ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 7 از 7
  1. #1
    2019/05/30
    172
    43

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

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

    ترکیبی از example8 و example3 و کمی تغییرات از داخل

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    می باشد.


    کد 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));

    ویرایش توسط حمید حمید : 2020/04/08 در ساعت 08:02
  2. #2
    2019/05/30
    172
    43

    پاسخ : یک برنامه با 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();

    ویرایش توسط حمید حمید : 2020/04/12 در ساعت 21:18 دلیل: تکمیل و رفع چند ایراد کد
  3. #3
    2019/05/30
    172
    43

    پاسخ : یک برنامه با 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);

    ویرایش توسط حمید حمید : 2020/04/15 در ساعت 09:15 دلیل: تکمیل و رفع چند ایراد کد
  4. #4
    2019/05/30
    172
    43

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

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

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    2-ماژول تبدیل LCD به i2c
    3-ماژول رله 2 کانال 5 ولت
    4- سنسور دما و رطوبت DHT21 یا DHT22
    5- ماژول ساعت

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    6- چهار عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    7-شش عدد مقاومت جهت ساخت سوئیچ آنالوگ و یکی برای پول آپ سنسور
    8-دو عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    9-

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    10-یک یا 2 متر سیم برق
    11-

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    12-حداکثر 20 متر سیم 3 رشته یا 2 زوج مسی برای سنسور دما و رطوبت(کابل تلفن مسی هم جواب میده)
    13- 2 عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    14-چند ترمینال پیچی مدل KF350-Pin دو و سه پین
    15-یک عدد آداپتور 24 ولت حداقل 1آمپری(اختیاری)
    16- یک عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    (اختیاری)
    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. #5
    2019/05/30
    172
    43

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


    18-یک عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت



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

    ویرایش توسط حمید حمید : 2020/04/22 در ساعت 22:56
  6. #6
    2019/05/30
    172
    43

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

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


    چند نکته تجربی که در رابطه با این دستگاه داشتم را با شما عزیزان به اشتراک می گذارم.
    ایجاد تاخیر حدود 3 میلی ثانیه ای در خطوط 440 و 469 برنامه.
    حذف قطعات زیر میتونه تو بهبود عملکرد دستگاه به شما کمک کند.
    9-

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت


    15-یک عدد آداپتور 24 ولت حداقل 1آمپری(اختیاری)
    16- یک عدد

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    (اختیاری)
    17- یک عدد آداپتور 5 ولت 1.5 آمپری
    که البته وجود

    مهمان عزیز شما حق دیدن لینک ها را ندارید

    عضویت

    ضروریست . بنده در این دستگاه از یک عدد برد آداپتور 700 میلی آمپری مبایل استفاده کردم.
    نکته :درباره هنگ گاه به گاه میکرو هم باید یک تدبیری داشته باشید که بنده هنوز راهی برای این مسئله ندارم.
    ویرایش توسط حمید حمید : 2020/04/25 در ساعت 05:46
  7. #7
    2019/05/30
    172
    43

    پاسخ : یک برنامه با 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();
    }
نمایش نتایج: از 1 به 7 از 7

موضوعات مشابه

  1. ایجاد یک برنامه ALARM برای کتابخانه ساعت RTClib
    توسط حمید حمید در انجمن سایر ماژول ها
    پاسخ: 2
    آخرين نوشته: 2020/04/04, 08:43
  2. برنامه arduino برای نمایش تاریخ و ساعت روی 7segment و ماژول 6 رقمی max7219
    توسط حمید حمید در انجمن برنامه نویسی و اینترفیس
    پاسخ: 1
    آخرين نوشته: 2020/03/30, 05:08
  3. ساعت (RTC + Alarm + LCD)
    توسط tohid041 در انجمن میکروکنترلرهای AVR
    پاسخ: 1
    آخرين نوشته: 2014/01/19, 20:08
  4. Alarm ساعت بندی شده با Bascom-AVR
    توسط soodi در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2011/01/11, 13:28
  5. فعال کردن alarm register در ایسی ساعت pcf8563
    توسط mikla در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2009/01/04, 20:06

کاربرانی که این تاپیک را مشاهده کرده اند: 0

هیچ عضوی در لیست وجود ندارد.

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •