Всем привет , недавно я купил камин съ водяным контуром и стал вопрос как им управлять , а именно водяным насосом . Я начал искать термостат и наткнулся на статью http://arrduinolab.blogspot.ru/2014/09/arduino.html#more . Сразу скажу что ардуино и программирование для меня новинка . После чего я заказал ардуино и шильды . Программа работает так : при включении включается вентилятор который вдувает теплый воздух из комнаты в камин чтоб прогреть дымоход . после того как температура воды нагревается до заданной температуры включается водяной насос Если нужно включить вентилятор нужно нажать кнопку 2 , вентилятор включится на 3 минуты. Конечно выглядит все не очень , но это только начало .В будущем хочу переделать и добавить web , пищалку для ошибки , co2 сенсор. Поставить экран на четыре строки и добавить температуру с улицы . Ну както так , жду критики . PS. Вопрос почему чтоб включить реле мне нужно написать LOW a ne HIGH
Смотрим на схему справа налево. Чтобы реле сработало надо чтобы через транзистор Q1 пошел ток. От пойдет когда откроется фототранзистор в оптроне U1. Светодиод в оптроне анодом подключен к плюсу питания, значит будет светиться (и откроет фототранзистор) тогда, когда на катоде будет минус, поэтому: - когда на входе high, те 5 вольт, то разница в напряжении между анодом и катодом ноль вольт и светиться он не будет - когда low, то в Ардуино он подсоединен к земле (ноль вольт) и уже через всю цепочку из двух светодиодов и резистора течет ток
Я столкнулся с проблемой , а именно раз ( иногда больше ) в день на экране появляются каракули, фото и скетч внизу . Код (Text): #include <EEPROM.h> #include <OneWire.h> #include <LiquidCrystal.h> #include <DallasTemperature.h> DeviceAddress sensor1 = {0x28, 0xFF, 0xE6, 0x25, 0x2E, 0x04, 0x00, 0xA4}; DeviceAddress sensor2 = {0x28, 0xFF, 0x37, 0x1F, 0x4B, 0x04, 0x00, 0xF4}; #define OUT1 2 // uitgang relay #define OUT2 3 byte tempOUT1, tempOUT2; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); OneWire oneWire(11); // 11 ingang 18b20 dallas sensor DallasTemperature ds(&oneWire); byte gradus[8] = { 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000 }; byte pech[8] = { 0b00100, 0b00100, 0b01110, 0b01110, 0b11111, 0b11111, 0b11111, 0b01110 }; byte dom[8] = { 0b00100, 0b01110, 0b01110, 0b11111, 0b11111, 0b11111, 0b11111, 0b11111 }; void erorr(){ // останавливает работу программы и сигнализирует ошибку digitalWrite(OUT1, HIGH); // выключаем реле digitalWrite(OUT2, LOW); while(1){ // крутим бесконечный цикл digitalWrite(13, !digitalRead(13)); delay(500); loop(); } } void ventilyator(){ ds.requestTemperatures(); double temperature1 = (ds.getTempC(sensor1)); // читаем температуру double temperature2 = (ds.getTempC(sensor2)); // читаем температуру digitalWrite(OUT1, LOW); // включает реле digitalWrite(OUT2, LOW); // включает реле lcd.begin(16,2); lcd.clear(); lcd.setCursor(0, 0); /// вывод инфы на экран lcd.print("PMP:"); lcd.print(tempOUT1); lcd.write(1); lcd.print("C"); if (digitalRead(OUT1)) lcd.print(" - "); // показываем состояние выхода else lcd.print(" + "); lcd.setCursor(0, 1); lcd.print("FAN:"); lcd.print(tempOUT2); lcd.write(1); if (digitalRead(OUT2)) lcd.print(" - "); else lcd.print(" + "); lcd.setCursor(9, 0); // показываем температуру с датчика lcd.write(2); lcd.print(temperature1, 1); lcd.write(1); lcd.print("C"); lcd.setCursor(9, 1); lcd.write(3); lcd.print ( temperature2, 1); lcd.write(1); lcd.print("C"); delay(300000); loop(); } //// byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void setMenu(){ // установка температуры byte pos; digitalWrite(OUT1, LOW); // выключаем реле digitalWrite(OUT2, HIGH); lcd.clear(); lcd.setCursor(0, 0); // что нужно отрисовать один раз lcd.print("OUT1: "); lcd.setCursor(0, 1); lcd.print("OUT2: "); lcd.blink(); while(1){ // крутим бесконечный цикл byte KEY = key(); // читаем состояние кнопок lcd.setCursor(6, 0); // выводим на экран lcd.print(tempOUT1); lcd.write(1); lcd.print("C "); lcd.setCursor(6, 1); lcd.print(tempOUT2); lcd.write(1); lcd.print("C "); ////// обработка кнопок if (pos == 0){ // если в первой позиции lcd.setCursor(5, 0); // устанавливаем курсор if (KEY == 2) { // если нажата кнопка tempOUT1--; // изменяем значение EEPROM.write(1, tempOUT1); // сохраняем в еепром } else if (KEY == 5){ tempOUT1++; EEPROM.write(1, tempOUT1); } } if (pos == 1){ lcd.setCursor(5, 1); if (KEY == 2) { tempOUT2--; EEPROM.write(2, tempOUT2); } else if (KEY == 5){ tempOUT2++; EEPROM.write(2, tempOUT2); } } if (KEY == 3) pos--; // крутим позицию else if (KEY == 4) pos++; if (pos > 1) pos = 0; delay(200); } } void setup() { { ds.begin(); pinMode(13, OUTPUT); pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT); lcd.begin(16,2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("KACHEL BEDIENING"); delay(3000); lcd.setCursor(0, 0); lcd.print(" VERWARMING "); lcd.setCursor(0, 1); lcd.print(" ROOKKANAAL "); digitalWrite(OUT2, LOW); //produvaem trubu teplim vozduhom digitalWrite(OUT1, HIGH); //vikluchaem pompu delay (20000); } lcd.createChar(1, gradus); lcd.createChar(2, pech); lcd.createChar(3, dom); lcd.begin(16, 2); lcd.clear(); tempOUT1 = EEPROM.read(1); // читаем настройки tempOUT2 = EEPROM.read(2); // из еепром } void loop() { ds.requestTemperatures(); byte KEY = key(); if (KEY == 1) setMenu(); // если нажата селект, уходим в меню else if (KEY == 4) analogWrite(10, 20); // если вниз, глушим подсветку else if (KEY == 3) digitalWrite(10, HIGH); else if (KEY == 2) ventilyator();; double temperature1 = (ds.getTempC(sensor1)); // читаем температуру double temperature2 = (ds.getTempC(sensor2)); // читаем температуру if (temperature1>=90) { lcd.clear(); lcd.print(" OVERVERHITTING "); lcd.setCursor(0, 1); lcd.print(" DRUK OP RESET "); erorr(); } if (temperature1 > tempOUT1) digitalWrite(OUT1, LOW); // сверяем температуру else digitalWrite(OUT1, HIGH); // и управляем выходами if (temperature1 > tempOUT2) digitalWrite(OUT2, LOW); else digitalWrite(OUT2, HIGH); lcd.clear(); lcd.setCursor(0, 0); /// вывод инфы на экран lcd.print("PMP:"); lcd.print(tempOUT1); lcd.write(1); // lcd.print("C"); if (digitalRead(OUT1)) lcd.print(" - "); // показываем состояние выхода else lcd.print(" + "); lcd.setCursor(0, 1); lcd.print("FAN:"); lcd.print(tempOUT2); lcd.write(1); if (digitalRead(OUT2)) lcd.print(" - "); else lcd.print(" + "); lcd.setCursor(9, 0); // показываем температуру с датчика lcd.write(2); lcd.print(temperature1, 1); lcd.write(1); lcd.print("C"); lcd.setCursor(9, 1); lcd.write(3); lcd.print ( temperature2, 1); lcd.write(1); lcd.print("C"); } У кого какие идеи ?