Ir ao conteúdo
  • Cadastre-se

Bruno R Ruinho

Membros Plenos
  • Total de itens

    101
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

20

Sobre Bruno R Ruinho

  • Data de Nascimento 20/11/1988 (31 anos)

Informações gerais

  • Cidade e Estado
    Campinas - SP
  • Sexo
    Masculino
  1. @Renato.88 é correto isso que apresentei, seguindo seus calculos ??
  2. Mas no caso de comprar-mos um transformador comercial (esses que são feitos sob medida a pedido do cliente) Ex: 0-20v / 5A, >>>> 5÷1,4142 = 3,5A ele já esta compensado ou temos que mandar enrolar acima, para tem uma corrente final de 5A? Sendo assim seria uma corrente de 7A para obternos os 5A eficaz(ou bem proximo). 7÷1,4142 = 4,94A
  3. Boas pessoal do Forum! Com esse COVID-19 e precisando ficar em casa... Isolamento social e tal, peguei para ler varios posts antigos aqui no forum, ver soluções do passado para aplicar agora, ter ideiasnovas sobre projetos antigos. Estava concentrado no post do Faller sobre a "fonte de alimentação primeira parte" (que foi em 2011 estou esperando a segunda parte ate hoje...kkk ficou TOP aquela fonte!). Foram mais de 25 paginas naquele topico recomendo a todos a darem uma lida!!! https://www.clubedohardware.com.br/forums/topic/871394-fonte-de-alimentação-ajustável-12-a-20v-x-10a-primeira-parte-montagem/ Entre todos os outros topicos que estava lendo, achei um que varias pessoas passaram pela mesma dificuldade, e com toda a paciencia foram respondidas infinitamente pelos mesmos membros renomados aqui presente. Os topicos eram + - : "TENHO UM TRANSFORMADOR XXX QUE RETIREI DE TAL LUGAR MAS NAO SEI A CORRENTE" "TINHA UM VIDEO GAME ANTIGO E RETIREI O TRAFO DELE E QUERIA USAR PARA OUTRA COISA" e por ai vai... Com essa ideia e juntando que eu tinha um "meio Nobreak" parado aqui,(trafo+placa) com aquele pensamento : "não vou jogar fora pois esse transformador é grande e posso aproveitar algum dia" E este belo dia chegou...!! kkkk Segue algumas imagens: Retirei a primeira camada de papelão pois estava na duvida sobre a entrada, como era de um nobreak ele fazia a função de estabilizador tambem, logo eu teria um fio comum e o restante seriam TAPs. Não encontrei chave seletora de entrada, então acredito que seja comutação automatica (127/220). Como o fio preto estava ligado a uma das fases da tomada de saida "penso eu" que seria o fio "comum" . Fiz um desenho arbitrario dos enrolamentos primario e secundario >>>>> Medição da entrada>>>> Resultado (tabela abaixo, valores em ohms) entre os fios, chegado assim a conclusão nenhuma com essa medição, pois os valores são muito proximos. >>>>> Agora sim a parte BOA, medir com alimentação! Pegando o fio Preto como "comum" segue a sequencia de valores das tensões>>>>> Com essa tabela, consigo selecionar a tensão de saida que mais se adequa a aproveitar o trafo para uma futura fonte de bancada, sabendo que a saida retificada e filtrada é igual: Vpico = Veficaz*raiz quadrada de 2 Escolhida foi : ENTRDA: PRETO + VERMELHO SAIDA: PRETO + BRANCO = 29,5V Ficando assim: Veficaz = 29,5v Vpico = 29,5 * 1,4142 Vpico = 41,71v Tensão excelente para fazer uma fonte variavel ate 35V, porque após esse valor eu nao vejo mais uso. porém vai ser limitada pelo circuito, sendo assim se alguem encotrar algum Trafo com essas caracteristicas podem ficar livres para escolher a tensão que mais lhe adequar. Vamos agora aos testes de descobrir a corrente que esse Trafo pode entregar, vou adotar aqui a mesma queda de tensão já adotada pelo @faller, que são os 10% da tensão eficaz. (26,5V) Fiz um cabo com fio de 4mm somente para esta aplicação (particularmente ficou muito bom!) >>>> PRIMEIRA LIGAÇÃO>> LIGAR O TRAFO NA RESISTENCIA(Encontre uma resistencia já queimada, de chuveiro mesmo, é melhor...kkkk) SEGUNDA LIGAÇÃO>> MULTIMETRO NA RESISTENCIA (já na escala de tensão alternada 200v) COLOCAR O CONJUNTO DENTRO DA AGUA>> ENERGIZAR O CONJUNTO (MUITO CUIDADO NESSE MOMENTO!!!!) Já podem ver a pequena queda de tensão em cima da resistencia. (TENSÃO INICIAL 29,5V) DURANTE O PINÇAMENTO DAS ESPIRAS, A RESISTENCIA ACABOU QUEBRANDO NOS TERMINAIS, MAS NADA QUE VÁ ATRAPALHAR NO TESTE! SEGUE O TESTE DO PINÇAMENTO, PODEMOS VER QUE A TENSÃO CAIU NOS 10%, LEMBRANDO QUE A TENSÃO INICIAL ERA DE 29,5v AGORA TEMOS>>>>>>>>>>>>> NESTE PONTO O SOM DA CORRENTE PASSANDO PELA RESISTENCIA É DE ASSUSTAR.... KKKK PARECE MESMO QUANDO voce FECHA O REGISTRO DO CHUVEIRO NA EPOCA DO FRIO, E DEIXA SOMENTE AQUELE FIOZINHO DE AGUA PASSANDO... CONTINUANDO..... COMO EU SOU MALUCO(E ESTAVA QUERENDO COMPRAR OUTRO MULTIMETRO!) >>> AO invés DE PEGAR O PONTO DA RESISTENCIA E MEDIR EM OHMS. RESOLVI TESTAR NA ESCALA DE CORRENTE MESMO!!!! (LEMBRANDO QUE ISSO NUNCA DEVE SER FEITO POIS NÃO SABEMOS QUAL CORRENTE ESTA PASSANDO PELO CIRCUITO, SENDO ESSE PROCEDIMENTO ALTAMENTE ARRISCADO!!!!) Corrente de 19,66A Excelente!!!! Caso for fazer esse teste lembre-se que para medir corrente os cabos tem que ser alterados, abrindo o circuito e colocando o multimetro no meio... (CONTINUO NAO RECOMENDADO!!!!!!!!!!!!!) AGORA FAZENDO DO JEITO CORRETO, E SEGURO! PINÇAMOS COM O MULTIMETRO NA ESCALA DE OHMS, OS PONTOS EXATOS QUE PEGAMOS A CORRENTE DE 19,66A >>>> Qual resistencia nos temos???? Já sabendo que a tensão é 29,5v e a corrente 19,66A Logo >>>>>>> Lei de Ohm: I = V / R I = 29,5 / 1,5 I = 19,6666A Antes de sabermos a resisitencia: R = V / I R = 29,5 / 19,66 R = 1,5 ohms LINDA ESSA LEI DE OHM!!! KKKKKK Testes finalizados, espero ter exclarecido alguma coisa para alguem, se quiserem aproveirar trafos de outros lugares para montar fontes de alimentação, ou qualquer outra ideia, este é o procedimento basico que tem que ser feito. Final do meu trafo: Tensão: 29V Corrente: 19A Agora vou em busca de um circuito de fonte de alimentação variavel de 0-35V com uma corrente variavel de 0-10~15A pois para segurar essa corrente vai dar um trabalho!!! Pois fontes com corrente variavel é complicado de se encontrar, e muitos ainda questionam o motivo pelo qual variar a corrente, mas isso é assunto para outro topico! Obrigado a Todos!!! Tem duas imagens abaixo que nao querem sair... favor desconsiderar.... kkkk
  4. Bem, estou desenvolvendo um alarme para minha casa, o que preciso fazer é o seguinte: Coloquei um sensor de abertura do portão para quando eu chegar de carro, e gostaria de colocar um tempo de 30 segundos para desarme do alarme sem que o mesmo disparasse... Algo como "Invasão detectada" digite a senha... 30...29..28...... Para acionar eu consegui fazer, para acionar o alarme ele me da X segundos para que seja ativado, mas o inverso disso não consegui fazer pois fica travado dentro do "WHILE" e trava o teclado (claro....) porém o que fiz ele já dispara e já entra na função de senha , apos digitar a senha ele desliga, tentei usar o millis() o timerOne, mas sem sucesso , alguma sugestão de como eu executo esses "30" segundos sem o teclado travar no delay ou while ?? Estou na pesquisa ainda.... se eu usar um for dessa maneira: for (int i = 0; i < 30; i++) { ativa_alarme() } Esta correto?
  5. não estava dando certo pois estava colocando ações muito longa dentro da interrupção. então modifiquei para ficar parecido com a função do millis> //============================= declaração de variaveis =============================== //*************************************************************************************// unsigned int sensor_dht=0; //armazena o contador de tempetarura/umidade unsigned int temp_dht=2; //armazena o tempo de leiura da temperatura //============================ configurações de iniciais ============================== //*************************************************************************************// pinmode(2,input); //entrada do sinal de interrupção do rtc rtc.writesqwpinmode(ds1307_squarewave1hz); // seta o pino sqw do rtc para frequencia de 1hz attachinterrupt(0,leitura_sensor,rising); // interrupção do rtc no pino 2 //============================ configurações de loop ================================== //*************************************************************************************// void loop(){ if(sensor_dht >= temp_dht){ //se "sensor" é maior ou igual a "temp_dht" dht1.read11(dht11_pin); //se sim, le o sensor dht sensor_dht = 0; //zera a variavel } lcd.createchar(1,thermometro); //cria caractere do termometro e grava na posição 1 lcd.setcursor(1,2); //posiciona cursor na coluna 2 e linha 3 lcd.write(byte(1)); //escreve caratere gravdo na posição 1 lcd.setcursor(2,2); lcd.print(dht1.temperature,0); //escreve a teperatura no lcd, sem casas decimais (temperature,0) lcd.setcursor(4,2); lcd.write(byte(223)); //escreve caractere de °grau lcd.createchar(2,gota); //cria caractere de "gota" e grava na posição 2 lcd.setcursor(15,2); lcd.write(byte(2)); //escreve caratere gravdo na posição 2 lcd.setcursor(16,2); lcd.print(dht1.humidity,0); //escreve a umidade no lcd, sem casas decimais (humidity,0) lcd.setcursor(18,2); lcd.write("%"); //escreve caractere de porcentagem } void leitura_sensor(){ //FUNÇÃO DA INTERRUPÇÃO sensor_dht++; //INCREMENTA +1 A VARIAVEL } //FINAL DA FUNÇÃO DE INTERRUPÇÃO funcionando perfeitamente, faz a leitura a cada 2 segundos! obrigado a todos!
  6. Obrigado pelos esclarecimentos!! Consegui fazer o RTC me retornar 1Hz: RTC.writeSqwPinMode(DS1307_SquareWave1HZ); mas ainda tenho um problema, a interrupção acontece pois o led no pino 10 fica mudando de estado, mas a leitura do sensor DHT não atualiza.... attachInterrupt(0,leitura_temp,RISING); void leitura_temp() { DHT1.read11(DHT11_PIN); digitalWrite(10, !digitalRead(10)); }
  7. Vou fazer o video e posto aqui, mas ainda segue a minha duvida, o trecho do codigo>>> void leitura_temp() { if ((millis() - delayIntervalo) > intervalo) { //delayIntervalo => ARMAZENA O TEMPO DE COMPARAÇÃO COM MILLIS unsigned long start = micros(); //intervalo=> INTERVALO DE LEITURA DO SENSOR DTH - esta setado para 2000ms int chk = DHT.read11(DHT11_PIN); unsigned long stop = micros(); delayIntervalo = millis(); }; } //FINAL DA FUNÇÃO LEITURA TEMPERATURA porém ao final de ~48 dias vai acontecer o ovewflow e será zerada, mas a minha variavel delayIntervalo estará carregada com o ultimo valor de millis, sendo assim a leitura ficará travada, assim como todo o resto que esta usando o millis. Já vi exemplos que usam o Timer1 com interrupção por overflow. Mas nao faço ideia..... Tem o RTC no circuito mas não faço ideia de como utilizar o tempo dele (imagino que dos segundos) para fazer a leitura do sensor. E dar um reset no Arduino antes do Millis estourar?
  8. Erro meu, este que desenhei é o de umidade do ar e temp, o higrometro eu nao encontrei, estava apanhando do Fritzing Eu me expressei mal, as luzes só vão ter o controle de tempo, ligada 24Horas, / ligada 12horas desligada 12horas / ligado 8h desligados 16h.....para simular as epocas do ano, exemplo que no inverno a irradiação do sol são mais curtos, intensidade estará sempre no 100% Para o tempo de medição dos sensores, estou pensado em usar os segudos do RTC mas estou travado ainda como transformar isso em função/código. Penso em escrever parecido com o Millis mas utilizando o now.second, acho que estou na linha certa Entrei para ver, vou precisar de um tutorial no Youtube, em primeira vista, nao entendi muito..... kkkk ainda nao, wireless seria na versão da estufa 5.0 ..... estou na versão 0.5....kkkkkkkkkk Dei uma melhorada no fonte, ainda baseando no millis, fazendo a leitura da temperatura/umidade e a umidade do solo, desconsidere o diagrama acima, pois tive que alterar algumas portas para fazer a leitura analogica. Fonte alterado nas linhas 167 ate 209, comentei mais linhas para ficar o mais claro do que esta acontecendo. /* ============================================================================================================= ============================================================================================================= */ //*************************************************************************************// //============================= DECLARAÇÃO DE BIBLIOTECAS ============================= #include <LiquidCrystal_I2C.h> //BIBLIOTECA DE LCD POR I2C #include <Wire.h> //BIBLIOTECA PARA COMUNICAÇÃO COM I2C #include <RTClib.h> //BIBLIOTECA DO RTC DS1307 #include <dht.h> //BIBLIOTECA DO SENSOR DTH //*************************************************************************************// //============================= DECLARAÇÃO DE CONSTANTES ============================== //*************************************************************************************// LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); RTC_DS1307 RTC; dht DHT; //*************************************************************************************// //============================= MAPEAMENTO DE HARDWARE ================================ //*************************************************************************************// #define bt_dir 2 //BOTÃO DA DIREITA #define bt_esq 3 //BOTÃO DA ESQUERDA #define bt_enter 4 //BOTÃO ENTER #define bt_down 5 //BOTÃO DOWN #define bt_up 6 //BOTÃO UP #define bt_esc 7 //BOTÃO ESC #define saida 8 //BOMBA DE IRRIGAÇÃO #define Relay 10 //RELE LAMPADA #define analog_sens A1 //SENSOR DE UMIDADE DO SOLO #define bomba 9 //BOMBA DE IRRIGAÇÃO #define DHT11_PIN 12 //SENSOR DTH //*************************************************************************************// //============================= DECLARAÇÃO DE VARIAVEIS =============================== //*************************************************************************************// byte menu_num = 1, sub_menu = 1; //FLAGS PARA OS MENUS PRINCIPAIS byte submenu1 = 1, submenu2 = 1; //FLAGS PARA OS SUBMENUS byte t_bt_down, t_bt_up; //FLAGS PARA ARMAZENAR OS ESTADOS DOS BOTÕES byte set_full=1; //FLAG PARA MANTER O RELÊ LIGADO int hourupg=0; //ARMAZENA HORA - INICIA COM 0 int minupg=0; //ARMAZENA MINUTOS - INICIA COM 0 int dayupg=1; //ARMAZENA DIA - INICIA COM 1 int monthupg=1; //ARMAZENA MÊS - INICIA COM 1 int yearupg=0; //ARMAZENA ANO - INICIA COM 0 int menu=0; //ARMAZENA O ESTADO DO MENU DENTRO DO SWITCH CASE int set_on=0; //ARMAZENA A HORA DE LIGAR O RELÊ int set_off=0; //ARMAZENA A HORA DE DESLOGAR O RELÊ int adc_value=0; //ARMAZENA VALOR DA UMIDADE DO SOLO - INICIA COM 0 int intervalo=2000; //INTERVALO DE LEITURA DO SENSOR DTH int intervalo2=5000; //INTERVALO DE LEITURA DO SENSOR DE SOLO String fotoperiodo; //ARMAZENA A STRING DO FOTO PERIODO "24h" , "18h" , "12h" , OFF String umidade_solo; unsigned long delayIntervalo; //ARMAZENA O TEMPO DE COMPARAÇÃO COM MILLIS unsigned long tempo=0; //ARMAZENA int level1=350; int level2=450; int level3=880; byte thermometro[8] = { //SIMBOLO TERMOMETRO B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110}; byte gota[8] = { //SIMBOLO GOTA-UMIDADE B00100, B00100, B01110, B01110, B11111, B11111, B11111, B01110}; byte sol_sym[8] = { //SIMBOLO SOL B00100, B10001, B01110, B11111, B01110, B10001, B00100, B00000 }; //*************************************************************************************// //============================ CONFIGURAÇÕES DE INICIAIS ============================== //*************************************************************************************// void setup() { pinMode(bt_dir, INPUT_PULLUP); //CONFIGURA COMO ENTRADA E SETA RESISTORES DE PULLUP INTERNOS pinMode(bt_esq, INPUT_PULLUP); // pinMode(bt_enter, INPUT_PULLUP); // pinMode(bt_down, INPUT_PULLUP); // pinMode(bt_up, INPUT_PULLUP); // pinMode(bt_esc, INPUT_PULLUP); // pinMode(analog_sens, INPUT); //COMFIGURA COMO ENTRADA ANALOGICA pinMode(Relay, OUTPUT); //CONFIGURA COMO SAIDA pinMode(bomba, OUTPUT); //CONFIGURA COMO SAIDA pinMode(saida, OUTPUT); //CONFIGURA COMO SAIDA lcd.begin(20, 4); //INICIA COMUNICAÇÃO COM LCD E SETA LCD20x4 Wire.begin(); //INICIA COMUNICAÇÃO WIRE RTC.begin(); //INICIA COMUNICAÇÃO COM MODULO RTC } //FINAL DO SETUP //*************************************************************************************// //============================ CONFIGURAÇÕES DE LOOP ================================== //*************************************************************************************// void loop() { leitura_temp(); //CHAMA FUNÇÃO DE LEITURA DE TEMPERATURA keyboard(); //CHAMA FUNÇÃO DE LEITURA DE TECLADO read_humidity(); //CHAMA FUNÇÃO DE LEITURA DE UMIDADE DO SOLO switch(menu_num) //SWITCH DO MENU { case 1: resumo(); break; case 2: iluminacao(); break; case 3: temperatura(); break; case 4: umidade(); break; case 5: ajuste_relogio(); break; } //FINAL DO SWITCH } //FUNAL DO LOOP //*************************************************************************************// //=========================== DESENVOLVIMENTO DAS FUNÇÕES ============================= //*************************************************************************************// void keyboard() { if(!digitalRead(bt_up)) t_bt_up = 0x01; //BOTÃO UP PRESSIONADO? SETA A FLAG if(!digitalRead(bt_down)) t_bt_down = 0x01; //BOTÃO DOWN PRESSIONADO? SETA A FLAG if(digitalRead(bt_up) && t_bt_up) //BOTÃO UP SOLTO E FLAG SETADA? { //SE SIM... t_bt_up = 0x00; //LIMPA FLAG lcd.clear(); //LIMPA LCD menu_num++; //INCREMENTA MENU if(menu_num > 0x05) menu_num = 0x01; //SE MENU FOR MAIOR QUE 5, MENU VOLTA A SER 1 } //FINAL BOTÃO UP (bt_up) if(digitalRead(bt_down) && t_bt_down) //BOTÃO DOWN SOLTO E FLAG SETADA? { //SE SIM... t_bt_down = 0x00; //LIMPA FLAG lcd.clear(); //LIMPA LCD menu_num--; //DECREMENTA MENU if(menu_num < 0x01) menu_num = 0x05; //SE MENU FOR MENOR QUE 1, MENU VOLTA A SER 5 } //FINAL BOTÃO DOWN (bt_down) if(!digitalRead(bt_enter)) //BOTÃO ENTER PRESSIONADO? { //SE SIM... delay(150); //AGUARDA 150ms lcd.clear(); if(sub_menu <= 2) sub_menu ++; //SE sub_menu FOR MENOR OU IGUAL A 2, INCREMENTA sub_menu } //FINAL BOTÃO ENTER (bt_enter) if(!digitalRead(bt_esc)) //BOTÃO ESC PRESSIONADO? { //SE SIM... delay(150); //AGUARDA 150ms if(sub_menu > 0) sub_menu --; //SE sub_menu FOR MAIOR QUE 0, DECREMENTA sub_menu } //FINAL BOTÃO ESC (bt_esc) } //FINAL DA FUNÇÃO KEYBOARD void leitura_temp() { if ( (millis() - delayIntervalo) > intervalo ) { //LEITURA DOS DADOS unsigned long start = micros(); int chk = DHT.read11(DHT11_PIN); unsigned long stop = micros(); delayIntervalo = millis(); }; } //FINAL DA FUNÇÃO LEITURA TEMPERATURA void read_humidity() { if((millis()- tempo) >= intervalo2) { tempo = millis(); adc_value = analogRead(analog_sens); } if (adc_value > 0 && adc_value < level1) //identifica nível de umidade 5 { umidade_solo = String("Umido "); digitalWrite(bomba,LOW); } // ================================================================ else if (adc_value > level1 && adc_value < level2) //identifica nível de umidade 3 { umidade_solo = String("Umd. Media "); digitalWrite(bomba,LOW); } // ================================================================ else if (adc_value > level2 && adc_value < level3) //identifica nível de umidade 2 { umidade_solo = String("Umd. Minima"); digitalWrite(bomba,HIGH); } // ================================================================ else if (adc_value > level3 && adc_value >= 1000) //identifica nível de umidade 3 { umidade_solo = String("Seco "); digitalWrite(bomba,HIGH); } } void resumo() //INICIO DA TELA PRINCIPAL { DateTime now = RTC.now(); lcd.setCursor(0,0); lcd.print("====== ESTUFA ======"); lcd.setCursor(0,1); if (now.hour()<=9) //SE A HORA FOR MENOR OU IGUAL A 9 { lcd.print("0"); //SIM... MOSTRA "0" NA FRENTE } lcd.print(now.hour(), DEC); //GET HORA DO RTC E MOSTRA NO LCD hourupg=now.hour(); lcd.print(":"); //ADICIONA ":" ENTRE HORA E MINUTO if (now.minute()<=9) //SE O MINUTO FOR MAIOR OU IGUAL A 9 { lcd.print("0"); //SIM... MOSTRA "0" NA FRENTE } lcd.print(now.minute(), DEC); minupg=now.minute(); //GET MINUTOS DO RTC E MOSTRA NO LCD //=====================segundos lcd.print(":"); if (now.second()<=9) //SE O DIA FOR MENOR OU IGUAL A 9 { lcd.print("0"); //SIM... MOSTRA "0" NA FRENTE } lcd.print(now.second(), DEC); //=====================segundos lcd.setCursor(15, 1); if (now.day()<=9) //SE O DIA FOR MENOR OU IGUAL A 9 { lcd.print("0"); //SIM... MOSTRA "0" NA FRENTE } lcd.print(now.day(), DEC); dayupg=now.day(); //GET DIA DO RTC E MOSTRA NO LCD lcd.print("/"); //ADICIONA "/" ENTRE DIA E MÊS if (now.month()<=9) //SE O MÊS FOR MENOR OU IGUAL A 9 { lcd.print("0"); //SIM... MOSTRA "0" NA FRENTE } lcd.print(now.month(), DEC); monthupg=now.month(); //GET MÊS DO RTC E MOSTRA NO LCD lcd.createChar(1,thermometro); //CRIA CARACTERE DO TERMOMETRO E GRAVA NA POSIÇÃO 1 lcd.setCursor(1,2); //POSICIONA CURSOR NA COLUNA 2 E LINHA 3 lcd.write(byte(1)); //ESCREVE CARATERE GRAVDO NA POSIÇÃO 1 lcd.setCursor(2,2); lcd.print(DHT.temperature,0); //ESCREVE A TEPERATURA NO LCD, SEM CASAS DECIMAIS (temperature,0) lcd.setCursor(4,2); lcd.write(byte(223)); //ESCREVE CARACTERE DE °GRAU lcd.createChar(2,gota); //CRIA CARACTERE DE "GOTA" E GRAVA NA POSIÇÃO 2 lcd.setCursor(15,2); lcd.write(byte(2)); //ESCREVE CARATERE GRAVDO NA POSIÇÃO 2 lcd.setCursor(16,2); lcd.print(DHT.humidity,0); //ESCREVE A UMIDADE NO LCD, SEM CASAS DECIMAIS (humidity,0) lcd.setCursor(18,2); lcd.write("%"); //ESCREVE CARACTERE DE PORCENTAGEM if(now.second() >= 30 && now.second() < 35 ){ //SE HORA FOR MAIOR OU IGUAL A set_on E HORA FOR MENOR QUE set_off digitalWrite(Relay, HIGH); //SIM... LIGA RELÊ } lcd.createChar(3,sol_sym); //CRIA CARACTERE DE "SOL" E GRAVA NA POSIÇÃO 3 lcd.setCursor(8,2); lcd.write(byte(3)); //ESCREVE CARATERE GRAVDO NA POSIÇÃO 3 lcd.setCursor(9,2); lcd.print(fotoperiodo); //ESCREVE o que ESTA GRAVADO DENTRO DA STRING O QUAL FOTO-PERIODO ESTA SELECIONADO //INICO TESTE DE UMINDADE DO SOLO lcd.setCursor(2,3); lcd.print("Solo:"); lcd.setCursor(8,3); lcd.print(umidade_solo); //lcd.setCursor(7,1); //lcd.print(adc_value); } void iluminacao() { switch(sub_menu) { case 1: lcd.setCursor(0,0); //APRESENTA A PRIMEIRA TELA DE MENU lcd.print(">ILUMINACAO "); //ILUMINAÇÃO lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: //SUBMENU DE ILUMINAÇÃO lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" ILUMINACAO "); lcd.setCursor(0,3); lcd.print(" "); switch(submenu1) { case 1: lcd.setCursor(0,2); lcd.print(" 24h >"); //MOSTRA AS opções DE FOTO-PERIODO if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} //BOTÃO DIREITO PRESSIONADO? SE SIM.. INCREMENTA submenu1 if(!digitalRead(bt_enter)){ //BOTÃO ENTER PRESSIONADO? lcd.clear(); //SE SIM... LIMPA LCD lcd.setCursor(0,0); lcd.print("SALVANDO..."); //MOSTRA "SALVANDO..." NO LCD digitalWrite(Relay, HIGH); //LIGA RELÊ fotoperiodo = String("24h"); //GRAVA "24h" DENTRO DA STRING delay(200); //AGUARDA 200ms set_full=0; //ZERA A FLAG set_full submenu2=1; //GRAVA 1 NA FLAG submenu2 PARA SAIR DO SUBMENU sub_menu=1; //GRAVA 1 NA FLAG sub_menu PARA SAIR DO SUB_MENU menu_num=1; //GRAVA 1 NA FLAG menu_num PARA IR A TELA PRINCIPAL } break; case 2: lcd.setCursor(0,2); lcd.print("< 12/12 >"); //MOSTRA AS opções DE FOTO-PERIODO if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} //BOTÃO DIREITO PRESSIONADO? SE SIM.. INCREMENTA submenu1 if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} //BOTÃO ESQUERDO PRESSIONADO? SE SIM.. DECEMENTA submenu1 if(!digitalRead(bt_enter)) { set_on = 0; set_off = 30; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("12h"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; case 3: lcd.setCursor(0,2); lcd.print("< 16/8 >"); if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} if(!digitalRead(bt_enter)) { set_on = 6; set_off = 50; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("18h"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; case 4: lcd.setCursor(0,2); lcd.print("< OFF "); if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} if(!digitalRead(bt_enter)) { set_on = 0; set_off = 0; set_full = 1; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("OFF"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; } //Final Switch foto-periodo break; } } //Final Switch Iluminação void temperatura() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(">TEMPERATURA" ); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: lcd.setCursor(0,0); lcd.print(" Temperatura "); lcd.setCursor(1,2); lcd.print("Interno"); lcd.setCursor(11,2); lcd.print("Externo"); lcd.createChar(1,thermometro); lcd.setCursor(2,3); lcd.write(byte(1)); lcd.print(DHT.temperature,0); lcd.write(byte(223)); lcd.print("C"); lcd.createChar(1,thermometro); lcd.setCursor(12,3); lcd.write(byte(1)); lcd.print(DHT.temperature,0); lcd.write(byte(223)); lcd.print("C"); break; }//FINAL SUB_MENU } //end temperatura void umidade() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(">UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: lcd.setCursor(0,0); lcd.print(" Umidade: "); lcd.setCursor(0,2); lcd.print("Leitura ADC:"); lcd.setCursor(13,2); lcd.print(adc_value); lcd.setCursor(0,3); lcd.print(umidade_solo); delay(1000); lcd.clear(); break; } } //end umidade void ajuste_relogio() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(">AJUSTE RELOGIO "); break; case 2: ajuste_sub(); break; } } //end ajuste_relogio void ajuste_sub() { switch(submenu2) { case 1: // ============ AJUSTE DA HORA =================================== lcd.clear(); //DateTime now = RTC.now(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(hourupg==23) // Se "hourupg" for igual a 23 { hourupg=0; // "hourupg" passa a ser 0 } else { hourupg=hourupg+1; // Se não, incrementa +1 a "hourupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(hourupg==0) // Se "hourupg" for igual a 0 { hourupg=23; // "hourupg" passa a ser 23 } else { hourupg=hourupg-1; // Se não, decrementa -1 a "hourupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Hora: ");// Escreve "Ajustar Hora" lcd.setCursor(0,3); lcd.print(hourupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 2: // ============ AJUSTE DOS MINUTOS ================================= lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if (minupg==59) // Se "minupg" for igual a 59 { minupg=0; // "minupg" passa a ser 0 } else { minupg=minupg+1; // Se não, incrementa +1 a "minupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(minupg==0) // Se "minupg" for igual a 0 { minupg=59; // "minupg" passa a ser 59 } else { minupg=minupg-1; // Se não, decrementa -1 a "minupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Minutos:");// Escreve "Ajustar Minutos" lcd.setCursor(0,3); lcd.print(minupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 3: // ============ AJUSTE DIA ====================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(dayupg==31) // Se "dayupg" for igual a 31 { dayupg=1; // "dayupg" passa a ser 1 } else { dayupg=dayupg+1; // Se não, incrementa +1 a "dayupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(dayupg==1) // Se "dayupg" for igual a 1 { dayupg=31; // "dayupg" passa a ser 31 } else { dayupg=dayupg-1; // se não, decrementa 11 a "dayupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Dia:");// Escreve "Ajustar dia" lcd.setCursor(0,3); lcd.print(dayupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 4: // ============ AJUSTE MÊS =========================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(monthupg==12) // Se "monthupg" for igual a 12 { monthupg=1; // "monthupg" passa a ser 1 } else { monthupg=monthupg+1; // Se não, incrementa +1 a "monthupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(monthupg==1) // Se "monthupg" for igual a 1 { monthupg=12; // "monthupg" passa a ser 12 } else { monthupg=monthupg-1; // Se não, decrementa -1 a "monthupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Mes:"); // Escreve "Ajustar Mes" lcd.setCursor(0,3); lcd.print(monthupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 5: // ============ AJUSTAR ANO =================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { yearupg=yearupg+1; // Incrementa +1 a "yearupg" } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { yearupg=yearupg-1; // Decrementa -1 a "yearupg" } lcd.setCursor(0,0); // Posiciona o cursor na coluna 0 e linha 0 lcd.print("Ajustar Ano:"); // Escreve "Ajustar Ano" lcd.setCursor(0,1); lcd.print(yearupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 6: lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); RTC.adjust(DateTime(yearupg,monthupg,dayupg,hourupg,minupg,0)); // Grava os dados no RTC delay(200); submenu2=1; sub_menu=1; menu_num=1; break; } //end switch } Tudo "funcionando" mas com o risco do estouro do Millis: Não sei se o Forum permite eu fazer um video com o funcionamento do menu e do projeto em funcionamento , se posso upar diretamente aqui na pagina ou tenho que carregar no YouTube como "não listado" e postar o link aqui.
  9. Obrigado Isadora e Paulão pela presença!!..rs Gosto da Isadora pois ela da umas "tiradas" de leve não importando a situação Paulão , já vi varios posts seus ajudando o pessoal por ai!!! Vamos lá a ideia da Estufa/Plantario: *Controle da iluminação para acelerar o crescimento, simular as épocas do ano, primavera, verão, outono e inverno e 24h ligado *Temperatura e Umidade do Ar = Somente para comparação interno/externo. *Umidade do Solo; = Medição (pelo visto posso elevar o tempo) a cada 1 min, caso esteja baixo, aciona uma bomba de aquário / solenoide para irrigação. *Relógio - Para ter uma precisão de acionar e desligar a lâmpada nos horários pre-definidos. Tela "RESUMO" Ao pressionar "SELECT" Select novamente, para entrar na "seleção" Os sub-menus desse menu será o tempo que a iluminação ficará acesa ex: >ILUMINAÇÃO > 24h / 12-12 / 16-8 / OFF.… Bibliotecas Utilizadas: DHTlib NewliquidCrystal_1.3.4 RTClib /* ============================================================================================================= ============================================================================================================= */ //*************************************************************************************// //============================= DECLARAÇÃO DE BIBLIOTECAS ============================= #include <LiquidCrystal_I2C.h> //BIBLIOTECA DE LCD POR I2C #include <Wire.h> //BIBLIOTECA PARA COMUNICAÇÃO COM I2C #include <RTClib.h> //BIBLIOTECA DO RTC DS1307 #include <dht.h> //BIBLIOTECA DO SENSOR DTH //*************************************************************************************// //============================= DECLARAÇÃO DE CONSTANTES ============================== //*************************************************************************************// LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE); RTC_DS1307 RTC; dht sensorDHT; //*************************************************************************************// //============================= MAPEAMENTO DE HARDWARE ================================ //*************************************************************************************// #define bt_dir 2 //BOTÃO DA DIREITA #define bt_esq 3 //BOTÃO DA ESQUERDA #define bt_enter 4 //BOTÃO ENTER #define bt_down 5 //BOTÃO DOWN #define bt_up 6 //BOTÃO UP #define bt_esc 7 //BOTÃO ESC #define Relay 10 //RELE LAMPADA #define pinSensor 12 //SENSOR DTH #define intervalo 2000 //INTERVALO DE LEITURA DO SENSOR DTH //*************************************************************************************// //============================= DECLARAÇÃO DE VARIAVEIS =============================== //*************************************************************************************// byte menu_num = 1, sub_menu = 1; //FLAGS PARA OS MENUS PRINCIPAIS byte submenu1 = 1, submenu2 = 1; //FLAGS PARA OS SUBMENUS byte t_bt_down, t_bt_up; //FLAGS PARA ARMAZENAR OS ESTADOS DOS BOTÕES byte set_full=1; //FLAG PARA MANTER O RELÊ LIGADO int hourupg=0; //ARMAZENA HORA - INICIA COM 0 int minupg=0; //ARMAZENA MINUTOS - INICIA COM 0 int dayupg=1; //ARMAZENA DIA - INICIA COM 1 int monthupg=1; //ARMAZENA MÊS - INICIA COM 1 int yearupg=0; //ARMAZENA ANO - INICIA COM 0 int menu=0; //ARMAZENA O ESTADO DO MENU DENTRO DO SWITCH CASE int set_on=0; //ARMAZENA A HORA DE LIGAR O RELÊ int set_off=0; //ARMAZENA A HORA DE DESLOGAR O RELÊ String fotoperiodo; //ARMAZENA A STRING DO FOTO PERIODO "24h" , "18h" , "12h" , OFF unsigned long delayIntervalo; //ARMAZENA O TEMPO DE COMPARAÇÃO COM MILLIS byte thermometro[8] = { //SIMBOLO TERMOMETRO B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110}; byte gota[8] = { //SIMBOLO GOTA-UMIDADE B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110}; byte sol_sym[8] = { //SIMBOLO SOL B00100, B10001, B01110, B11111, B01110, B10001, B00100, B00000 }; //*************************************************************************************// //============================ CONFIGURAÇÕES DE INICIAIS ============================== //*************************************************************************************// void setup() { pinMode(bt_dir, INPUT_PULLUP); //CONFIGURA COMO ENTRADA E SETA RESISTORES DE PULLUP INTERNOS pinMode(bt_esq, INPUT_PULLUP); // pinMode(bt_enter, INPUT_PULLUP); // pinMode(bt_down, INPUT_PULLUP); // pinMode(bt_up, INPUT_PULLUP); // pinMode(bt_esc, INPUT_PULLUP); // pinMode(Relay, OUTPUT); //CONFIGURA COMO SAIDA lcd.begin(20, 4); //INICIA COMUNICAÇÃO COM LCD E SETA LCD20x4 Wire.begin(); //INICIA COMUNICAÇÃO WIRE RTC.begin(); //INICIA COMUNICAÇÃO COM MODULO RTC } //FINAL DO SETUP //*************************************************************************************// //============================ CONFIGURAÇÕES DE LOOP ================================== //*************************************************************************************// void loop() { leitura_temp(); //CHAMA FUNÇÃO DE LEITURA DE TEMPERATURA keyboard(); //CHAMA FUNÇÃO DE LEITURA DE TECLADO switch(menu_num) //SWITCH DO MENU { case 1: resumo(); break; case 2: iluminacao(); break; case 3: temperatura(); break; case 4: umidade(); break; case 5: ajuste_relogio(); break; } //FINAL DO SWITCH } //FUNAL DO LOOP //*************************************************************************************// //=========================== DESENVOLVIMENTO DAS FUNÇÕES ============================= //*************************************************************************************// void keyboard() { if(!digitalRead(bt_up)) t_bt_up = 0x01; //BOTÃO UP PRESSIONADO? SETA A FLAG if(!digitalRead(bt_down)) t_bt_down = 0x01; //BOTÃO DOWN PRESSIONADO? SETA A FLAG if(digitalRead(bt_up) && t_bt_up) //BOTÃO UP SOLTO E FLAG SETADA? { //SE SIM... t_bt_up = 0x00; //LIMPA FLAG lcd.clear(); //LIMPA LCD menu_num++; //INCREMENTA MENU if(menu_num > 0x05) menu_num = 0x01; //SE MENU FOR MAIOR QUE 5, MENU VOLTA A SER 1 } //FINAL BOTÃO UP (bt_up) if(digitalRead(bt_down) && t_bt_down) //BOTÃO DOWN SOLTO E FLAG SETADA? { //SE SIM... t_bt_down = 0x00; //LIMPA FLAG lcd.clear(); //LIMPA LCD menu_num--; //DECREMENTA MENU if(menu_num < 0x01) menu_num = 0x05; //SE MENU FOR MENOR QUE 1, MENU VOLTA A SER 5 } //FINAL BOTÃO DOWN (bt_down) if(!digitalRead(bt_enter)) //BOTÃO ENTER PRESSIONADO? { //SE SIM... delay(150); //AGUARDA 150ms if(sub_menu <= 2) sub_menu ++; //SE sub_menu FOR MENOR OU IGUAL A 2, INCREMENTA sub_menu } //FINAL BOTÃO ENTER (bt_enter) if(!digitalRead(bt_esc)) //BOTÃO ESC PRESSIONADO? { //SE SIM... delay(150); //AGUARDA 150ms if(sub_menu > 0) sub_menu --; //SE sub_menu FOR MAIOR QUE 0, DECREMENTA sub_menu } //FINAL BOTÃO ESC (bt_esc) } //FINAL DA FUNÇÃO KEYBOARD void leitura_temp() { if ( (millis() - delayIntervalo) > intervalo ) { //LEITURA DOS DADOS unsigned long start = micros(); int chk = sensorDHT.read11(pinSensor); // unsigned long stop = micros(); /* VERIFICA SE HOUVE ERRO switch (chk) { case DHTLIB_OK: Serial.print("OK,\t"); break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break; case DHTLIB_ERROR_CONNECT: Serial.print("Connect error,\t"); break; case DHTLIB_ERROR_ACK_L: Serial.print("Ack Low error,\t"); break; case DHTLIB_ERROR_ACK_H: Serial.print("Ack High error,\t"); break; default: Serial.print("Unknown error,\t"); break; }*/ delayIntervalo = millis(); }; } //FINAL DA FUNÇÃO LEITURA TEMPERATURA void resumo() { DateTime now = RTC.now(); lcd.setCursor(0,0); lcd.print("====== ESTUFA ======"); lcd.setCursor(0,1); if (now.hour()<=9) { lcd.print("0"); } lcd.print(now.hour(), DEC); // GET HORA DO RTC E MOSTRA NO LCD hourupg=now.hour(); lcd.print(":"); // ESPAÇO ENTRE if (now.minute()<=9) { lcd.print("0"); } lcd.print(now.minute(), DEC);// GET MINUTOS DO RTC E MOSTRA NO LCD minupg=now.minute(); lcd.setCursor(15, 1); if (now.day()<=9) { lcd.print("0"); } lcd.print(now.day(), DEC); dayupg=now.day(); lcd.print("/"); if (now.month()<=9) { lcd.print("0"); } lcd.print(now.month(), DEC); monthupg=now.month(); lcd.createChar(1,thermometro); lcd.setCursor(1,2); lcd.write(byte(1)); lcd.setCursor(2,2); lcd.print(sensorDHT.temperature,0); lcd.setCursor(4,2); lcd.write(byte(223)); lcd.createChar(2,gota); lcd.setCursor(15,2); lcd.write(byte(2)); lcd.setCursor(16,2); lcd.print(sensorDHT.humidity,0); lcd.setCursor(18,2); lcd.write("%"); //Função do Relay if(set_on == set_off){ digitalWrite(Relay, LOW); if(set_on == set_off && set_on == set_full) { digitalWrite(Relay, HIGH); } } if(set_on < set_off){ if(now.hour() >= set_on && now.hour() < set_off ){ //Start digitalWrite(Relay, HIGH); } else if(now.hour() >= set_off) { digitalWrite(Relay, LOW); } else{ digitalWrite(Relay, LOW); } } if (set_on > set_off){ if(now.hour() >= set_on && now.hour() <= 23){ //Start digitalWrite(Relay, HIGH); } else if(now.hour() < set_off){ digitalWrite(Relay, HIGH); } else if(now.hour() >= set_off && now.hour() < set_on){ digitalWrite(Relay, LOW); } } lcd.createChar(3,sol_sym); lcd.setCursor(8,2); lcd.write(byte(3)); lcd.setCursor(9,2); lcd.print(fotoperiodo); lcd.setCursor(0,3); lcd.print(" SOLO: 50 UMIDO "); } void iluminacao() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(">ILUMINACAO "); lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: //iluminacao_sub(); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print(" ILUMINACAO "); lcd.setCursor(0,3); lcd.print(" "); switch(submenu1) { case 1: lcd.setCursor(0,2); lcd.print(" 24 >"); if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} if(!digitalRead(bt_enter)) { lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); digitalWrite(Relay, HIGH); fotoperiodo = String("24h"); delay(200); set_full=0; submenu2=1; sub_menu=1; menu_num=1; } break; case 2: lcd.setCursor(0,2); lcd.print("< 12/12 >"); if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} if(!digitalRead(bt_enter)) { set_on = 10; set_off = 11; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("12h"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; case 3: lcd.setCursor(0,2); lcd.print("< 16/8 >"); if(!digitalRead(bt_dir)) {delay(150); submenu1 ++;} if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} if(!digitalRead(bt_enter)) { set_on = 6; set_off = 0; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("18h"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; case 4: lcd.setCursor(0,2); lcd.print("< OFF "); if(!digitalRead(bt_esq)) {delay(150); submenu1 --;} if(!digitalRead(bt_enter)) { set_on = 0; set_off = 0; set_full = 1; lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); fotoperiodo = String("OFF"); delay(200); submenu2=1; sub_menu=1; menu_num=1; } break; } //Final Switch foto-periodo break; } } //Final Switch Iluminação void temperatura() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(">TEMPERATURA "); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); lcd.print(" Temperatura: "); lcd.setCursor(0,2); lcd.print("Ext: 25 "); lcd.setCursor(0,3); lcd.print("Int: 30 "); break; } } //end temperatura void umidade() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(">UMIDADE "); lcd.setCursor(0,3); lcd.print(" AJUSTE RELOGIO "); break; case 2: lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,0); lcd.print(" Umidade: "); lcd.setCursor(0,2); lcd.print("Ext: 58 "); lcd.setCursor(0,3); lcd.print("Int: 77 "); break; } } //end umidade void ajuste_relogio() { switch(sub_menu) { case 1: lcd.setCursor(0,0); lcd.print(" ILUMINACAO "); lcd.setCursor(0,1); lcd.print(" TEMPERATURA "); lcd.setCursor(0,2); lcd.print(" UMIDADE "); lcd.setCursor(0,3); lcd.print(">AJUSTE RELOGIO "); break; case 2: ajuste_sub(); break; } } //end ajuste_relogio void ajuste_sub() { switch(submenu2) { case 1: // ============ AJUSTE DA HORA =================================== lcd.clear(); //DateTime now = RTC.now(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(hourupg==23) // Se "hourupg" for igual a 23 { hourupg=0; // "hourupg" passa a ser 0 } else { hourupg=hourupg+1; // Se não, incrementa +1 a "hourupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(hourupg==0) // Se "hourupg" for igual a 0 { hourupg=23; // "hourupg" passa a ser 23 } else { hourupg=hourupg-1; // Se não, decrementa -1 a "hourupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Hora: ");// Escreve "Ajustar Hora" lcd.setCursor(0,3); lcd.print(hourupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 2: // ============ AJUSTE DOS MINUTOS ================================= lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if (minupg==59) // Se "minupg" for igual a 59 { minupg=0; // "minupg" passa a ser 0 } else { minupg=minupg+1; // Se não, incrementa +1 a "minupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(minupg==0) // Se "minupg" for igual a 0 { minupg=59; // "minupg" passa a ser 59 } else { minupg=minupg-1; // Se não, decrementa -1 a "minupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Minutos:");// Escreve "Ajustar Minutos" lcd.setCursor(0,3); lcd.print(minupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 3: // ============ AJUSTE DIA ====================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(dayupg==31) // Se "dayupg" for igual a 31 { dayupg=1; // "dayupg" passa a ser 1 } else { dayupg=dayupg+1; // Se não, incrementa +1 a "dayupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(dayupg==1) // Se "dayupg" for igual a 1 { dayupg=31; // "dayupg" passa a ser 31 } else { dayupg=dayupg-1; // se não, decrementa 11 a "dayupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Dia:");// Escreve "Ajustar dia" lcd.setCursor(0,3); lcd.print(dayupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 4: // ============ AJUSTE MÊS =========================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { if(monthupg==12) // Se "monthupg" for igual a 12 { monthupg=1; // "monthupg" passa a ser 1 } else { monthupg=monthupg+1; // Se não, incrementa +1 a "monthupg" } } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { if(monthupg==1) // Se "monthupg" for igual a 1 { monthupg=12; // "monthupg" passa a ser 12 } else { monthupg=monthupg-1; // Se não, decrementa -1 a "monthupg" } } lcd.setCursor(0,2); lcd.print("Ajustar Mes:"); // Escreve "Ajustar Mes" lcd.setCursor(0,3); lcd.print(monthupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 5: // ============ AJUSTAR ANO =================================== lcd.clear(); if(digitalRead(bt_dir)==LOW) // Se P2 estiver em nivel logico baixo { yearupg=yearupg+1; // Incrementa +1 a "yearupg" } if(digitalRead(bt_esq)==LOW) // Se P3 estiver em nivel logico baixo { yearupg=yearupg-1; // Decrementa -1 a "yearupg" } lcd.setCursor(0,0); // Posiciona o cursor na coluna 0 e linha 0 lcd.print("Ajustar Ano:"); // Escreve "Ajustar Ano" lcd.setCursor(0,1); lcd.print(yearupg,DEC); delay(200); if(!digitalRead(bt_enter)) {delay(150); submenu2 ++;} break; case 6: lcd.clear(); lcd.setCursor(0,0); lcd.print("SALVANDO..."); RTC.adjust(DateTime(yearupg,monthupg,dayupg,hourupg,minupg,0)); // Grava os dados no RTC delay(200); submenu2=1; sub_menu=1; menu_num=1; break; } //end switch } ACREDITO que o codigo esta uma lambança mas incrivelmente funciona, o LCD esta ligado por I2C para economizar pinos, ja que estou usando o Arduino UNO No caso dos botões, tem um "defeito" , se apertar as teclas de esquerda e direita, elas incrementam / decrementam sem estar dentro dos MENUS, logo quando voce aperta a tecla Menu ele ja esta dentro de outro.... + - isso. Com o codigo acima esta completo e funcional, vou desenhar o circuito e postar aqui, para quem quiser ulilizar o mesmo projeto e fazer melhorias serão bem vindos! A tela de "RESUMO" foi modificada para esta abaixo, ficou mais visual porém estou fora de casa então nao deu para pegar do Proteus, com isso os valores da hora / data nao estão aparecendo, somente os separadores E o valor da leitura de temp , umidade e foto-periodo tambem nao. Agora estou travado na leitura de temperatura e umidade com o millis e como habilitar a bomba / solenoide para irrigação.
  10. Segue o trecho do codigo: #define intervalo 2000 //INTERVALO DE LEITURA DO SENSOR DTH unsigned long delayIntervalo; //ARMAZENA O TEMPO DE COMPARAÇÃO COM MILLIS void loop() { leitura_temp(); //CHAMA FUNÇÃO DE LEITURA DE TEMPERATURA } void leitura_temp() { if ( (millis() - delayIntervalo) > intervalo ) { //LEITURA DOS DADOS unsigned long start = micros(); int chk = sensorDHT.read11(pinSensor); // unsigned long stop = micros(); /* VERIFICA SE HOUVE ERRO switch (chk) { case DHTLIB_OK: Serial.print("OK,\t"); break; case DHTLIB_ERROR_CHECKSUM: Serial.print("Checksum error,\t"); Esta parte esta comentada pois estava dando erro na leitura. break; case DHTLIB_ERROR_TIMEOUT: Serial.print("Time out error,\t"); break; case DHTLIB_ERROR_CONNECT: Serial.print("Connect error,\t"); break; case DHTLIB_ERROR_ACK_L: Serial.print("Ack Low error,\t"); break; case DHTLIB_ERROR_ACK_H: Serial.print("Ack High error,\t"); break; default: Serial.print("Unknown error,\t"); break; }*/ delayIntervalo = millis(); //CARREGA O VALOR DE MILLIS DENTRO DE delayIntervalo }; } //FINAL DA FUNÇÃO LEITURA TEMPERATURA
  11. Boa Tarde a Todos, Desculpem resgatar esse topico tão antigo mas fiz varias pesquisas e não encontrei claramente como "dar a volta" na função millis. Gostaria da ajuda de vocês! Estou em um projeto de estufa de hortaliças estou usando a função millis() para medição de umidade do solo e ao mesmo tempo habilitar uma solenoide para liberara agua. Sendo assim não consigo usar o delay() pois "travaria" a medição de umidade e não ia desabilitar a solenide ou vice e versa. A função millis() estoura em ~48 dias com isso pode ser que meu programa trave na solenoide com a agua aberta e cause um desastre, se alguem necessitar do codigo inteiro ou somente a parte do millis é só falar que eu posto aqui. Obrigado e Agradeço a todos desde já!!!!
  12. Boa Tarde a Todos! Gostaria de uma luz por onde começar, estou precisando criar um sistema parecido com cancelas de condomínio, ex: O carro esta passando pela câmera, e é identificado o numero da placa e a hora que ela esta passando. porém ate hoje só mexi com o Arduíno, e todos as bases que vi são pelo pyton, tesseract que não tive contato ate agora, vou postar uma ideia de interface no youtube: A Imagem da direita é da câmera ao vivo, a imagem da esquerda é a imagem a ser tratada para o reconhecimento da placa, depois listado ao lado. Onde eu posso desenvolver, qual plataforma utilizar, e caso precise de algum curso, qual curso buscar? Obrigado e Aguardo!
  13. Já efetuei o reset pelo botão, segura 20 segundos e tal, mas retorna na mesma. Como se não estivesse feito reset. Existe algum botão interno ou pads para "forçar" o reset?
  14. Bom Dia a todos! Comprei um roteador pela OLX da intelbras IWR300N mas quando tento entrar no Ip dele nao conecta, acessei o Ipconfig e aparece este endereço: Gateway Padrão. . . . . . . . . . . . . . . : fe80::1a0d:2cff:fe1c:1f3b%14 https://prnt.sc/o3x3t8 Alguém poderia me ajudar, ja tentei dar reset pelo botão mas nada mudou. Agradeço!

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!