Контроль и управление нагревом бойлера по температуре и времени.

hok
Offline
Зарегистрирован: 04.02.2014

1 Греем бойлер до 70 и поддержуем 70 градусов цельсия

стоп продолжения выпонения программы (70 градусов продолжаем удерживать) до нажатия кнопки

засыпаем засыпь темп упала до 60-65 градусов // кнопку нажали

Вот приблизительный рецепт (прошу учесть они разные я имею ввиду темп и временные режимы)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Ну вот смотрите: я вижу у Вас на диаграмме 6 участков время/температура, соответственно, надо задать массив переменных time[N], temperature[N] который Вы, наверняка, захотите изменять.

После чего пишем алгоритм работы:

"По включении питания мы попадаем в меню, из которого можно выставить (и запомнить в eeprom) режимы time и temperature для каждого "периода", которых (с запасом) должно быть 8. Если у периода зачения времени и температуры нулевые - его не отрабатываем."

В моем сценарии не освещено (предлагаю Вам самому пофантазировать):

"величина изменения параметра по одному нажатия кнопки" (а если непрерывно держим 3 секунды - то x5),

"окончательный просмотр параметров перез запуском",

"условия сохранения текущего профиля в eeprom",

возможность хранения нескольких "профилей" и способ их выбора/просмотра для работы.

И это мы еще не начали нагрев. :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а говорили

Gosha пишет:

Очень сильно смахивает на контроллер для варки пива, а не на бойлер :))

hok пишет:

нет это бойлер с водой нагревателем и насосом

а оказалось все таки пивоварня

hok
Offline
Зарегистрирован: 04.02.2014

2второй этап фильтрация его можно пропустить так как он делается в ручную

И я совсем запутался

раньше не мог раму собрать в теперь ......... :(

Andrey_Y_Ostanov

Скажите вы можете написать эту программу?! (не даром конечно) программист из меня как из Зверева мужик!!!!

hok
Offline
Зарегистрирован: 04.02.2014

jeka_tm пишет:

а говорили

Gosha пишет:

Очень сильно смахивает на контроллер для варки пива, а не на бойлер :))

hok пишет:

нет это бойлер с водой нагревателем и насосом

а оказалось все таки пивоварня

hok пишет:

Смахивает :))

А  варочник это не бойлер???

Я прозрачно ответил :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ага. тут многие прозрачно отвечают, а особенно вопросы задают

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

hok пишет:

Andrey_Y_Ostanov Скажите вы можете написать эту программу?!

Не, не смогу: из меня кодер - никакой, тем более - на заказ.

hok
Offline
Зарегистрирован: 04.02.2014

подскажите что не так ругается на скобки в последней строчке

pivovarna_DS18B20_ver3.ino: In function ‘void loop()’:
pivovarna_DS18B20_ver3.ino:100:3: error: expected ‘;’ before ‘{’ token

#include <OneWire.h>

OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину

void setup(void) {
  Serial.begin(9600);
  pinMode(3, OUTPUT);  
  // Включаем кипятильник
  digitalWrite(3, LOW);   
}

void loop(void) {
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  // Ищем адрес датчика
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  Serial.println();

  // Определяем серию датчика
  switch (addr[0]) {
  case 0x10:
    Serial.println("  Chip = DS18S20");  
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  Chip = DS18B20");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  Chip = DS1822");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(1000);    

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }

  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0];
  // Переводим температуру в шкалы по Цельсию и Фаренгейту  
  if (type_s) 
  {
    raw = raw << 3; 
  }
  if (data[7] == 0x10) 
  {
    raw = (raw & 0xFFF0) + 12 - data[6];
  } 
  else {
    byte cfg =  (data[4] & 0x60);
    if (cfg == 0x00) 
      raw = raw << 3; 
    else if  (cfg == 0x20) 
      raw = raw << 2; 
    else if  (cfg == 0x40) \
      raw = raw << 1;
  }  
  celsius =  (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("Temp = ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  // Если температура достигает температуры (с погрешностью), отключаем нагрев
  if (celsius < 26.0)
  {

    digitalWrite(3, HIGH); 
  }
  else 

    (celsius > 26.0)
  {
    digitalWrite(3, LOW);
  }  

}

 

hok
Offline
Зарегистрирован: 04.02.2014

Вопрос снимается разобрался

hok
Offline
Зарегистрирован: 04.02.2014

подскажите как можно использовать  два делея по 1000 находящиеся в скетче как таймер

чтоб удерживать заданную темп. определенное кол-во времени потом повысить темп. 

стоп всей программы


)

#include <OneWire.h>

OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину

void setup(void) {
  Serial.begin(9600);
  pinMode(3, OUTPUT);  
  // Включаем кипятильник
  digitalWrite(3, LOW);   
}

void loop(void) {
  byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  // Ищем адрес датчика
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(1000);
    return;
  }

  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  Serial.println();

  // Определяем серию датчика
  switch (addr[0]) {
  case 0x10:
    Serial.println("  Chip = DS18S20");  
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  Chip = DS18B20");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  Chip = DS1822");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(1000);    

  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }

  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  int16_t raw = (data[1] << 8) | data[0];
  // Переводим температуру в шкалы по Цельсию и Фаренгейту  
  if (type_s) 
  {
    raw = raw << 3; 
  }
  if (data[7] == 0x10) 
  {
    raw = (raw & 0xFFF0) + 12 - data[6];
  } 
  else {
    byte cfg =  (data[4] & 0x60);
    if (cfg == 0x00) 
      raw = raw << 3; 
    else if  (cfg == 0x20) 
      raw = raw << 2; 
    else if  (cfg == 0x40) \
      raw = raw << 1;
  }  
  celsius =  (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0; // считаем фаренгейты
  Serial.print("Temp = "); 
  Serial.print(celsius); // выводим в терминал градусы
  Serial.print(" C, ");
  Serial.print(fahrenheit);
  Serial.println(" F");

  // Если температура достигает необходимого уровня отключаем нагрев
  if (celsius < 26.0)
  {

    digitalWrite(3, HIGH); 
  }
  else 

  {
    digitalWrite(3, LOW);
  }  

}

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Зачем Вам делеи? Используйте millis()

 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

А ещё лучше простой(idle) только тут нужен определённый опыт чтобы всё сделать правильно, может подсказал кто чего на тему простоя?