электроника для котла на твердом топливе Arduino
- Войдите на сайт для отправки комментариев
Чт, 19/01/2017 - 22:29
здорово народ! недавно мне пришла с китая вот такая железка.
летом я собрался варить котел длительного горения. и купил я ее специально что бы собрать на ней электронику для управления котлом, но до лета далеко поэтому решил заняться сейчас самой электроникой.
для сборки я решил использовать Arduino UNO R3, термопару на max6675 два однолинейных реле и эту железку TM1638
в итоге после четырех вечеров непосильного труда получилось вот что
1 кнопка розжиг загарается 7 светодиод на дисплее отображается РОЗ и температура котла

2 кнопка нажимая на кнопку по очереди будут включатся 4 пунката натройки
1 настройка рабочей температуры горит 3 светодиод на дисплее отображается ПР1 и настраеваемая рабочая температура

2 настройка времини продувки в секундах горит 4 светодиод на дисплее отображается ПР2 и настраевоемое значение

3 настройка перерыва продувки в минутах горит 5 светодиод на дисплее отображается ПР3 и настраевоемое значение

4 настройка температуры отключения насоса если кончилось топливо горит 6 светодиод на дисплее отображается ПР4 и настраевоемое значение

3-4 кнопки +,-
если температура ниже температуры отключения насоса горит 1 светодиод на дисплее отображается НЕР и температура котла

если температура выше температуры отключения насоса горит 2 светодиод на дисплее отображается РАБ и температура котла

при включении вместо задержки такой запуск на 3 секунды

