Доброго времени суток. Делаю контроллер под аквариум что бы свет включался и выключался по расписанию. перепробовал кучу библиотек под 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); }
тоеесть должно быть ИЛИ ? вот так Код (C++): if((vremy > 570) &&( vremy < 1260)) { flag=1; } if ((vremy < 570) || ( vremy >1260)) { flag=0;
Кстати мой первый вариант был такой: Код (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); } Но все равно не работало
В консоли правильно V= это время в минутах F= это flag Возможно не глупый т.к. про эти функции я не знаю
если вот так прописать - че пишет? Код (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. возможно текущий скетч отличается от того что в первом посте?
По ссылке есть примеры использования: "DS3231_alarm" - чисто программная проверка будильников; "DS3231_intalarm" - с аппаратным прерыванием.
попробовал так сделать vremy считает правильно flag =1 но реле не включается. Заметил, что при включении контролера реле включается примерно на 6 сек. и отключается до следующий перезагрузки. причем платы разные брал 3 шт.
А я всепонял Так я всегда flag приравниваю к единице Код (C++): if (flag=1 ) { digitalWrite(led, HIGH); digitalWrite(lamp, HIGH)); } а надо вот так писать Код (C++): if (flag==1 ) { digitalWrite(led, HIGH); digitalWrite(lamp, HIGH)); }