اطلاعیه

Collapse
No announcement yet.

یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

    بسم الله
    کد برنامه ساعت به همراه 2 Alarm داخلی ماژول DS3231 و DS3231

    ترکیبی از example8 و example3 و کمی تغییرات از داخل کتابخانه DS3232RTC می باشد.


    کد PHP:
    // Arduino DS3232RTC Library
    // https://github.com/JChristensen/DS3232RTC
    // Copyright (C) 2018 by Jack Christensen and licensed under
    // GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
    //
    // DS3231/DS3232 Alarm Example Sketch #8
    //
    // Set both alarms to occur once per day at different times.
    // Configure the RTC INT/SQW pin to be asserted when alarm match occurs.
    // Detect the alarms by polling the INT/SQW pin.
    // Assumes the RTC time is already set.
    //
    // Hardware:
    // Arduino Uno, DS3231 RTC.
    // Connect RTC SDA to Arduino pin A4.
    // Connect RTC SCL to Arduino pin A5.
    // Connect RTC INT/SQW to Arduino pin 2.
    //
    // Jack Christensen 17Dec2018

    #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC
    #include <Streaming.h> // http://arduiniana.org/libraries/streaming/

    //*******RTClib.h****
    #include "RTClib.h"
    #include "Wire.h"
    RTC_DS3231 rtc;
    //*******END_RTClib.h****

    //tabdile roz caat va daghighe be saniye
    long t_to_sec(int hint m long days)
    {
      
    long t_to_sec = ((((days 24) * 60) * 60) + ((60) * 60) + (60));
      return 
    t_to_sec;
    }
    int tA1_Hour 0;
    int tA1_Minute 1;
    long tA1_Day 0;
    int tA2_Hour 0;
    int tA2_Minute 1;
    long tA2_Day 0;
    const 
    time_t ALARM_1_INTERVAL(t_to_sec(tA1_HourtA1_MinutetA1_Day));  // alarm interval in seconds
    const time_t ALARM_2_INTERVAL(t_to_sec(tA2_HourtA2_MinutetA2_Day));  // alarm interval in seconds

    // pin definitions
    const uint8_t RTC_INT_PIN(2);

    // current time from the RTC in text format
    char timestamp[32];

    void setup()
    {
      
    Serial.begin(115200);

      
    //*******RTClib.h****
      
    if (! rtc.begin()) {
        
    Serial.println("Couldn't find RTC");
        while (
    1);
      }
      if (
    rtc.lostPower()) {
        
    Serial.println("RTC lost power, lets set the time!");
        
    // If the RTC have lost power it will sets the RTC to the date & time this sketch was compiled in the following line
        
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
      
    // If you need to set the time of the uncomment line 34 or 37
      // following line sets the RTC to the date & time this sketch was compiled
       //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      // This line sets the RTC with an explicit date & time, for example to set
      // January 21, 2014 at 3am you would call:
       //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
      //*******END_RTClib.h****


      
    delay(1000);
      
    Serial << F"\n" __FILE__ " " __DATE__ " " __TIME__ "\n" );
      
    pinMode(RTC_INT_PININPUT_PULLUP);

      
    // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
      
    RTC.setAlarm(ALM1_MATCH_DATE0001);
      
    RTC.setAlarm(ALM2_MATCH_DATE0001);
      
    RTC.alarm(ALARM_1);
      
    RTC.alarm(ALARM_2);
      
    RTC.alarmInterrupt(ALARM_1false);
      
    RTC.alarmInterrupt(ALARM_2false);
      
    RTC.squareWave(SQWAVE_NONE);

      
    // print the current time
      
    time_t t RTC.get();
      
    formatTime(timestampt);
      
    Serial << millis() << F(" Current RTC time ") << timestamp << endl;

      
    // set alarm 1 to occur in ?
      // set alarm 2 to occur in ?
      
    tmElements_t tm;
      
    breakTime(60 tm);
      
    //tm.Hour = 00;                   // set the RTC to an arbitrary time
      //tm.Minute = 00;
      
    tm.Second 00;
      
    time_t a1 makeTime(tm) + ALARM_1_INTERVAL ;   // calculate the alarm time
      
    time_t a2 makeTime(tm) + ALARM_2_INTERVAL;    // calculate the alarm time

      
    formatTime(timestampa1);
      
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
      
    Serial << F("A1:") << timestamp << endl;
      
    formatTime(timestampa2);
      
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
      
    Serial << F("A2:") << timestamp << endl;
      
    RTC.setAlarm(ALM1_MATCH_DATEminute(a1), hour(a1), day(a1));
      
    RTC.alarm(ALARM_1);                 // ensure RTC interrupt flag is cleared
      
    RTC.alarmInterrupt(ALARM_1true);
      
    RTC.setAlarm(ALM2_MATCH_DATEminute(a2), hour(a2), day(a2));
      
    RTC.alarm(ALARM_2);                 // ensure RTC interrupt flag is cleared
      
    RTC.alarmInterrupt(ALARM_2true);
    }

    void loop()
    {

      
    //*******RTClib.h****
      
    DateTime now rtc.now();
      
    char buffer1[] = "hh:mm:ss";
      
    Serial.print(now.toString(buffer1));
      
    char buffer2[] = " DDD ";
      
    Serial.print(now.toString(buffer2));
      
    char buffer3[] = "YYYY-MM-DD";
      
    Serial.print(now.toString(buffer3));
      
    Serial.print(" Temp:");
      
    Serial.print(rtc.getTemperature());
      
    Serial.println("C");
      
    delay(1000);
      
    //*******END_RTClib.h****
      // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
      
    if (!digitalRead(RTC_INT_PIN))
      {
        
    formatTime(timestampRTC.get());   // get current RTC time
        
    if (RTC.alarm(ALARM_1))             // resets the alarm flag if set
        
    {
          
    Serial <<  F(" Alarm1 Fired at:") << timestamp << endl;
          
    // get the current time
          
    time_t t RTC.get();
          
    // calculate the next alarm time
          
    time_t a1 ALARM_1_INTERVAL;
          
    // set the alarm
          
    RTC.setAlarm(ALM1_MATCH_DATEsecond(a1), minute(a1), hour(a1), day(a1));
          
    formatTime(timestampa1);
          
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
          
    Serial << F("A1:") << timestamp << endl;

        }

        if (
    RTC.alarm(ALARM_2))
        {
          
    Serial << millis() << F(" Alarm2 Fired at:") << timestamp << endl;
          
    // get the current time
          
    time_t t RTC.get();
          
    // calculate the next alarm time
          
    time_t a2 ALARM_2_INTERVAL;
          
    // set the alarm
          
    RTC.setAlarm(ALM2_MATCH_DATEsecond(a2), minute(a2), hour(a2), day(a2));
          
    formatTime(timestampa2);
          
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
          
    Serial << F("A2:") << timestamp << endl;
        }
      }
    }

    // format a time_t value, return the formatted string in buf (must be at least 25 bytes)
    void formatTime(char *buftime_t t)
    {
      
    char m[4];    // temporary storage for month string (DateStrings.cpp uses shared buffer)
      
    strcpy(mmonthShortStr(month(t)));
      
    sprintf(buf"%.2d:%.2d:%.2d %s%.2d%s %d",
              
    hour(t), minute(t), second(t),  dayShortStr(weekday(t)), day(t), myear(t));

    جدیدترین ویرایش توسط حمید حمید; ۰۹:۰۲ ۱۳۹۹/۰۱/۲۰.

    #2
    پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

    با سلام
    LCD کاراکتری 20x4 با رابط I2C به کد برنامه اضافه شد.
    بعلاوه 2 عدد رله که در زمان Alarm ها وصل میشود.

    کد PHP:
    #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC
    #include <Streaming.h> // http://arduiniana.org/libraries/streaming/

    #include <EEPROM.h>
    //*******RTClib.h****
    #include "RTClib.h"
    #include "Wire.h"
    RTC_DS3231 rtc;
    //*******END_RTClib.h****
    #include <AnalogButtons.h>

    #define ANALOG_PIN A1

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    // Set the LCD address to 0x27 for a 20 chars and 4 line display
    LiquidCrystal_I2C lcd(0x3F204);

    // pin definitions
    #define Input1 A1
    #define Input2 A2
    #define Output1 8
    #define Output2 7

    boolean key 0;
    int _hour_minute;
    int _year_month_day;
    boolean key_SET key_DOWN 1key_UP 1;

    // pin definitions
    const uint8_t RTC_INT_PIN(10);  //connected to SQW PIN of DS3231

    // current time from the RTC in text format
    char timestamp[32];
    char timestamp2[32];
    //**************************************
    // A call back function that you pass into the constructor of AnalogButtons, see example
    // below. Alternativly you could extend the Button class and re-define the methods pressed()
    // or held() which are called
    void b1Click() {
      
    ////Serial.println("button 1 clicked");
    }
    void b1Hold() {
      
    //Serial.println("button 1 held");
      
    key_SET 0;
    }
    void b2Click() {
      
    //Serial.println("button 2 clicked");
    }
    void b2Hold() {
      
    //Serial.println("button 2 held");
    }

    void b3Click() {
      
    //Serial.println("button 3 clicked");
      
    key_DOWN 0;
      
    lcd.clear();
    }
    void b3Hold() {
      
    //Serial.println("button 3 held");
      
    key_DOWN 0;

    }

    void b4Click() {
      
    //Serial.println("button 4 clicked");
      
    key_UP 0;
      
    lcd.clear();
    }
    void b4Hold() {
      
    //Serial.println("button 4 held");
      
    key_UP 0;

    }

    AnalogButtons analogButtons(ANALOG_PININPUT);
    Button b1 Button(595, &b1Click, &b1Hold10002500);
    Button b2 Button(839, &b2Click, &b2Hold);
    Button b3 Button(777, &b3Click, &b3Hold50025);
    // Default hold activation frequency of 250ms is overriden for button 4 so to
    // get it activated (hold function invoked) only every 500ms
    Button b4 Button(888, &b4Click, &b4Hold50025);

    //tabdile roz caat va daghighe be saniye
    long t_to_sec(int hint m long days)
    {
      
    long t_to_sec = ((((days 24) * 60) * 60) + ((60) * 60) + (60));
      return 
    t_to_sec;
    }
    long A1_day EEPROM.read(20);
    int A1_hour EEPROM.read(25);
    int A1_minute EEPROM.read(30);
    long A1_delay EEPROM.get(35,  A1_delay);
    long A2_day EEPROM.read(40);
    int A2_hour EEPROM.read(45);
    int A2_minute EEPROM.read(50);
    long A2_delay EEPROM.get(55,  A2_delay);
    const 
    time_t ALARM_1_INTERVAL(t_to_sec(A1_hourA1_minuteA1_day));  // alarm interval in seconds
    const time_t ALARM_2_INTERVAL(t_to_sec(A2_hourA2_minuteA2_day));  // alarm interval in seconds

    void setup()
    {
      
    //Serial.begin(115200);
      
    pinMode(Output1OUTPUT);
      
    pinMode(Output2OUTPUT);
      
    digitalWrite(Output1HIGH);
      
    digitalWrite(Output2HIGH);

      
    //*******RTClib.h****
      
    if (! rtc.begin()) {
        
    //Serial.println("Couldn't find RTC");
        
    while (1);
      }
      if (
    rtc.lostPower()) {
        
    //Serial.println("RTC lost power, lets set the time!");
        // If the RTC have lost power it will sets the RTC to the date & time this sketch was compiled in the following line
        
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
      
    // only If you need to set the time    uncomment line 1 or 2
      // following line sets the RTC to the date & time this sketch was compiled
      //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      // This line sets the RTC with an explicit date & time, for example to set
      // April 21, 2020 at 23pm you would call:
      //rtc.adjust(DateTime(2020, 4, 21, 23, 59, 59));
      //*******END_RTClib.h****
      
    analogButtons.add(b1);
      
    analogButtons.add(b2);
      
    analogButtons.add(b3);
      
    analogButtons.add(b4);

      
    lcd.begin();
      
    lcd.clear();
      
    lcd.setCursor(00);
      
    lcd.print("*Hamid Samadi 99*");
      
    lcd.setCursor (01);
      
    lcd.print(">Arduino Pro CLOCK");
      
    delay(3000);
      
    lcd.clear();

      
    delay(1000);
      
    //Serial << F( "\n" __FILE__ " " __DATE__ " " __TIME__ "\n" );
      
    pinMode(RTC_INT_PININPUT_PULLUP);
      
    //Serial.print("A1_delay:");
      //Serial.println(A1_delay);
      //Serial.println(A2_delay);
      // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
      
    RTC.setAlarm(ALM1_MATCH_DATE0001);
      
    RTC.setAlarm(ALM2_MATCH_DATE0001);
      
    RTC.alarm(ALARM_1);
      
    RTC.alarm(ALARM_2);
      
    RTC.alarmInterrupt(ALARM_1false);
      
    RTC.alarmInterrupt(ALARM_2false);
      
    RTC.squareWave(SQWAVE_NONE);

      
    // print the current time
      
    time_t t RTC.get();
      
    formatTime(timestampt);
      
    //Serial << millis() << F(" Current RTC time ") << timestamp << endl;

      // set alarm 1 to occur in ?
      // set alarm 2 to occur in ?
      
    tmElements_t tm;
      
    breakTime(60 tm);
      
    //tm.Hour = 00;                   // set the RTC to an arbitrary time
      //tm.Minute = 00;
      
    tm.Second 00;

      
    time_t a1 makeTime(tm) + ALARM_1_INTERVAL ;   // calculate the alarm time
      
    formatTime(timestampa1);
      
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
      //Serial << F("A1:") << timestamp << endl;
      
    RTC.setAlarm(ALM1_MATCH_DATEminute(a1), hour(a1), day(a1));
      
    RTC.alarm(ALARM_1);                 // ensure RTC interrupt flag is cleared
      
    RTC.alarmInterrupt(ALARM_1true);
      
    lcd.setCursor (02);
      
    lcd.print("A1:");
      
    lcd.print(timestamp);

      
    time_t a2 makeTime(tm) + ALARM_2_INTERVAL;    // calculate the alarm time
      
    formatTime(timestamp2a2);
      
    timestamp2[17] = 0;                  // keep just hh:mm weekday DD MM
      //Serial << F("A2:") << timestamp2 << endl;
      
    RTC.setAlarm(ALM2_MATCH_DATEminute(a2), hour(a2), day(a2));
      
    RTC.alarm(ALARM_2);                 // ensure RTC interrupt flag is cleared
      
    RTC.alarmInterrupt(ALARM_2true);
      
    lcd.setCursor (03);
      
    lcd.print("A2:");
      
    lcd.print(timestamp2);
    }


    void loop()
    {

      
    //*******RTClib.h****
      
    DateTime now rtc.now();
      
    char buffer4[] = "hh:mm:ss";
      
    //Serial.println(now.toString(buffer4));
      
    delay(1000);
      
    //*******END_RTClib.h****
      //************************
      // To check values when button are pressed

      
    analogButtons.check();
      
    // calculate a date which is 7 days and 30 seconds into the future
      //DateTime future (now + TimeSpan(7,12,30,6));
      
    lcd.setCursor(00);
      
    char buffer1[] = "hh:mm:ss";
      
    lcd.print(now.toString(buffer1));
      
    lcd.setCursor(100);
      
    lcd.print(rtc.getTemperature());
      
    lcd.print("\337");
      
    lcd.setCursor(01);
      
    char buffer3[] = "YYYY/MM/DD";
      
    lcd.print(now.toString(buffer3));
      
    //lcd.print("  ");
      
    char buffer2[] = " [DDD]";
      
    lcd.print(now.toString(buffer2));

      
    lcd.setCursor (02);
      
    lcd.print("A1:");
      
    lcd.print(timestamp);

      
    lcd.setCursor (03);
      
    lcd.print("A2:");
      
    lcd.print(timestamp2);


      if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
        
    key_SET 1;
        
    key 1;
        
    _hour now.hour();
        
    _minute now.minute();
        
    _year now.year();
        
    _month now.month();
        
    _day now.day();
        
    SET_hour();
      }
      if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
        
    key 0;
      }
      
    //****************************

      // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
      
    if (!digitalRead(RTC_INT_PIN))
      {


        if (
    RTC.alarm(ALARM_1))             // resets the alarm flag if set
        
    {
          
    //formatTime(timestamp, RTC.get());   // get current RTC time
          
    lcd.clear();
          
    lcd.setCursor(00);
          
    lcd.print("A1 Fired: ");
          
    lcd.setCursor(01);
          
    lcd.print("Relay1 is on ");
          
    digitalWrite(Output1LOW);
          
    //Serial <<  F(" Alarm1 Fired:")  << endl;
          // get the current time
          
    time_t t RTC.get();
          
    // calculate the next alarm time
          
    time_t a1 ALARM_1_INTERVAL;
          
    // set the alarm
          
    RTC.setAlarm(ALM1_MATCH_DATEsecond(a1), minute(a1), hour(a1), day(a1));
          
    formatTime(timestampa1);
          
    timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
          //Serial << F("NEXT A1:") << timestamp << endl;
          
    lcd.setCursor (02);
          
    lcd.print("A1:");
          
    lcd.print(timestamp);
          
    delay((A1_delay 1000) * 60);
          
    digitalWrite(Output1HIGH);
          
    lcd.clear();
        }

        if (
    RTC.alarm(ALARM_2))
        {
          
    //formatTime(timestamp2, RTC.get());   // get current RTC time
          
    lcd.clear();
          
    lcd.setCursor(00);
          
    lcd.print("A2 Fired: ");
          
    lcd.setCursor(01);
          
    lcd.print("Relay2 is on ");
          
    digitalWrite(Output2LOW);
          
    //Serial << F(" Alarm2 Fired:")  << endl;
          // get the current time
          
    time_t t RTC.get();
          
    // calculate the next alarm time
          
    time_t a2 ALARM_2_INTERVAL;
          
    // set the alarm
          
    RTC.setAlarm(ALM2_MATCH_DATEsecond(a2), minute(a2), hour(a2), day(a2));
          
    formatTime(timestamp2a2);
          
    timestamp2[17] = 0;                   // keep just hh:mm weekday DD MM
          //Serial << F("NEXT A2:") << timestamp2 << endl;
          
    lcd.setCursor (03);
          
    lcd.print("A2:");
          
    lcd.print(timestamp2);
          
    delay((A2_delay 1000) * 60);
          
    digitalWrite(Output2HIGH);
          
    lcd.clear();
        }
      }
      
    /*switch (show) {
        // case 0:
        //   break;
        //case 1:
        //break;
        //case 2:
        // break;
        // default:;
        }*/
    }

    // format a time_t value, return the formatted string in buf (must be at least 25 bytes)
    void formatTime(char *buftime_t t)
    {
      
    char m[4];    // temporary storage for month string (DateStrings.cpp uses shared buffer)
      
    strcpy(mmonthShortStr(month(t)));
      
    sprintf(buf"%.2d:%.2d:%.2d %s%.2d%s %d",
              
    hour(t), minute(t), second(t),  dayShortStr(weekday(t)), day(t), myear(t));
    }


    void SET_hour() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET Hour");
        
    lcd.setCursor (01);
        
    lcd.print("Hour  = ");
        
    lcd.print(_hour);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    _hour == 0) {
            
    _hour 23;
          } else {
            
    _hour--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    _hour == 23) {
            
    _hour 0;
          } else {
            
    _hour++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_minute();
    }
    //*********************************************Subprogram SET_minute()
    void SET_minute() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET Minute");
        
    lcd.setCursor (01);
        
    lcd.print("Minute= ");
        
    lcd.print(_minute);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    _minute == 0) {
            
    _minute 59;
          } else {
            
    _minute--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    _minute == 59) {
            
    _minute 0;
          } else {
            
    _minute++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_year();
    }
    //*********************************************Subprogram SET_year()
    void SET_year() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET Year");
        
    lcd.setCursor (01);
        
    lcd.print("Year  = ");
        
    lcd.print(_year);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    _year == 2014) {
            
    _year 2030;
          } else {
            
    _year--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    _year == 2030) {
            
    _year 2014;
          } else {
            
    _year++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_month();
    }
    //*********************************************Subprogram SET_month()
    void SET_month() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET Month");
        
    lcd.setCursor (01);
        
    lcd.print("Month = ");
        
    lcd.print(_month);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    _month == 1) {
            
    _month 12;
          } else {
            
    _month--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    _month == 12) {
            
    _month 1;
          } else {
            
    _month++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_day();
    }
    //*********************************************Subprogram SET_day()
    void SET_day() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET Day");
        
    lcd.setCursor (01);
        
    lcd.print("Day   = ");
        
    lcd.print(_day);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    _day == 1) {
            
    _day 31;
          } else {
            
    _day--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    _day == 31) {
            
    _day 1;
          } else {
            
    _day++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm1_day();
    }

    //*********************************************Subprogram SET_Alarm1_day()
    void SET_Alarm1_day() {
      
    lcd.clear();
      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print("SET A1 Every Few Day");
        
    lcd.setCursor (01);
        
    lcd.print("Day   = ");
        
    lcd.print(A1_day);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A1_day == 0) {
            
    A1_day 31;
          } else {
            
    A1_day--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A1_day == 31) {
            
    A1_day 0;
          } else {
            
    A1_day++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm1_hour();
    }
    //*********************************************Subprogram SET_Alarm1_hour()
    void SET_Alarm1_hour() {
      
    lcd.clear();
      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A1 Match Hour");
        
    lcd.setCursor (01);
        
    lcd.print("Hour  = ");
        
    lcd.print(A1_hour);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A1_hour == 0) {
            
    A1_hour 23;
          } else {
            
    A1_hour--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A1_hour == 23) {
            
    A1_hour 0;
          } else {
            
    A1_hour++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm1_minute();
    }
    //*********************************************Subprogram SET_Alarm1_minute()
    void SET_Alarm1_minute() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A1 Match Minute");
        
    lcd.setCursor (01);
        
    lcd.print("Minute= ");
        
    lcd.print(A1_minute);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A1_minute == 0) {
            
    A1_minute 59;
          } else {
            
    A1_minute--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A1_minute == 59) {
            
    A1_minute 0;
          } else {
            
    A1_minute++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm1_delay();
    }
    //*********************************************Subprogram SET_Alarm1_delay()
    void SET_Alarm1_delay() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A1 Amount Delay");
        
    lcd.setCursor (01);
        
    lcd.print("Delay = ");
        
    lcd.print(A1_delay);
        
    lcd.setCursor (121);
        
    lcd.print("*Minute");
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A1_delay == 1) {
            
    A1_delay 360;
          } else {
            
    A1_delay--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A1_delay == 360) {
            
    A1_delay 1;
          } else {
            
    A1_delay++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm2_day();
    }
    //*********************************************Subprogram SET_Alarm2_day()
    void SET_Alarm2_day() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print("SET A2 Every Few Day");
        
    lcd.setCursor (01);
        
    lcd.print("Day   = ");
        
    lcd.print(A2_day);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A2_day == 0) {
            
    A2_day 31;
          } else {
            
    A2_day--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A2_day == 31) {
            
    A2_day 0;
          } else {
            
    A2_day++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm2_hour();
    }
    //*********************************************Subprogram SET_Alarm2_hour()
    void SET_Alarm2_hour() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A2 Match Hour");
        
    lcd.setCursor (01);
        
    lcd.print("Hour  = ");
        
    lcd.print(A2_hour);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A2_hour == 0) {
            
    A2_hour 23;
          } else {
            
    A2_hour--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A2_hour == 23) {
            
    A2_hour 0;
          } else {
            
    A2_hour++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm2_minute();
    }
    //*********************************************Subprogram SET_Alarm2_minute()
    void SET_Alarm2_minute() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A2 Match Minute");
        
    lcd.setCursor (01);
        
    lcd.print("Minute= ");
        
    lcd.print(A2_minute);
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A2_minute == 0) {
            
    A2_minute 59;
          } else {
            
    A2_minute--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A2_minute == 59) {
            
    A2_minute 0;
          } else {
            
    A2_minute++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    SET_Alarm2_delay();
    }
    //*********************************************Subprogram SET_Alarm2_delay()
    void SET_Alarm2_delay() {
      
    lcd.clear();

      while (
    1) {
        
    lcd.setCursor(00);
        
    lcd.print(">SET A2 Amount Delay");
        
    lcd.setCursor (01);
        
    lcd.print("Delay = ");
        
    lcd.print(A2_delay);
        
    lcd.setCursor (121);
        
    lcd.print(" *Minute");
        
    analogButtons.check();
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_DOWN 1;
          
    key 1;
          if (
    A2_delay == 1) {
            
    A2_delay 360;
          } else {
            
    A2_delay--;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 0) {
          
    key_UP 1;
          
    key 1;
          if (
    A2_delay == 360) {
            
    A2_delay 1;
          } else {
            
    A2_delay++;
          }
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key_SET 1;
          
    key 1;
          break;
        }
        if (
    key == && key_SET == && key_DOWN == && key_UP == 1) {
          
    key 0;
        }
      }
      
    Save();
    }
    //*********************************************Subprogram Save()
    void Save() {
      
    lcd.clear();
      
    lcd.setCursor(00);
      
    lcd.print(">    Save...    ");
      
    lcd.setCursor(01);
      
    lcd.print("*Zakhire Tanzimat*");
      
    EEPROM.write(20A1_day);
      
    EEPROM.write(25A1_hour);
      
    EEPROM.write(30A1_minute);
      
    EEPROM.put(35,  A1_delay);
      
    EEPROM.write(40A2_day);
      
    EEPROM.write(45A2_hour);
      
    EEPROM.write(50A2_minute);
      
    EEPROM.put(55A2_delay);

      
    time_t t RTC.get();

      
    time_t ALARM_1_INTERVAL(t_to_sec(A1_hourA1_minuteA1_day));  // alarm interval in seconds
      // calculate the next alarm time
      
    time_t a1 ALARM_1_INTERVAL;
      
    // set the alarm
      
    RTC.setAlarm(ALM1_MATCH_DATEsecond(a1), minute(a1), hour(a1), day(a1));
      
    //////formatTime(timestamp, a1);
      //////Serial << F("A1:") << timestamp << endl;

      
    time_t ALARM_2_INTERVAL(t_to_sec(A2_hourA2_minuteA2_day));
      
    time_t a2 ALARM_2_INTERVAL;
      
    // set the alarm
      
    RTC.setAlarm(ALM2_MATCH_DATEsecond(a2), minute(a2), hour(a2), day(a2));
      
    //////formatTime(timestamp2, a2);
      //////Serial << F("A2:") << timestamp2 << endl;
      
    DateTime now rtc.now();
      if (
    DateTime(_year_month_day_hour_minute0) > DateTime(now))
        
    rtc.adjust(DateTime(_year_month_day_hour_minute0));

      
    delay(2000);
      
    lcd.clear();

    جدیدترین ویرایش توسط حمید حمید; ۲۲:۱۸ ۱۳۹۹/۰۱/۲۴. دلیل: تکمیل و رفع چند ایراد کد

    دیدگاه


      #3
      پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

      بسم الله

      به کدفوق ، سنسور دما و رطوبت AM2302 با قابلیت کنترل دما و رطوبت اضافه شد.
      نکته:کد روی میکروکنترلر بر پایه ATmega32u4 اجرا می شود.

      کد PHP:
      #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC
      #include <Streaming.h> // http://arduiniana.org/libraries/streaming/

      #include <EEPROM.h>
      //*******RTClib.h****
      #include "RTClib.h"
      #include "Wire.h"
      RTC_DS3231 rtc;
      //*******END_RTClib.h****
      #include <AnalogButtons.h> //https://github.com/rlogiacco/AnalogButtons

      #define ANALOG_PIN A1

      #include <Wire.h>
      #include <LiquidCrystal_I2C.h>  //https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

      // Set the LCD address to 0x27 or 0x3F for a 20 chars and 4 line display
      LiquidCrystal_I2C lcd(0x3F204);

      // pin definitions
      //#define Input1 A3
      //#define Input2 A4
      #define RELAY_Temp1 8
      #define RELAY_Hum2 7

      boolean key 0;
      int _hour_minute;
      int _year_month_day;
      boolean key_SET key_SET2 key_DOWN 1key_UP 1;
      int show 0;
      // pin definitions
      const uint8_t RTC_INT_PIN(10);  //connected to SQW PIN of DS3231

      // current time from the RTC in text format
      char timestamp[32];
      char timestamp2[32];
      //**************************************
      // A call back function that you pass into the constructor of AnalogButtons, see example
      // below. Alternativly you could extend the Button class and re-define the methods pressed()
      // or held() which are called
      void b1Click() {
        
      //Serial.println("button 1 clicked");
        
      show 0;
        
      lcd.clear();
      }
      void b1Hold() {
        
      //Serial.println("button 1 held");
        
      key_SET 0;
      }
      void b2Click() {
        
      //Serial.println("button 2 clicked");
        
      show 1;
        
      lcd.clear();
      }
      void b2Hold() {
        
      //Serial.println("button 2 held");
        
      key_SET2 0;
      }

      void b3Click() {
        
      //Serial.println("button 3 clicked");
        
      key_DOWN 0;
        
      lcd.clear();
      }
      void b3Hold() {
        
      //Serial.println("button 3 held");
        
      key_DOWN 0;
      }
      void b4Click() {
        
      //Serial.println("button 4 clicked");
        
      key_UP 0;
        
      lcd.clear();
      }
      void b4Hold() {
        
      //Serial.println("button 4 held");
        
      key_UP 0;
      }

      AnalogButtons analogButtons(ANALOG_PININPUT);
      Button b1 Button(692, &b1Click, &b1Hold25002500);
      Button b2 Button(857, &b2Click, &b2Hold25002500);
      Button b3 Button(880, &b3Click, &b3Hold500200);
      Button b4 Button(904, &b4Click, &b4Hold500200);

      //tabdile roz caat va daghighe be saniye
      long t_to_sec(int hint m long days)
      {
        
      long t_to_sec = ((((days 24) * 60) * 60) + ((60) * 60) + (60));
        return 
      t_to_sec;
      }
      #include "DHT.h"
      #define DHTPIN A0
      #define DHTTYPE DHT22
      DHT dht(DHTPINDHTTYPE);

      long A1_day EEPROM.read(20);
      int A1_hour EEPROM.read(25);
      int A1_minute EEPROM.read(30);
      long A1_delay EEPROM.get(35,  A1_delay);
      long A2_day EEPROM.read(40);
      int A2_hour EEPROM.read(45);
      int A2_minute EEPROM.read(50);
      long A2_delay EEPROM.get(55,  A2_delay);
      const 
      time_t ALARM_1_INTERVAL(t_to_sec(A1_hourA1_minuteA1_day));  // alarm interval in seconds
      const time_t ALARM_2_INTERVAL(t_to_sec(A2_hourA2_minuteA2_day));  // alarm interval in seconds

      float temphumhic;
      boolean temperaturestate EEPROM.get(80temperaturestate);
      boolean humiditystate EEPROM.get(85humiditystate);
      float mintemp EEPROM.get(90mintemp);
      float maxtemp =  EEPROM.get(95maxtemp);
      float  minhum =  EEPROM.get(100minhum);
      float maxhum EEPROM.get(105,  maxhum);


      void setup()
      {
        
      dht.begin();
        
      //Serial.begin(115200);
        
      pinMode(RELAY_Temp1OUTPUT);
        
      pinMode(RELAY_Hum2OUTPUT);
        
      digitalWrite(RELAY_Temp1HIGH);
        
      digitalWrite(RELAY_Hum2HIGH);

        
      //*******RTClib.h****
        
      if (! rtc.begin()) {
          
      //Serial.println("Couldn't find RTC");
          
      while (1);
        }
        if (
      rtc.lostPower()) {
          
      //Serial.println("RTC lost power, lets set the time!");
          // If the RTC have lost power it will sets the RTC to the date & time this sketch was compiled in the following line
          
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        }
        
      // 1>only If you need to set the time    uncomment line 3 or 6
        // 2>following line sets the RTC to the date & time this sketch was compiled
        //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // 4>This line sets the RTC with an explicit date & time, for example to set
        // 5>April 21, 2020 at 23pm you would call:
        //rtc.adjust(DateTime(2020, 4, 21, 23, 59, 59));
        //*******END_RTClib.h****
        
      analogButtons.add(b1);
        
      analogButtons.add(b2);
        
      analogButtons.add(b3);
        
      analogButtons.add(b4);

        
      lcd.begin();
        
      lcd.clear();
        
      lcd.setCursor(00);
        
      lcd.print("*Hamid Samadi 99*");
        
      lcd.setCursor (01);
        
      lcd.print(">Arduino Pro CLOCK");
        
      delay(2000);
        
      lcd.clear();

        
      delay(300);
        
      //Serial << F( "\n" __FILE__ " " __DATE__ " " __TIME__ "\n" );
        
      pinMode(RTC_INT_PININPUT_PULLUP);

        
      // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
        
      RTC.setAlarm(ALM1_MATCH_DATE0001);
        
      RTC.setAlarm(ALM2_MATCH_DATE0001);
        
      RTC.alarm(ALARM_1);
        
      RTC.alarm(ALARM_2);
        
      RTC.alarmInterrupt(ALARM_1false);
        
      RTC.alarmInterrupt(ALARM_2false);
        
      RTC.squareWave(SQWAVE_NONE);

        
      // print the current time
        
      time_t t RTC.get();
        
      //formatTime(timestamp, t);
        //Serial << millis() << F(" Current RTC time ") << timestamp << endl;


        
      time_t a1 EEPROM.get(60a1); ;   // calculate the alarm time
        
      formatTime(timestampa1);
        
      //timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
        //Serial << F("A1:") << timestamp << endl;
        
      RTC.setAlarm(ALM1_MATCH_DATEminute(a1), hour(a1), day(a1));
        
      RTC.alarm(ALARM_1);                 // ensure RTC interrupt flag is cleared
        
      RTC.alarmInterrupt(ALARM_1true);  //faal kardane zang

        
      time_t a2 EEPROM.get(65a2);;    // calculate the alarm time
        
      formatTime(timestamp2a2);
        
      //timestamp2[17] = 0;                  // keep just hh:mm weekday DD MM
        //Serial << F("A2:") << timestamp2 << endl;
        
      RTC.setAlarm(ALM2_MATCH_DATEminute(a2), hour(a2), day(a2));
        
      RTC.alarm(ALARM_2);                 // ensure RTC interrupt flag is cleared
        
      RTC.alarmInterrupt(ALARM_2true);  //faal kardane zang

      }


      void loop()

        
      analogButtons.check();

        
      DateTime now rtc.now();
        
        if (
      show == 0) {
          
      // To check values when button are pressed
          
      analogButtons.check();

          
      lcd.setCursor(00);
          
      char buffer1[] = "hh:mm:ss";
          
      lcd.print(now.toString(buffer1));
          
      lcd.setCursor(100);
          
      lcd.print(rtc.getTemperature());
          
      lcd.print("\337");
          
      lcd.setCursor(01);
          
      char buffer3[] = "YYYY/MM/DD";
          
      lcd.print(now.toString(buffer3));
          
      char buffer2[] = " [DDD]";
          
      lcd.print(now.toString(buffer2));

          
      lcd.setCursor (02);
          
      lcd.print("A1:");
          
      timestamp[17] = 0;
          
      lcd.print(timestamp);

          
      lcd.setCursor (03);
          
      lcd.print("A2:");
          
      timestamp2[17] = 0;
          
      lcd.print(timestamp2);


          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            
      _hour now.hour();
            
      _minute now.minute();
            
      _year now.year();
            
      _month now.month();
            
      _day now.day();
            
      SET_hour();
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
          
      //****************************
        
      } else {
          
      analogButtons.check();
          
      temp dht.readTemperature();

          
      lcd.setCursor(00);
          
      lcd.print("Temp:");
          
      lcd.print(temp1);
          
      lcd.print("\337");

          if (
      mintemp == maxtemp || !temperaturestate ) {
            
      lcd.print("  OFF!");
          }
          if ( 
      mintemp != maxtemp && mintemp maxtemp ) {
            
      //Cooling mode system
            
      if (temp mintemp && temperaturestate) {
              
      lcd.print(" Too warm");
            }
            if (
      temp mintemp && temp maxtemp && temperaturestate) {
              
      lcd.print(" Cooling");
            }
            if (
      temp maxtemp && temperaturestate) {
              
      lcd.print(" Too cool");
            }
          }
          if (
      mintemp != maxtemp && mintemp maxtemp) {
            
      //Heating mode system
            
      if (temp mintemp && temperaturestate) {
              
      lcd.print(" Too cool");
            }
            if (
      temp mintemp && temp maxtemp && temperaturestate) {
              
      lcd.print(" Heating");
            }
            if (
      temp maxtemp && temperaturestate) {
              
      lcd.print(" Too warm");
            }
          }
          
      lcd.setCursor(01);
          
      lcd.print("TMin<");
          
      lcd.print(mintemp1);
          
      lcd.print("  TMax<");
          
      lcd.print(maxtemp1);

          
      hum dht.readHumidity();

          
      lcd.setCursor(02);
          
      lcd.print("Hum :");
          
      lcd.print(hum1);
          
      lcd.print("%");

          if (
      minhum == maxhum || !humiditystate ) {
            
      lcd.print("  OFF!");
          }
          if ( 
      minhum != maxhum && minhum maxhum ) {
            
      //Dehumidification mode system
            
      if (hum minhum && humiditystate) {
              
      lcd.print(" Too humid");
            }
            if (
      hum minhum && hum maxhum && humiditystate) {
              
      lcd.print(" Dehumidif");
            }
            if (
      hum maxhum && humiditystate) {
              
      lcd.print(" Too dry");
            }
          }
          if (
      minhum != maxhum && minhum maxhum) {
            
      //Humidification mode system
            
      if (hum minhum && humiditystate) {
              
      lcd.print(" Too dry");
            }
            if (
      hum minhum && hum maxhum && humiditystate) {
              
      lcd.print(" Humidific");
            }
            if (
      hum maxhum && humiditystate) {
              
      lcd.print(" Too humid");
            }
          }
          
      lcd.setCursor(03);
          
      lcd.print("HMin<");
          
      lcd.print(minhum1);
          
      lcd.print("  HMax<");
          
      lcd.print(maxhum1);

          
      //Heat index= mohasebe dama ba tavajoh be rotobat
          //hic = dht.computeHeatIndex(temp, hum, false);
          //Serial.print(F("Heat  index: "));
          //Serial.print(hic);
          //Serial.println(F("°C "));
          //Serial.print(F("Temperature: "));
          //Serial.print(temp, 1);
          //Serial.println(F(" °C"));
          //Serial.print(F("Humidity: "));
          //Serial.print(hum, 1);
          //Serial.println(F("%"));
          //Serial.println("-----------------------");

          
      if (key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;

            
      SET_systemp();
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }

        
      temp dht.readTemperature();
        
      hum dht.readHumidity();
        
      TempRelay();
        
      HumRelay();
        
      // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
        
      if (!digitalRead(RTC_INT_PIN))
        {
          if (
      RTC.alarm(ALARM_1))             // resets the alarm flag if set
          
      {
            
      //Serial <<  F(" Alarm1 Fired")  << endl;
            
      lcd.clear();
            
      lcd.setCursor(00);
            
      lcd.print("A1 Fired: ");
            
      lcd.setCursor(01);
            
      lcd.print("Relay1 is on ");
            
      digitalWrite(RELAY_Temp1LOW);
            
      // get the current time
            
      time_t t RTC.get();
            
      //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
            
      tmElements_t tm;
            
      breakTime(t  tm);
            
      tm.Hour 00;                   // set the RTC to an arbitrary time
            
      tm.Minute 00;
            
      tm.Second 00;
            
      // calculate the next alarm time
            
      time_t a1 makeTime(tm) + ALARM_1_INTERVAL;
            
      EEPROM.put(60a1);
            
      // set the alarm
            
      RTC.setAlarm(ALM1_MATCH_DATEsecond(a1), minute(a1), hour(a1), day(a1));
            
      formatTime(timestampa1);
            
      timestamp[17] = 0;                   // keep just hh:mm weekday DD MM
            //Serial << F("NEXT A1:") << timestamp << endl;
            
      lcd.setCursor (02);
            
      lcd.print("A1:");
            
      lcd.print(timestamp);
            
      delay((A1_delay 1000) * 60);
            
      digitalWrite(RELAY_Temp1HIGH);
            
      lcd.clear();
          }

          if (
      RTC.alarm(ALARM_2))
          {
            
      lcd.clear();
            
      lcd.setCursor(00);
            
      lcd.print("A2 Fired: ");
            
      lcd.setCursor(01);
            
      lcd.print("Relay2 is on ");
            
      digitalWrite(RELAY_Hum2LOW);
            
      //Serial << F(" Alarm2 Fired")  << endl;
            // get the current time
            
      time_t t RTC.get();
            
      //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
            
      tmElements_t tm;
            
      breakTime(t  tm);
            
      tm.Hour 00;                   // set the RTC to an arbitrary time
            
      tm.Minute 00;
            
      tm.Second 00;
            
      // calculate the next alarm time
            
      time_t a2 makeTime(tm) + ALARM_2_INTERVAL;
            
      EEPROM.put(65a2);
            
      // set the alarm
            
      RTC.setAlarm(ALM2_MATCH_DATEsecond(a2), minute(a2), hour(a2), day(a2));
            
      formatTime(timestamp2a2);
            
      timestamp2[17] = 0;                   // keep just hh:mm weekday DD MM
            //Serial << F("NEXT A2:") << timestamp2 << endl;
            
      lcd.setCursor (03);
            
      lcd.print("A2:");
            
      lcd.print(timestamp2);
            
      delay((A2_delay 1000) * 60);
            
      digitalWrite(RELAY_Hum2HIGH);
            
      lcd.clear();
          }
        }
        
      configure();
      }
      void configure() {
        
      unsigned int value analogRead(ANALOG_PIN);
        
      //Serial.println(value);
        
      delay(250);
      }

      // format a time_t value, return the formatted string in buf (must be at least 25 bytes)
      void formatTime(char *buftime_t t)
      {
        
      char m[4];    // temporary storage for month string (DateStrings.cpp uses shared buffer)
        
      strcpy(mmonthShortStr(month(t)));
        
      sprintf(buf"%.2d:%.2d:%.2d %s%.2d%s %d",
                
      hour(t), minute(t), second(t),  dayShortStr(weekday(t)), day(t), myear(t));
      }

      //*********************************************Subprogram SET_hour()
      void SET_hour() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET Hour");
          
      lcd.setCursor (01);
          
      lcd.print("Hour  = ");
          
      lcd.print(_hour);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      _hour == 0) {
              
      _hour 23;
            } else {
              
      _hour--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      _hour == 23) {
              
      _hour 0;
            } else {
              
      _hour++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_minute();
      }
      //*********************************************Subprogram SET_minute()
      void SET_minute() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET Minute");
          
      lcd.setCursor (01);
          
      lcd.print("Minute= ");
          
      lcd.print(_minute);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      _minute == 0) {
              
      _minute 59;
            } else {
              
      _minute--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      _minute == 59) {
              
      _minute 0;
            } else {
              
      _minute++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_year();
      }
      //*********************************************Subprogram SET_year()
      void SET_year() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET Year");
          
      lcd.setCursor (01);
          
      lcd.print("Year  = ");
          
      lcd.print(_year);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      _year == 2015) {
              
      _year 2030;
            } else {
              
      _year--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      _year == 2030) {
              
      _year 2015;
            } else {
              
      _year++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_month();
      }
      //*********************************************Subprogram SET_month()
      void SET_month() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET Month");
          
      lcd.setCursor (01);
          
      lcd.print("Month = ");
          
      lcd.print(_month);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      _month == 1) {
              
      _month 12;
            } else {
              
      _month--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      _month == 12) {
              
      _month 1;
            } else {
              
      _month++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_day();
      }
      //*********************************************Subprogram SET_day()
      void SET_day() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET Day");
          
      lcd.setCursor (01);
          
      lcd.print("Day   = ");
          
      lcd.print(_day);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      _day == 1) {
              
      _day 31;
            } else {
              
      _day--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      _day == 31) {
              
      _day 1;
            } else {
              
      _day++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm1_day();
      }

      //*********************************************Subprogram SET_Alarm1_day()
      void SET_Alarm1_day() {
        
      lcd.clear();
        
        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print("SET A1 Every Few Day");
          
      lcd.setCursor (01);
          
      lcd.print("Day   = ");
          
      lcd.print(A1_day);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A1_day == 1) {
              
      A1_day 31;
            } else {
              
      A1_day--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A1_day == 31) {
              
      A1_day 1;
            } else {
              
      A1_day++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm1_hour();
      }
      //*********************************************Subprogram SET_Alarm1_hour()
      void SET_Alarm1_hour() {
        
      lcd.clear();
        
        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A1 Match Hour");
          
      lcd.setCursor (01);
          
      lcd.print("Hour  = ");
          
      lcd.print(A1_hour);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A1_hour == 0) {
              
      A1_hour 23;
            } else {
              
      A1_hour--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A1_hour == 23) {
              
      A1_hour 0;
            } else {
              
      A1_hour++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm1_minute();
      }
      //*********************************************Subprogram SET_Alarm1_minute()
      void SET_Alarm1_minute() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A1 Match Minute");
          
      lcd.setCursor (01);
          
      lcd.print("Minute= ");
          
      lcd.print(A1_minute);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A1_minute == 0) {
              
      A1_minute 59;
            } else {
              
      A1_minute--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A1_minute == 59) {
              
      A1_minute 0;
            } else {
              
      A1_minute++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm1_delay();
      }
      //*********************************************Subprogram SET_Alarm1_delay()
      void SET_Alarm1_delay() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A1 Amount Delay");
          
      lcd.setCursor (01);
          
      lcd.print("Delay = ");
          
      lcd.print(A1_delay);
          
      lcd.setCursor (121);
          
      lcd.print("*Minute");
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A1_delay == 0) {
              
      A1_delay 1400;
            } else {
              
      A1_delay--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A1_delay == 1400) {
              
      A1_delay 0;
            } else {
              
      A1_delay++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm2_day();
      }
      //*********************************************Subprogram SET_Alarm2_day()
      void SET_Alarm2_day() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print("SET A2 Every Few Day");
          
      lcd.setCursor (01);
          
      lcd.print("Day   = ");
          
      lcd.print(A2_day);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A2_day == 1) {
              
      A2_day 31;
            } else {
              
      A2_day--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A2_day == 31) {
              
      A2_day 1;
            } else {
              
      A2_day++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm2_hour();
      }
      //*********************************************Subprogram SET_Alarm2_hour()
      void SET_Alarm2_hour() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A2 Match Hour");
          
      lcd.setCursor (01);
          
      lcd.print("Hour  = ");
          
      lcd.print(A2_hour);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A2_hour == 0) {
              
      A2_hour 23;
            } else {
              
      A2_hour--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A2_hour == 23) {
              
      A2_hour 0;
            } else {
              
      A2_hour++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm2_minute();
      }
      //*********************************************Subprogram SET_Alarm2_minute()
      void SET_Alarm2_minute() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A2 Match Minute");
          
      lcd.setCursor (01);
          
      lcd.print("Minute= ");
          
      lcd.print(A2_minute);
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A2_minute == 0) {
              
      A2_minute 59;
            } else {
              
      A2_minute--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A2_minute == 59) {
              
      A2_minute 0;
            } else {
              
      A2_minute++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_Alarm2_delay();
      }
      //*********************************************Subprogram SET_Alarm2_delay()
      void SET_Alarm2_delay() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET A2 Amount Delay");
          
      lcd.setCursor (01);
          
      lcd.print("Delay = ");
          
      lcd.print(A2_delay);
          
      lcd.setCursor (121);
          
      lcd.print(" *Minute");
          
      analogButtons.check();
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      A2_delay == 0) {
              
      A2_delay 1400;
            } else {
              
      A2_delay--;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      A2_delay == 1400) {
              
      A2_delay 0;
            } else {
              
      A2_delay++;
            }
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key_SET 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      Save();
      }
      //*********************************************Subprogram Save()
      void Save() {
        
      lcd.clear();
        
      lcd.setCursor(00);
        
      lcd.print(">    Save...    ");
        
      lcd.setCursor(01);
        
      lcd.print("*Zakhire Tanzimat*");

        
      time_t t RTC.get();
        
      //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
        
      tmElements_t tm;
        
      breakTime(t  tm);
        
      tm.Hour 00;                   // set the RTC to an arbitrary time
        
      tm.Minute 00;
        
      tm.Second 00;
        
        
      time_t ALARM_1_INTERVAL(t_to_sec(A1_hourA1_minuteA1_day));  // alarm interval in seconds
        // calculate the next alarm time
        
      time_t a1 makeTime(tm) + ALARM_1_INTERVAL;
        
      // set the alarm
        
      RTC.setAlarm(ALM1_MATCH_DATEsecond(a1), minute(a1), hour(a1), day(a1));
        
      formatTime(timestampa1);

        
      time_t ALARM_2_INTERVAL(t_to_sec(A2_hourA2_minuteA2_day));
        
      time_t a2 makeTime(tm) + ALARM_2_INTERVAL;
        
      // set the alarm
        
      RTC.setAlarm(ALM2_MATCH_DATEsecond(a2), minute(a2), hour(a2), day(a2));
        
      formatTime(timestamp2a2);

        
      DateTime now rtc.now();
        if (
      DateTime(_year_month_day_hour_minute0) > DateTime(now))
          
      rtc.adjust(DateTime(_year_month_day_hour_minute0));

        
      EEPROM.write(20A1_day);
        
      EEPROM.write(25A1_hour);
        
      EEPROM.write(30A1_minute);
        
      EEPROM.put(35,  A1_delay);
        
      EEPROM.write(40A2_day);
        
      EEPROM.write(45A2_hour);
        
      EEPROM.write(50A2_minute);
        
      EEPROM.put(55A2_delay);
        
      EEPROM.put(60a1);
        
      EEPROM.put(65a2);

        
      delay(2000);
        
      lcd.clear();
      }


      //*********************************************Subprogram SET_SystemTemp()
      void SET_systemp() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET System Temp");
          
      lcd.setCursor (01);
          
      lcd.print("System Temp  = ");
          if (
      temperaturestate) {
            
      lcd.print("ON");
          } else {
            
      lcd.print("OFF");
          }
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            
      temperaturestate = !temperaturestate;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            
      temperaturestate = !temperaturestate;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_syshum();
      }
      //*********************************************Subprogram SET_SystemHum()
      void SET_syshum() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET System Hum");
          
      lcd.setCursor (01);
          
      lcd.print("System Hum  = ");
          if (
      humiditystate) {
            
      lcd.print("ON");
          } else {
            
      lcd.print("OFF");
          }
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            
      humiditystate = !humiditystate;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            
      humiditystate = !humiditystate;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_mintemp();
      }

      //*********************************************Subprogram SET_MinTemp()
      void SET_mintemp() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET MinTemp");
          
      lcd.setCursor (01);
          
      lcd.print("Temp  = ");
          
      lcd.print(mintemp1);
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      mintemp == -40) {
              
      mintemp 80;
            } else {
              
      mintemp -= 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      mintemp == 80) {
              
      mintemp = -40;
            } else {
              
      mintemp += 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_maxtemp();
      }
      //*********************************************Subprogram SET_MaxTemp()
      void SET_maxtemp() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET MaxTemp");
          
      lcd.setCursor (01);
          
      lcd.print("Temp  = ");
          
      lcd.print(maxtemp1);
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      maxtemp == -40) {
              
      maxtemp 80;
            } else {
              
      maxtemp -= 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      maxtemp == 80) {
              
      maxtemp = -40;
            } else {
              
      maxtemp += 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_minhum();
      }
      //*********************************************Subprogram SET_MinHum()
      void SET_minhum() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET MinHum");
          
      lcd.setCursor (01);
          
      lcd.print("Hum  = ");
          
      lcd.print(minhum1);
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      minhum == 0) {
              
      minhum 100;
            } else {
              
      minhum -= 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      minhum == 100) {
              
      minhum 0;
            } else {
              
      minhum += 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      SET_maxhum();
      }
      //*********************************************Subprogram SET_MaxHum()
      void SET_maxhum() {
        
      lcd.clear();

        while (
      1) {
          
      lcd.setCursor(00);
          
      lcd.print(">SET MaxHum");
          
      lcd.setCursor (01);
          
      lcd.print("Hum  = ");
          
      lcd.print(maxhum1);
          
      analogButtons.check();
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_DOWN 1;
            
      key 1;
            if (
      maxhum == 0) {
              
      maxhum 100;
            } else {
              
      maxhum -= 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 0) {
            
      key_UP 1;
            
      key 1;
            if (
      maxhum == 100) {
              
      maxhum 0;
            } else {
              
      maxhum += 0.1;
            }
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key_SET2 1;
            
      key 1;
            break;
          }
          if (
      key == && key_SET2 == && key_DOWN == && key_UP == 1) {
            
      key 0;
          }
        }
        
      Save2();
      }
      //*********************************************Subprogram Save()
      void Save2() {
        
      lcd.clear();
        
      lcd.setCursor(00);
        
      lcd.print(">    Save...    ");
        
      lcd.setCursor(01);
        
      lcd.print("*Zakhire Tanzimat*");
        
      EEPROM.put(80,  temperaturestate);
        
      EEPROM.put(85humiditystate);
        
      EEPROM.put(90mintemp);
        
      EEPROM.put(95maxtemp);
        
      EEPROM.put(100minhum);
        
      EEPROM.put(105,  maxhum);
        
      delay(2000);
        
      lcd.clear();
      }

      void TempRelay() {
        if (
      mintemp == maxtemp || !temperaturestate ) {
          
      digitalWrite (RELAY_Temp1HIGH);
        }
        if ( 
      mintemp != maxtemp && mintemp maxtemp ) {
          
      //Cooling mode system
          
      if (temp mintemp && temperaturestate) {
            
      digitalWrite (RELAY_Temp1LOW);
          }
          if (
      temp maxtemp && temperaturestate) {
            
      digitalWrite (RELAY_Temp1HIGH);
          }
        }
        if (
      mintemp != maxtemp && mintemp maxtemp) {
          
      //Heating mode system
          
      if (temp mintemp && temperaturestate) {
            
      digitalWrite (RELAY_Temp1LOW);
          }
          if (
      temp maxtemp && temperaturestate) {
            
      digitalWrite (RELAY_Temp1HIGH);
          }
        }
        
      delay(5);
      }

      void HumRelay() {
        if (
      minhum == maxhum || !humiditystate ) {
          
      digitalWrite (RELAY_Hum2HIGH);
        }
        if ( 
      minhum != maxhum && minhum maxhum ) {
          
      //Dehumidification mode system
          
      if (hum minhum && humiditystate) {
            
      digitalWrite (RELAY_Hum2LOW);
          }
          if (
      hum maxhum && humiditystate) {
            
      digitalWrite (RELAY_Hum2HIGH);
          }
        }
        if (
      minhum != maxhum && minhum maxhum) {
          
      //Humidification mode system
          
      if (hum minhum && humiditystate) {
            
      digitalWrite (RELAY_Hum2LOW);
          }
          if (
      hum maxhum && humiditystate) {
            
      digitalWrite (RELAY_Hum2HIGH);
          }
        }
        
      delay(5);

      جدیدترین ویرایش توسط حمید حمید; ۱۰:۱۵ ۱۳۹۹/۰۱/۲۷. دلیل: تکمیل و رفع چند ایراد کد

      دیدگاه


        #4
        پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

        بسم الله
        مدتی بود دنبال یک دستگاه بودم که هم بتونم کنترل دما و رطوبت را باهاش انجام بدهم هم یک قابلیت زمانبدی قطع و وصل رله را داشته باشه.
        بعد از جستجو تو سایتهای مختلف و پیدا نکردن یک همچین موجودی ،خودم دست به کار شدم و همچین موجودی را ساختم.
        قطعات مورد نیاز:
        1- LCD 20x4
        2-ماژول تبدیل LCD به i2c
        3-ماژول رله 2 کانال 5 ولت
        4- سنسور دما و رطوبت DHT21 یا DHT22
        5- ماژول ساعت DS3231
        6- چهار عدد تک سوئیچ
        7-شش عدد مقاومت جهت ساخت سوئیچ آنالوگ و یکی برای پول آپ سنسور
        8-دو عدد برد سوراخدار 250 نقطه
        9-ماژول تغذیه کاهنده LM2596
        10-یک یا 2 متر سیم برق
        11-سیم جامپر نر به ماده 20cm فلت 40 رشته
        12-حداکثر 20 متر سیم 3 رشته یا 2 زوج مسی برای سنسور دما و رطوبت(کابل تلفن مسی هم جواب میده)
        13- 2 عدد پریز توکار دربدار تابلویی
        14-چند ترمینال پیچی مدل KF350-Pin دو و سه پین
        15-یک عدد آداپتور 24 ولت حداقل 1آمپری(اختیاری)
        16- یک عدد جک آداپتور روپنلی مدل DC-025M (اختیاری)
        17- یک عدد آداپتور 5 ولت 1.5 آمپری
        18-یک عدد جعبه 10x15
        20- یک عدد میکرو پرو بخاطر کوچک شدن سایز دستگاه وگرنه هر میکروی دیگری میتوان استفاده شود
        بعد از سر هم کردن قطعات برنامه زیر را هم روش بار گذاری بفرمایید
        ,والسلام
        هدیه نثار روح شهدا و امام شهدا الفاتحه مع صلوات بر محمد و آل محمد


        #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC

        #include <EEPROM.h>

        #include <AnalogButtons.h> //https://github.com/rlogiacco/AnalogButtons

        #define ANALOG_PIN A0

        #include <Wire.h>
        #include <LiquidCrystal_I2C.h> //https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

        // Set the LCD address to 0x27 or 0x3F for a 20 chars and 4 line display
        LiquidCrystal_I2C lcd(0x3F, 20, 4);

        #include "DHT.h"
        #define DHTPIN A1
        #define DHTTYPE DHT22
        DHT dht(DHTPIN, DHTTYPE);

        // pin definitions
        //#define Input1 A3
        //#define Input2 A4
        #define RELAY_Temp1 8
        #define RELAY_Hum2 7

        boolean key = 0;
        int _hour, _minute;
        int _year, _month, _day;
        boolean key_SET = 1 , key_SET2 = 1 , key_DOWN = 1, key_UP = 1;
        boolean show = 0;
        // pin definitions
        const uint8_t RTC_INT_PIN(10); //connected to SQW PIN of DS3231

        // current time from the RTC in text format
        char timestamp[32];
        char timestamp2[32];
        //**************************************
        // A call back function that you pass into the constructor of AnalogButtons, see example
        // below. Alternativly you could extend the Button class and re-define the methods pressed()
        // or held() which are called
        void b1Click() {

        show = 0;
        lcd.clear();
        }
        void b1Hold() {

        key_SET = 0;
        }
        void b2Click() {

        show = 1;
        lcd.clear();
        }
        void b2Hold() {

        key_SET2 = 0;
        }

        void b3Click() {

        key_DOWN = 0;
        lcd.clear();
        }
        void b3Hold() {

        key_DOWN = 0;
        }
        void b4Click() {

        key_UP = 0;
        lcd.clear();
        }
        void b4Hold() {

        key_UP = 0;
        }

        AnalogButtons analogButtons(ANALOG_PIN, INPUT);
        Button b1 = Button(693, &b1Click, &b1Hold, 2500, 2500);
        Button b2 = Button(857, &b2Click, &b2Hold, 2500, 2500);
        Button b3 = Button(881, &b3Click, &b3Hold, 500, 200);
        Button b4 = Button(904, &b4Click, &b4Hold, 500, 200);

        //tabdile roz caat va daghighe be saniye
        long t_to_sec(int h, int m , long days)
        {
        long t_to_sec = ((((days * 24) * 60) * 60) + ((h * 60) * 60) + (m * 60));
        return t_to_sec;
        }

        long A1_day = EEPROM.read(20);
        int A1_hour = EEPROM.read(25);
        int A1_minute = EEPROM.read(30);
        long A1_delay = EEPROM.get(35, A1_delay);
        long A2_day = EEPROM.read(40);
        int A2_hour = EEPROM.read(45);
        int A2_minute = EEPROM.read(50);
        long A2_delay = EEPROM.get(55, A2_delay);
        const time_t ALARM_1_INTERVAL(t_to_sec(A1_hour, A1_minute, A1_day)); // alarm interval in seconds
        const time_t ALARM_2_INTERVAL(t_to_sec(A2_hour, A2_minute, A2_day)); // alarm interval in seconds

        float temp, hum, hic;
        boolean temperaturestate = EEPROM.get(80, temperaturestate);
        boolean humiditystate = EEPROM.get(85, humiditystate);
        float mintemp = EEPROM.get(90, mintemp);
        float maxtemp = EEPROM.get(95, maxtemp);
        float minhum = EEPROM.get(100, minhum);
        float maxhum = EEPROM.get(105, maxhum);

        //**************************************************************************Setup()
        void setup()
        {
        dht.begin();
        //Serial.begin(9600);
        pinMode(RELAY_Temp1, OUTPUT);
        pinMode(RELAY_Hum2, OUTPUT);
        digitalWrite(RELAY_Temp1, HIGH);
        digitalWrite(RELAY_Hum2, HIGH);

        analogButtons.add(b1);
        analogButtons.add(b2);
        analogButtons.add(b3);
        analogButtons.add(b4);

        lcd.begin();
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" *Besme allah*");
        lcd.setCursor (0, 1);
        lcd.print(" CLOCK Pro");
        lcd.setCursor (0, 2);
        lcd.print(" TEMP & HUM");
        delay(5000);
        lcd.clear();

        pinMode(RTC_INT_PIN, INPUT_PULLUP);
        // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
        RTC.setAlarm(ALM1_MATCH_DATE, 0, 0, 0, 1);
        RTC.setAlarm(ALM2_MATCH_DATE, 0, 0, 0, 1);
        RTC.alarm(ALARM_1);
        RTC.alarm(ALARM_2);
        RTC.alarmInterrupt(ALARM_1, false);
        RTC.alarmInterrupt(ALARM_2, false);
        RTC.squareWave(SQWAVE_NONE);

        // the current time
        time_t t = RTC.get();
        //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
        tmElements_t tm;
        breakTime(t , tm);
        tm.Hour = 00; // set the RTC to an arbitrary time
        tm.Minute = 00;
        tm.Second = 00;

        // calculate the alarm1
        time_t a1 = EEPROM.get(60, a1); ;
        time_t a_1 = makeTime(tm) + ALARM_1_INTERVAL;
        // calculate the next alarm time
        if (t < a1) {
        RTC.setAlarm(ALM1_MATCH_DATE, minute(a1), hour(a1), day(a1));
        formatTime(timestamp, a1);
        } else {
        RTC.setAlarm(ALM1_MATCH_DATE, minute(a_1), hour(a_1), day(a_1));
        formatTime(timestamp, a_1);
        }
        RTC.alarm(ALARM_1); // ensure RTC interrupt flag is cleared
        RTC.alarmInterrupt(ALARM_1, true); //faal kardane Alarm1

        // calculate the alarm2
        time_t a2 = EEPROM.get(65, a2);; // calculate the alarm time
        time_t a_2 = makeTime(tm) + ALARM_2_INTERVAL;
        if (t < a2) {
        RTC.setAlarm(ALM2_MATCH_DATE, minute(a2), hour(a2), day(a2));
        formatTime(timestamp2, a2);
        } else {
        RTC.setAlarm(ALM2_MATCH_DATE, minute(a_2), hour(a_2), day(a_2));
        formatTime(timestamp2, a_2);
        }
        RTC.alarm(ALARM_2); // ensure RTC interrupt flag is cleared
        RTC.alarmInterrupt(ALARM_2, true); //faal kardane Alarm2
        }

        //**********************************************************loop()
        void loop()
        {
        analogButtons.check();

        //***************************************************Namayesh Clock & Alarms
        if (show == 0) {
        // To check values when button are pressed
        analogButtons.check();
        char buf_time[20];
        char buf_date[20];
        time_t t = RTC.get();
        sprintf(buf_time, "%.2d:%.2d:%.2d",
        hour(t), minute(t), second(t));
        sprintf(buf_date, "%.4d/%.2d/%.2d [%s]",
        year(t) , month(t), day(t), dayShortStr(weekday(t)));

        lcd.setCursor(0, 0);
        lcd.print(buf_time);
        lcd.print(" ");
        lcd.print(RTC.temperature() / 4.0);
        lcd.print("\337");

        lcd.setCursor(0, 1);
        lcd.print(buf_date);

        lcd.setCursor (0, 2);
        lcd.print("A1:");
        timestamp[14] = 0;
        lcd.print(timestamp);

        lcd.setCursor (0, 3);
        lcd.print("A2:");
        timestamp2[14] = 0;
        lcd.print(timestamp2);


        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        _hour = hour(t);
        _minute = minute(t);
        _year = year(t);
        _month = month(t);
        _day = day(t);
        SET_hour();
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        //***************************************************Namayesh TEMP & HUM
        } else {
        analogButtons.check();
        temp = dht.readTemperature();

        lcd.setCursor(0, 0);
        lcd.print("Temp:");
        lcd.print(temp, 1);
        lcd.print("\337");

        if (mintemp == maxtemp || !temperaturestate ) {
        lcd.print(" OFF! ");
        }
        if ( mintemp != maxtemp && mintemp > maxtemp ) {
        //Cooling mode system
        if (temp > mintemp && temperaturestate) {
        lcd.print(" Warm ");
        }
        if (temp < mintemp && temp > maxtemp && temperaturestate && !digitalRead(RELAY_Temp1)) {
        lcd.print(" Cooling");
        }
        if (temp < maxtemp && temperaturestate) {
        lcd.print(" Cold ");
        }

        }
        if (mintemp != maxtemp && mintemp < maxtemp) {
        //Heating mode system
        if (temp < mintemp && temperaturestate) {
        lcd.print(" Cold ");
        }
        if (temp > mintemp && temp < maxtemp && temperaturestate && !digitalRead(RELAY_Temp1)) {
        lcd.print(" Heating");
        }
        if (temp > maxtemp && temperaturestate) {
        lcd.print(" Warm ");
        }

        }
        lcd.setCursor(0, 1);
        lcd.print("TMin");
        lcd.print(mintemp, 1);
        lcd.print(" TMax");
        lcd.print(maxtemp, 1);

        hum = dht.readHumidity();

        lcd.setCursor(0, 2);
        lcd.print("Hum :");
        lcd.print(hum, 1);
        lcd.print("%");

        if (minhum == maxhum || !humiditystate ) {
        lcd.print(" OFF! ");
        }
        if ( minhum != maxhum && minhum > maxhum ) {
        //Dehumidification mode system
        if (hum > minhum && humiditystate) {
        lcd.print(" Wet ");
        }
        if (hum < minhum && hum > maxhum && humiditystate && !digitalRead(RELAY_Hum2)) {
        lcd.print(" Dehumidif");
        }
        if (hum < maxhum && humiditystate) {
        lcd.print(" Dry ");
        }

        }
        if (minhum != maxhum && minhum < maxhum) {
        //Humidification mode system
        if (hum < minhum && humiditystate) {
        lcd.print(" Dry ");
        }
        if (hum > minhum && hum < maxhum && humiditystate && !digitalRead(RELAY_Hum2)) {
        lcd.print(" Humidific");
        }
        if (hum > maxhum && humiditystate) {
        lcd.print(" Wet ");
        }

        }
        lcd.setCursor(0, 3);
        lcd.print("HMin");
        lcd.print(minhum, 1);
        lcd.print(" HMax");
        lcd.print(maxhum, 1);



        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;

        SET_systemp();
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }

        temp = dht.readTemperature();
        hum = dht.readHumidity();
        TempRelay();
        HumRelay();
        // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
        if (!digitalRead(RTC_INT_PIN))
        {
        if (RTC.alarm(ALARM_1)) // resets the alarm flag if set
        {

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("A1 Fired: ");
        lcd.setCursor(0, 1);
        lcd.print("Relay1 is on ");
        digitalWrite(RELAY_Temp1, LOW);
        // get the current time
        time_t t = RTC.get();
        //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
        tmElements_t tm;
        breakTime(t , tm);
        tm.Hour = 00; // set the RTC to an arbitrary time
        tm.Minute = 00;
        tm.Second = 00;
        // calculate the next alarm time
        time_t a1 = makeTime(tm) + ALARM_1_INTERVAL;
        EEPROM.put(60, a1);
        // set the alarm
        RTC.setAlarm(ALM1_MATCH_DATE, second(a1), minute(a1), hour(a1), day(a1));
        formatTime(timestamp, a1);
        timestamp[14] = 0; // keep just hh:mm weekday DD MM

        lcd.setCursor (0, 2);
        lcd.print("A1:");
        lcd.print(timestamp);
        delay((A1_delay * 1000) * 60);
        digitalWrite(RELAY_Temp1, HIGH);
        lcd.clear();
        }

        if (RTC.alarm(ALARM_2))
        {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("A2 Fired: ");
        lcd.setCursor(0, 1);
        lcd.print("Relay2 is on ");
        digitalWrite(RELAY_Hum2, LOW);

        // get the current time
        time_t t = RTC.get();
        //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
        tmElements_t tm;
        breakTime(t , tm);
        tm.Hour = 00; // set the RTC to an arbitrary time
        tm.Minute = 00;
        tm.Second = 00;
        // calculate the next alarm time
        time_t a2 = makeTime(tm) + ALARM_2_INTERVAL;
        EEPROM.put(65, a2);
        // set the alarm
        RTC.setAlarm(ALM2_MATCH_DATE, second(a2), minute(a2), hour(a2), day(a2));
        formatTime(timestamp2, a2);
        timestamp2[14] = 0; // keep just hh:mm weekday DD MM

        lcd.setCursor (0, 3);
        lcd.print("A2:");
        lcd.print(timestamp2);
        delay((A2_delay * 1000) * 60);
        digitalWrite(RELAY_Hum2, HIGH);
        lcd.clear();
        }
        }
        //baraye be dast avardane maghadir switch analog az in ghesmat estefade shavad
        //configure();
        }
        //void configure() {
        //unsigned int value = analogRead(ANALOG_PIN);
        //lcd.setCursor (17, 0);
        //lcd.print(value);
        //delay(250);
        //}
        //*********************************************Subprogram TempRelay()
        void TempRelay() {
        if (mintemp == maxtemp || !temperaturestate ) {
        digitalWrite (RELAY_Temp1, HIGH);
        }
        if ( mintemp != maxtemp && mintemp > maxtemp ) {
        //Cooling mode system
        if (temp > mintemp && temperaturestate) {
        digitalWrite (RELAY_Temp1, LOW);
        }
        if (temp < maxtemp && temperaturestate) {
        digitalWrite (RELAY_Temp1, HIGH);
        }
        }

        if (mintemp != maxtemp && mintemp < maxtemp) {
        //Heating mode system
        if (temp < mintemp && temperaturestate) {
        digitalWrite (RELAY_Temp1, LOW);
        }
        if (temp > maxtemp && temperaturestate) {
        digitalWrite (RELAY_Temp1, HIGH);
        }
        }
        //delay(5);
        }
        //*********************************************Subprogram HumRelay()
        void HumRelay() {
        if (minhum == maxhum || !humiditystate ) {
        digitalWrite (RELAY_Hum2, HIGH);
        }
        if ( minhum != maxhum && minhum > maxhum ) {
        //Dehumidification mode system
        if (hum > minhum && humiditystate) {
        digitalWrite (RELAY_Hum2, LOW);
        //lcd.setCursor(12, 0);
        //lcd.print("ON");
        }
        if (hum < maxhum && humiditystate) {
        digitalWrite (RELAY_Hum2, HIGH);
        }
        }
        if (minhum != maxhum && minhum < maxhum) {
        //Humidification mode system
        if (hum < minhum && humiditystate) {
        digitalWrite (RELAY_Hum2, LOW);
        //lcd.setCursor(12, 2);
        //lcd.print("ON");
        }
        if (hum > maxhum && humiditystate) {
        digitalWrite (RELAY_Hum2, HIGH);
        }
        }
        //delay(5);
        }
        //****************************************************************************************
        // format a time_t value, return the formatted string in buf (must be at least 25 bytes)
        void formatTime(char *buf, time_t t)
        {
        char m[4]; // temporary storage for month string (DateStrings.cpp uses shared buffer)
        strcpy(m, monthShortStr(month(t)));
        sprintf(buf, "%.2d:%.2d %s%.2d%s",
        hour(t), minute(t), dayShortStr(weekday(t)), day(t), m);
        }

        //*********************************************Subprogram SET_hour()
        void SET_hour() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET Hour");
        lcd.setCursor (0, 1);
        lcd.print("Hour = ");
        lcd.print(_hour);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (_hour == 0) {
        _hour = 23;
        } else {
        _hour--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (_hour == 23) {
        _hour = 0;
        } else {
        _hour++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_minute();
        }
        //*********************************************Subprogram SET_minute()
        void SET_minute() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET Minute");
        lcd.setCursor (0, 1);
        lcd.print("Minute= ");
        lcd.print(_minute);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (_minute == 0) {
        _minute = 59;
        } else {
        _minute--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (_minute == 59) {
        _minute = 0;
        } else {
        _minute++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_year();
        }
        //*********************************************Subprogram SET_year()
        void SET_year() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET Year");
        lcd.setCursor (0, 1);
        lcd.print("Year = ");
        lcd.print(_year);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (_year == 2015) {
        _year = 2030;
        } else {
        _year--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (_year == 2030) {
        _year = 2015;
        } else {
        _year++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_month();
        }
        //*********************************************Subprogram SET_month()
        void SET_month() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET Month");
        lcd.setCursor (0, 1);
        lcd.print("Month = ");
        lcd.print(_month);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (_month == 1) {
        _month = 12;
        } else {
        _month--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (_month == 12) {
        _month = 1;
        } else {
        _month++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_day();
        }
        //*********************************************Subprogram SET_day()
        void SET_day() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET Day");
        lcd.setCursor (0, 1);
        lcd.print("Day = ");
        lcd.print(_day);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (_day == 1) {
        _day = 31;
        } else {
        _day--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (_day == 31) {
        _day = 1;
        } else {
        _day++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm1_day();
        }

        //*********************************************Subprogram SET_Alarm1_day()
        void SET_Alarm1_day() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print("SET A1 Every Few Day");
        lcd.setCursor (0, 1);
        lcd.print("Day = ");
        lcd.print(A1_day);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A1_day == 1) {
        A1_day = 31;
        } else {
        A1_day--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A1_day == 31) {
        A1_day = 1;
        } else {
        A1_day++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm1_hour();
        }
        //*********************************************Subprogram SET_Alarm1_hour()
        void SET_Alarm1_hour() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A1 Match Hour");
        lcd.setCursor (0, 1);
        lcd.print("Hour = ");
        lcd.print(A1_hour);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A1_hour == 0) {
        A1_hour = 23;
        } else {
        A1_hour--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A1_hour == 23) {
        A1_hour = 0;
        } else {
        A1_hour++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm1_minute();
        }
        //*********************************************Subprogram SET_Alarm1_minute()
        void SET_Alarm1_minute() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A1 Match Minute");
        lcd.setCursor (0, 1);
        lcd.print("Minute= ");
        lcd.print(A1_minute);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A1_minute == 0) {
        A1_minute = 59;
        } else {
        A1_minute--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A1_minute == 59) {
        A1_minute = 0;
        } else {
        A1_minute++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm1_delay();
        }
        //*********************************************Subprogram SET_Alarm1_delay()
        void SET_Alarm1_delay() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A1 Amount Delay");
        lcd.setCursor (0, 1);
        lcd.print("Delay = ");
        lcd.print(A1_delay);
        lcd.setCursor (12, 1);
        lcd.print("*Minute");
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A1_delay == 0) {
        A1_delay = 1400;
        } else {
        A1_delay--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A1_delay == 1400) {
        A1_delay = 0;
        } else {
        A1_delay++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm2_day();
        }
        //*********************************************Subprogram SET_Alarm2_day()
        void SET_Alarm2_day() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print("SET A2 Every Few Day");
        lcd.setCursor (0, 1);
        lcd.print("Day = ");
        lcd.print(A2_day);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A2_day == 1) {
        A2_day = 31;
        } else {
        A2_day--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A2_day == 31) {
        A2_day = 1;
        } else {
        A2_day++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm2_hour();
        }
        //*********************************************Subprogram SET_Alarm2_hour()
        void SET_Alarm2_hour() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A2 Match Hour");
        lcd.setCursor (0, 1);
        lcd.print("Hour = ");
        lcd.print(A2_hour);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A2_hour == 0) {
        A2_hour = 23;
        } else {
        A2_hour--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A2_hour == 23) {
        A2_hour = 0;
        } else {
        A2_hour++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm2_minute();
        }
        //*********************************************Subprogram SET_Alarm2_minute()
        void SET_Alarm2_minute() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A2 Match Minute");
        lcd.setCursor (0, 1);
        lcd.print("Minute= ");
        lcd.print(A2_minute);
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A2_minute == 0) {
        A2_minute = 59;
        } else {
        A2_minute--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A2_minute == 59) {
        A2_minute = 0;
        } else {
        A2_minute++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_Alarm2_delay();
        }
        //*********************************************Subprogram SET_Alarm2_delay()
        void SET_Alarm2_delay() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET A2 Amount Delay");
        lcd.setCursor (0, 1);
        lcd.print("Delay = ");
        lcd.print(A2_delay);
        lcd.setCursor (12, 1);
        lcd.print(" *Minute");
        analogButtons.check();
        if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (A2_delay == 0) {
        A2_delay = 1400;
        } else {
        A2_delay--;
        }
        }
        if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (A2_delay == 1400) {
        A2_delay = 0;
        } else {
        A2_delay++;
        }
        }
        if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        Save();
        }
        //*********************************************Subprogram Save()
        void Save() {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("> Save...");
        lcd.setCursor(0, 1);
        lcd.print("> *Zakhire*");

        time_t t = RTC.get();
        //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
        tmElements_t tm;
        breakTime(t , tm);
        tm.Hour = 00; // set the RTC to an arbitrary time
        tm.Minute = 00;
        tm.Second = 00;

        time_t ALARM_1_INTERVAL(t_to_sec(A1_hour, A1_minute, A1_day)); // alarm interval in seconds
        // calculate the next alarm time
        time_t a1 = makeTime(tm) + ALARM_1_INTERVAL;
        // set the alarm
        RTC.setAlarm(ALM1_MATCH_DATE, second(a1), minute(a1), hour(a1), day(a1));
        formatTime(timestamp, a1);

        time_t ALARM_2_INTERVAL(t_to_sec(A2_hour, A2_minute, A2_day));
        time_t a2 = makeTime(tm) + ALARM_2_INTERVAL;
        // set the alarm
        RTC.setAlarm(ALM2_MATCH_DATE, second(a2), minute(a2), hour(a2), day(a2));
        formatTime(timestamp2, a2);

        tm.Year = _year - 1970;
        tm.Month = _month;
        tm.Day = _day;
        tm.Hour = _hour;
        tm.Minute = _minute;
        tm.Second = 0;

        if (makeTime(tm) > t)
        RTC.write(tm);

        EEPROM.write(20, A1_day);
        EEPROM.write(25, A1_hour);
        EEPROM.write(30, A1_minute);
        EEPROM.put(35, A1_delay);
        EEPROM.write(40, A2_day);
        EEPROM.write(45, A2_hour);
        EEPROM.write(50, A2_minute);
        EEPROM.put(55, A2_delay);
        EEPROM.put(60, a1);
        EEPROM.put(65, a2);

        delay(2000);
        lcd.clear();
        }


        //*********************************************Subprogram SET_SystemTemp()
        void SET_systemp() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET System Temp");
        lcd.setCursor (0, 1);
        lcd.print("System Temp = ");
        if (temperaturestate) {
        lcd.print("ON");
        } else {
        lcd.print("OFF");
        }
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        temperaturestate = !temperaturestate;
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        temperaturestate = !temperaturestate;
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_syshum();
        }
        //*********************************************Subprogram SET_SystemHum()
        void SET_syshum() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET System Hum");
        lcd.setCursor (0, 1);
        lcd.print("System Hum = ");
        if (humiditystate) {
        lcd.print("ON");
        } else {
        lcd.print("OFF");
        }
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        humiditystate = !humiditystate;
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        humiditystate = !humiditystate;
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_mintemp();
        }

        //*********************************************Subprogram SET_MinTemp()
        void SET_mintemp() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET MinTemp");
        lcd.setCursor (0, 1);
        lcd.print("Temp = ");
        lcd.print(mintemp, 1);
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (mintemp == -40) {
        mintemp = 80;
        } else {
        mintemp -= 0.1;
        }
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (mintemp == 80) {
        mintemp = -40;
        } else {
        mintemp += 0.1;
        }
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_maxtemp();
        }
        //*********************************************Subprogram SET_MaxTemp()
        void SET_maxtemp() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET MaxTemp");
        lcd.setCursor (0, 1);
        lcd.print("Temp = ");
        lcd.print(maxtemp, 1);
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (maxtemp == -40) {
        maxtemp = 80;
        } else {
        maxtemp -= 0.1;
        }
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (maxtemp == 80) {
        maxtemp = -40;
        } else {
        maxtemp += 0.1;
        }
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_minhum();
        }
        //*********************************************Subprogram SET_MinHum()
        void SET_minhum() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET MinHum");
        lcd.setCursor (0, 1);
        lcd.print("Hum = ");
        lcd.print(minhum, 1);
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (minhum == 0) {
        minhum = 100;
        } else {
        minhum -= 0.1;
        }
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (minhum == 100) {
        minhum = 0;
        } else {
        minhum += 0.1;
        }
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        SET_maxhum();
        }
        //*********************************************Subprogram SET_MaxHum()
        void SET_maxhum() {
        lcd.clear();

        while (1) {
        lcd.setCursor(0, 0);
        lcd.print(">SET MaxHum");
        lcd.setCursor (0, 1);
        lcd.print("Hum = ");
        lcd.print(maxhum, 1);
        analogButtons.check();
        if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
        key_DOWN = 1;
        key = 1;
        if (maxhum == 0) {
        maxhum = 100;
        } else {
        maxhum -= 0.1;
        }
        }
        if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
        key_UP = 1;
        key = 1;
        if (maxhum == 100) {
        maxhum = 0;
        } else {
        maxhum += 0.1;
        }
        }
        if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
        key_SET2 = 1;
        key = 1;
        break;
        }
        if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
        key = 0;
        }
        }
        Save2();
        }
        //***************************************************Subprogram Save()
        void Save2() {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("> Save...");
        lcd.setCursor(0, 1);
        lcd.print("> *Zakhire*");
        EEPROM.put(80, temperaturestate);
        EEPROM.put(85, humiditystate);
        EEPROM.put(90, mintemp);
        EEPROM.put(95, maxtemp);
        EEPROM.put(100, minhum);
        EEPROM.put(105, maxhum);
        delay(2000);
        lcd.clear();
        }

        از نظرات برنامه نویسان متخصص محترم استقبال میکنم.

        دیدگاه


          #5
          پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC


          18-یک عدد جعبه 12x12x10 پارسا

          نکته:در صورت استفاده از آداپتور 24ولت 1 آمپری سوئیچینگ، باید حرارت داخل جعبه که توسط آداپتور بوجود می آید کنترل بشه وگرنه با بالا رفتن حرارت داخل جعبه میکرو هنگ میکنه و در همون حالت رله باقی میمونه تا به دادش برسید.

          جدیدترین ویرایش توسط حمید حمید; ۲۳:۵۶ ۱۳۹۹/۰۲/۰۳.

          دیدگاه


            #6
            پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

            با عرض سلام
            و عرض تبریک بمناسبت فرارسیدن ماه مبارک رمضان ماه مهمانی خداوند مهربان به خدمت همه بندگان خدا


            چند نکته تجربی که در رابطه با این دستگاه داشتم را با شما عزیزان به اشتراک می گذارم.
            ایجاد تاخیر حدود 3 میلی ثانیه ای در خطوط 440 و 469 برنامه.
            حذف قطعات زیر میتونه تو بهبود عملکرد دستگاه به شما کمک کند.
            9-ماژول تغذیه کاهنده LM2596
            15-یک عدد آداپتور 24 ولت حداقل 1آمپری(اختیاری)
            16- یک عدد جک آداپتور روپنلی مدل DC-025M (اختیاری)
            17- یک عدد آداپتور 5 ولت 1.5 آمپری
            که البته وجود آداپتور 5 ولتی، 1 آمپری ضروریست . بنده در این دستگاه از یک عدد برد آداپتور 700 میلی آمپری مبایل استفاده کردم.
            نکته :درباره هنگ گاه به گاه میکرو هم باید یک تدبیری داشته باشید که بنده هنوز راهی برای این مسئله ندارم.
            جدیدترین ویرایش توسط حمید حمید; ۰۶:۴۶ ۱۳۹۹/۰۲/۰۶.

            دیدگاه


              #7
              پاسخ : یک برنامه با ALARM برای کتابخانه ماژول ساعت DS3232RTC

              سلام علیکم
              با آرزوی قبولی نماز و روزه همه بندگان خدا
              تغییرات در این نسخه جدید :
              1- اضافه شدن watchdog برای رفع مشکل هنگ میکرو
              2- اصلاح نمایش اعداد بین 0 تا 10 در زمان افزایش و کاهش سریع
              3- اصلاح وقفه فعال سازی رله، از حالت delay به حالت timer. با استفاده از pulseImmediate
              4- اصلاح و تغییر نوع چند متغیر برای ذخیره صحیح داده.
              5-ایجاد یک ارتباط منطقی در زمان فعال سازی رله ها و حدود بالا و پائین دما و رطوبت.
              6- اضافه کردن لینک کتابخانه های مورد استفاده در سورس کد.
              و...

              #include <DS3232RTC.h>        // https://github.com/JChristensen/DS3232RTC    https://github.com/PaulStoffregen/Time

              #include <EEPROM.h>

              #include <avr/wdt.h>

              #include "Timer.h" //https://github.com/JChristensen/Timer
              Timer Ti1;
              Timer Ti2;

              #include <AnalogButtons.h> //https://github.com/rlogiacco/AnalogButtons
              #define ANALOG_PIN A0

              #include <Wire.h>
              #include <LiquidCrystal_I2C.h> //https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
              // Set the LCD address to 0x27 or 0x3F for a 20 chars and 4 line display
              LiquidCrystal_I2C lcd(0x3F, 20, 4);


              #include "DHT.h" //https://github.com/adafruit/DHT-sensor-library
              #define DHTPIN A1
              #define DHTTYPE DHT22
              DHT dht(DHTPIN, DHTTYPE);

              // pin definitions
              //#define Input1 A3
              //#define Input2 A4
              #define RELAY_Temp1 8
              #define RELAY_Hum2 7

              boolean key = 0 , key_SET = 1 , key_SET2 = 1 , key_DOWN = 1, key_UP = 1 , show = 0;
              int _hour, _minute;
              int _year, _month, _day;
              // pin definitions
              const uint8_t RTC_INT_PIN(10); //connected to SQW PIN of DS3231

              // current time from the RTC in text format
              char timestamp[32];
              char timestamp2[32];
              //**************************************
              // A call back function that you pass into the constructor of AnalogButtons, see example
              // below. Alternativly you could extend the Button class and re-define the methods pressed()
              // or held() which are called
              void b1Click() {
              show = 0;
              lcd.clear();
              }

              void b1Hold() {
              key_SET = 0;
              }

              void b2Click() {
              show = 1;
              lcd.clear();
              }

              void b2Hold() {
              key_SET2 = 0;
              }

              void b3Click() {
              key_DOWN = 0;
              lcd.clear();
              }

              void b3Hold() {
              key_DOWN = 0;
              }

              void b4Click() {
              key_UP = 0;
              lcd.clear();
              }

              void b4Hold() {
              key_UP = 0;
              }

              AnalogButtons analogButtons(ANALOG_PIN, INPUT);
              Button b1 = Button(693, &b1Click, &b1Hold, 2500, 2500);
              Button b2 = Button(857, &b2Click, &b2Hold, 2500, 2500);
              Button b3 = Button(881, &b3Click, &b3Hold, 500, 200);
              Button b4 = Button(904, &b4Click, &b4Hold, 500, 200);

              //tabdile roz caat va daghighe be saniye
              long t_to_sec( long days_, long h_, int m_ )
              {
              long t_to_sec = ((((days_ * 24) * 60) * 60) + ((h_ * 60) * 60) + (m_ * 60));
              return t_to_sec;
              }

              long A1_day = EEPROM.read(20);
              int A1_hour = EEPROM.read(25);
              int A1_minute = EEPROM.read(30);
              long A1_delay = EEPROM.get(35, A1_delay);
              long A2_day = EEPROM.read(40);
              int A2_hour = EEPROM.read(45);
              int A2_minute = EEPROM.read(50);
              long A2_delay = EEPROM.get(55, A2_delay);
              const time_t ALARM_1_INTERVAL(t_to_sec( A1_day, A1_hour, A1_minute)); // alarm interval in seconds
              const time_t ALARM_2_INTERVAL(t_to_sec(A2_day, A2_hour, A2_minute)); // alarm interval in seconds

              float temp, hum, hic;
              boolean temperaturestate = EEPROM.get(80, temperaturestate);
              boolean humiditystate = EEPROM.get(85, humiditystate);
              float mintemp = EEPROM.get(90, mintemp);
              float maxtemp = EEPROM.get(95, maxtemp);
              float minhum = EEPROM.get(100, minhum);
              float maxhum = EEPROM.get(105, maxhum);


              //**************************************************************************Setup()
              void setup()
              {
              dht.begin();
              //Serial.begin(9600);
              pinMode(RELAY_Temp1, OUTPUT);
              pinMode(RELAY_Hum2, OUTPUT);
              digitalWrite(RELAY_Temp1, HIGH);
              digitalWrite(RELAY_Hum2, HIGH);

              analogButtons.add(b1);
              analogButtons.add(b2);
              analogButtons.add(b3);
              analogButtons.add(b4);

              lcd.begin();
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print(" *Besme Allah*");
              lcd.setCursor (0, 1);
              lcd.print(" CLOCK Pro");
              lcd.setCursor (0, 2);
              lcd.print(" TEMP & HUM");
              delay(5000);
              lcd.clear();

              pinMode(RTC_INT_PIN, INPUT_PULLUP);
              // initialize the alarms to known values, clear the alarm flags, clear the alarm interrupt flags
              RTC.setAlarm(ALM1_MATCH_DATE, 0, 0, 0, 1);
              RTC.setAlarm(ALM2_MATCH_DATE, 0, 0, 0, 1);
              RTC.alarm(ALARM_1);
              RTC.alarm(ALARM_2);
              RTC.alarmInterrupt(ALARM_1, false);
              RTC.alarmInterrupt(ALARM_2, false);
              RTC.squareWave(SQWAVE_NONE);

              // the current time
              time_t t = RTC.get();
              //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
              tmElements_t tm;
              breakTime(t , tm);
              tm.Hour = 00; // set the RTC to an arbitrary time
              tm.Minute = 00;
              tm.Second = 00;

              // calculate the alarm1
              time_t a1 = EEPROM.get(60, a1); ;
              time_t a_1 = makeTime(tm) + ALARM_1_INTERVAL;
              // calculate the next alarm time //for lost power
              if (t < a1) {
              RTC.setAlarm(ALM1_MATCH_DATE, minute(a1), hour(a1), day(a1));
              formatTime(timestamp, a1);
              } else {
              RTC.setAlarm(ALM1_MATCH_DATE, minute(a_1), hour(a_1), day(a_1));
              formatTime(timestamp, a_1);
              }
              RTC.alarm(ALARM_1); // ensure RTC interrupt flag is cleared
              RTC.alarmInterrupt(ALARM_1, true); //faal kardane Alarm1

              // calculate the alarm2
              time_t a2 = EEPROM.get(65, a2);; // calculate the alarm time
              time_t a_2 = makeTime(tm) + ALARM_2_INTERVAL;
              if (t < a2) {
              RTC.setAlarm(ALM2_MATCH_DATE, minute(a2), hour(a2), day(a2));
              formatTime(timestamp2, a2);
              } else {
              RTC.setAlarm(ALM2_MATCH_DATE, minute(a_2), hour(a_2), day(a_2));
              formatTime(timestamp2, a_2);
              }
              RTC.alarm(ALARM_2); // ensure RTC interrupt flag is cleared
              RTC.alarmInterrupt(ALARM_2, true); //faal kardane Alarm2
              wdt_enable(WDTO_8S);
              }

              //**********************************************************loop()
              void loop()
              {
              analogButtons.check();
              wdt_reset();
              //***************************************************Namayesh Clock & Alarms
              if (show == 0) {
              // To check values when button are pressed
              analogButtons.check();
              char buf_time[20];
              char buf_date[20];
              time_t t = RTC.get();
              sprintf(buf_time, "%.2d:%.2d:%.2d",
              hour(t), minute(t), second(t));
              sprintf(buf_date, "%.4d/%.2d/%.2d [%s]",
              year(t) , month(t), day(t), dayShortStr(weekday(t)));

              lcd.setCursor(0, 0);
              lcd.print(buf_time);
              lcd.print(" ");
              lcd.print(RTC.temperature() / 4.0);
              lcd.print("\337");

              lcd.setCursor(0, 1);
              lcd.print(buf_date);

              lcd.setCursor (0, 2);
              lcd.print("A1:");
              timestamp[14] = 0;
              lcd.print(timestamp);

              lcd.setCursor (0, 3);
              lcd.print("A2:");
              timestamp2[14] = 0;
              lcd.print(timestamp2);


              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              _hour = hour(t);
              _minute = minute(t);
              _year = year(t);
              _month = month(t);
              _day = day(t);
              SET_hour();
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              //***************************************************Namayesh TEMP & HUM
              } else {
              analogButtons.check();
              temp = dht.readTemperature();

              lcd.setCursor(0, 0);
              lcd.print("Temp:");
              lcd.print(temp, 1);
              lcd.print("\337");

              if ( !temperaturestate ) { //mintemp == maxtemp ||
              lcd.print(" OFF! ");
              }
              if ( mintemp > maxtemp ) { //mintemp != maxtemp &&
              //Cooling mode system
              if (temp > mintemp && temperaturestate) {
              lcd.print(" Warm ");
              }
              if (temp < mintemp && temp > maxtemp && temperaturestate && !digitalRead(RELAY_Temp1)) {
              lcd.print(" Cooling");
              }
              if (temp < maxtemp && temperaturestate) {
              lcd.print(" Cold ");
              }

              }
              if ( mintemp < maxtemp) { //mintemp != maxtemp &&
              //Heating mode system
              if (temp < mintemp && temperaturestate) {
              lcd.print(" Cold ");
              }
              if (temp > mintemp && temp < maxtemp && temperaturestate && !digitalRead(RELAY_Temp1)) {
              lcd.print(" Heating");
              }
              if (temp > maxtemp && temperaturestate) {
              lcd.print(" Warm ");
              }

              }
              lcd.setCursor(0, 1);
              lcd.print("TMin");
              lcd.print(mintemp, 1);
              lcd.print(" TMax");
              lcd.print(maxtemp, 1);

              hum = dht.readHumidity();

              lcd.setCursor(0, 2);
              lcd.print("Hum :");
              lcd.print(hum, 1);
              lcd.print("%");

              if ( !humiditystate ) { //minhum == maxhum ||
              lcd.print(" OFF! ");
              }
              if ( minhum > maxhum ) { //minhum != maxhum &&
              //Dehumidification mode system
              if (hum > minhum && humiditystate) {
              lcd.print(" Wet ");
              }
              if (hum < minhum && hum > maxhum && humiditystate && !digitalRead(RELAY_Hum2)) {
              lcd.print(" Dehumidif");
              }
              if (hum < maxhum && humiditystate) {
              lcd.print(" Dry ");
              }

              }
              if ( minhum < maxhum) { //minhum != maxhum &&
              //Humidification mode system
              if (hum < minhum && humiditystate) {
              lcd.print(" Dry ");
              }
              if (hum > minhum && hum < maxhum && humiditystate && !digitalRead(RELAY_Hum2)) {
              lcd.print(" Humidific");
              }
              if (hum > maxhum && humiditystate) {
              lcd.print(" Wet ");
              }

              }
              lcd.setCursor(0, 3);
              lcd.print("HMin");
              lcd.print(minhum, 1);
              lcd.print(" HMax");
              lcd.print(maxhum, 1);

              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;

              SET_systemp();
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }

              temp = dht.readTemperature();
              hum = dht.readHumidity();
              TempRelay();
              HumRelay();
              //update state of relay for delay timer
              Ti1.update();
              Ti2.update();
              // check to see if the INT/SQW pin is low, i.e. an alarm has occurred
              if (!digitalRead(RTC_INT_PIN))
              {
              if (RTC.alarm(ALARM_1)) // resets the alarm flag if set
              {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("A1 Fired: ");
              lcd.setCursor(0, 1);
              lcd.print("Relay1 is on ");

              // get the current time
              time_t t = RTC.get();
              //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
              tmElements_t tm;
              breakTime(t , tm);
              tm.Hour = 00; // set the RTC to an arbitrary time
              tm.Minute = 00;
              tm.Second = 00;
              // calculate the next alarm time
              time_t a1 = makeTime(tm) + ALARM_1_INTERVAL;
              EEPROM.put(60, a1);
              // set the alarm
              RTC.setAlarm(ALM1_MATCH_DATE, second(a1), minute(a1), hour(a1), day(a1));
              formatTime(timestamp, a1);
              timestamp[14] = 0; // keep just hh:mm weekday DD MM

              lcd.setCursor (0, 2);
              lcd.print("A1:");
              lcd.print(timestamp);
              Ti1.pulseImmediate(RELAY_Temp1, A1_delay * 60 * 1000UL, LOW);
              delay(3000);
              lcd.clear();
              }

              if (RTC.alarm(ALARM_2))
              {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("A2 Fired: ");
              lcd.setCursor(0, 1);
              lcd.print("Relay2 is on ");

              // get the current time
              time_t t = RTC.get();
              //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
              tmElements_t tm;
              breakTime(t , tm);
              tm.Hour = 00; // set the RTC to an arbitrary time
              tm.Minute = 00;
              tm.Second = 00;
              // calculate the next alarm time
              time_t a2 = makeTime(tm) + ALARM_2_INTERVAL;
              EEPROM.put(65, a2);
              // set the alarm
              RTC.setAlarm(ALM2_MATCH_DATE, second(a2), minute(a2), hour(a2), day(a2));
              formatTime(timestamp2, a2);
              timestamp2[14] = 0; // keep just hh:mm weekday DD MM

              lcd.setCursor (0, 3);
              lcd.print("A2:");
              lcd.print(timestamp2);
              Ti2.pulseImmediate(RELAY_Hum2, A2_delay * 60 * 1000UL, LOW);
              delay(3000);
              lcd.clear();
              }
              }

              //baraye be dast avardane maghadir switch analog az in ghesmat estefade shavad
              //configure();
              }
              //void configure() {
              //unsigned int value = analogRead(ANALOG_PIN);
              //lcd.setCursor (17, 0);
              //lcd.print(value);
              //delay(250);
              //}
              //*********************************************Subprogram TempRelay()
              void TempRelay() {
              //if (mintemp == maxtemp || !temperaturestate ) {
              //digitalWrite (RELAY_Temp1, HIGH);
              //}
              if ( mintemp != maxtemp && mintemp > maxtemp ) {
              //Cooling mode system
              if (temp > mintemp && temperaturestate) {
              digitalWrite (RELAY_Temp1, LOW);
              }
              if (temp < maxtemp && temperaturestate) {
              digitalWrite (RELAY_Temp1, HIGH);
              }
              }

              if (mintemp != maxtemp && mintemp < maxtemp) {
              //Heating mode system
              if (temp < mintemp && temperaturestate) {
              digitalWrite (RELAY_Temp1, LOW);
              }
              if (temp > maxtemp && temperaturestate) {
              digitalWrite (RELAY_Temp1, HIGH);
              }
              }
              delay(2);
              }
              //*********************************************Subprogram HumRelay()
              void HumRelay() {
              //if (minhum == maxhum || !humiditystate ) {
              //digitalWrite (RELAY_Hum2, HIGH);
              //}
              if ( minhum != maxhum && minhum > maxhum ) {
              //Dehumidification mode system
              if (hum > minhum && humiditystate) {
              digitalWrite (RELAY_Hum2, LOW);
              }
              if (hum < maxhum && humiditystate) {
              digitalWrite (RELAY_Hum2, HIGH);
              }
              }
              if (minhum != maxhum && minhum < maxhum) {
              //Humidification mode system
              if (hum < minhum && humiditystate) {
              digitalWrite (RELAY_Hum2, LOW);
              }
              if (hum > maxhum && humiditystate) {
              digitalWrite (RELAY_Hum2, HIGH);
              }
              }
              delay(2);
              }
              //****************************************************************************************
              // format a time_t value, return the formatted string in buf (must be at least 25 bytes)
              void formatTime(char *buf, time_t t)
              {
              char m[4]; // temporary storage for month string (DateStrings.cpp uses shared buffer)
              strcpy(m, monthShortStr(month(t)));
              sprintf(buf, "%.2d:%.2d %s%.2d%s",
              hour(t), minute(t), dayShortStr(weekday(t)), day(t), m);
              }

              //*********************************************Subprogram SET_hour()
              void SET_hour() {
              lcd.clear();
              wdt_disable();
              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET Hour");
              lcd.setCursor (0, 1);
              lcd.print("Hour = ");
              if (_hour < 10) lcd.print(" ");
              lcd.print(_hour);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (_hour == 0) {
              _hour = 23;
              } else {
              _hour--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (_hour == 23) {
              _hour = 0;
              } else {
              _hour++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_minute();
              }
              //*********************************************Subprogram SET_minute()
              void SET_minute() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET Minute");
              lcd.setCursor (0, 1);
              lcd.print("Minute= ");
              if (_minute < 10) lcd.print(" ");
              lcd.print(_minute);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (_minute == 0) {
              _minute = 59;
              } else {
              _minute--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (_minute == 59) {
              _minute = 0;
              } else {
              _minute++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_year();
              }
              //*********************************************Subprogram SET_year()
              void SET_year() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET Year");
              lcd.setCursor (0, 1);
              lcd.print("Year = ");
              lcd.print(_year);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (_year == 2015) {
              _year = 2030;
              } else {
              _year--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (_year == 2030) {
              _year = 2015;
              } else {
              _year++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_month();
              }
              //*********************************************Subprogram SET_month()
              void SET_month() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET Month");
              lcd.setCursor (0, 1);
              lcd.print("Month = ");
              if (_month < 10) lcd.print(" ");
              lcd.print(_month);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (_month == 1) {
              _month = 12;
              } else {
              _month--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (_month == 12) {
              _month = 1;
              } else {
              _month++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_day();
              }
              //*********************************************Subprogram SET_day()
              void SET_day() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET Day");
              lcd.setCursor (0, 1);
              lcd.print("Day = ");
              if (_day < 10) lcd.print(" ");
              lcd.print(_day);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (_day == 1) {
              _day = 31;
              } else {
              _day--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (_day == 31) {
              _day = 1;
              } else {
              _day++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm1_day();
              }

              //*********************************************Subprogram SET_Alarm1_day()
              void SET_Alarm1_day() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print("SET A1 Every Few Day");
              lcd.setCursor (0, 1);
              lcd.print("Day = ");
              if (A1_day < 10) lcd.print(" ");
              lcd.print(A1_day);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A1_day == 1) {
              A1_day = 31;
              } else {
              A1_day--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A1_day == 31) {
              A1_day = 1;
              } else {
              A1_day++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm1_hour();
              }
              //*********************************************Subprogram SET_Alarm1_hour()
              void SET_Alarm1_hour() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A1 Match Hour");
              lcd.setCursor (0, 1);
              lcd.print("Hour = ");
              if (A1_hour < 10) lcd.print(" ");
              lcd.print(A1_hour);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A1_hour == 0) {
              A1_hour = 23;
              } else {
              A1_hour--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A1_hour == 23) {
              A1_hour = 0;
              } else {
              A1_hour++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm1_minute();
              }
              //*********************************************Subprogram SET_Alarm1_minute()
              void SET_Alarm1_minute() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A1 Match Minute");
              lcd.setCursor (0, 1);
              lcd.print("Minute= ");
              if (A1_minute < 10) lcd.print(" ");
              lcd.print(A1_minute);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A1_minute == 0) {
              A1_minute = 59;
              } else {
              A1_minute--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A1_minute == 59) {
              A1_minute = 0;
              } else {
              A1_minute++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm1_delay();
              }
              //*********************************************Subprogram SET_Alarm1_delay()
              void SET_Alarm1_delay() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A1 Amount Delay");
              lcd.setCursor (0, 1);
              lcd.print("Delay = ");
              if (A1_delay < 10) lcd.print(" ");
              lcd.print(A1_delay);
              lcd.setCursor (12, 1);
              lcd.print("*Minute");
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A1_delay == 0) {
              A1_delay = 1400;
              } else {
              A1_delay--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A1_delay == 1400) {
              A1_delay = 0;
              } else {
              A1_delay++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm2_day();
              }
              //*********************************************Subprogram SET_Alarm2_day()
              void SET_Alarm2_day() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print("SET A2 Every Few Day");
              lcd.setCursor (0, 1);
              lcd.print("Day = ");
              if (A2_day < 10) lcd.print(" ");
              lcd.print(A2_day);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A2_day == 1) {
              A2_day = 31;
              } else {
              A2_day--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A2_day == 31) {
              A2_day = 1;
              } else {
              A2_day++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm2_hour();
              }
              //*********************************************Subprogram SET_Alarm2_hour()
              void SET_Alarm2_hour() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A2 Match Hour");
              lcd.setCursor (0, 1);
              lcd.print("Hour = ");
              if (A2_hour < 10) lcd.print(" ");
              lcd.print(A2_hour);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A2_hour == 0) {
              A2_hour = 23;
              } else {
              A2_hour--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A2_hour == 23) {
              A2_hour = 0;
              } else {
              A2_hour++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm2_minute();
              }
              //*********************************************Subprogram SET_Alarm2_minute()
              void SET_Alarm2_minute() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A2 Match Minute");
              lcd.setCursor (0, 1);
              lcd.print("Minute= ");
              if (A2_minute < 10) lcd.print(" ");
              lcd.print(A2_minute);
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A2_minute == 0) {
              A2_minute = 59;
              } else {
              A2_minute--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A2_minute == 59) {
              A2_minute = 0;
              } else {
              A2_minute++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_Alarm2_delay();
              }
              //*********************************************Subprogram SET_Alarm2_delay()
              void SET_Alarm2_delay() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET A2 Amount Delay");
              lcd.setCursor (0, 1);
              lcd.print("Delay = ");
              if (A2_delay < 10) lcd.print(" ");
              lcd.print(A2_delay);
              lcd.setCursor (12, 1);
              lcd.print(" *Minute");
              analogButtons.check();
              if (key == 0 && key_SET == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (A2_delay == 0) {
              A2_delay = 1400;
              } else {
              A2_delay--;
              }
              }
              if (key == 0 && key_SET == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (A2_delay == 1400) {
              A2_delay = 0;
              } else {
              A2_delay++;
              }
              }
              if (key == 0 && key_SET == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              Save();
              }
              //*********************************************Subprogram Save()
              void Save() {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("> Save...");
              lcd.setCursor(0, 1);
              lcd.print("> *Zakhire*");

              time_t t = RTC.get();
              //tanzim caat be 00:00:00 be jahate match shodane ba time alarm
              tmElements_t tm;
              breakTime(t , tm);
              tm.Hour = 00; // set the RTC to an arbitrary time
              tm.Minute = 00;
              tm.Second = 00;

              time_t ALARM_1_INTERVAL(t_to_sec(A1_day, A1_hour, A1_minute )); // alarm interval in seconds
              // calculate the next alarm time
              time_t a1 = makeTime(tm) + ALARM_1_INTERVAL;
              // set the alarm
              RTC.setAlarm(ALM1_MATCH_DATE, second(a1), minute(a1), hour(a1), day(a1));
              formatTime(timestamp, a1);
              time_t ALARM_2_INTERVAL(t_to_sec( A2_day, A2_hour, A2_minute));
              time_t a2 = makeTime(tm) + ALARM_2_INTERVAL;
              // set the alarm
              RTC.setAlarm(ALM2_MATCH_DATE, second(a2), minute(a2), hour(a2), day(a2));
              formatTime(timestamp2, a2);
              tm.Year = _year - 1970;
              tm.Month = _month;
              tm.Day = _day;
              tm.Hour = _hour;
              tm.Minute = _minute;
              tm.Second = 0;

              if (makeTime(tm) > t)
              RTC.write(tm);

              EEPROM.write(20, A1_day);
              EEPROM.write(25, A1_hour);
              EEPROM.write(30, A1_minute);
              EEPROM.put(35, A1_delay);
              EEPROM.write(40, A2_day);
              EEPROM.write(45, A2_hour);
              EEPROM.write(50, A2_minute);
              EEPROM.put(55, A2_delay);
              EEPROM.put(60, a1);
              EEPROM.put(65, a2);
              wdt_enable(WDTO_8S);
              delay(2000);
              lcd.clear();
              }


              //*********************************************Subprogram SET_SystemTemp()
              void SET_systemp() {
              lcd.clear();
              wdt_disable();
              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET System Temp");
              lcd.setCursor (0, 1);
              lcd.print("System Temp = ");
              if (temperaturestate) {
              lcd.print("ON");
              } else {
              lcd.print("OFF");
              }
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              temperaturestate = !temperaturestate;
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              temperaturestate = !temperaturestate;
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_syshum();
              }
              //*********************************************Subprogram SET_SystemHum()
              void SET_syshum() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET System Hum");
              lcd.setCursor (0, 1);
              lcd.print("System Hum = ");
              if (humiditystate) {
              lcd.print("ON");
              } else {
              lcd.print("OFF");
              }
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              humiditystate = !humiditystate;
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              humiditystate = !humiditystate;
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_mintemp();
              }

              //*********************************************Subprogram SET_MinTemp()
              void SET_mintemp() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET MinTemp");
              lcd.setCursor (0, 1);
              lcd.print("Temp = ");
              lcd.print(mintemp, 1);
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (mintemp == -40) {
              mintemp = 80;
              } else {
              mintemp -= 0.1;
              }
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (mintemp == 80) {
              mintemp = -40;
              } else {
              mintemp += 0.1;
              }
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_maxtemp();
              }
              //*********************************************Subprogram SET_MaxTemp()
              void SET_maxtemp() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET MaxTemp");
              lcd.setCursor (0, 1);
              lcd.print("Temp = ");
              lcd.print(maxtemp, 1);
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (maxtemp == -40) {
              maxtemp = 80;
              } else {
              maxtemp -= 0.1;
              }
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (maxtemp == 80) {
              maxtemp = -40;
              } else {
              maxtemp += 0.1;
              }
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_minhum();
              }
              //*********************************************Subprogram SET_MinHum()
              void SET_minhum() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET MinHum");
              lcd.setCursor (0, 1);
              lcd.print("Hum = ");
              lcd.print(minhum, 1);
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (minhum == 0) {
              minhum = 100;
              } else {
              minhum -= 0.1;
              }
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (minhum == 100) {
              lcd.clear();
              minhum = 0;
              } else {
              minhum += 0.1;
              }
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              SET_maxhum();
              }
              //*********************************************Subprogram SET_MaxHum()
              void SET_maxhum() {
              lcd.clear();

              while (1) {
              lcd.setCursor(0, 0);
              lcd.print(">SET MaxHum");
              lcd.setCursor (0, 1);
              lcd.print("Hum = ");
              lcd.print(maxhum, 1);
              analogButtons.check();
              if (key == 0 && key_SET2 == 1 && key_DOWN == 0 && key_UP == 1) {
              key_DOWN = 1;
              key = 1;
              if (maxhum == 0) {
              maxhum = 100;
              } else {
              maxhum -= 0.1;
              }
              }
              if (key == 0 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 0) {
              key_UP = 1;
              key = 1;
              if (maxhum == 100) {
              lcd.clear();
              maxhum = 0;
              } else {
              maxhum += 0.1;
              }
              }
              if (key == 0 && key_SET2 == 0 && key_DOWN == 1 && key_UP == 1) {
              key_SET2 = 1;
              key = 1;
              break;
              }
              if (key == 1 && key_SET2 == 1 && key_DOWN == 1 && key_UP == 1) {
              key = 0;
              }
              }
              Save2();
              }
              //***************************************************Subprogram Save()
              void Save2() {
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("> Save...");
              lcd.setCursor(0, 1);
              lcd.print("> *Zakhire*");
              EEPROM.put(80, temperaturestate);
              EEPROM.put(85, humiditystate);
              EEPROM.put(90, mintemp);
              EEPROM.put(95, maxtemp);
              EEPROM.put(100, minhum);
              EEPROM.put(105, maxhum);
              wdt_enable(WDTO_8S);
              delay(2000);
              lcd.clear();
              }

              دیدگاه

              لطفا صبر کنید...
              X