Automatic Irrigation (Adjust Hour)
My Project
1
Posts
1
Posters
686
Views
1
Watching
-
#include <string.h> #include <Wire.h> #include <DS1307.h> #include <avr/wdt.h> #include <EEPROM.h> #include <LiquidCrystal.h> #include <TimerOne.h> char dateTime[20]; int RTCValues[7]; char acertahora[8]; int programas[21]; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); const int analogS = 0; // Sensor connected to Analog 0 const int relay1 =12; // Led connected at pin 13 ( Dry ON- Wet OFF) const int led2= 13; // Led connectected at pin 12(Dry OFF - Wet ON) const int relay2 = 11; // Realay connected at pin 8 boolean up = 8; boolean sete = 9; boolean dow = 10; int i = 0; int p = 0; byte z = 0; byte h = 0; byte db = 0; boolean m = 0; boolean o = 0; int d = 0; int d1 = 0; byte menu = 0; byte program =0; int humidad = 0; int reading = 0; byte estouro = 0; int deslbomba = 0; int deslbomba2 = 0; void setup() { Serial.begin(9600);// initialize serial communications at 9600 bps DS1307.begin(); lcd.begin(16, 2); Timer1.initialize(500000); Timer1.attachInterrupt(interrup); pinMode(relay1, OUTPUT);// declare the ledPin as an OUTPUT: pinMode(relay2, OUTPUT); // Declare relay as Output pinMode(led2, OUTPUT); // pinMode(up, INPUT); digitalWrite(up, HIGH); pinMode(dow, INPUT); digitalWrite(dow, HIGH); pinMode(sete, INPUT); digitalWrite(sete, HIGH); digitalWrite(relay1, LOW); // Led off at start up humidad = EEPROM.read(50); o = EEPROM.read(51); for (int x=0; x<10; x++){programas[x] = EEPROM.read(x);} *((char*)&deslbomba) = EEPROM.read(52); *((char*)&deslbomba + 1) = EEPROM.read(53); } void interrup() { d1 = d1++; if(!menu == 0){estouro = estouro++;} if(!p == 0){estouro = estouro++;} if(!db == 0){estouro = estouro++;} if(!h == 0){estouro = estouro++;} if(!i == 0){estouro = estouro++;} if(m == 1){estouro = estouro++;} if(o == 1 && digitalRead(relay2)==HIGH && (reading > humidad)){deslbomba2 = deslbomba2++;} if(o == 0 && digitalRead(relay2)==HIGH && reading >= humidad){deslbomba2 = deslbomba2++;} // ou seja a bomba vai ligar ate atingir a humidade necessaria, quando a humidade for atingida ela conta um tempo que é o delay off bomba e depois desliga. } void acertartc()// COMANDO PARA ACERTAR A DATA E A HORA. { wdt_disable(); // DESABILITA A FUNÇÃO WDT NESTA PARTE DO PROGRAMA. delay(1000); while( i> 0 && i<8) { lcd.clear(); lcd.setCursor(0,0); if(i==1){lcd.print(" Entre com Ano ");} if(i==2){lcd.print(" Entre com Mes ");} if(i==3){lcd.print(" Entre com Dia ");} if(i==4){lcd.print(" Entre cm Semana");} if(i==5){lcd.print(" Entre com Hora ");} if(i==6){lcd.print(" Entre com Minut");} if(i==7){lcd.print(" Entre com Segun");} if(digitalRead(up) == LOW){acertahora[i]++;estouro = 0;} if(digitalRead(dow) == LOW && acertahora[i] >= 0){acertahora[i]--;estouro = 0;} if(digitalRead(sete) == LOW){i ++;estouro = 0;} if(acertahora[1] < 1 ){acertahora[1] = 13;} if(acertahora[2] > 12){acertahora[2] = 1;} if(acertahora[2] == 0){acertahora[2] = 12;} if(acertahora[3] > 31){acertahora[3] = 1;} if(acertahora[3] == 0){acertahora[3] = 31;} if(acertahora[4] > 7){acertahora[4] = 1;} if(acertahora[4] == 0){acertahora[4] = 7;} if(acertahora[5] > 23){acertahora[5] = 0;} if(acertahora[5] == -1){acertahora[5] = 23;} if(acertahora[6] > 59){acertahora[6] = 0;} if(acertahora[6] == -1){acertahora[6] = 59;} if(acertahora[7] > 59){acertahora[7] = 0;} if(acertahora[7] == -1){acertahora[7] = 59;} lcd.setCursor(9, 1); lcd.print(acertahora[i], DEC); if(estouro == 20){ i = 0 ; estouro = 0;} delay(200); } DS1307.setDate(acertahora[1], acertahora[2], acertahora[3], acertahora[4], acertahora[5], acertahora[6], acertahora[7]); // AQUI ENVIAMOS OS DADOS DEFINIDOS PARA O REAL TIME CLOK lcd.clear(); } void menus() { wdt_disable(); delay(1000); lcd.clear(); while(menu > 0) { lcd.setCursor(0,0); if(menu==1){lcd.print("Definir Horarios"); if(digitalRead(sete)==LOW){p=1; menu=0; programa();}} if(menu==2){lcd.print("Definir Umidade "); if(digitalRead(sete)==LOW){h = 1; menu=0; humidade();}} if(menu==3){lcd.print("Acerta dt e a Hr"); if(digitalRead(sete)==LOW){i=1; menu=0; acertartc();}} if(menu==4){lcd.print("delay off bomba "); if(digitalRead(sete)==LOW){db=1; menu=0; offbomba();}} if(menu==5){lcd.print("Zerar programas "); if(digitalRead(sete)==LOW){z=1; menu=0; zera();}} if(menu==6){lcd.print("Modo de Operacao"); if(digitalRead(sete)==LOW){m=1; menu=0; operacao();}} if(digitalRead(up)==LOW && menu < 6){menu++;estouro = 0;} if(digitalRead(dow)==LOW && menu > 0){menu--;estouro = 0;} if(estouro == 20){ menu = 0 ; estouro = 0;} delay(400); } lcd.clear(); } void programa() { wdt_disable(); delay(1000); lcd.clear(); while( p> 0 && p<7) { lcd.clear(); lcd.setCursor(0,0); if(p==1 || p==2){lcd.print(" Programa 1 "); lcd.setCursor(2, 1);lcd.print(programas[1], DEC);lcd.print(':');lcd.print(programas[2]);lcd.print(" horas");} if(p==3 || p==4){lcd.print(" Programa 2 "); lcd.setCursor(2, 1);lcd.print(programas[3], DEC);lcd.print(':');lcd.print(programas[4]);lcd.print(" horas");} if(p==5 || p==6){lcd.print(" Programa 3 "); lcd.setCursor(2, 1);lcd.print(programas[5], DEC);lcd.print(':');lcd.print(programas[6]);lcd.print(" horas");} if(digitalRead(up) == LOW ){programas[p]++;estouro = 0;} if(digitalRead(dow) == LOW && programas[p] >= 0 ){programas[p]--;estouro = 0;} if(digitalRead(sete) == LOW){p ++;estouro = 0;} if(estouro == 30){ p = 0 ; estouro = 0;} if(programas[1] > 23){programas[1] = 0; } if(programas[1] < 0){programas[1] = 23; } if(programas[3] > 23){programas[3] = 0; } if(programas[3] < 0){programas[3] = 23; } if(programas[5] > 23){programas[5] = 0; } if(programas[5] < 0){programas[5] = 23; } if(programas[2] > 59){programas[2] = 0; } if(programas[2] < 0){programas[2] = 59; } if(programas[4] > 59){programas[4] = 0; } if(programas[4] < 0){programas[4] = 59; } if(programas[6] > 59){programas[6] = 0; } if(programas[6] < 0){programas[6] = 59; } delay(400); } for (int x=0; x<10; x++) { EEPROM.write(x, programas[x]); } for(int x = 0; x < 16; x++) {delay(90);lcd.setCursor(x,1);lcd.write(B11111111);} lcd.clear(); p = 0; } void humidade() { wdt_disable(); delay(1000); lcd.clear(); while(h > 0) { lcd.setCursor(0,0); lcd.print("Definir Umidade "); if(digitalRead(up) == LOW && humidad < 100 ){humidad ++;estouro = 0;} if(digitalRead(dow) == LOW && humidad > 0){humidad --;estouro = 0;} if(digitalRead(sete) == LOW){h = 0;estouro = 0;} lcd.setCursor(5, 1);lcd.print(humidad);lcd.print("% "); if(estouro == 20){ h = 0 ; estouro = 0;} delay(150); } EEPROM.write(50, humidad); for(int x = 0; x < 16; x++) {delay(90);lcd.setCursor(x,1);lcd.write(B11111111);} lcd.clear(); } void offbomba() { { wdt_disable(); delay(1000); lcd.clear(); while(db > 0) { lcd.setCursor(0,0); lcd.print("Delay off bomba"); if(digitalRead(up) == LOW){deslbomba ++;estouro = 0;} if(digitalRead(dow) == LOW && deslbomba > 0){deslbomba --;estouro = 0;} if(digitalRead(sete) == LOW){db = 0;estouro = 0;} lcd.setCursor(5, 1);lcd.print(deslbomba);lcd.print(" Segundos"); delay(150); if(estouro == 30){ db = 0 ; estouro = 0;} } EEPROM.write(52,*((char*)&deslbomba )); EEPROM.write(53, *((char*)&deslbomba + 1)); } for(int x = 0; x < 16; x++) {delay(90);lcd.setCursor(x,1);lcd.write(B11111111);} lcd.clear(); } void zera() { lcd.setCursor(4, 0); lcd.clear(); lcd.print("Zerando"); for (int x=0; x<10; x++) { EEPROM.write(x, 0); } for (int x=0; x<10; x++){programas[x] = EEPROM.read(x);} for(int x = 0; x < 16; x++) {delay(90);lcd.setCursor(x,1);lcd.write(B11111111);} lcd.clear(); } void operacao() { wdt_disable(); delay(500); lcd.clear(); while(m > 0) { lcd.setCursor(0,0); lcd.print("Modo de Controle"); lcd.setCursor(0,1); lcd.print("Dow = Um Up = Pr"); if(digitalRead(up) == LOW){o = 0;digitalWrite(relay2, LOW); m = 0 ;} if(digitalRead(dow) == LOW){ o = 1; m = 0 ;} if(estouro == 30){ m = 0 ; estouro = 0;} } EEPROM.write(51, o); for(int x = 0; x < 16; x++) {delay(90);lcd.setCursor(x,1);lcd.write(B11111111);} lcd.clear(); } void mostrahora() { DS1307.getDate(RTCValues); sprintf(dateTime, "%02d:%02d:%02d %02d/%02d", RTCValues[4], RTCValues[5], RTCValues[6], RTCValues[2], RTCValues[1]); delay(50); lcd.setCursor(0,0); lcd.print(dateTime); delay(50); } void teste() { if(programas[1] == RTCValues[4] && programas[2] == RTCValues[5] && RTCValues[6] == 0 && reading < humidad){ digitalWrite(relay2, HIGH);} if(programas[3] == RTCValues[4] && programas[4] == RTCValues[5] && RTCValues[6] == 0 && reading < humidad){ digitalWrite(relay2, HIGH);} if(programas[5] == RTCValues[4] && programas[6] == RTCValues[5] && RTCValues[6] == 0 && reading < humidad){ digitalWrite(relay2, HIGH);} if(o == 1 && reading < humidad){ digitalWrite(relay2, HIGH);}else{if(o == 1 && (deslbomba2/2) >= deslbomba){digitalWrite(relay2, LOW);}}// Caso queira que a bomba não desligue imediatamente coloque aqui seu delay. if(RTCValues[4] == 0 && RTCValues[5] == 0 && RTCValues[6] == 0) { digitalWrite(relay2, LOW);} } void informa() { if(d1<= 10){lcd.setCursor(0,1);lcd.print("Setpoint. ");lcd.print(humidad);lcd.print("% ");} if(d1>10 && d1<=15){lcd.setCursor(0,1);lcd.print("Sensor ");lcd.print(reading);lcd.print("% ");} if(d1>15 && d1<=20){lcd.setCursor(0,1);if(digitalRead(relay2)==HIGH){lcd.print("> Bomba ligada <");}else{lcd.print("Bomba Desligada ");}} if(d1>20 && d1<=25){lcd.setCursor(0,1);if(reading < humidad){lcd.print("Umidade Baixa!!!");}else{lcd.print(" Umidade Normal ");}} if(d1>25 && d1<=30){lcd.setCursor(0,1);lcd.print("Irrigador Autom.");} if(d1>=30){d1=0;} } void Nivel() { int nivelMax = analogRead(1); int nivelMini = analogRead(2); if(nivelMax < 10) {digitalWrite(relay1 , LOW);} if(nivelMini < 10 && nivelMax > 500) {digitalWrite(relay1 , HIGH);} } void loop() { if(digitalRead(sete)==LOW){menu =1; menus();} reading = map(analogRead(analogS),0, 1023, 0, 100); mostrahora(); informa(); teste(); Nivel(); if(digitalRead(relay2)==HIGH && (deslbomba2/2) >= deslbomba){digitalWrite(relay2, LOW);deslbomba2 = 0;} if(reading < humidad){ digitalWrite(led2, HIGH);}else{digitalWrite(led2, LOW); } //for (int b=0; b<21; b++){ // Serial.println(programas[b]);} //Serial.println(humidad , DEC); } I know i should learn and make myself the code, but i need this working by the end of this month, so, i pray for anyone that could look to the code and change it to work the same way but with a LCDkeypas instead of a typical LCD, it would really help me guys, and i promise i will learn when i got time.