[Из песочницы] Экономим электричество или таймер времени для ночного тарифа в электросетях
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib#include
//на пин A4 цепляем SDA монитора и SDA часов//на пин A5 цепляем SCL монитора и SCL часов
int FullMinutesTimerOn = EEPROM.read (0); int FullMinutesTimerOff = EEPROM.read (2); int rtc[7]; byte rr[7]; int ledPin = 13; LiquidCrystal_I2C lcd (0×27,20,4); // set the LCD address to 0×27 for a 16 chars and 2 line displayint button1 = 10; //кнопка на пин D10int button2 = 9; //кнопка на пин D9int button3 = 8; //кнопка на пин D8int button4 = 7; //кнопка на пин D7int button5 = 6; //кнопка на пин D6int led = 5; int rejim=0; //переменная режима изменения настроек таймераint PrevSec=0; int CurSec=0; boolean lastButton=LOW;
byte LT[8] ={
B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111}; byte UB[8] ={B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000}; byte RT[8] ={
B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111}; byte LL[8] ={
B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111}; byte LB[8] ={B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111}; byte LR[8] ={
B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100}; byte MB[8] ={B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111}; byte block[8] ={B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111};// loop counterint count = 0;
void setup () {DDRC|=_BV (2) |_BV (3); // POWER: Vcc GndPORTC |=_BV (3); // VCC PINC3pinMode (ledPin, OUTPUT);//pinMode (timePIN, OUTPUT); pinMode (RELE_1, OUTPUT); //инициируем реле только на выходpinMode (RELE_2, OUTPUT); //инициируем реле только на выходdigitalWrite (RELE_1, HIGH); // запускаем реле выключеннымиdigitalWrite (RELE_2, HIGH); // запускаем реле выключенными
RTC.get (rtc, true); lcd.init (); // initialize the lcdlcd.backlight (); lcd.home ();
lcd.createChar (0, LT); lcd.createChar (1, UB); lcd.createChar (2, RT); lcd.createChar (3, LL); lcd.createChar (4, LB); lcd.createChar (5, LR); lcd.createChar (6, MB); lcd.createChar (7, block);
// sets the LCD’s rows and colums: lcd.clear ();
RTC.SetOutput (DS1307_SQW32KHZ); pinMode (led, OUTPUT); pinMode (button1, INPUT); pinMode (button2, INPUT); pinMode (button3, INPUT);}
void custom0(int x){ // uses segments to build the number 0
lcd.setCursor (x,0); // set cursor to column 0, line 0 (first row)lcd.write (0); // call each segment to createlcd.write (1); // top half of the numberlcd.write (2); lcd.setCursor (x, 1); // set cursor to colum 0, line 1 (second row)lcd.write (3); // call each segment to createlcd.write (4); // bottom half of the numberlcd.write (5);}
void custom1(int x){lcd.setCursor (x,0); lcd.write (1); lcd.write (2); lcd.print (» »); lcd.setCursor (x,1); lcd.write (4); lcd.write (7); lcd.write (4);}
void custom2(int x){lcd.setCursor (x,0); lcd.write (6); lcd.write (6); lcd.write (2); lcd.setCursor (x, 1); lcd.write (3); lcd.write (4); lcd.write (4);}
void custom3(int x){lcd.setCursor (x,0); lcd.write (6); lcd.write (6); lcd.write (2); lcd.setCursor (x, 1); lcd.write (4); lcd.write (4); lcd.write (5);}
void custom4(int x){lcd.setCursor (x,0); lcd.write (3); lcd.write (4); lcd.write (7); lcd.setCursor (x, 1); lcd.print (» »); lcd.print (» »); lcd.write (7);}
void custom5(int x){lcd.setCursor (x,0); lcd.write (3); lcd.write (6); lcd.write (6); lcd.setCursor (x, 1); lcd.write (4); lcd.write (4); lcd.write (5);}
void custom6(int x){lcd.setCursor (x,0); lcd.write (0); lcd.write (6); lcd.write (6); lcd.setCursor (x, 1); lcd.write (3); lcd.write (4); lcd.write (5);}
void custom7(int x){lcd.setCursor (x,0); lcd.write (1); lcd.write (1); lcd.write (2); lcd.setCursor (x, 1); lcd.print (» »); lcd.print (» »); lcd.write (7);}
void custom8(int x){lcd.setCursor (x,0); lcd.write (0); lcd.write (6); lcd.write (2); lcd.setCursor (x, 1); lcd.write (3); lcd.write (4); lcd.write (5);}
void custom9(int x){lcd.setCursor (x,0); lcd.write (0); lcd.write (6); lcd.write (2); lcd.setCursor (x, 1); lcd.print (» »); lcd.print (» »); lcd.write (7);
}
void digitalClockDisplay (){// digital clock display of the time
printDigits (rtc[2]/10,0); printDigits (rtc[2]%10,4);
printDigits (rtc[1]/10,9); printDigits (rtc[1]%10,13);
if (rtc[0]%10%2==0){lcd.setCursor (7, 0); lcd.print (»+ »); lcd.setCursor (7, 1); lcd.print (» +»); lcd.setCursor (3, 1); lcd.print (»+»); lcd.setCursor (12, 0); lcd.print (»+»); lcd.setCursor (3, 0); lcd.print (» »); lcd.setCursor (12, 1); lcd.print (» »);}else{lcd.setCursor (7, 0); lcd.print (» +»); lcd.setCursor (7, 1); lcd.print (»+ »); lcd.setCursor (3, 0); lcd.print (»+»); lcd.setCursor (12, 1); lcd.print (»+»); lcd.setCursor (3, 1); lcd.print (» »); lcd.setCursor (12, 0); lcd.print (» »);}//нарисовали двоеточие
}
void printDigits (int digits, int x){// utility function for digital clock display: prints preceding colon and leading 0
switch (digits) {case 0: custom0(x); break; case 1: custom1(x); break; case 2: custom2(x); break; case 3: custom3(x); break; case 4: custom4(x); break; case 5: custom5(x); break; case 6: custom6(x); break; case 7: custom7(x); break; case 8: custom8(x); break; case 9: custom9(x); break;
}
}
void loop () {int hourOn=EEPROM.read (110); //EEPROM.read (110)int hourOff= EEPROM.read (112);; //EEPROM.read (112)int minOn= EEPROM.read (111);; //EEPROM.read (111)int minOff= EEPROM.read (113);; //EEPROM.read (113)int minVent= EEPROM.read (114); //время работы вентилятора
int Hour = rtc[2]; //присваиваем часыint Minute = rtc[1]; //присваиваем минутыint Second = rtc[0]; // присваиваем секундыint FullMinutes = Hour * 60 + Minute; //приводим значение текущего времени к минутамint FullMinutesTimerOn= hourOn*60+minOn; //приводим значение ВКЛЮЧЕНИЯ таймера к минутамint FullMinutesTimerOff= hourOff*60+minOff; //приводим значение ВЫКЛЮЧЕНИЯ таймера к минутамint sutki=0; // по умолчанию, таймер работает в одних сутках
if (hourOff-hourOn < 0) sutki=1; //если время выключения на следующие сутки, то включаем триггер сутки=1else sutki=0;
if (sutki==1 && (FullMinutes >= FullMinutesTimerOn || FullMinutes <= FullMinutesTimerOff) ){lcd.setCursor(16, 2);lcd.print(«VKL1»);digitalWrite(RELE_1, LOW);// если сутки перескакивают, то проверяем время оператором ИЛИ}else if (sutki==1){lcd.print(" ");digitalWrite(RELE_1, HIGH);}
if (sutki == 0 && (FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff )){lcd.setCursor(16, 2);lcd.print(«VKL0»);digitalWrite(RELE_1, LOW);} // если сутки НЕ перескакивают, то проверяем время оператором Иelse if (sutki == 0){lcd.print(" ");digitalWrite(RELE_1, HIGH);}
if ((Minute >= 0 && Minute <= minVent) && (Hour >= 9 && Hour <= 21)){lcd.setCursor(17, 1);lcd.print(«VEN»);digitalWrite(RELE_2, LOW);}if (Minute >= 0 && Minute > minVent){lcd.setCursor (17, 1); lcd.print (» »); digitalWrite (RELE_2, HIGH);}
RTC.get (rtc, true); digitalClockDisplay (); //выводим красивенькие часики на 2 строкиstrokatimera ();
if (rejim==0){lcd.setCursor (0, 2); lcd.print («ojidayu komandi»);}if (rejim==1){setTimerOn ();}if (rejim==2){setTimerOff ();}if (rejim==3){setTime ();}if (rejim==4){setVent ();}
if (digitalRead (button5) == HIGH){rejim++; if (rejim>4) rejim=0; lcd.clear ();//}}
}
void setTimerOn (){int hourOn= EEPROM.read (110); int minOn= EEPROM.read (111); lcd.setCursor (0, 2); lcd.print («nastroika VKL»);
if (digitalRead (button3)==HIGH) //нажимая верхнюю кнопку меняем часы{hourOn++; if (hourOn >=24) hourOn=0;}
if (! digitalRead (button4)) //нажимая нижнюю кнопку меняем минуты{minOn++; if (minOn >=60){minOn=0; hourOn++; if (hourOn >=24) hourOn=0;}}strokatimera (); if (digitalRead (button2) == HIGH){EEPROM.write (110, hourOn); EEPROM.write (111, minOn); lcd.clear ();}}
void setTimerOff (){int hourOff= EEPROM.read (112); int minOff= EEPROM.read (113); lcd.setCursor (0, 2); lcd.print («nastroika VIKL»);
if (digitalRead (button3)==HIGH) //нажимая верхнюю кнопку меняем часы{hourOff++; if (hourOff >=24) hourOff=0;}
if (! digitalRead (button4)) //нажимая нижнюю кнопку меняем минуты{minOff++; if (minOff >=60){minOff=0; hourOff++; if (hourOff >=24) hourOff=0;}}strokatimera (); if (digitalRead (button2) == HIGH){EEPROM.write (112, hourOff); EEPROM.write (113, minOff); lcd.clear ();}}
void setTime (){int Hour = rtc[2]; //присваиваем часыint Minute = rtc[1];//lcd.clear (); lcd.setCursor (0, 2); lcd.print («nastroika time»); RTC.get (rtc, true);
//lcd.setCursor (0, 3); // вывод в последней строчке времени работы таймера// lcd.print (Hour);// lcd.print (»:»);// lcd.print (Minute);
if (! digitalRead (button4)) //нажимая нижнюю кнопку меняем минуты{Minute++; if (Minute >=60){Minute=0; Hour++; if (Hour >=24) Hour=0;}}
if (digitalRead (button2) == HIGH){RTC.set (DS1307_MIN, Minute); RTC.set (DS1307_HR, Hour); lcd.clear ();}
}
void strokatimera (){int hourOn=EEPROM.read (110); //EEPROM.read (110)int hourOff= EEPROM.read (112);; //EEPROM.read (112)int minOn= EEPROM.read (111);; //EEPROM.read (111)int minOff= EEPROM.read (113);; //EEPROM.read (113)int minVent= EEPROM.read (114); lcd.setCursor (0, 3); // вывод в последней строчке времени работы таймераlcd.print (hourOn); lcd.print (»:»); lcd.print (minOn); lcd.print (»-»); lcd.print (hourOff); lcd.print (»:»); lcd.print (minOff); lcd.print (» »); lcd.print («VENT:»); lcd.print (minVent);
}
void setVent (){
int minVent= EEPROM.read (114); lcd.setCursor (0, 2); lcd.print («nastroika Vent»);
if (! digitalRead (button4)) //нажимая нижнюю кнопку меняем минуты{minVent++; if (minVent >=60){minVent=0;}}
strokatimera (); if (digitalRead (button2) == HIGH){EEPROM.write (114, minVent); lcd.clear ();}}