Не пойму что не так

Тема в разделе "Arduino & Shields", создана пользователем Nikita_mv, 24 фев 2020.

  1. Nikita_mv

    Nikita_mv Нерд

    Доброго времени суток. Делаю контроллер под аквариум что бы свет включался и выключался по расписанию. перепробовал кучу библиотек под DS3231 но все равно не работает.


    Код (C++):
    vremy=now.hour()*60+now.minute();
     
         if((vremy > 570) &&( vremy < 1260)) {
            flag=1;
         }
        if ((vremy < 570) &&( vremy >1260)) {
           flag=0;
           
          }
    переменную vremy считает правильно. а вот flag всегда 0.
    Объясните что я не правильно сделала.
    Весь код:

    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"

    DS1307 rtc;



    int led =13;
    int lamp = 7;
    int On_Time=570; //=9*60+30; //включение 21:48  (приводим к минутам)
    int Off_Time=1260; //=21*60+00; //выключение 22:49
    int Curent_Time; //текущее время в минутах
    int minut_Time;
    int vremy;
    int flag;
    //------------------------
    #define B 3950 // B-коэффициент
    #define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
    #define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
    #define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)
    const byte tempPin = A0;
    const byte tempPin1 = A1;
    //-----------------------------

    int pwm = 9;
    int pwm1 = 11;


    void setup() {
        Serial.begin(57600);
    #ifdef AVR
      Wire.begin();
    #else
      Wire1.begin();
    #endif
      rtc.begin();

      if (! rtc.isrunning()) {
        Serial.println("RTC is NOT running!");
          rtc.adjust(DateTime(__DATE__, __TIME__));
      }

        pinMode (led, OUTPUT);
        pinMode (lamp,OUTPUT);

        pinMode( tempPin, INPUT );
        pinMode( tempPin1, INPUT );

     
    }


    void loop() {
     
        DateTime now = rtc.now();
     
        DateTime future (now.unixtime() + 7 * 86400L + 30);
           
            delay(3000);


    vremy=now.hour()*60+now.minute();
     
         if((vremy > 570) &&( vremy < 1260)) {
            flag=1;
         }
        if ((vremy < 570) &&( vremy >1260)) {
           flag=0;
           
          }

    if (flag=1  )   {
            digitalWrite(led, HIGH);
            digitalWrite(lamp, HIGH));
          }

      if (flag=0  ) {

            digitalWrite(led, LOW);
            digitalWrite(lamp, LOW);
      }

       
    //определяем температуру радиаторов светодиодов
    int t = analogRead( tempPin );
    int t1 = analogRead( tempPin1 );
        float tr = 1023.0 / t - 1;
        float tr1 = 1023.0 / t1 - 1;
        tr = SERIAL_R / tr;
         tr1 = SERIAL_R / tr1;
        Serial.print("R=");
        Serial.print(tr);
        Serial.print(", t=");


     
        float steinhart; //температура радиатора
        float steinhart1;//тепмература радиатора
        steinhart = tr / THERMISTOR_R; // (R/Ro)
        steinhart1 = tr1 / THERMISTOR_R; // (R/Ro)
       
        steinhart = log(steinhart); // ln(R/Ro)
        steinhart1 = log(steinhart1); // ln(R/Ro)
       
        steinhart /= B; // 1/B * ln(R/Ro)
        steinhart1 /= B1; // 1/B * ln(R/Ro)
       
        steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
        steinhart1 += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
       
        steinhart = 1.0 / steinhart; // Invert
        steinhart1 = 1.0 / steinhart1; // Invert
       
        steinhart -= 273.15;
         steinhart -= 273.15;
       
        Serial.println(steinhart);
        Serial.println(steinhart1);
        delay(100);

    //----------------------------

    //Управление кулерром

    float K= 12.75; //коэффициент увеличения ШИМ
    float Kt= steinhart-30.00;
    float Kt1=steinhart1-30.00;
    analogWrite(pwm,Kt*K);
    analogWrite(pwm,Kt1*K);
       
    }
     
  2. akl

    akl Гуру

    (vremy < 570) &&( vremy >1260) - невыполнимое условие
    то есть flag по идее должен быть всегда 1.
     
  3. Nikita_mv

    Nikita_mv Нерд

    тоеесть должно быть ИЛИ ?

    вот так
    Код (C++):
    if((vremy > 570) &&( vremy < 1260)) {
            flag=1;
         }
        if ((vremy < 570) || ( vremy >1260)) {
           flag=0;
     
  4. b707

    b707 Гуру

    лучше else
     
  5. Nikita_mv

    Nikita_mv Нерд

    Кстати мой первый вариант был такой:
    Код (C++):



    int On_Time=570; //=9*60+30; //время включение (приводим к минутам)
    int Off_Time=1260; //=21*60+00; //время выключения в минутах




    vremy=now.hour()*60+now.minute();
     
         if((vremy > On_Time) &&( vremy < Off_Time)) {
       
           digitalWrite(led, HIGH);
            digitalWrite(lamp, HIGH)
         
          }
    else{

    digitalWrite(led, LOW);
            digitalWrite(lamp, LOW);
    }
    Но все равно не работало
     
  6. akl

    akl Гуру

    а vremy точно правильно определяется? если в консоль его напечатать что показывает?
     
  7. fogary

    fogary Гик

    Глупый вопрос, почему не хотите использовать будильники (их два в DS3231)?
     
  8. Nikita_mv

    Nikita_mv Нерд

    В консоли правильно V= это время в минутах F= это flag


    Возможно не глупый т.к. про эти функции я не знаю
     

    Вложения:

  9. akl

    akl Гуру

    если вот так прописать - че пишет?
    Код (C++):

        vremy=now.hour()*60+now.minute();
        Serial.println(vremy);
         if((vremy > 570) &&( vremy < 1260)) {
            flag=1;
            Serial.println("f");
         }
        else{
           flag=0;
        }
     
    если vremy действительно 715, то оно в принципе не может не зайти в условие и не поставить флаг в 1.
    возможно текущий скетч отличается от того что в первом посте?
     
  10. fogary

    fogary Гик

    По ссылке есть примеры использования: "DS3231_alarm" - чисто программная проверка будильников; "DS3231_intalarm" - с аппаратным прерыванием.
     
  11. Nikita_mv

    Nikita_mv Нерд

    попробовал так сделать vremy считает правильно flag =1 но реле не включается. Заметил, что при включении контролера реле включается примерно на 6 сек. и отключается до следующий перезагрузки. причем платы разные брал 3 шт.
     

    Вложения:

    Последнее редактирование: 25 фев 2020
  12. Nikita_mv

    Nikita_mv Нерд

    А я всепонял
    Так я всегда flag приравниваю к единице
    Код (C++):
    if (flag=1  )   {                                      
            digitalWrite(led, HIGH);
            digitalWrite(lamp, HIGH));
    }
    а надо вот так писать

    Код (C++):
    if (flag==1  )   {                                        
            digitalWrite(led, HIGH);
            digitalWrite(lamp, HIGH));
    }
     
  13. Nikita_mv

    Nikita_mv Нерд

    Всем огромное спасибо за помощь!!