Загрузчик для печки.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

avgustdon пишет:

Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.

Я же привел пример. Он работает. Осталось спаять и посмотреть. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

avgustdon пишет:

 Что касается автоматического режима. Еще не понимаю как его реализовать, но чувствую, что надо. Разберемся с первичной автоматикой и индикацией и будем штурмовать следующий этап.

Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ua6em пишет:

Мне представляется есть два принципиальных решения автоматического режима - по скорости сгорания топлива и по максимальной экономичности, вам то какой нужен?

Скорее всего 1. Для второго нужен уголь и регулирование поддува.

http://www.youtube.com/watch?v=HQUU1D3Sp-s

avgustdon
Offline
Зарегистрирован: 28.02.2016

По скорости сгорания.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Чуток поправил скетч, теперь выводит более гламурненько )))

 

КОД:
 

#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);         //опрос раз в секунду если разгорается
}

 

avgustdon
Offline
Зарегистрирован: 28.02.2016

Эх! А уговорите ведь на двухстрочник! )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

Скорее всего 1. Для второго нужен уголь и регулирование поддува.

http://www.youtube.com/watch?v=HQUU1D3Sp-s

Несёт ахинею, для начала надо правильно сложить печь, у меня дед был печник, выкладывал любые печи, у нас была Голландка, что это за печь в котле которой 45 градусов при топке антрацитом )))
Поддув это для кокса в кузне...
два шибера на розжиг и работу более чем достаточно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

avgustdon пишет:

Эх! А уговорите ведь на двухстрочник! )))

Ничто не мешает применить оба

Нарисовал еще пару букв, ТЕМПЕРАТУРА выводит по русски )))
 

#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);         //опрос раз в секунду если разгорается
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну не у всех же сложена печь правильно.  Вот прикиньте сколько денег вложить надо, что бы перестроить печь и трубу. А так костыль и готово.  И сколько таких костылей надо сделать, что бы исправлять косяки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

он там предупреждает кстати, что могут быть проблемы

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

avgustdon пишет:

Эх! А уговорите ведь на двухстрочник! )))

А чем меряете температуру и столь линейно преобразовываете в показания АЦП?

Кстати, подобный проект уже обсуждается тут

avgustdon
Offline
Зарегистрирован: 28.02.2016

Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

avgustdon пишет:

Температуру меряю китайским датчиком. На линейность не претендую, но расчитываю добиться динамики нагрева - охлаждения адекватной ремпературе в топке. А тема интересная, спасибо за ссылку. 

Что за датчик, дайте ссылку

avgustdon
Offline
Зарегистрирован: 28.02.2016

https://ru.aliexpress.com/item/Freeshipping-W1209-Mini-thermostat-Temper...

с такого термореле. сопротивление при 20 гр. порядка 10к

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
avgustdon
Offline
Зарегистрирован: 28.02.2016

Такой датчик у меня есть. Но и с предыдущим отрабатывает неплохо. Проблема оказалась в топливе. Лузга подсолнечника, которая предполагалась как основное топливо, в таком режиме сильно дымит и накапливает непрогоревшую золу. Возможно из-за влажности. Пеллеты из этой же лузги горят гораздо лучше и неожиданно хороший вариант получился на скорлупе грецкого ореха. Но надо добиваться работы на лузге, т.к. устройство делается для грибной фермы. Вспомнился совет qwone использовать шим. Как реализовать его на трехфазном двигателе не придумал. Прикрутил на время вместо мотора дрель и регулятор света от китайцев – теряется мощность мотора. Еще хочу попробовать изменить режим работы – ожидания и сделать, чтобы мотор работал короткими периодами, а паузу регулировать. Получится что-то вроде шим. Но долго такой режим мотор не выдержит. Пока вот такой краткий отчет.

avgustdon
Offline
Зарегистрирован: 28.02.2016

Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

avgustdon пишет:

Пробую использовать последний код с выводом температуры по-русски. При компиляции возникает ошибка: 'POSITIVE' was not declared in this scope. Поискав в инете обнаружил что возможно у меня установлена неподходящая библиотека. Попробовал еще два варианта библиотек с тем же результатом. Далее традиционная просьба помочь кто чем может.)

конечно, тут

avgustdon
Offline
Зарегистрирован: 28.02.2016

Спасибо. Вот теперь другое дело. Все заработало!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Это радует )))

avgustdon
Offline
Зарегистрирован: 28.02.2016

Решил все же поставить семисегмент. Его получше с расстояния видно. Сделал вот такой скетч. 

[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]

В результате вижу только последнюю цифру. Как добиться остального понять не получается. Просьба помочь подробным советом, ну или рабочим вариантом.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы вроде не первый раз на форуме, а код вставлять не умеете. Может и в жизни у вас так.

avgustdon
Offline
Зарегистрирован: 28.02.2016

Верно. Когда занимаюсь делом которым не умею заниматься , но ситуация заставляет, то у меня всегда так. Код вставил сначала правильно, но потом заметил, что это не тот код, ну и соответственно заменил. Но при этом почему-то криво. Попробую еще переделать.

avgustdon
Offline
Зарегистрирован: 28.02.2016

Получилось. )) Полезная вещь - помидоры. Теперь надеюсь на помощь.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

попробуйте так 

/*
*/
#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);
}

 

avgustdon
Offline
Зарегистрирован: 28.02.2016

Теперь цифры видны все. Но при достижении максимальной температуры гаснут все кроме последней и та замирает на последнем значении. В мониторе все показывает нормально. Далее при достижении минимальной температуры показания на индикаторе восстанавливаются.