сам код еще сырой, протестировал все кроме таймера на продувку котла, для этого нужно уйма времени. займусь этим завтра, если будут какие косяки допинаю и выкину ниже.
в коде коменты делал в каждой строчке потому что даже сам запутывался
вот сам код может кому пригодится. если в каментах есть ошибки, это нормально по клаве бамбил быстро на монитор не смотрел.
//* 1 кнопка розжиг загарается 7 светодиод на дисплее отображается РОЗ и температура котла //* 2 кнопка нажимая на кнопку по очереди будут включатся 4 пунката натройки //1 настройка рабочей температуры горит 3 светодиод на дисплее отображается ПР1 и настраеваемое значение //2 настройка времини продувки в секундах горит 4 светодиод на дисплее отображается ПР2 и настраеваемое значение //3 настройка перерыва продувки в минутах горит 5 светодиод на дисплее отображается ПР3 и настраеваемое значение //4 настройка температуры отключения насоса если кончилось топливо горит 6 светодиод на дисплее отображается ПР4 и настраеваемое значение //* 3-4 кнопки +,- //* если температура ниже температуры отключения насоса горит 1 светодиод на дисплее отображается НЕР и температура котла //* если температура выше температуры отключения насоса горит 2 светодиод на дисплее отображается РАБ и температура котла //*************************************************************************************************************************** #include <EEPROM.h> #include <TM1638.h> //библиотека дисплея #include "max6675.h"//библиотека дачика температуры //**************8-DIO/9-CLK/10-STB подключам пины дисплей TM1638 module(8, 9, 10); //**************************подключаем дачик температуры int thermoDO = 2; // SO int thermoCS = 3;//CS int thermoCLK = 4; // SCK MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);//инициализируем наш датчик //**************************подключаем реле int rele1 = 7;// подключаем одноленейное реле1 насос int rele2 = 6;// подключаем одноленейное реле2 потдув //**************************обЪявляем пременные unsigned long vremy1; // переменая таймера unsigned long vremy2; // переменая таймера int temper; // переменая для отображения дачика температуры int temperd;// переменая для отображения на дисплее програмируемой температуры int temper1; // переменая рабочая температура int tempernas; // переменая температура отключения насоса int vremyprod; // переменая время продувки int pererivprod; // переменая перерыв продува int tempernas1; // переменая для отображения на дисплее програмируемой температуры int start; // переменая для режимов старта int prog;// переменая для выбора програм номер програмы byte knopka;//Переменная для считывания значений кнопок void setup() { pinMode (rele1, OUTPUT); // ГОВОРИМ ПРОГРАММЕ ЧТО ПОРТ БУДЕТ РАБОТАТЬ КАК ВЫХОД pinMode (rele2, OUTPUT); // ГОВОРИМ ПРОГРАММЕ ЧТО ПОРТ БУДЕТ РАБОТАТЬ КАК ВЫХОД digitalWrite (rele1, HIGH); digitalWrite (rele2, HIGH);//выключаем оба реле. // ***************************запуск используется вмето задержки чтобы дачики начали работать стобильно module.setDisplayToString("-", false,0);//тере "-" module.setDisplayToString("-", false,1);//тере "-" module.setDisplayToString("-", false,2);//тере "-" module.setDisplayToString("-", false,4);//тере "-" module.setDisplayToString("-", false,5);//тере "-" module.setDisplayToString("-", false,6);//тере "-" module.setDisplayToString("-", false,7);//тере "-" module.setDisplayDigit(1,3, false); delay(1000); module.setDisplayDigit(2,3, false); delay(1000); module.setDisplayDigit(3,3, false); delay(1000); // ***************************запуск конец // ***************************запись EEPROM ******************* // ВНИМАНИЕ ЭТУ СТРОКУ НУЖНО РАСКАМЕНТИРОВАТЬ ТОЛЬКО ПРИ ПЕРВОМ ЗАПУСКЕ ПРИ РАБОЧЕЙ ЗАГРУЗЕ СТРОКА ОНА ДОЛЖНА БЫТЬ ЗАКАМЕНТИРОВАНА // EEPROM.write(1, 45); EEPROM.write(2, 15); EEPROM.write(3, 15); EEPROM.write(4, 26); // ***************************EEPROM ******************* prog = 0;// программа вне програмирования start = 0;// розжиг отключен } void loop() { nastroika:// точка безусловного перехода начало цикла temper = thermocouple.readCelsius()*100 ;// смещаем делитель на 2 знека для правельного отображения на дисплее temperd = temper1*100 ;// смещаем делитель на 2 знека для правельного отображения на дисплее tempernas1 = tempernas*100 ; knopka=module.getButtons();//подключаем кнопки 1-1,2-2,3-4,4-8,5-16,6-32,7-64,8-128 //****************ПРОГРАММИРОВАНИЕ************************************************************* if(knopka == 2){ //если нажата вторая кнопка то к переменой prog прибавляем 1 и делаем задержку в 1 с prog = prog+1; delay(1000); } if ( prog > 4){ //ели prog перешла границу 4 то начинаем выполнять основную программу prog = 0; } //*********************************программирование 1 устанавливаем рабочию температуру if ( prog == 1){ module.setLED(TM1638_COLOR_RED, 2);//включаем светодиод символизирующий програмирование 3 светодиод module.setDisplayToDecNumber(temperd,4,false);//отображаем даные температуры на десплее module.setDisplayToString("NP1", false,0);//выводим на дисплей ПР1 //отключаем светоды символизирующие програмирование module.setLED(0, 3); module.setLED(0, 4); module.setLED(0, 5); if(knopka == 4){ //если нажата третия кнопка то добовляем к показаниям 1 temper1 = temper1+1; } if(knopka == 8){ //если нажата четвертая кнопка то отнимаем от показаний 1 temper1 = temper1-1; } if(temper1 < 40 ){ //ставим ограничение низкой температуры temper1 = 40; } if(temper1 > 80 ){ //ставим ограничение высокой температуры temper1 = 80; } EEPROM.write(1, temper1); // ЗАПИСЫВАЕМ ДАНЫЕ В EEPROM } //******************программирование 2 устанавливаем время продувки в секундах if ( prog == 2){ module.setLED(TM1638_COLOR_RED, 3);//включаем светодиод символизирующий програмирование 3 светодиод module.setDisplayToDecNumber(vremyprod,0,false);//отображаем даные температуры на десплее module.setDisplayToString("NP2", false,0);//выводим на дисплей ПР2 //отключаем светоды символизирующие програмирование module.setLED(0, 2); module.setLED(0, 4); module.setLED(0, 5); if(knopka == 4){ //если нажата третия кнопка то добовляем к показаниям 1 vremyprod = vremyprod+1; } if(knopka == 8){ //если нажата четвертая кнопка то отнимаем от показаний 1 vremyprod = vremyprod-1; } if(vremyprod < 10 ){ //ставим ограничение короткого времени продува в секундах vremyprod = 10; } if(vremyprod > 60 ){ //ставим ограничение длительного времени продува в секундах vremyprod = 60; } EEPROM.write(2, vremyprod); // ЗАПИСЫВАЕМ ДАНЫЕ В EEPROM } //******************программирование 3 устанавливаем перерыв продувки в минутах if ( prog == 3){ module.setLED(TM1638_COLOR_RED, 4);//включаем светодиод символизирующий програмирование 3 светодиод module.setDisplayToDecNumber(pererivprod,0,false);//отображаем даные температуры на десплее module.setDisplayToString("NP3", false,0);//выводим на дисплей ПР3 //отключаем светоды символизирующие програмирование module.setLED(0, 2); module.setLED(0, 3); module.setLED(0, 5); if(knopka == 4){ //если нажата третия кнопка то добовляем к показаниям 1 pererivprod = pererivprod+1; } if(knopka == 8){ //если нажата четвертая кнопка то отнимаем от показаний 1 pererivprod = pererivprod-1; } if(pererivprod < 5 ){ //ставим ограничение короткого времени перерыва продува в минутах pererivprod = 5; } if(pererivprod > 60 ){ //ставим ограничение длительного времени перерыва продува в минутах pererivprod = 60; } EEPROM.write(3, pererivprod); // ЗАПИСЫВАЕМ ДАНЫЕ В EEPROM } //******************программирование 4 устанавливаем температуру отключения насоса если закончится топливо if ( prog == 4){ module.setLED(TM1638_COLOR_RED, 5);//включаем светодиод символизирующий програмирование 3 светодиод module.setDisplayToDecNumber(tempernas1,4,false);//отображаем даные температуры на десплее module.setDisplayToString("NP4", false,0);//выводим на дисплей ПР4 //отключаем светоды символизирующие програмирование module.setLED(0, 2); module.setLED(0, 3); module.setLED(0, 4); if(knopka == 4){ //если нажата третия кнопка то добовляем к показаниям 1 tempernas = tempernas+1; } if(knopka == 8){ //если нажата четвертая кнопка то отнимаем от показаний 1 tempernas = tempernas-1; } if(tempernas < 20 ){ //ставим ограничение низкой температуры tempernas = 20; } if(tempernas > 50 ){ //ставим ограничение низкой температуры tempernas = 50; } EEPROM.write(4, tempernas);// ЗАПИСЫВАЕМ ДАНЫЕ В EEPROM } //******************программирование конец if ( prog == 0){ module.setLED(0, 5);//отключаем светоды символизирующие програмирование } // это условие проедназначено для того чтобы програмированию не мешала основная программа if ( prog > 0){ goto nastroika;// отправляем програму выполнять цикл loop сначала. } //**************** конец программирование //**************** ЧИТАЕМ ДАНЫЕ С EEPROM************************* temper1 = EEPROM.read(1); vremyprod = EEPROM.read(2); pererivprod = EEPROM.read(3); tempernas = EEPROM.read(4); //**************** СТАРТ*************************запускаем розжиг if(knopka == 1){ //если нажата первая кнопка то запускаем режим старт start = start+1; delay(1000); } if ( start > 1){ //ели старт запущен то вторым нажатием отключаем его start = 0; } if ( start == 1&& (thermocouple.readCelsius() < tempernas)){ module.setLED(TM1638_COLOR_RED, 6);// зажигаем 7 светодиод символизирующий розжиг module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("P03", false,0);//отображаем на десплее РОЗ розжиг digitalWrite (rele1, LOW);// насос включен digitalWrite (rele2, LOW);//подув включен } //****************конец СТАРТ************************* //**********************ОСНОВНАЯ ПРОГРАММА****************************** //если температура меньше чем рабочая температура включаем потдув if ( (thermocouple.readCelsius() <= temper1-2) && (thermocouple.readCelsius() > tempernas+1) ){ module.setLED(0, 0); // если температура больше чем темература установленая отключения насоса тушим 1 светодиод module.setLED(TM1638_COLOR_RED, 1);// если температура больше чем темература установленая отключения насоса зажигаем 2 светодиод module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("PA6", false,0);//отображаем на десплее РАБ режим работы module.setLED(0, 6);// отключаем светодиод символизирующий розжиг digitalWrite (rele1, LOW);// насос включен digitalWrite (rele2, LOW);//потдув включен } //*************ТАЙМЕР******* if ( thermocouple.readCelsius() == temper1+2){ vremy1 = millis(); } //*************в этом условии отображаются 4 градуса разницы рабочей температуры и выполняется продувка*******pererivprod if ( (thermocouple.readCelsius() <= temper1+2) && (thermocouple.readCelsius() >= temper1-2)){ module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("PA6", false,0);//отображаем на десплее РАБ режим работы if ( ((vremy1*1000)*60)+pererivprod == millis() ){ vremy2 = millis(); digitalWrite (rele2, LOW);//потдув включен if ( (vremy2*1000)+vremyprod == millis() ){ digitalWrite (rele2, HIGH);//потдув включен } } vremy1 = millis(); } //********************************************************************************* //если температура больше чем рабочая температура выключаем потдув if ( (thermocouple.readCelsius() >= temper1+2) && (thermocouple.readCelsius() > tempernas)){ module.setLED(0, 0); // если температура больше чем темература установленая отключения насоса тушим 1 светодиод module.setLED(TM1638_COLOR_RED, 1);// если температура больше чем темература установленая отключения насоса зажигаем 2 светодиод module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("PA6", false,0);//отображаем на десплее РАБ режим работы start = 0;// если старт был запущен то отключаем его module.setLED(0, 6);// отключаем светодиод символизирующий розжиг digitalWrite (rele1, LOW);// насос включен digitalWrite (rele2, HIGH);//подув выключен HIGH } //*************в этом условии отображаются 2 градуса разницы отключения насоса и не каких действий не выполняется что бы реле не щелкало туда сюда******* if((thermocouple.readCelsius() >= tempernas-1) && (thermocouple.readCelsius() <= tempernas+1)){ module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("PA6", false,0);//отображаем на десплее РАБ режим работы } if((thermocouple.readCelsius() <= tempernas-1) && (start == 0)){ module.setLED(TM1638_COLOR_RED, 0); // 1 цвет светодиода, 2 номер светодиода от 0 до 7 module.setLED(0, 1);//если температура меньше чем темература установленая отключения насоса тушим 2 светодиод module.setDisplayToDecNumber(temper,4,false);//отображаем даные температуры на десплее module.setDisplayToString("HEP", false,0);//отображаем на десплее НЕР неработает закончилось топливо digitalWrite (rele1, HIGH); digitalWrite (rele2, HIGH);//выключаем оба реле. } delay(1000); module.clearDisplay();// очищаем дисплей }
если кому не лень посмотрите таймер
вот так вот вроде все работает
вот видео https://www.youtube.com/watch?v=jqTuK1zF_8s
не критикую, если работает как вам нужно то и отлично.
только как по мне lcd дисплей всё таки информативнее, удобнее и привычнее
ТМ1638 имеет 8 кнопок 8 светодиодных индикаторов и 8 семисигментых индикаоров, я думаю что это самый удобный модуль для реализации таких проектов.
как по мне lcd дисплей всё таки ... привычнее
Это смотря у кого какие привычки :)
Все хорошо ! Только непонятно как точки отобразить ?
Наверно как-то так:
В TM1638.h ?
Вадимм, девайс у Вас физически есть? Или вопрос типа
потрындетьтеоретический?Если есть и Вам реально надо, дайте мне ссылку на библиотеку, которую Вы используете, и я попробую либо найти точку там, либо подсказать Вам как её найти "методом тыка" на живом устройстве.
В этом скетче как точка выводится на 6(5) месте ?
http://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uac...
Искал в TM1638.cpp , не нашол или не там ищу !
Искал в TM1638.cpp , не нашол или не там ищу !
плохо искали, последняя функция в файле, параметр dot (может вы английского не знаете? :)