Завсегдатай, Кандидат в Советники
|
Простой Arduino-контроллер "чайника" - от макета до готового изделия (страница 2) |
В какой-то мере эта тема является продолжением темы уважаемого ZORS, ARDUINO для автоматизации аквариума . По крайней мере, в том, что касается контроллера, который делаю я, пользуясь наработками, схемами и критикой из той темы. |
|
#1968755 Нравится skitol
|
Посетитель
|
|
Дядька-рыбомор Ого! Огромное спасибо за работу!) |
|
#1974682 |
|
Завсегдатай, Кандидат в Советники
|
|
Небольшие пояснения к схеме, чаво-куды включено |
|
#1974686 |
Завсегдатай, Кандидат в Советники
|
|
Когда включается питание, появляется логотипчик, что-то типа "Хэллоуворда". Потом экран гаснет. Чтобы вообще понимать, работает ли контроллер, я на переднюю панель вывел 3,5 мм зеленый светодиод, включенный к GND и VCC через резистор 1 ком. После нажатия кнопки "подсветки экрана" включается подсветка экрана (все должно быть логично!), выводится время, дата, день недели (а вдруг пригодится?). Далее кнопкой "меню" листаем меню. После первого нажатия выводится инфа, чего у нас включено, в авто или ручном режиме. Ну, к примеру такая запись говорит о том, что свет и СО2 работают в режиме "авто", свет включен, СО2 выключено, а три буквы Evg означают evening, т.е. вечер (основной свет уже погас, но доп. подсветка еще работает). Также возможны варианты Ngt, т.е. night, ночь (весь свет выключен), Mrg, т.е. morning (включено доп.освещение), Day (включено основное освещение). Утром-вечером будут включаться 3 диода теплого белого, а днем в качестве основного света - 8 диодов холодного белого. Все, конечно, через ШИМ для плавности. Продолжение следует. |
|
#1974691 |
Завсегдатай, Кандидат в Советники
|
|
На этой странице меню можно кнопками "СО2" и "свет" включать нужный режим. Следующее нажатие кнопки "меню" выводит на экран температуру воды и ридиаторов, тут все понятно Значок "*" обозначает, что температура превысила установленный порог+гистерезис и включились соответствующие кулеры (в последнем варианте скетча для радиаторов установлено 40 градусов). После падения температуры ниже установленного порога-гистерезис кулеры отключаются. Работает терморегуляция в период 9:00 - 22:00, т.к. аквас стоит в спальном помещении, слушать ночью джаз кулеров я и жена не хотели бы. Третье нажатие на кнопку "меню" возвращает нас к часам, и так по кругу. Выключается подсветка экрана повторным нажатием на кнопку "подсветка экрана". Была мысль сделать автоматом выключение экрана через заданное время, но мне так показалось неудобным. |
|
#1974699 |
Завсегдатай, Кандидат в Советники
|
|
Кнопка "21:00" на задней панели устанавливает часы на 21:00 по сигналам программы "Время". Часы программно корригируются, у меня установлена коррекция минус 1 секунда каждые 38 мин. Этот показатель индивидуальный для разных RTC. |
|
#1974700 |
|
Завсегдатай, Кандидат в Советники
|
|
Еще добавлю, что несмотря на обилие соединений на схеме, внутри корпуса проводов относительно мало, т.к. вся коммутация выполнена на самодельном шилде к ардуине, и все компоненты подключены шлейфами через разъемы типа "мама-папа". |
|
#1974703 Нравится Bwzs
|
Посетитель
|
|
Спасибо Вам огромное за данную тему. Собрал почти все как у Вас, только проще. У меня нет требований ставить датчики температуры и кулеров, в связи с этим поставил 2 реле вместо 4, так же у меня всего одна линейка СД поэтому поставил только один драйвер, в связи с этим возникает вопрос как можно переделать скетч под эти требования? Вырезал из скетча все что связано с Ldd2 и и температурой, теперь вообще все работает криво косо, подскажите как решить? |
|
#1984711 |
Посетитель
|
|
Bwzs нужен оригинальный скетч и тот, что получился, искать, где затронули основную логику выкладывайте |
|
#1985361 |
|
Посетитель
|
|
Оригинальный в данной теме |
|
#1985885 |
Малёк
|
|
Дядька-рыбомор Помогите пожалуйста с кодом в этой теме.У меня четырёх канальное реле включается в off а выключается в On.Где и что нужно поменять в скетче? /*Скетч с использованием UNIX-времени По материалам www.aqa.ru и благодаря стараниям ZORS Версия от 03 мая 2014 Управление 4-мя реле (СО2, термореле воды и радиаторов ЛЭД, вкл/выкл драйверов ЛЭД) ШИМ ЛЭД по 2-м каналам Вывод на экран температуры, времени, даты, состояния включенных функций Коррекция неточных RTC Работа с 5-ю кнопками: вкл/выкл подсветки дисплея меню дисплея, время на 21:00, управление СО2, светом. */ //Загрузка библиотек #include #include #include #include //Установка экрана LiquidCrystal_I2C lcd(0x27,16,2); //Подключение выходов const int RelCO2 = 4; //реле СО2 на выходе 4 const int RelLdd = 7;//выход 7 реле DC для драйверов LDD const int Led1 = 5; //ШИМ утро-вечер выходе 5 const int Led2 = 6; //ШИМ день на выходе 6 const int TermRel1 = 8;//выход 8 для реле термодатчика воды const int TermRel2 = 12; //выход 12 для реле термодатчика радиаторов //Установки параметров ШИМ #define PWM_MIN 0 //минимальное значение ШИМ #define PWM_MAX 255//максимальное значение ШИМ //Значения минут и часов в секундах #define mn 60UL #define hr 3600UL //Установки времени вклвыкл ШИМ-сигнала на 5 и 6 выходах (время в секундах UNIX) const long Led1On = 13*hr;//включение ШИМ на 5 выходе в 13:00 const long Led1Off = 21*hr+30*mn;//выключение (начало заката) в 21:30 const long Led1Dur = 30*mn;//длительность восхода-заката 30 мин const long Led2On = 15*hr;//включение ШИМ на 6 выходе в 15:00 const long Led2Off = 20*hr+30*mn;//выключение (начало заката) в 20:30 const long Led2Dur = 30*mn;//длительность восхода-заката const long CO2On = 14*hr+30*mn;//включение СО2 const long CO2Off = 20*hr+30*mn;//выключение СО2 //Установка RTC и их коррекция RTC_DS1307 RTC; uint32_t TimeAdjustPeriod = 38*mn; //корректирровка времени на -1 сек за 38 мин uint32_t TimeCorrection = 1; unsigned long nextAdjustTime = 0; //Установки для печати месяцев на экране const char* months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; //Установки для термодатчика int TSensorPin1 = 10; int TSensorPin2 = 9; OneWire ds1(TSensorPin1);// создаем объект температурного датчика OneWire ds2(TSensorPin2); float t1 = 27.0;//установка температуры float tGist1 = 0.2;//установка гистерезиса float t2 = 40.0;//установка температуры float tGist2 = 0.5;//установка гистерезиса //Установки для кнопки СО2 на выходе 2 const int ButtonCO2 = 2; boolean flagCO2 = false; int regimCO2 = 1; //Установки для кнопок "Время 21:00", "Свет" и "Подсветка LCD на аналоговом входе А0 const int ButtonA0 = A0; int analogA0 = 0; boolean flagA0 = false; int regimA0 = 1; boolean flagA0LCD = false; int regimA0LCD = 1; //Установки для кнопки "Меню экрана" на выходе 3 const int ButtonMenu = 3; boolean flagMenu = false; int regimMenu = 1; //********************************************************* void setup () { Wire.begin(); RTC.begin(); //RTC.adjust(DateTime(__DATE__, __TIME__)); // строка только для первой компиляции!!! DateTime myTime = RTC.now(); //RTC.adjust(DateTime(myTime.unixtime()+15)); //строка только для первой компиляции!!! RTC.adjust(DateTime(myTime.unixtime()+3));//для второй компиляции, коррекция при перезагрузках Arduino на 3 сек. //Первоначальные установки выходов pinMode (RelCO2, OUTPUT); pinMode (RelLdd, OUTPUT); pinMode (TermRel1, OUTPUT); pinMode (TermRel2, OUTPUT); digitalWrite (RelCO2, LOW); digitalWrite (RelLdd, LOW); digitalWrite (TermRel1, LOW); digitalWrite (TermRel2, LOW); analogWrite(Led1, PWM_MIN); analogWrite(Led2, PWM_MIN); //Первоначальные надписи на дисплее lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(5, 0); lcd.print("iAQUA");//Слава мне, любимому lcd.setCursor(3, 1); lcd.print("v.3.05.14"); delay (3000); lcd.clear(); lcd.noBacklight(); } //*************************************************** void loop () { //Работа часов с коррекцией DateTime myTime = RTC.now(); uint32_t UTime = myTime.unixtime(); if (UTime > nextAdjustTime){ nextAdjustTime = UTime+TimeAdjustPeriod; RTC.adjust(DateTime(UTime-TimeCorrection)); } UTime %=86400; analogA0=analogRead(A0); if (analogA0>685 && analogA0 { DateTime myTime = RTC.now(); uint32_t UTime = myTime.unixtime(); UTime = 75600 + (UTime-UTime%86400); RTC.adjust(DateTime(UTime)); } if (analogA0>810 && analogA0 { regimA0++; flagA0 = true; if (regimA0>2) { regimA0=1; } } else if (analogA0 { flagA0=false; } if (regimA0==1) { if ((UTime>=(Led1On-1*mn)) && (UTime { digitalWrite(RelLdd, HIGH); } else { digitalWrite(RelLdd, LOW); } } if (regimA0 !=1) { digitalWrite(RelLdd, LOW); } if (analogA0>580 && analogA0 { regimA0LCD++; flagA0LCD = true; if (regimA0LCD > 2) { regimA0LCD = 1; }} else if(analogA0 { flagA0LCD = false; } if (regimA0LCD==1) { lcd.noBacklight(); } if (regimA0LCD !=1) { lcd.backlight(); } //Управление СО2 if (digitalRead(ButtonCO2)==HIGH && !flagCO2) { regimCO2++; flagCO2=true; if(regimCO2>3) { regimCO2=1; } } else if (digitalRead(ButtonCO2)==LOW && flagCO2) { flagCO2=false; } if(regimCO2==1) { if (UTime>=CO2On && UTime { digitalWrite (RelCO2, HIGH); } else { digitalWrite (RelCO2, LOW); } } else if(regimCO2==2) { digitalWrite(RelCO2, HIGH); } else if(regimCO2==3) { digitalWrite(RelCO2, LOW); } //управление термореле воды в период 9:00-22:00 float temp1 = getTemp1(); //lcd.setCursor(9,1); if((temp1 > (t1 + tGist1)) && (UTime >= 9*hr) && (UTime { digitalWrite(TermRel1,HIGH); } else if ((temp1 = 22*hr) { digitalWrite(TermRel1,LOW); } float temp2 = getTemp2();//управление термореле радиаторов if (temp2>(t2+tGist1) && UTime>=9*hr && UTime { digitalWrite(TermRel2, HIGH); } else if (temp2=22*hr) { digitalWrite(TermRel2, LOW); } //Управление кнопкой "Меню экрана" if (digitalRead(ButtonMenu)==HIGH && !flagMenu) { lcd.clear(); flagMenu = true; regimMenu ++; if (regimMenu>3) { regimMenu=1; } } else if (digitalRead(ButtonMenu)==LOW && flagMenu) { flagMenu=false; } if (regimMenu==1) //меню "1" вывод на экран времени и календаря { lcd.setCursor(4, 0); if (myTime.hour() lcd.print(myTime.hour()); lcd.print(':'); if (myTime.minute() lcd.print(myTime.minute()); lcd.print(':'); if (myTime.second() lcd.print(myTime.second()); lcd.setCursor(0, 1); if (myTime.day() lcd.print(myTime.day()); lcd.setCursor(3, 1); lcd.print (months[myTime.month()-1]); lcd.setCursor(7,1); lcd.print(myTime.year()); lcd.setCursor(13,1); int dow = (myTime.dayOfWeek()); switch (dow){ case 0: lcd.print("Sun"); break; case 1: lcd.print("Mon"); break; case 2: lcd.print("Tue"); break; case 3: lcd.print("Wed"); break; case 4: lcd.print("Thu"); break; case 5: lcd.print("Fri"); break; case 6: lcd.print("Sat"); break; } } else if (regimMenu==2)//меню "2" вывод на экран CO2, T, режима работы диодов { lcd.setCursor(0,0); lcd.print("CO2"); lcd.setCursor(4,0); if (digitalRead(RelCO2)==HIGH) { lcd.print("On "); } else { lcd.print("Off"); } lcd.setCursor(8,0); if (regimCO2 == 1) { lcd.print("Auto"); } else if (regimCO2 !=1) { lcd.print("Hand"); } lcd.setCursor(13,1); if(UTime=(Led1Off+Led1Dur)) { lcd.print("Ngt"); } else if (UTime>=(Led1On) && UTime { lcd.print("Mrg"); } else if(UTime >= Led2On && UTime { lcd.print("Day"); } else if (UTime >= Led2Off && UTime { lcd.print("Evg"); } lcd.setCursor(0,1); if (digitalRead(RelLdd)==HIGH && regimA0 ==1) { lcd.print("LED On Auto"); } else if (digitalRead(RelLdd) == LOW && regimA0 ==1) { lcd.print("LED Off Auto"); } else { lcd.print("LED Off Hand"); } } else if(regimMenu==3)// меню "3" вывод на экран температуры { lcd.setCursor(0,0); lcd.print("Water t="); lcd.print(temp1,1); lcd.setCursor(13,0); if (digitalRead(TermRel1)==HIGH) { lcd.print("*"); } else { lcd.print(" "); } lcd.setCursor(0,1); lcd.print("LED t="); lcd.print(temp2,1); lcd.setCursor(13,1); if(digitalRead(TermRel2)==HIGH) { lcd.print("*"); } else { lcd.print(" "); } } //Управление ШИМ //для выхода 5 (утро и вечер) long pwm; if ((UTime=Led1Off + Led1Dur)) { pwm=PWM_MIN; } else if((UTime>=Led1On) && (UTime { pwm = ((UTime - Led1On)*(PWM_MAX-PWM_MIN)) / Led1Dur; } else if((UTime>=Led1Off) && (UTime { pwm=((Led1Off + Led1Dur - UTime)*(PWM_MAX-PWM_MIN))/Led1Dur; } else { pwm=PWM_MAX; } analogWrite(Led1, pwm); //для выхода 6 (день) if ((UTime=Led2Off + Led2Dur)) { pwm=PWM_MIN; } else if((UTime>=Led2On) && (UTime { pwm = ((UTime - Led2On)*(PWM_MAX-PWM_MIN)) / Led2Dur; } else if((UTime>=Led2Off) && (UTime { pwm=((Led2Off + Led2Dur - UTime)*(PWM_MAX-PWM_MIN))/Led2Dur; } else { pwm=PWM_MAX; } analogWrite(Led2, pwm); } //***************************************************** //Функции чтения с датчиков температуры float getTemp1(){ byte data[12]; byte addr[8]; if ( !ds1.search(addr)) { //no more sensors on chain, reset search ds1.reset_search(); return -1001; } if ( OneWire::crc8( addr, 7) != addr[7]) { return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { return -1003; } ds1.reset(); ds1.select(addr); ds1.write(0x44,1); byte present = ds1.reset(); ds1.select(addr); ds1.write(0xBE); for (int i = 0; i data[i] = ds1.read(); } ds1.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float TRead = ((MSB float Temperature = TRead / 16; return Temperature; } float getTemp2(){ byte data[12]; byte addr[8]; if ( !ds2.search(addr)) { //no more sensors on chain, reset search ds2.reset_search(); return -1001; } if ( OneWire::crc8( addr, 7) != addr[7]) { return -1002; } if ( addr[0] != 0x10 && addr[0] != 0x28) { return -1003; } ds2.reset(); ds2.select(addr); ds2.write(0x44,1); byte present = ds2.reset(); ds2.select(addr); ds2.write(0xBE); for (int i = 0; i data[i] = ds2.read(); } ds2.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float TRead = ((MSB float Temperature = TRead / 16; return Temperature; } |
|
#2008340 |
Малёк
|
|
Дядька-рыбомор Добавил фото -где на дисплее видно что при off реле включено.А при On наоборот выключается.Где искать?У меня реле видать отличается от реле (Дядька-рыбомор)? Как это исправить в коде? |
|
#2008383 |
|
Малёк
|
|
Всё разобрался.В реле с нормально-разомкнутых контактов переставил на - нормально-замкнутые контакты.А мучился искал причину несколько дней в скетче. |
|
#2009156 |
Малёк
|
|
Дядька-рыбоморСбивается время на контролёре, после отключения питания, батарейка живая.В чём может быть причина? Подскажите пожалуйста. |
|
#2012006 |
Малёк
|
|
Выдёргиваю питание из USB, затем жду минуты 3-5, потом вставляю USB, -время показывает то что было 3-5 минут назад.Для чего тогда батарейка? |
|
#2012025 |
|
Малёк
|
|
Прочитал внимательно тему уважаемого ZORS и понял свою ошибку.Мне надо было раскомментировать и загрузить а второй раз закомментировать и ещё раз загрузить вот это RTC.adjust(DateTime(__DATE__, __TIME__)); |
|
#2012176 |
Завсегдатай, Кандидат в Советники
|
|
Давненько не был в теме и вообще на форуме, работа замучала. Да и со светильником еще вожусь, пока собрал рабочий макет, времени не хватает. |
|
#2015765 |
Завсегдатай, Кандидат в Советники
|
|
Настало время завершать проект, начатый весной. Мешало отсутствие свободного времени, а то бы закончил все еще летом. |
|
#2025734 |
|
Малёк
|
|
Молодец. А я всё светильник никак не зделаю.Уже собираю другой контролёр на мега 2560 с цветным дисплеем TFT32. |
|
#2033782 |
|
Малёк
|
|
Последний скетч не открывается. |
|
#2033785 |
Малёк
|
|
какова стоимость контроллера? |
|
#2044924 |
Завсегдатай, Кандидат в Советники
|
|
Сергей.Б Ссылка пропала Выкладываю еще раз За 2 месяца аквариум просто зарос и регулярно пропалывается. Несколько уменьшил максимальное значение PWM_MAX для основного света и назвал его PWM_LOW, чтобы приглушить интенсивность света, а то на анубиасах по краю листа черная бородка пошла. Подобрал интенсивность света просто "на глазок". Динамика растений покажет. Изменено 3.2.15 автор Дядька-рыбомор |
|
#2047850 |
|