Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <DHT.h>
- #include <Time.h>
- #include <BH1750.h>
- #include <DS3232RTC.h>
- #include <EEPROM.h>
- #include <LiquidCrystal_I2C.h>
- #define MOTOR_OPEN 9 //int1
- #define MOTOR_CLOSE 10 //int2
- #define BUTTON_OPEN 8
- #define BUTTON_CLOSE 7
- #define SENSOR_1 12
- #define SENSOR_2 13
- #define PIN_DHT 5
- #define LED_G 4
- #define LED_R 3
- #define BEEP 6 // druhy pin do minus
- // SCL - pin 5 , SDA - pin 4
- BH1750 lightMeter;
- DHT mojeDHT(PIN_DHT, DHT11);
- LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- tmElements_t tm, tm_hour_start, tm_hour_end;
- time_t now_, t_hour_start, t_hour_end;
- unsigned long previousMillis = 0;
- int counterLuxOtvirani = 0;
- int counterLuxZavirani = 0;
- int lux_otevreni; // nacita se z pameti.. ADDR 10
- int lux_zavreni; // nacita se z pameti.. ADDR 20
- String ulozenyCas = "";
- bool muzeSeOtvirat = false;
- bool muzeSeZavirat = false;
- bool otevrene = false; //
- // Button variables
- int debounce = 10;
- int holdTime = 2000;
- boolean buttonVal1 = HIGH; boolean buttonVal2 = HIGH;
- boolean buttonLast1 = HIGH; boolean buttonLast2 = HIGH;
- long downTime1 = -1; long downTime2 = -1;
- long upTime1 = -1; long upTime2 = -1;
- boolean ignoreUp1 = false; boolean ignoreUp2 = false;
- boolean waitForUp1 = false; boolean waitForUp2 = false;
- boolean holdEventPast1 = false; boolean holdEventPast2 = false;
- // time variables.. /////////////////////////
- int otvirani_OD[] = {5,0}; // od 5:00
- int otvirani_DO[] = {7,30}; // do 7:30
- int zavirani_OD[] = {17,0}; // od 17:00
- int zavirani_DO[] = {22,0}; // do 22:00
- /////////////////////////////////////////////
- // declare functions
- void beeping(int count);
- void opening(long cas);
- void closing(long cas);
- void showLuxTempHumid();
- int checkOpenButton(); // 1-press, 2-hold
- int checkCloseButton(); // 1-press, 2-hold
- void printDigits(int digits);
- void printTimeNow(); //hh:mm
- bool isOpenSensor1(); //sensor1
- bool isOpenSensor2(); //sensor2
- void firstStartCheckDoor();
- bool watchClosingTime();
- bool watchOpeningTime();
- void setOpeningLux();
- void setClosingLux();
- void LEDcontrol();
- bool isTimeBetween(int startHour, int startMinute,
- int endHour, int endMinute);
- void setup() {
- pinMode(MOTOR_OPEN, OUTPUT);
- pinMode(MOTOR_CLOSE, OUTPUT);
- digitalWrite(MOTOR_OPEN,HIGH); //
- digitalWrite(MOTOR_CLOSE,HIGH); //
- pinMode(BUTTON_OPEN, INPUT);
- pinMode(BUTTON_CLOSE, INPUT);
- pinMode(SENSOR_1, INPUT);
- pinMode(SENSOR_2, INPUT);
- pinMode(BEEP, OUTPUT);
- pinMode(LED_G, OUTPUT);
- pinMode(LED_R, OUTPUT);
- lightMeter.begin();
- mojeDHT.begin();
- lcd.begin(16,2);
- lcd.backlight();
- // nactu hodnoty Luxu z pameti..
- lux_otevreni = EEPROM.read(10);
- lux_zavreni = EEPROM.read(20);
- firstStartCheckDoor();
- LEDcontrol();
- //prvni ulozeni Lux do EEPROM, defaultne 5 Lx pro oba
- //EEPROM.write(10, 5); EEPROM.write(20, 5);
- //set the system time to 23h31m30s on 13Feb2009
- //setTime(12, 34, 0, 6, 9, 2016); RTC.set(now());
- }
- void loop() { // co 1min..
- if ((unsigned long)(millis() - previousMillis) >= 1000UL*60* 1){
- if (watchOpeningTime() && !otevrene) opening();
- if (watchClosingTime() && otevrene) closing();
- previousMillis = millis(); }
- switch(checkOpenButton()){
- case 1: if(!otevrene) opening(); break; // press
- case 2: setOpeningLux(); break; // hold
- default: break; }
- switch(checkCloseButton()){
- case 1: if(otevrene) closing(); break; // press
- case 2: setClosingLux(); break; // hold
- default: break; }
- showLuxTempHumid(); LEDcontrol();
- }
- void opening(){ // OPENING
- float cas = 0.0;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("OTVIRANI - ");
- lcd.print(cas,1); lcd.print("s");
- beeping(3);
- digitalWrite(MOTOR_OPEN,LOW); // motor start
- do{
- if(millis()%100==0)
- {
- cas+=0.1;
- lcd.setCursor(11,0);
- lcd.print(cas,1);
- lcd.print("s ");
- LEDcontrol();
- }
- }
- while ( (!isOpenSensor1()) || (!isOpenSensor2()) );
- digitalWrite(MOTOR_OPEN,HIGH); // motor stop
- otevrene = true; //
- LEDcontrol();
- beeping(1);
- delay(800);
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("OTEVRENE - ");
- printTimeNow();
- }
- void closing(){ // CLOSING
- float cas = 0.0;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("ZAVIRANI - ");
- lcd.print(cas/1000.0,1);
- lcd.print("s");
- beeping(3);
- digitalWrite(MOTOR_CLOSE,LOW); // motor start
- do{
- if(millis()%100==0)
- {
- cas+=0.1;
- lcd.setCursor(11,0);
- lcd.print(cas,1);
- lcd.print("s ");
- LEDcontrol();
- }
- }
- while ( (isOpenSensor1()) || (isOpenSensor2()) );
- digitalWrite(MOTOR_CLOSE,HIGH); // motor stop
- otevrene = false; //
- LEDcontrol();
- beeping(1);
- delay(800);
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("ZAVRENE - ");
- printTimeNow();
- }
- bool watchOpeningTime(){
- if (muzeSeOtvirat)
- { // je otviraci cas ?
- if (isTimeBetween(otvirani_OD[0], otvirani_OD[1], otvirani_DO[0], otvirani_DO[1]) )
- {
- int lux = lightMeter.readLightLevel();
- if (lux >= lux_otevreni) counterLuxOtvirani++;
- else { counterLuxOtvirani = 0; return false; }
- if (counterLuxOtvirani == 3) // po 3. po sobe jdoucich minutach - otvira se
- {
- counterLuxOtvirani = 0;
- muzeSeOtvirat = false;
- muzeSeZavirat = true;
- return true;
- }
- else return false;
- }
- // pokud neni otevrene 2min po casu otvirani - automaticky otevrit
- else if (isTimeBetween(otvirani_DO[0], otvirani_DO[1]+1, otvirani_DO[0], otvirani_DO[1]+2) )
- {
- counterLuxOtvirani = 0;
- muzeSeOtvirat = false;
- muzeSeZavirat = true;
- return true;
- }
- else return false;
- }
- }
- bool watchClosingTime(){
- if (muzeSeZavirat)
- { // je zaviraci cas ?
- if (isTimeBetween(zavirani_OD[0], zavirani_OD[1], zavirani_DO[0], zavirani_DO[1]) )
- {
- int lux = lightMeter.readLightLevel();
- if (lux >= lux_zavreni) counterLuxZavirani++;
- else { counterLuxZavirani = 0; return false; }
- if (counterLuxZavirani == 3) // po 3. po sobe jdoucich minutach - zavira se
- {
- counterLuxZavirani = 0;
- muzeSeOtvirat = true;
- muzeSeZavirat = false;
- return true;
- }
- else return false;
- }
- // pokud neni otevrene 2min po casu zavirani - automaticky zavrit
- else if (isTimeBetween(zavirani_DO[0], zavirani_DO[1]+1, zavirani_DO[0], zavirani_DO[1]+2) )
- {
- counterLuxZavirani = 0;
- muzeSeOtvirat = true;
- muzeSeZavirat = false;
- return true;
- }
- else return false;
- }
- }
- void firstStartCheckDoor(){
- // ze zacatku ZAVRENE
- if( (!isOpenSensor1()) && (!isOpenSensor2()) )
- {
- otevrene = false; //
- muzeSeOtvirat = true;
- muzeSeZavirat = false;
- lcd.clear(); lcd.setCursor(0,0);
- lcd.print("ZAVRENE - "); printTimeNow();
- beeping(1);
- }
- // ze zacatku OTEVRENE
- else
- {
- if( (isOpenSensor1()) && (isOpenSensor2()) )
- {
- otevrene = true; //
- muzeSeOtvirat = false;
- muzeSeZavirat = true;
- lcd.clear(); lcd.setCursor(0,0);
- lcd.print("OTEVRENE - "); printTimeNow();
- beeping(1);
- }
- // je POOTEVRENE (neni zavrene ani otevrene)
- else
- {
- if(isTimeBetween(otvirani_OD[0], otvirani_OD[1], zavirani_DO[0], zavirani_DO[1]) )
- { // je den - otevri
- otevrene = true; //
- muzeSeOtvirat = false;
- muzeSeZavirat = true;
- opening();
- }
- else
- { // je noc - zavri
- otevrene = false; //
- muzeSeOtvirat = true;
- muzeSeZavirat = false;
- closing();
- }
- }
- }
- }
- int checkOpenButton() {
- int event = 0;
- // Read the state of the button
- buttonVal1 = !digitalRead(BUTTON_OPEN);
- // Button pressed down
- if (buttonVal1 == LOW && buttonLast1 == HIGH && (millis() - upTime1) > debounce)
- {
- downTime1 = millis();
- ignoreUp1 = false;
- waitForUp1 = false;
- holdEventPast1 = false;
- }
- // Button released
- else if (buttonVal1 == HIGH && buttonLast1 == LOW && (millis() - downTime1) > debounce && (not ignoreUp1))
- {
- event = 1; // press
- upTime1 = millis();
- }
- // Test for hold
- if (buttonVal1 == LOW && (millis() - downTime1) >= holdTime && (not holdEventPast1))
- {
- event = 2; // hold
- waitForUp1 = true;
- ignoreUp1 = true;
- holdEventPast1 = true;
- }
- buttonLast1 = buttonVal1;
- return event;
- }
- int checkCloseButton() {
- int event = 0;
- // Read the state of the button
- buttonVal2 = !digitalRead(BUTTON_CLOSE);
- // Button pressed down
- if (buttonVal2 == LOW && buttonLast2 == HIGH && (millis() - upTime2) > debounce)
- {
- downTime2 = millis();
- ignoreUp2 = false;
- waitForUp2 = false;
- holdEventPast2 = false;
- }
- // Button released
- else if (buttonVal2 == HIGH && buttonLast2 == LOW && (millis() - downTime2) > debounce && (not ignoreUp2))
- {
- event = 1; // press
- upTime2 = millis();
- }
- // Test for hold
- if (buttonVal2 == LOW && (millis() - downTime2) >= holdTime && (not holdEventPast2))
- {
- event = 2; // hold
- waitForUp2 = true;
- ignoreUp2 = true;
- holdEventPast2 = true;
- }
- buttonLast2 = buttonVal2;
- return event;
- }
- void setOpeningLux(){
- long timer = millis();
- int nove_lux_otevreni = lux_otevreni;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("Nastav otevreni!");
- lcd.setCursor(0,1);
- lcd.print("Hodnota: ");
- lcd.print(nove_lux_otevreni);
- lcd.print("Lx");
- lcd.setCursor(15,1); lcd.blink();
- while (millis() - timer < 6000) // po 6s bez zmacknuti se ulozi
- {
- if (checkOpenButton() == 1) // minus
- {
- if (nove_lux_otevreni > 0)
- nove_lux_otevreni--;
- lcd.setCursor(9,1);
- lcd.print(nove_lux_otevreni);
- lcd.print("Lx ");
- lcd.setCursor(15,1);
- timer = millis();
- delay(50);
- }
- if (checkCloseButton() == 1) // plus
- {
- nove_lux_otevreni++;
- lcd.setCursor(9,1);
- lcd.print(nove_lux_otevreni);
- lcd.print("Lx ");
- lcd.setCursor(15,1);
- timer = millis();
- delay(50);
- }
- }
- lux_otevreni = nove_lux_otevreni; //
- EEPROM.write(10, nove_lux_otevreni); //
- lcd.noBlink();
- lcd.clear(); lcd.setCursor(0,0);
- lcd.print("Hodnota otevreni");
- lcd.setCursor(0,1);
- lcd.print(nove_lux_otevreni);
- lcd.print("Lx ulozena!");
- delay(2500);
- lcd.clear(); lcd.setCursor(0,0);
- if (otevrene) lcd.print("OTEVRENE - ");
- else lcd.print("ZAVRENE - ");
- lcd.print(ulozenyCas);
- }
- void setClosingLux(){
- long timer = millis();
- int nove_lux_zavreni = lux_zavreni;
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("Nastav zavreni!");
- lcd.setCursor(0,1);
- lcd.print("Hodnota: ");
- lcd.print(nove_lux_zavreni);
- lcd.print("Lx");
- lcd.setCursor(15,1); lcd.blink();
- while (millis() - timer < 6000) // po 6s bez zmacknuti se ulozi
- {
- if (checkOpenButton() == 1) // minus
- {
- if (nove_lux_zavreni > 0)
- nove_lux_zavreni--;
- lcd.setCursor(9,1);
- lcd.print(nove_lux_zavreni);
- lcd.print("Lx ");
- lcd.setCursor(15,1);
- timer = millis();
- delay(50);
- }
- if (checkCloseButton() == 1) // plus
- {
- nove_lux_zavreni++;
- lcd.setCursor(9,1);
- lcd.print(nove_lux_zavreni);
- lcd.print("Lx ");
- lcd.setCursor(15,1);
- timer = millis();
- delay(50);
- }
- }
- lux_zavreni = nove_lux_zavreni; //
- EEPROM.write(20, nove_lux_zavreni); //
- lcd.noBlink();
- lcd.clear(); lcd.setCursor(0,0);
- lcd.print("Hodnota zavreni");
- lcd.setCursor(0,1);
- lcd.print(nove_lux_zavreni);
- lcd.print("Lx ulozena!");
- delay(2500);
- lcd.clear(); lcd.setCursor(0,0);
- if (otevrene) lcd.print("OTEVRENE - ");
- else lcd.print("ZAVRENE - ");
- lcd.print(ulozenyCas);
- }
- void beeping(int count) {
- int pipnuti = 200; int mezera = 50;
- for(int i=0; i<count; i++)
- {
- analogWrite(BEEP, 128);
- delay(pipnuti);
- analogWrite(BEEP, 0);
- delay(mezera);
- }
- }
- void showLuxTempHumid(){
- float tep = mojeDHT.readTemperature();
- float vlh = mojeDHT.readHumidity();
- int lux = lightMeter.readLightLevel();
- //lux = (lux/10)*10; // zaokrohleni na 10tky
- if (isnan(tep) || isnan(vlh))
- { // pokud senzor vraci blbosti tak nuly
- tep = 0; vlh = 0;
- }
- else
- { // zobraz hodnoty..
- lcd.setCursor(0,1);
- lcd.print(lux);
- lcd.print("Lx");
- if(lux<10) { lcd.setCursor(3,1); lcd.print(" ");}
- if(lux>=10 && lux<100) { lcd.setCursor(4,1); lcd.print(" ");}
- if(lux>=100 && lux<1000) { lcd.setCursor(5,1); lcd.print(" ");}
- if(lux>=1000) { lcd.setCursor(6,1); lcd.print(" ");}
- lcd.setCursor(7, 1);
- lcd.print(tep,0);
- lcd.print((char)223); lcd.print("C");
- lcd.setCursor(13, 1);
- lcd.print(vlh,0);
- lcd.print("%");
- }
- }
- void printDigits(int digits){
- lcd.print(':');
- ulozenyCas += ":";
- if(digits < 10)
- {
- lcd.print('0');
- ulozenyCas += "0";
- }
- lcd.print(digits);
- ulozenyCas += digits;
- }
- void printTimeNow(){
- time_t myTime;
- myTime = RTC.get();
- lcd.print(hour(myTime));
- ulozenyCas = hour(myTime);
- printDigits(minute(myTime));
- //printDigits(second(myTime));
- }
- bool isOpenSensor1(){
- return digitalRead(SENSOR_1);
- }
- bool isOpenSensor2(){
- return digitalRead(SENSOR_2);
- }
- bool isTimeBetween(int startHour, int startMinute, int endHour, int endMinute){
- //get current timestamp
- time_t now_ = RTC.get();
- // make current date and time structure
- breakTime(now_, tm);
- // make auxiliary structures to be more human editable and friendly
- memcpy(&tm_hour_start, &tm, sizeof(tm));
- memcpy(&tm_hour_end, &tm, sizeof(tm));
- // change auxiliary structures to meet your start and end schedule
- tm_hour_start.Hour = startHour;
- tm_hour_start.Minute = startMinute;
- tm_hour_start.Second = 0;
- tm_hour_end.Hour = endHour;
- tm_hour_end.Minute = endMinute;
- tm_hour_end.Second = 0;
- // reverse process to get timestamps
- t_hour_start = makeTime(tm_hour_start);
- t_hour_end = makeTime(tm_hour_end);
- // check if end time is past midnight and correct if needed
- if (startHour > endHour) //past midnight correction
- t_hour_end = t_hour_end + SECS_PER_DAY;
- //final part
- if ((t_hour_start <= now_) && (now_ <= t_hour_end))
- return true;
- else
- return false;
- }
- void LEDcontrol(){
- if ((isOpenSensor1() && !isOpenSensor2()) || (!isOpenSensor1() && isOpenSensor2()) )
- {
- digitalWrite(LED_G,HIGH);
- digitalWrite(LED_R,HIGH);
- }
- else
- {
- if (isOpenSensor1() && isOpenSensor2())
- digitalWrite(LED_G,HIGH);
- else digitalWrite(LED_G,LOW);
- if (!isOpenSensor1() && !isOpenSensor2())
- digitalWrite(LED_R,HIGH);
- else digitalWrite(LED_R,LOW);
- }
- }
- // lcd.print("STISK. TLACITKO ");
- // while ( (isOpenSensor()) ||
- // ( (!buttonOpenPressed()) && (!buttonClosePressed()) ));
- /*
- if (digitalRead(BUTTON_CLOSE)) {
- delay(20);
- if (digitalRead(BUTTON_CLOSE)) {
- return true; }
- } return false;
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement