2 programas de irrigação e o arduino nao esta realizando mais o processo. Para que nao fosse necessário usar delays eu estou calculando o tempo de ligar e desligar os setores e a bomba e deixando uma quantidade bem grande de if's para conferir as condições. Acho que pode ser nisso o problema:
O codigo esta muito grande, vou deixar ele em anexo mas vou citar o trecho que acredito ser o problema
void Bomba()//Tempo que a bomba ficará ligada{ delay(1000); while(tBomba >=1) { lcd.clear();lcd.setCursor(0,0);lcd.print("Tempo ");lcd.print(tBomba);lcd.print(" minutos"); lcd.setCursor(0,1);lcd.print("Enter");lcd.setCursor(7,1);lcd.print("(-)");lcd.setCursor(12,1);lcd.print("(+)"); delay(120); if(tBomba>60){tBomba=1;} if(digitalRead(bUp)==LOW){delay(70);tBomba++;} if(digitalRead(bDown)==LOW){delay(70);tBomba--;} if(digitalRead(bEnter)==LOW){delay(70);tB=tBomba;menu=0;tBomba=0;} if(digitalRead(bMode)==LOW){menu=0;tBomba=0;} //Vetores recebem horas e minutos e converte para minutos //Calculo Programa 1//Depois acrescenta o valor do tempo de bomba(tB)//Operação desliga bomba e valvula 4 //Retorna os valores para os vetores com o horario de desligar//Exemplo: Programa 1 - 6:30 com tempo de bomba 10min//Em minutos (6*60)+30+10=400minutos//Tranformando para desligar hora=400/60=6 e minuto=400%60=40
if(h[2]!=0 && h[1]!=0 && h[30]==0 && tB!=0){ h[34]=h[2];h[33]=h[1]; h[34]=h[34]*60;h[34]=h[34]+h[33]+(4*tB);h[33]=h[34]%60;h[34]=h[34]/60; h[8]=h[2];h[7]=h[1]; h[8]=h[8]*60;h[8]=h[8]+h[7]+tB;h[7]=h[8]%60;h[8]=h[8]/60;//1 tempo(desliga 1 e liga 2) h[10]=h[2];h[9]=h[1]; h[10]=h[10]*60;h[10]=h[10]+h[9]+(2*tB);h[9]=h[10]%60;h[10]=h[10]/60;//2 tempo(desliga 2 e liga 3) h[12]=h[2];h[11]=h[1]; h[12]=h[12]*60;h[12]=h[12]+h[11]+(3*tB);h[11]=h[12]%60;h[12]=h[12]/60;//3 tempo(desliga 3 e liga 4) //Calculo Programa 2 if(h[4]!=0 && h[3]!=0 && h[31]==0){ h[14]=h[4];h[15]=h[3]; h[14]=h[14]*60;h[14]=h[14]+h[15]+(4*tB);h[15]=h[14]%60;h[14]=h[14]/60;//Operação Desliga bomba e valvula 4 h[16]=h[4];h[17]=h[3]; h[16]=h[16]*60;h[16]=h[16]+h[17]+tB;h[17]=h[16]%60;h[16]=h[16]/60;//1 tempo(desliga 1 e liga 2) h[18]=h[4];h[19]=h[3]; h[18]=h[18]*60;h[18]=h[18]+h[19]+(2*tB);h[19]=h[18]%60;h[18]=h[18]/60;//2 tempo(desliga 2 e liga 3) h[20]=h[4];h[21]=h[3]; h[20]=h[20]*60;h[20]=h[20]+h[21]+(3*tB);h[21]=h[20]%60;h[20]=h[20]/60;//3 tempo(desliga 3 e liga 4) h[31]=1; //Calculo Programa 3 if(h[6]!=0 && h[5]!=0 && h[32]==0){ h[22]=h[6];h[23]=h[5]; h[22]=h[22]*60;h[22]=h[22]+h[23]+(4*tB);h[23]=h[22]%60;h[22]=h[22]/60;//Operação Desliga bomba e valvula 4 h[24]=h[6];h[25]=h[5]; h[24]=h[24]*60;h[24]=h[24]+h[25]+tB;h[25]=h[24]%60;h[24]=h[24]/60;//1 tempo(desliga 1 e liga 2) h[26]=h[6];h[27]=h[5]; h[26]=h[26]*60;h[26]=h[26]+h[27]+(2*tB);h[27]=h[26]%60;h[26]=h[26]/60;//2 tempo(desliga 2 e liga 3) h[28]=h[6];h[29]=h[5]; h[28]=h[28]*60;h[28]=h[28]+h[29]+(3*tB);h[29]=h[28]%60;h[28]=h[28]/60;//3 tempo(desliga 3 e liga 4) h[32]=1; } }//Fim if Programa 2 h[30]=1;tempo=1; }//Fim if Programa 1 }//Fim While}
if(d[0]=1){//Se apção todos os dias for selecionada //Horarios Para Programa 1 if(h[2]==RTCValues[4] && h[1]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba,HIGH);digitalWrite(vs1,LOW);delay(70);}//Liga bomba e valvula 1 if(h[8]==RTCValues[4] && h[7]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs1,HIGH);digitalWrite(vs2,LOW);delay(70);}//Desliga Valvula 1 e liga Valvula 2 if(h[10]==RTCValues[4] && h[9]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs2,HIGH);digitalWrite(vs3,LOW);delay(70);}//Desliga Valvula 2 e liga Valvula 3 if(h[12]==RTCValues[4] && h[11]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs3,HIGH);digitalWrite(vs4,LOW);delay(70);}//Desliga Valvula 3 e liga Valvula 4 if(h[34]==RTCValues[4] && h[33]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba,LOW);digitalWrite(vs4,HIGH);delay(70);}//Desliga bomba e desliga Valvula 4 //Horarios Para Programa 2 if(h[4]==RTCValues[4] && h[3]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba, HIGH);digitalWrite(vs1,LOW);}//Liga bomba e valvula 1 if(h[16]==RTCValues[4] && h[17]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs1,HIGH);digitalWrite(vs2,LOW);}//Desliga Valvula 1 e liga Valvula 2 if(h[18]==RTCValues[4] && h[19]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs2,HIGH);digitalWrite(vs3,LOW);}//Desliga Valvula 2 e liga Valvula 3 if(h[20]==RTCValues[4] && h[21]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs3,HIGH);digitalWrite(vs4,LOW);}//Desliga Valvula 3 e liga Valvula 4 if(h[14]==RTCValues[4] && h[15]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba,LOW);digitalWrite(vs4,HIGH);}//Desliga bomba e desliga Valvula 4 //Horarios Para Programa 3 if(h[6]==RTCValues[4] && h[5]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba, HIGH);digitalWrite(vs1,LOW);}//Liga bomba e valvula 1 if(h[24]==RTCValues[4] && h[25]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs1,HIGH);digitalWrite(vs2,LOW);}//Desliga Valvula 1 e liga Valvula 2 if(h[26]==RTCValues[4] && h[27]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs2,HIGH);digitalWrite(vs3,LOW);}//Desliga Valvula 2 e liga Valvula 3 if(h[28]==RTCValues[4] && h[29]==RTCValues[5] && RTCValues[6]==0){digitalWrite(vs3,HIGH);digitalWrite(vs4,LOW);}//Desliga Valvula 3 e liga Valvula 4 if(h[22]==RTCValues[4] && h[23]==RTCValues[5] && RTCValues[6]==0){digitalWrite(bomba,LOW);digitalWrite(vs4,HIGH);}//Desliga bomba e desliga Valvula 4 }
As variaveis h[1]...h[6] Recebem os horarios de irrigação. Impares minutos e Pares horas…
rial.begin (9600);if (!SD.begin(4)){Serial.println("Erro ao iniciar o cartao SD !");inicio_ok =0;return;}
Serial.println ("Iniciacao Ok!");}
void loop (){ Mostrarelogio(); delay(1000); {if (inicio_ok) { int opcao = Serial.read();if (opcao == 'C'){Serial.println ("Opcao Configuracao Selecionada");opcao = Serial.read();while (opcao == -1){opcao = Serial.read();}int valorConfig = opcao - 48;EEPROM.write (0 , valorConfig);Serial.print ("Valor gravado com sucesso:");Serial.println (valorConfig);}else if (opcao == 'w'){while (opcao !='x'){int leituraSensor = analogRead (0);arquivo = SD.open ("sensor.txt, FILE_WRITE");if (arquivo){arquivo.print ("Valor do sensor em:");arquivo.print (millis());arquivo.print (" ms: ");arquivo. println (leituraSensor);arquivo.close();delay (1000 * EEPROM.read (0));Serial.print ("Feita leitura do sensor em");Serial.print (EEPROM.read(0), DEC);Serial.println("segs.");}else{Serial.println ("Erro ao abrir o arquivo para escrita!");}opcao = Serial.read();}Serial.println ("Terminando leitura do Sensor!");}else if (opcao == 'r'){arquivo = SD.open ("sensor.txt");if (arquivo){while (arquivo.available()){Serial.write( arquivo.read());}arquivo.close();Serial.println("Termino da leitura");}else{Serial.println ("Erro ao abrir arquivo para leitura");}}else if (opcao == 'e'){SD.remove ("sensor.txt");if (!SD.exists ("sensor.txt") ){Serial.println ("Arquivo apagado com ");}else{Serial.println ("Erro ao apagar arquivo!"); } } }}}
void SelecionaDataeHora() //Seta a data e a hora do DS1307{ byte segundos = 40; //Valores de 0 a 59 byte minutos = 59; //Valores de 0 a 59 byte horas = 23; //Valores de 0 a 23 byte diadasemana = 1; //Valores de 0 a 6 - 0=Domgino, 1 = Segunda, etc. byte dia = 17; //Valores de 1 a 31 byte mes = 4; //Valores de 1 a 12 byte ano = 13; //Valores de 0 a 99
Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados
//As linhas abaixo escrevem no CI os valores de data e hora que foram colocados nas variaveis acima Wire.write(ConverteParaBCD(segundos)); Wire.write(ConverteParaBCD(minutos)); Wire.write(ConverteParaBCD(horas)); Wire.write(ConverteParaBCD(diadasemana)); Wire.write(ConverteParaBCD(dia)); Wire.write(ConverteParaBCD(mes)); Wire.write(ConverteParaBCD(ano));
Wire.write(zero); //Start no CI Wire.endTransmission(); }
byte ConverteParaBCD(byte val){ //Converte o número de decimal para BCD return ( (val/10*16) + (val%10) );}
byte ConverteparaDecimal(byte val) { //Converte de BCD para decimal return ( (val/16*10) + (val%16) );}
void Mostrarelogio(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int segundos = ConverteparaDecimal(Wire.read()); int minutos = ConverteparaDecimal(Wire.read()); int horas = ConverteparaDecimal(Wire.read() & 0b111111); int diadasemana = ConverteparaDecimal(Wire.read()); int dia = ConverteparaDecimal(Wire.read()); int mes = ConverteparaDecimal(Wire.read()); int ano = ConverteparaDecimal(Wire.read());
//Mostra a data no Serial Monitor Serial.print("Data: "); Serial.print(dia); Serial.print("/"); Serial.print(mes); Serial.print("/"); Serial.print(ano); Serial.print(" "); Serial.print("Hora : "); Serial.print(horas); Serial.print(":"); Serial.print(minutos); Serial.print(":"); Serial.print(segundos); switch(diadasemana) { case 0:Serial.println(", Domingo"); break; case 1:Serial.println(", Segunda"); break; case 2:Serial.println(", Terca"); break; case 3:Serial.println(", Quarta"); break; case 4:Serial.println(", Quinta"); break; case 5:Serial.println(", Sexta"); break; case 6:Serial.println(", Sabado"); }}…
display 16X2 Criado por Eng. Carlos kwiek - Rio de Janeiro - RJ - Brasil 02 de Agosto de 2015 - e-mail carloskwiek1@hotmail.com O codigo é livre para uso e modificação, seguindo as diretivas de software open source. Use por sua conta e risco. */
#include "Wire.h"#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68
// Inicializa o LCDLiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte zero = 0x00; int buzzer = 13;
void setup(){ pinMode (buzzer, OUTPUT); // Define o LCD com 16 colunas e 2 linhas lcd.begin(16, 4); Wire.begin(); Serial.begin(9600); // A linha abaixo pode ser retirada apos setar a data e hora // SelecionaDataeHora(); }
void loop(){ Mostrarelogio(); delay(1000);}
void SelecionaDataeHora() // Seta a data e a hora do DS1307{byte segundos = 01; // Valores de 0 a 59byte minutos = 30; // Valores de 0 a 59byte horas = 19; // Valores de 0 a 23byte diadasemana = 0; // Valores de 0 a 6 (0=Domingo, 1 = Segunda...)byte diadomes = 22; // Valores de 1 a 31byte mes = 11; // Valores de 1 a 12byte ano = 15; // Valores de 0 a 99 Wire.beginTransmission(DS1307_ADDRESS); // Stop no CI para que o mesmo possa receber os dados Wire.write(zero);
// As linhas abaixo escrevem no CI os valores de // data e hora que foram colocados nas variaveis acima Wire.write(ConverteParaBCD(segundos)); Wire.write(ConverteParaBCD(minutos)); Wire.write(ConverteParaBCD(horas)); Wire.write(ConverteParaBCD(diadasemana)); Wire.write(ConverteParaBCD(diadomes)); Wire.write(ConverteParaBCD(mes)); Wire.write(ConverteParaBCD(ano)); Wire.write(zero); //Start no CI Wire.endTransmission(); }
byte ConverteParaBCD(byte val){ // Converte o número de decimal para BCD return ( (val/10*16) + (val%10) );}
byte ConverteparaDecimal(byte val) { // Converte de BCD para decimal return ( (val/16*10) + (val%16) );}
void Mostrarelogio(){ Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int segundos = ConverteparaDecimal(Wire.read()); int minutos = ConverteparaDecimal(Wire.read()); int horas = ConverteparaDecimal(Wire.read() & 0b111111); //int diadasemana = ConverteparaDecimal(Wire.read()); int diadomes = ConverteparaDecimal(Wire.read()); int mes = ConverteparaDecimal(Wire.read()); int ano = ConverteparaDecimal(Wire.read()); // Imprime mensagem na primeira linha do display lcd.setCursor(0,0); lcd.print("DATA: ");
// Mostra a hora atual no display lcd.setCursor(6, 1); if (horas < 10) { lcd.print("0"); } lcd.print(horas); lcd.print(":"); if (minutos < 10) { lcd.print("0"); } lcd.print(minutos); lcd.print(":"); if (segundos < 10) { lcd.print("0"); } lcd.print(segundos); // Mostra a HORA atual no display lcd.setCursor(0,1); lcd.print("HORA: "); lcd.setCursor(0, 2); lcd.print(" "); lcd.setCursor(6,0); if (diadomes < 10) { lcd.print("0"); } lcd.print(diadomes); lcd.print("."); if (mes < 10) { lcd.print("0"); } lcd.print(mes); lcd.print("."); lcd.print(ano); // Definicao do alarme. if (horas == 06 && minutos == 00 && segundos == 0)//Define a hora de tocar o alarme por 1o segundos { digitalWrite (buzzer, HIGH);// Eleva tensao pino 13 para 5V delay (10000);// Atrasa 50ms } { digitalWrite (buzzer, LOW); //Abaixa tensao pino 13 para 0V }
if (horas == 18 && minutos == 00 && segundos == 00)//Define a hora de tocar o alarme por 10 segundos { digitalWrite (buzzer, HIGH);// Eleva tensao pino 13 para 5V delay (10000);// Atrasa 50ms } { digitalWrite (buzzer, LOW); //Abaixa tensao pino 13 para 0V }
}…
o sensor.. o mega, manda sinal pro modulo de rele ligar..
alguem pode me ajudar
#include <NewPing.h>
int led1 = 22; int led2 = 23; int led3 = 24; int led4 = 25; int led5 = 26; int led6 = 27; int led7 = 28; int led8 = 29; int led9 = 30; int led10 = 31; int led11 = 32; int led12 = 33; int led13 = 34; int led14 = 35; int led15 = 36; int led16 = 37;
#define SONAR_NUM 2 // Define o numero de sensores#define MAX_DISTANCE 200 // Distancia maxima#define PING_INTERVAL 33 // Milisegundos de intervalo entre medicoes
unsigned long pingTimer[SONAR_NUM]; // Armazena a quantidade de vezes que a medicao deve ocorrer, para cada sensorunsigned int cm[SONAR_NUM]; // Armazena o numero de medicoesuint8_t currentSensor = 0; // Armazena o sensor que esta ativo
NewPing sonar[SONAR_NUM]= { // Armazena informacoes sobre a pinagem dos sensores NewPing(9, 8, MAX_DISTANCE), // Pino trigger, echo e distancia máxima, para cada sensor NewPing(4, 3, MAX_DISTANCE), };
int i = 1;int totalSaidas = (22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37);int t = 200; //tempo entre o acender dos leds.int tempo = 2000; //tempo que fica aceso os leds para depois apagar.
void setup(){Serial.begin(9600); //Inicializando o serial monitor pingTimer[0] = millis() + 75; //Primeira medicao começa com 75ms for (uint8_t i = 1; i < SONAR_NUM; i++) //Define o tempo de inicializacao de cada sensor pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
pinMode(led1,OUTPUT); pinMode(led2,OUTPUT); pinMode(led3,OUTPUT); pinMode(led4,OUTPUT); pinMode(led5,OUTPUT); pinMode(led6,OUTPUT); pinMode(led7,OUTPUT); pinMode(led8,OUTPUT); pinMode(led9,OUTPUT); pinMode(led10,OUTPUT); pinMode(led11,OUTPUT); pinMode(led12,OUTPUT); pinMode(led13,OUTPUT); pinMode(led14,OUTPUT); pinMode(led15,OUTPUT); pinMode(led16,OUTPUT); digitalWrite(totalSaidas,LOW);}void loop(){
for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop entre todos os sensores if (millis() >= pingTimer[i]) { pingTimer[i] += PING_INTERVAL * SONAR_NUM; //Define o tempo que o proximo sensor sera acionado if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Ciclo do sensor completo sonar[currentSensor].timer_stop(); // Reseta o timer antes de ler o proximo sensor currentSensor = i; // Número do sensor sendo acionado cm[currentSensor] = 0; // Se nao houver eco do sensor, seta a distância como zero sonar[currentSensor].ping_timer(echoCheck); } }} void echoCheck() { //Se receber um sinal (eco), calcula a distancia if (sonar[currentSensor].check_timer()) cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; }
void oneSensorCycle() { // Ciclo de leitura do sensorfor (uint8_t i = 0; i <SONAR_NUM; i++){ Serial.print(i); Serial.print("="); Serial.print(cm[i]); Serial.print("cm "); delay(1000); Serial.println();}
if (cm[0] > 10 && cm[0] < 100);{ for (int i=1; i<=totalSaidas; i++){ digitalWrite(i, HIGH); delay(t); } delay(tempo); for (int i=1; i<=totalSaidas; i++){ digitalWrite(i, LOW); delay(t); }}//Se for detectado objeto entre 0 e 50 cm do sensor2, acende o led if (cm[1] > 10 && cm[1] < 100) { for (int i=1; i<=totalSaidas; i++){ digitalWrite(totalSaidas+1-i, HIGH); delay(t); } delay(tempo); for (int i=1; i<=totalSaidas; i++){ digitalWrite(totalSaidas+1-i, LOW); delay(t); } } }
…