// подключаем две библиотеки для работы с LCD и математических вычислений // DS1302: RST -> Arduino Digital 0 // DAT -> Arduino Digital 7 // SKL -> Arduino Digital 8 //VCC ->GND //VDD ->5+ //VO -> potenciometr //15 ->5+ //16 ->GND // LCD: DB7 -> Arduino Digital 1 // DB6 -> Arduino Digital 3 // DB5 -> Arduino Digital 4 // DB4 -> Arduino Digital 5 // E -> Arduino Digital 10 // RW -> Arduino Digital 11 // RS -> Arduino Digital 12 #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <OneWire.h>// Инициализация библиотеки шины OneWire. #include <DallasTemperature.h>// Инициализация библиотеки термодатчиков. #include <DS1302.h> #define ONE_WIRE_BUS 6// Подключение цифрового вывода датчика к 10-му пину Ардуино. OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств. DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от Dallas Temperature. DS1302 _RTC1( 3, 4, 5); LiquidCrystal_I2C lcd(0x27,20,4); // Задаем размерность дисплея. входы A4,A5 unsigned long currentTime; unsigned long loopTime; Time _tRTC1; bool _RTCAlO1 = 0; bool _RTCAlO2 = 0; bool _RTCAlO3 = 0; bool _RTCAlO4 = 0; void setup(void) { pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); currentTime = millis(); // считываем время, прошедшее с момента запуска программы loopTime = currentTime; _RTC1.halt(false); _RTC1.writeProtect(false); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку sensors.begin(); // Запуск сенсора. lcd.clear(); lcd.setCursor(0,2); lcd.print(" AQVA"); lcd.setCursor(9,2); lcd.print("T:"); lcd.setCursor(0,3); lcd.print("RELE1:"); lcd.setCursor(11,3); lcd.print("RELE2:"); // Display date in the lower right corner } void loop(void) { _tRTC1 = _RTC1.getTime(); if (1) { _RTCAlO1 = (((_tRTC1.hour) == 22) && ((_tRTC1.min) == 30) && ((_tRTC1.sec) == 10));}//выставляем максимум после выключения else {_RTCAlO1 = 0;} if (1) { _RTCAlO2 = (((_tRTC1.hour) == 20) && ((_tRTC1.min) == 20) && ((_tRTC1.sec) == 13));}//уменьшаем яркость до минимума else {_RTCAlO2 = 0;} if ( _tRTC1.hour < 8 )// включение лампы без регулировки { _RTCAlO3 = 1 ; lcd.setCursor(6,3); lcd.print("OFF "); } if (_tRTC1.hour > 19)//выключение лампы {_RTCAlO3 = 1 ; lcd.setCursor(6,3); lcd.print("OFF"); } else {_RTCAlO3 = 0; lcd.setCursor(6,3); lcd.print("ON "); } if ( ((_tRTC1.hour) < 9 ))// { _RTCAlO4 = 1 ; lcd.setCursor(17,3); lcd.print("OFF "); } if (((_tRTC1.hour) > 21)) {_RTCAlO4 = 1 ; lcd.setCursor(17,3); lcd.print("OFF"); } else {_RTCAlO4 = 0; lcd.setCursor(17,3); lcd.print("ON "); } digitalWrite(7, _RTCAlO1); digitalWrite(8, _RTCAlO2); digitalWrite(9, _RTCAlO3); digitalWrite(10, _RTCAlO4); currentTime = millis(); // считываем время, прошедшее с момента запуска программы if(currentTime >= (loopTime + 1000)){ lcd.setCursor(0, 0); lcd.print(_RTC1.getDateStr()); lcd.setCursor(11,1); lcd.print(_RTC1.getTimeStr()); lcd.setCursor(0, 1); lcd.print(_RTC1.getDOWStr(FORMAT_SHORT)); sensors.requestTemperatures(); // Команда опроса температуры. lcd.setCursor(12,2); lcd.print(sensors.getTempCByIndex(0));// Печать в порт температуры, "0" в данном случае указывает на первое устройство в шине. lcd.print(" C"); loopTime = currentTime; } } Проблема с _RTCAlO3 и _RTCAlO4 при достижении времени 00.00.00. реле включаются ( логика реле инвертированная). В программирование новичок).
Так, собственно, и запрограммировано. Сначала текущий час проверяется на меньше нижней границы. Переменная выставляется в 1, нм экране пишется OFF. Потом проверяется на больше верхней границы. Ноль этому условию, естественно, не соответствует, а потому выполняется то, что в else у этого условия, т.е. переменная в 0, на экран ON. Чтобы выполнялось задуманное, надо после первого условия, после того, что у него в фигурных скобках, добавить else, дабы следующий if (со своими блоками после него и после его собственного else) выполнялся только тогда, когда условие ложно. Другой вариант - объединить условия (благо, код для них идентичен), оставив else второго условия. Примерно так: Код (Text): if ( _tRTC1.hour < 8 )||(_tRTC1.hour > 21) {_RTCAlO4 = 1 ; lcd.setCursor(17,3); lcd.print("OFF"); } else {_RTCAlO4 = 0; lcd.setCursor(17,3); lcd.print("ON "); } Сделать надо это для обоих блоков, которые задают значения _RTCAlO3 и _RTCAlO4 в зависимости от времени.
Благодарю за ответ ,все заработало как надо.Еще один вопрос ,если не сложно могли бы подсказать как в этом коде запихнуть регулировку температуры ( если достигло опред. значения вкл. вентилятор например)для других датчиков разобрался а вот с этим сложно).
Если я правильно понимаю, то sensors.getTempCByIndex возвращает абсолютное значение температуры в градусах Цельсия. В этом случае с вентилятором по температуре примерно так же, как с реле по времени. Проверяем условие, и на пин, управляющий вентилятором через транзистор или реле подаем нужный уровень. Примерно так: Код (Text): int ventstate=0; // состояние, должно быть где-то до setup() ... if ((!ventstate)&&(sensors.getTempCByIndex(0)>50)) { // VENTPIN надо определить как номер пина для управления вентилятором digitalWrite(VENTPIN, ventstate=HIGH);//в данном случае применяется трюк, характерный для языка С, а именно тот факт, что присваивание возвращает присвоенное переменной значение, } else if ((ventstate)&&(sensors.getTempCByIndex(0)<45)) { digitalWrite(VENTPIN, ventstate=LOW); } Разная температура включения и выключения нужны, чтобы не было ненужных постоянных запусков и остановок вентилятора, когда температура слегка колеблется относительно заданной. Точные температуры включения и выключения зависят от требований к температуре (чем выше требуемая точность, тем ближе должны быть эти температуры).