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

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

001#include <OneWire.h>
002 
003OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
004 
005void setup(void) {
006  Serial.begin(9600);
007  pinMode(3, OUTPUT); 
008  // Включаем кипятильник
009  digitalWrite(3, LOW);  
010}
011 
012void loop(void) {
013  byte i;
014  byte type_s;
015  byte data[12];
016  byte addr[8];
017  float celsius, fahrenheit;
018 
019  // Ищем адрес датчика
020  if ( !ds.search(addr)) {
021    Serial.println("No more addresses.");
022    Serial.println();
023    ds.reset_search();
024    delay(250);
025    return;
026  }
027 
028  // Проверяем не было ли помех при передаче
029  if (OneWire::crc8(addr, 7) != addr[7]) {
030    Serial.println("CRC is not valid!");
031    return;
032  }
033  Serial.println();
034 
035  // Определяем серию датчика
036  switch (addr[0]) {
037  case 0x10:
038    Serial.println("  Chip = DS18S20"); 
039    type_s = 1;
040    break;
041  case 0x28:
042    Serial.println("  Chip = DS18B20");
043    type_s = 0;
044    break;
045  case 0x22:
046    Serial.println("  Chip = DS1822");
047    type_s = 0;
048    break;
049  default:
050    Serial.println("Device is not a DS18x20 family device.");
051    return;
052  }
053 
054  ds.reset();           
055  ds.select(addr);       // Выбираем адрес
056  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
057  delay(1000);   
058 
059  ds.reset();
060  ds.select(addr);   
061  ds.write(0xBE);         // Считываем оперативную память датчика
062 
063  for ( i = 0; i < 9; i++) {          
064    data[i] = ds.read();  // Заполняем массив считанными данными
065  }
066 
067  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
068  int16_t raw = (data[1] << 8) | data[0];
069  // Переводим температуру в шкалы по Цельсию и Фаренгейту 
070  if (type_s)
071  {
072    raw = raw << 3;
073  }
074  if (data[7] == 0x10)
075  {
076    raw = (raw & 0xFFF0) + 12 - data[6];
077  }
078  else {
079    byte cfg =  (data[4] & 0x60);
080    if (cfg == 0x00)
081      raw = raw << 3;
082    else if  (cfg == 0x20)
083      raw = raw << 2;
084    else if  (cfg == 0x40) \
085      raw = raw << 1;
086  
087  celsius =  (float)raw / 16.0;
088  fahrenheit = celsius * 1.8 + 32.0;
089  Serial.print("Temp = ");
090  Serial.print(celsius);
091  Serial.print(" C, ");
092  Serial.print(fahrenheit);
093  Serial.println(" F");
094 
095  // Если температура достигает температуры (с погрешностью), отключаем нагрев
096  if (celsius < 26.0)
097  {
098 
099    digitalWrite(3, HIGH);
100  }
101  else
102 
103    (celsius > 26.0)
104  {
105    digitalWrite(3, LOW);
106  
107 
108}

 

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

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

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

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

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

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

)

001#include <OneWire.h>
002 
003OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
004 
005void setup(void) {
006  Serial.begin(9600);
007  pinMode(3, OUTPUT); 
008  // Включаем кипятильник
009  digitalWrite(3, LOW);  
010}
011 
012void loop(void) {
013  byte i;
014  byte type_s;
015  byte data[12];
016  byte addr[8];
017  float celsius, fahrenheit;
018 
019  // Ищем адрес датчика
020  if ( !ds.search(addr)) {
021    Serial.println("No more addresses.");
022    Serial.println();
023    ds.reset_search();
024    delay(1000);
025    return;
026  }
027 
028  // Проверяем не было ли помех при передаче
029  if (OneWire::crc8(addr, 7) != addr[7]) {
030    Serial.println("CRC is not valid!");
031    return;
032  }
033  Serial.println();
034 
035  // Определяем серию датчика
036  switch (addr[0]) {
037  case 0x10:
038    Serial.println("  Chip = DS18S20"); 
039    type_s = 1;
040    break;
041  case 0x28:
042    Serial.println("  Chip = DS18B20");
043    type_s = 0;
044    break;
045  case 0x22:
046    Serial.println("  Chip = DS1822");
047    type_s = 0;
048    break;
049  default:
050    Serial.println("Device is not a DS18x20 family device.");
051    return;
052  }
053 
054  ds.reset();           
055  ds.select(addr);       // Выбираем адрес
056  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
057  delay(1000);   
058 
059  ds.reset();
060  ds.select(addr);   
061  ds.write(0xBE);         // Считываем оперативную память датчика
062 
063  for ( i = 0; i < 9; i++) {          
064    data[i] = ds.read();  // Заполняем массив считанными данными
065  }
066 
067  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
068  int16_t raw = (data[1] << 8) | data[0];
069  // Переводим температуру в шкалы по Цельсию и Фаренгейту 
070  if (type_s)
071  {
072    raw = raw << 3;
073  }
074  if (data[7] == 0x10)
075  {
076    raw = (raw & 0xFFF0) + 12 - data[6];
077  }
078  else {
079    byte cfg =  (data[4] & 0x60);
080    if (cfg == 0x00)
081      raw = raw << 3;
082    else if  (cfg == 0x20)
083      raw = raw << 2;
084    else if  (cfg == 0x40) \
085      raw = raw << 1;
086  
087  celsius =  (float)raw / 16.0;
088  fahrenheit = celsius * 1.8 + 32.0; // считаем фаренгейты
089  Serial.print("Temp = ");
090  Serial.print(celsius); // выводим в терминал градусы
091  Serial.print(" C, ");
092  Serial.print(fahrenheit);
093  Serial.println(" F");
094 
095  // Если температура достигает необходимого уровня отключаем нагрев
096  if (celsius < 26.0)
097  {
098 
099    digitalWrite(3, HIGH);
100  }
101  else
102 
103  {
104    digitalWrite(3, LOW);
105  
106 
107}

 

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

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

 

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

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