Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.
Я же привел пример. Он работает. Осталось спаять и посмотреть.
Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.
Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?
Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?
Скорее всего 1. Для второго нужен уголь и регулирование поддува.
Несёт ахинею, для начала надо правильно сложить печь, у меня дед был печник, выкладывал любые печи, у нас была Голландка, что это за печь в котле которой 45 градусов при топке антрацитом )))
Поддув это для кокса в кузне...
два шибера на розжиг и работу более чем достаточно
Ну не у всех же сложена печь правильно. Вот прикиньте сколько денег вложить надо, что бы перестроить печь и трубу. А так костыль и готово. И сколько таких костылей надо сделать, что бы исправлять косяки.
Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку.
Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку.
Такой датчик у меня есть. Но и с предыдущим отрабатывает неплохо. Проблема оказалась в топливе. Лузга подсолнечника, которая предполагалась как основное топливо, в таком режиме сильно дымит и накапливает непрогоревшую золу. Возможно из-за влажности. Пеллеты из этой же лузги горят гораздо лучше и неожиданно хороший вариант получился на скорлупе грецкого ореха. Но надо добиваться работы на лузге, т.к. устройство делается для грибной фермы. Вспомнился совет qwone использовать шим. Как реализовать его на трехфазном двигателе не придумал. Прикрутил на время вместо мотора дрель и регулятор света от китайцев – теряется мощность мотора. Еще хочу попробовать изменить режим работы – ожидания и сделать, чтобы мотор работал короткими периодами, а паузу регулировать. Получится что-то вроде шим. Но долго такой режим мотор не выдержит. Пока вот такой краткий отчет.
Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)
Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)
Верно. Когда занимаюсь делом которым не умею заниматься , но ситуация заставляет, то у меня всегда так. Код вставил сначала правильно, но потом заметил, что это не тот код, ну и соответственно заменил. Но при этом почему-то криво. Попробую еще переделать.
Теперь цифры видны все. Но при достижении максимальной температуры гаснут все кроме последней и та замирает на последнем значении. В мониторе все показывает нормально. Далее при достижении минимальной температуры показания на индикаторе восстанавливаются.
Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.
Я же привел пример. Он работает. Осталось спаять и посмотреть.
Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.
Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?
Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?
Скорее всего 1. Для второго нужен уголь и регулирование поддува.
http://www.youtube.com/watch?v=HQUU1D3Sp-s
По скорости сгорания.
Чуток поправил скетч, теперь выводит более гламурненько )))
КОД:
#define temperature_pin 0 #include <Wire.h> #include <LiquidCrystal_I2C.h> byte degree[8] = // Битовая маска символа градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000,}; int relay_pin = 10; int relay = LOW ; int podacha = 1000; int t_min =500; int t_max =700; int t_tek =0; int flag_t_max = 0; //Дисплей LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void PLCD(){ lcd.clear(); lcd.home (); // В Начальную позицию дисплея lcd.print("TEMPERATURE-"); lcd.print(analogRead(temperature_pin)); lcd.print("\1"); // Выводим текст, со знаком градуса lcd.setCursor(0, 1); if(flag_t_max == 1){ lcd.print(" <<<-DOWN-<<< "); }else { lcd.print(" >>>--UP-->>> "); } } // Конец подпрограммы вывода температуры на дисплей void setup() { pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, !relay); Serial.begin(9600); // Скорость порта для отладки lcd.begin(16,2); lcd.createChar(1, degree); // Создаем символ под номером 1 } void loop() { t_tek=analogRead(temperature_pin); if (t_tek >= t_max){flag_t_max = 1;} // Топливо разгорелось выходим в автоматический режим while(analogRead(temperature_pin) >= t_min && flag_t_max == 1){ Serial.println(analogRead(temperature_pin)); PLCD(); delay(2000); } // Ждём понижения температуры до нижнего порога if (flag_t_max ==1){ digitalWrite(relay_pin, relay); delay(podacha); digitalWrite(relay_pin, !relay); flag_t_max=0;} // подкинули дровишек Serial.println(analogRead(temperature_pin)); PLCD(); delay(1000); //опрос раз в секунду если разгорается }Эх! А уговорите ведь на двухстрочник! )))
Скорее всего 1. Для второго нужен уголь и регулирование поддува.
http://www.youtube.com/watch?v=HQUU1D3Sp-s
Несёт ахинею, для начала надо правильно сложить печь, у меня дед был печник, выкладывал любые печи, у нас была Голландка, что это за печь в котле которой 45 градусов при топке антрацитом )))
Поддув это для кокса в кузне...
два шибера на розжиг и работу более чем достаточно
Эх! А уговорите ведь на двухстрочник! )))
Ничто не мешает применить оба
Нарисовал еще пару букв, ТЕМПЕРАТУРА выводит по русски )))
#define temperature_pin 0 #include <Wire.h> #include <LiquidCrystal_I2C.h> byte degree[8] = // Битовая маска символа градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000,}; byte pe[8] = // Битовая маска символа П { B11111, B10001, B10001, B10001, B10001, B10001, B10001,}; byte bu[8] = // Битовая маска символа У { B10001, B10001, B10001, B10001, B01111, B00001, B11110,}; int relay_pin = 10; int relay = LOW ; int podacha = 1000; int t_min =500; int t_max =700; int t_tek =0; int flag_t_max = 0; //Дисплей LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void PLCD(){ // lcd.clear(); lcd.home (); // В Начальную позицию дисплея lcd.print("TEM\2EPAT\3PA-"); lcd.print(analogRead(temperature_pin)); lcd.print("\1"); // Выводим текст, со знаком градуса lcd.setCursor(0, 1); if(flag_t_max == 1){ lcd.print(" <<<-DOWN-<<< "); }else { lcd.print(" >>>--UP-->>> "); } } // Конец подпрограммы вывода температуры на дисплей void setup() { pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, !relay); Serial.begin(9600); // Скорость порта для отладки lcd.begin(16,2); lcd.createChar(1, degree); // Создаем символ под номером 1 - градус lcd.createChar(2, pe); // Создаем символ под номером 2 буква П lcd.createChar(3, bu); // Создаем символ под номером 3 буква У } void loop() { t_tek=analogRead(temperature_pin); if (t_tek >= t_max){flag_t_max = 1;} // Топливо разгорелось выходим в автоматический режим while(analogRead(temperature_pin) >= t_min && flag_t_max == 1){ Serial.println(analogRead(temperature_pin)); PLCD(); delay(2000); } // Ждём понижения температуры до нижнего порога if (flag_t_max ==1){ digitalWrite(relay_pin, relay); delay(podacha); digitalWrite(relay_pin, !relay); flag_t_max=0;} // подкинули дровишек Serial.println(analogRead(temperature_pin)); PLCD(); delay(1000); //опрос раз в секунду если разгорается }Ну не у всех же сложена печь правильно. Вот прикиньте сколько денег вложить надо, что бы перестроить печь и трубу. А так костыль и готово. И сколько таких костылей надо сделать, что бы исправлять косяки.
он там предупреждает кстати, что могут быть проблемы
Эх! А уговорите ведь на двухстрочник! )))
А чем меряете температуру и столь линейно преобразовываете в показания АЦП?
Кстати, подобный проект уже обсуждается тут
Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку.
Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку.
Что за датчик, дайте ссылку
https://ru.aliexpress.com/item/Freeshipping-W1209-Mini-thermostat-Temper...
с такого термореле. сопротивление при 20 гр. порядка 10к
https://ru.aliexpress.com/item/Freeshipping-W1209-Mini-thermostat-Temperature-controller-Incubation-thermostat-temperature-control-switch/32225252366.html?spm=2114.13010708.cb0001.7.vahmJy&scm=1007.13441.64707.0&%3Bpvid=64230dd5-26ed-4b21-9f7d-aadad67cc5b5&%3Btpp=1
с такого термореле. сопротивление при 20 гр. порядка 10к
Я бы поставил термопару
Такой датчик у меня есть. Но и с предыдущим отрабатывает неплохо. Проблема оказалась в топливе. Лузга подсолнечника, которая предполагалась как основное топливо, в таком режиме сильно дымит и накапливает непрогоревшую золу. Возможно из-за влажности. Пеллеты из этой же лузги горят гораздо лучше и неожиданно хороший вариант получился на скорлупе грецкого ореха. Но надо добиваться работы на лузге, т.к. устройство делается для грибной фермы. Вспомнился совет qwone использовать шим. Как реализовать его на трехфазном двигателе не придумал. Прикрутил на время вместо мотора дрель и регулятор света от китайцев – теряется мощность мотора. Еще хочу попробовать изменить режим работы – ожидания и сделать, чтобы мотор работал короткими периодами, а паузу регулировать. Получится что-то вроде шим. Но долго такой режим мотор не выдержит. Пока вот такой краткий отчет.
Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)
Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)
конечно, тут
Спасибо. Вот теперь другое дело. Все заработало!
Это радует )))
Решил все же поставить семисегмент. Его получше с расстояния видно. Сделал вот такой скетч.
[code] #define temperature_pin 5 int relay_pin = 10; int relay = HIGH ; int podacha = 10; // время подачи int t_min =500; int t_max =700; int t_tek =0; int flag_t_max = 0; // --------------------------------------------- float k_temp = 1; // --------------------------------------------- //uint8_t Count; // счетчик //#2 const int Latch_pin=4; const int CLK_pin =7; const int Data_pin =8; // матрица цифр 0 to 9 const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; // матрица выбора знакоместа 1 to 4 const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; // Вывод числа на экран void WriteNumber(int Number) { WriteNumberToSegment(0 , Number / 1000); WriteNumberToSegment(1 , (Number / 100) % 10); WriteNumberToSegment(2 , (Number / 10) % 10); WriteNumberToSegment(3 , Number % 10); } // запись нужного числа (0-9) в нужную позицию(1-4) void WriteNumberToSegment(byte Segment, byte Value){ digitalWrite(Latch_pin,0); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_MAP[Value]); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_SELECT[Segment] ); digitalWrite(Latch_pin,1); } // ----------------------------------------------------------------------- void setup() { pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, !relay); Serial.begin(9600); // Скорость порта для отладки //analogReference(INTERNAL ); //Объявляем диапазон чтения с аналогового порта. //#1 // Count = 0; //#2 pinMode(Latch_pin,OUTPUT); pinMode(CLK_pin,OUTPUT); pinMode(Data_pin,OUTPUT); } void loop() { t_tek=(analogRead(temperature_pin)/(k_temp)); if (t_tek >= t_max){flag_t_max = 1;} // Топливо разгорелось выходим в автоматический режим while(analogRead(temperature_pin) >= t_min && flag_t_max == 1){ Serial.println(analogRead(temperature_pin)); } // Ждём понижения температуры до нижнего порога if (flag_t_max ==1){ digitalWrite(relay_pin, relay); delay(podacha); digitalWrite(relay_pin, !relay); flag_t_max=0;} // подкинули дровишек Serial.println(analogRead(temperature_pin)/(k_temp)); delay(1000); //опрос раз в заданное время если разгорается WriteNumber(t_tek); } [/code]В результате вижу только последнюю цифру. Как добиться остального понять не получается. Просьба помочь подробным советом, ну или рабочим вариантом.)
Вы вроде не первый раз на форуме, а код вставлять не умеете. Может и в жизни у вас так.
Верно. Когда занимаюсь делом которым не умею заниматься , но ситуация заставляет, то у меня всегда так. Код вставил сначала правильно, но потом заметил, что это не тот код, ну и соответственно заменил. Но при этом почему-то криво. Попробую еще переделать.
Получилось. )) Полезная вещь - помидоры. Теперь надеюсь на помощь.
попробуйте так
/* */ #define temperature_pin 5 int relay_pin = 10; int relay = HIGH ; int podacha = 10; // время подачи int t_min = 500; int t_max = 700; int t_tek = 0; int flag_t_max = 0; // --------------------------------------------- float k_temp = 1; // --------------------------------------------- const int Latch_pin = 4; const int CLK_pin = 7; const int Data_pin = 8; const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90}; // матрица цифр 0 to 9 const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8}; // матрица выбора знакоместа 1 to 4 void WriteNumber(int Number) {// Вывод числа на экран WriteNumberToSegment(0 , Number / 1000); WriteNumberToSegment(1 , (Number / 100) % 10); WriteNumberToSegment(2 , (Number / 10) % 10); WriteNumberToSegment(3 , Number % 10); } void WriteNumberToSegment(byte Segment, byte Value) { // запись нужного числа (0-9) в нужную позицию(1-4) digitalWrite(Latch_pin, 0); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_MAP[Value]); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_SELECT[Segment] ); digitalWrite(Latch_pin, 1); } // ----------------------------------------------------------------------- void setup() { pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, !relay); Serial.begin(9600); // Скорость порта для отладки //analogReference(INTERNAL ); //Объявляем диапазон чтения с аналогового порта. pinMode(Latch_pin, OUTPUT); pinMode(CLK_pin, OUTPUT); pinMode(Data_pin, OUTPUT); } void loop() { static uint32_t past = 0; if (millis() - past >= 1000) { //опрос раз в заданное время если разгорается past = millis(); t_tek = (analogRead(temperature_pin) / (k_temp)); if (t_tek >= t_max) { flag_t_max = 1; // Топливо разгорелось выходим в автоматический режим } while (analogRead(temperature_pin) >= t_min && flag_t_max == 1) { Serial.println(analogRead(temperature_pin)); } // Ждём понижения температуры до нижнего порога if (flag_t_max == 1) { digitalWrite(relay_pin, relay); delay(podacha); digitalWrite(relay_pin, !relay); flag_t_max = 0; } // подкинули дровишек Serial.println(analogRead(temperature_pin) / (k_temp)); } WriteNumber(t_tek); }Теперь цифры видны все. Но при достижении максимальной температуры гаснут все кроме последней и та замирает на последнем значении. В мониторе все показывает нормально. Далее при достижении минимальной температуры показания на индикаторе восстанавливаются.