Ну вот смотрите: я вижу у Вас на диаграмме 6 участков время/температура, соответственно, надо задать массив переменных time[N], temperature[N] который Вы, наверняка, захотите изменять.
После чего пишем алгоритм работы:
"По включении питания мы попадаем в меню, из которого можно выставить (и запомнить в eeprom) режимы time и temperature для каждого "периода", которых (с запасом) должно быть 8. Если у периода зачения времени и температуры нулевые - его не отрабатываем."
В моем сценарии не освещено (предлагаю Вам самому пофантазировать):
"величина изменения параметра по одному нажатия кнопки" (а если непрерывно держим 3 секунды - то x5),
"окончательный просмотр параметров перез запуском",
"условия сохранения текущего профиля в eeprom",
возможность хранения нескольких "профилей" и способ их выбора/просмотра для работы.
1 Греем бойлер до 70 и поддержуем 70 градусов цельсия
стоп продолжения выпонения программы (70 градусов продолжаем удерживать) до нажатия кнопки
засыпаем засыпь темп упала до 60-65 градусов // кнопку нажали
Вот приблизительный рецепт (прошу учесть они разные я имею ввиду темп и временные режимы)
Ну вот смотрите: я вижу у Вас на диаграмме 6 участков время/температура, соответственно, надо задать массив переменных time[N], temperature[N] который Вы, наверняка, захотите изменять.
После чего пишем алгоритм работы:
"По включении питания мы попадаем в меню, из которого можно выставить (и запомнить в eeprom) режимы time и temperature для каждого "периода", которых (с запасом) должно быть 8. Если у периода зачения времени и температуры нулевые - его не отрабатываем."
В моем сценарии не освещено (предлагаю Вам самому пофантазировать):
"величина изменения параметра по одному нажатия кнопки" (а если непрерывно держим 3 секунды - то x5),
"окончательный просмотр параметров перез запуском",
"условия сохранения текущего профиля в eeprom",
возможность хранения нескольких "профилей" и способ их выбора/просмотра для работы.
И это мы еще не начали нагрев. :)
а говорили
Очень сильно смахивает на контроллер для варки пива, а не на бойлер :))
нет это бойлер с водой нагревателем и насосом
а оказалось все таки пивоварня
2второй этап фильтрация его можно пропустить так как он делается в ручную
И я совсем запутался
раньше не мог раму собрать в теперь ......... :(
Andrey_Y_Ostanov
Скажите вы можете написать эту программу?! (не даром конечно) программист из меня как из Зверева мужик!!!!
а говорили
Очень сильно смахивает на контроллер для варки пива, а не на бойлер :))
нет это бойлер с водой нагревателем и насосом
а оказалось все таки пивоварня
Смахивает :))
А варочник это не бойлер???
Я прозрачно ответил :)
ага. тут многие прозрачно отвечают, а особенно вопросы задают
Andrey_Y_Ostanov Скажите вы можете написать эту программу?!
Не, не смогу: из меня кодер - никакой, тем более - на заказ.
подскажите что не так ругается на скобки в последней строчке
pivovarna_DS18B20_ver3.ino: In function ‘void loop()’:
pivovarna_DS18B20_ver3.ino:100:3: error: expected ‘;’ before ‘{’ token
001
#include <OneWire.h>
002
003
OneWire ds(10);
// Подключаем датчик к 10 цифровому пину
004
005
void
setup
(
void
) {
006
Serial
.begin(9600);
007
pinMode(3, OUTPUT);
008
// Включаем кипятильник
009
digitalWrite(3, LOW);
010
}
011
012
void
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
}
Вопрос снимается разобрался
подскажите как можно использовать два делея по 1000 находящиеся в скетче как таймер
чтоб удерживать заданную темп. определенное кол-во времени потом повысить темп.
стоп всей программы
1
)
001
#include <OneWire.h>
002
003
OneWire ds(10);
// Подключаем датчик к 10 цифровому пину
004
005
void
setup
(
void
) {
006
Serial
.begin(9600);
007
pinMode(3, OUTPUT);
008
// Включаем кипятильник
009
digitalWrite(3, LOW);
010
}
011
012
void
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
}
Зачем Вам делеи? Используйте millis()
А ещё лучше простой(idle) только тут нужен определённый опыт чтобы всё сделать правильно, может подсказал кто чего на тему простоя?