Добрый день отличный скейтч только вот немогу разобраться как подключить термодатчики? какие вы использываете и где прописаны пины для их подключения? буду благодарен за помощь, кстати часы поставил DS1307 работает хорошо
Помогите, повторил схему на макетной плате, залил скетч, всё работает, показывается температура, работает энкодер, но не идут часы, время стоит.Залил скетч для проверки часов, на мониторе порта видно что часы идут.Поменял плату часов, результат тотже.На какие ноги выведена шина i2c? У меня А4 А5. Часы на ds1307 и ардуино нано.
Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c i2c портом (поменьше проводов будет), который подключается к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.
Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c i2c портом (поменьше проводов будет), который подключается к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.
Вместо библиотеки LiquidCrystal.h использовать библиотеку LiquidCrystal_I2C, изменить инициализацию LCD и , возможно, поправить строки с обращениями к LCD. Вообще - откройте в ардуинской оболочке три окна (окно с проектом и два окна с тестовыми примерами для LCD и i2c_LCD) - там всё очевидно будет. Я собирался переделать проект на I2C (хотел ещё радиомодуль в коробочку добавить для связи с остальным умным домом, а свободные пины закончились :), но руки не доходят и вряд ли в ближайшем будущем дойдут...
Я только знакомлюсь с ардуино и радиоэлектроникой прошу не судить строго.
Есть 3 вопроса.
1. Где можно найти схему проекта? Боюсь, не поставлю какой-нибудь резистор и все будет работать неправильно. Если схемы нет, то обясните пожалуйста как вы понимаете, что-куда.
2. Хочу сделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Может подскажете где копать и что допилить чтобы связвть ардуинкуи по радио?
3. Как организовать автономное питание для ардуинки-датчика и сколько это штука с такой обвязкой и таким скетчем сможет прожить автономно?
PS: В наличии есть UNO, Nano и Mini Pro 328, котёл baxi rocco neobit )
Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.
Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.
чо за котёл-то ?
делаю свой проект (не себе) , сюда посматриваю , но делаю свой проект....
котёл тупой - уставка T подачи ручная , может работать от радиоТермометра...
у тибя такой ? есть наработки... нано ?
мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)
мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)
Дело в том, что не имею возможности запитать модуль к котлу по проводам. Так как в доме сделан ремонт и не хочеться ничего сверлить и т.п. Для этого решил cделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Cтолкунля с тем, что мне не хватает пинов и для их освобожднеия думаю использовать i2c . Возможно я в чем-то ошибаюсь.
@SU-27-16 для какой цели вы используете 3 датчкика (подача, обратка, улица) ? На мой взгляд главное иметь комфортную температуру в помещении. Для этого достаточно одного датчика в комнате.
Vitaly-V , сначала тоже хотел радиопульт для котла , заказчик перехотел.
Желает устройство иметь в "кочегарке" около котла.
Датчики - ВСЕ для контроля температур котла и улицы
1 и 2-ой - для управления котлом
2-ой - для компенсации "мороза"
например , в диапазоне -10..-30гр на улице добавляет пропорционально 10гр на подачу
при -20 подача будет на 5 больше чем при -9 , а при -40 - на 15
Vitaly-V , у заказчика уже есть EUROSTER 2006TX = 6300р. , круто !
если котёл с электроникой - то классно !
если котёл тупой как холодильник_СССР - то есть проблема... рассказать ? https://www.teplo-serv.com/ru/prod3861 с точки зрения котла - это выходы реле ( два провода ) : греть / не греть :)
на моей схеме это "RF-приёмник КТВ" никакой обратной связи !
ой-ой-ой !
Ldelta - получилось 20гр.... НЕ ПРАВИЛЬНО нарисовал :(
это значение на графике НЕОТОБРАЖАЕМО... ступил :( Ldelta - можно прикрутить к нижнему "графику" , но сложнова-то....
SU-27-16 спасибо за советы. Котёл у меня - тупой (Baxi Roca Neobit) Делаю термостат ради интереса и для себя. Понимаю, что можно было купить готовый и дешевле, но мне хочеться разобраться и сделать самому.
а не хочется ли иметь визуальный контроль за работой тупого котла ?
у заказчика - стрелочные-мембранные датчики Т подачи и обратки....
неудобно и нефейшуйно :)
заказчик - брат в другом городе , т.е. делаю как сибе !
Мониторинг порта выдаёт 0.0 - что и вижу на экране.
Вот блин дела - не пойму что не так, с датчика с вывода данных резистор подтягивающий есть, сам вывод подключен к А1, может что ешё надо подключить, да и реле не срабатывает, что с Д12, нет надо с "бубном". Кто знает "пните" в нужном направлении.
ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.
в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,
а затем внести их в скетч.
по датчику.
в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))
ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.
в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,
а затем внести их в скетч.
по датчику.
в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))
вам там по месту виднее
Так весь прикол, что в другой кострукции он работает, он же , фикус да и только, Объясните пожалуста LCD здесь причём он всё отображает, или я что то "не догоняю"
Добрый день отличный скейтч только вот немогу разобраться как подключить термодатчики? какие вы использываете и где прописаны пины для их подключения? буду благодарен за помощь, кстати часы поставил DS1307 работает хорошо
druzik
DS18B20
Я выше даже схему выкладывал в картинках. Но имейте ввиду, что резистор на Ds18b20 я не рисовал, а он там нужен.
Добрый вечер! Перепробовал кучу библиотек, пайку проверил, датчик рабочий. Все равно температуру показывает вот так:
Подскажите, куда копнуть?
Доброго времени суток). Vladis_a, а где вы брали такой корпус и есть ли там еще?
В любом магазине электротоваров. :) Называется коробка распределительная.
Помогите, повторил схему на макетной плате, залил скетч, всё работает, показывается температура, работает энкодер, но не идут часы, время стоит.Залил скетч для проверки часов, на мониторе порта видно что часы идут.Поменял плату часов, результат тотже.На какие ноги выведена шина i2c? У меня А4 А5. Часы на ds1307 и ардуино нано.
Все правильно.Часы подключаются на А4 и А5. На других скетчах попробуйте часы проверить.
Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c i2c портом (поменьше проводов будет), который подключается к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.
Отличный проект! Автору спасибо. Просто и функционально.Собрал проект, работает отлично. Хочу ещё такой же собрать, но использовать lcd 1602 c i2c портом (поменьше проводов будет), который подключается к А4 и А5, но прошу помощи))) Что в скетче изменить?Заранее благодарен всем ответившим.
Вместо библиотеки LiquidCrystal.h использовать библиотеку LiquidCrystal_I2C, изменить инициализацию LCD и , возможно, поправить строки с обращениями к LCD. Вообще - откройте в ардуинской оболочке три окна (окно с проектом и два окна с тестовыми примерами для LCD и i2c_LCD) - там всё очевидно будет. Я собирался переделать проект на I2C (хотел ещё радиомодуль в коробочку добавить для связи с остальным умным домом, а свободные пины закончились :), но руки не доходят и вряд ли в ближайшем будущем дойдут...
Все получилось!Подключил дисплей по i2c.РаботаетЕще раз спасибо за практичный проект.
Выложите свой скетч плиз, тоже хочу собрать этот проект.
У меня как ошалелый мигает LCD и пищит пьезоэлемент. Было у кого-нибудь так же?
Для i2c код со второй страницы от vlad219i, номера выходов под себя менял:
001
/*
002
Суточный термостат для котла Baxi Mainfour 240F
003
>Encoder control
004
>DS18B20 thermal sensor
005
>LCD1602 parallel
006
>DS1307 RTC
007
*/
008
009
//#include <avr\eeprom.h>
010
#include <Wire.h> // i2c (для RTC)
011
#include <RealTimeClockDS1307.h> // RTC
012
#include <EEPROMex.h> // EE
013
#include <LiquidCrystal_I2C.h>
014
#include <TimerOne.h> // прерывания по таймеру1
015
016
#include <OneWire.h> // 1wire для DS18B20
017
#include <DallasTemperature.h> // DS18B20
018
019
#define ONE_WIRE_BUS 15
020
OneWire oneWire(ONE_WIRE_BUS);
021
DallasTemperature DS18B20(&oneWire);
022
DeviceAddress DS18B20Address;
023
024
#define encoderA 2 // энкодер - поворот вправо (об землю)
025
#define encoderB 3 // энкодер - поворот влево (об землю)
026
#define encoderK 4 // энкодер - кнопка (об землю)
027
#define BeepPin 11 // пищалка
028
#define BeepToneNo 2000 // тон звука "No", герц
029
#define BeepToneYes 4000 // тон звука "Yes", герц
030
#define BeepToneNoDuration 200 // длительность звука "No", мс
031
#define BeepToneYesDuration 200 // длительность звука "Yes", мс
032
#define Relay 12 // нога, к которой подключено реле
033
#define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW)
034
035
// Set the LCD address to 0x27 for a 16 chars and 2 line display
036
LiquidCrystal_I2C lcd(0x27, 16, 2);
037
038
byte
block1[8] = {
039
0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F };
// значок градуса с пламенем снизу
040
byte
block2[8] = {
041
0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 };
// значок градуса
042
043
#define serialenabled // раскомментировать для выдачи в порт отладочной инфы
044
045
#define TstatTimerMax 180 //минимальная пауза между включениями горелки, сек
046
unsigned
int
TstatTimer = 20;
//таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса
047
048
float
DS18B20Temperature = 0;
//сырая температура от датчика
049
float
Temperature = 0;
//вычисленная температура с коррекцией
050
float
DS18B20TempTmp;
//времянка
051
byte
DS18B20iteration = 0;
//счётчик измерений температуры для усреднения
052
053
float
TstatTemp = 23;
//температура термостатирования, может изменяться настройками
054
float
TemperatureCorr = 0;
//коррекция температуры, может изменяться настройками
055
float
Hysteresis = 0.1;
// гистерезис термостата, может изменяться настройками
056
float
HysteresisOld;
057
058
int
Hours = 0;
// времянка часов RTC для отображения и установки
059
int
Minutes = 0;
// времянка минут RTC для отображения и установки
060
int
Seconds;
061
boolean PrintYesNo =
false
;
// показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение)
062
boolean SetH =
false
;
// выделение часов при отображении
063
boolean SetM =
false
;
// выделение минут при отображении
064
boolean SetYesNo =
false
;
// выделение Yes/No при установке часов
065
066
boolean blink500ms =
false
;
// мигающий бит, инвертируется каждые 500мс
067
boolean plus1sec =
false
;
// ежесекундно взводится
068
069
boolean BeepEnabled =
true
;
070
071
byte
MenuTimeoutTimer;
072
073
// структура для суточных таймеров (8 байт)
074
struct
buffer_template {
075
byte
Hours;
076
byte
Minutes;
077
float
Temperature;
078
boolean Enabled;
079
boolean Activated;
080
};
081
buffer_template Timer[4] = {
082
0, 0, 23.0,
false
,
false
};
//объявление 4-х суточных таймеров и их начальные значения
083
084
float
AlarmTemp = 10;
// температура для замерзательного орала
085
086
// encoder vars
087
static
boolean rotating=
false
;
// debounce management
088
boolean A_set =
false
;
089
boolean B_set =
false
;
090
boolean encoderR =
false
;
091
boolean encoderL =
false
;
092
093
// EEPROM
094
EEMEM
float
TstatTempEE;
//EE температура термостатирования
095
EEMEM
float
TemperatureCorrEE;
// EE коррекция температуры
096
EEMEM
float
HysteresisEE;
// EE гистерезис
097
EEMEM boolean BeepEnabledEE;
// EE признак разрешения звука
098
EEMEM
float
AlarmTempEE;
// EE значение недопустимого снижения температуры
099
EEMEM buffer_template TimerEE[4];
// EE структуры для 4 суточных таймеров
100
101
// ===== SETUP ========================================================================
102
void
setup
() {
103
104
#ifdef serialenabled
105
Serial
.begin(9600);
106
#endif
107
pinMode(Relay, OUTPUT);
108
digitalWrite(Relay, HIGH);
109
// initialize the LCD
110
lcd.begin();
111
// Turn on the blacklight and print a message.
112
lcd.backlight();
113
lcd.createChar(1, block1);
114
lcd.createChar(2, block2);
115
pinMode(encoderA, INPUT);
116
digitalWrite(encoderA, HIGH);
117
pinMode(encoderB, INPUT);
118
digitalWrite(encoderB, HIGH);
119
pinMode(encoderK, INPUT);
120
digitalWrite(encoderK, HIGH);
121
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 0 (pin 2)
122
attachInterrupt(1, doEncoderB, CHANGE);
// encoder pin on interrupt 1 (pin 3)
123
Timer1.initialize(500000);
// Timer0 interrupt - set a timer of length 500000 microseconds
124
Timer1.attachInterrupt( timerIsr );
// attach the service routine here
125
EEPROM.setMaxAllowedWrites(32767);
126
if
((digitalRead(encoderK)) == 0)
127
{
// если первая запись однокристалки (зажата кнопка при включении питания)- записать начальные значения в EE
128
lcd.setCursor(0, 0);
//инфо на LCD
129
lcd.print(F(
"Cold start..."
));
130
for
(
int
i=0; i<4; i++)
131
{
132
// Timer[i].Hours = Timer[i].Minutes = 0;
133
// Timer[i].Temperature = 23.0;
134
// Timer[i].Enabled = Timer[i].Activated = false;
135
EEPROM.updateBlock(
int
(&TimerEE[i]), Timer[i]);
136
}
137
EEPROM.updateFloat(
int
(&TstatTempEE), TstatTemp);
138
EEPROM.updateByte(
int
(&BeepEnabledEE), BeepEnabled);
139
EEPROM.updateFloat(
int
(&TemperatureCorrEE), TemperatureCorr);
140
EEPROM.updateFloat(
int
(&HysteresisEE), Hysteresis);
141
EEPROM.updateFloat(
int
(&AlarmTempEE), AlarmTemp);
142
tone(BeepPin,2000,50);
143
delay(50);
144
tone(BeepPin,3000,50);
145
delay(50);
146
tone(BeepPin,4000,50);
147
delay(1000);
148
}
149
lcd.clear();
150
lcd.setCursor(0, 0);
//инфо на LCD
151
lcd.print(F(
"Read settings..."
));
152
BeepEnabled = EEPROM.readByte(
int
(&BeepEnabledEE));
153
TstatTemp = EEPROM.readFloat(
int
(&TstatTempEE));
154
TemperatureCorr = EEPROM.readFloat(
int
(&TemperatureCorrEE));
155
Hysteresis = EEPROM.readFloat(
int
(&HysteresisEE));
156
AlarmTemp = EEPROM.readFloat(
int
(&AlarmTempEE));
157
for
(
int
i=0; i<4; i++)
158
{
159
EEPROM.readBlock(
int
(&TimerEE[i]), Timer[i]);
160
}
161
162
DS18B20.begin();
163
DS18B20.getAddress(DS18B20Address, 0);
164
DS18B20.setResolution(DS18B20Address, 12);
165
DS18B20.setWaitForConversion(
false
);
166
DS18B20.requestTemperatures();
167
168
tone(BeepPin,4000,50);
169
delay(100);
170
tone(BeepPin,4000,50);
171
delay(1000);
172
lcd.clear();
173
RTC.start();
174
175
}
176
177
// ===== MAIN CYCLE ===================================================================
178
void
loop
() {
179
lcd.setCursor(8, 0);
//инфо на LCD
180
if
((Temperature < AlarmTemp)&(blink500ms)) {
181
lcd.print(F(
"*"
));
182
}
183
else
{
184
lcd.print(F(
" "
));
185
}
186
lcd.print(F(
"t="
));
187
if
(Temperature < 10) {
188
lcd.print(F(
" "
));
189
}
190
lcd.print(Temperature,1);
191
lcd.write(0x02);
// значок градуса
192
193
// если таймер включен - надпись светится, если сработал - мигает, обрабатываем все 4 таймера
194
lcd.setCursor(0, 1);
//инфо на LCD
195
for
(
int
i=0;i<4;i++){
196
if
((Timer[i].Enabled)&!((Timer[i].Activated)&(blink500ms))) {
197
lcd.print(F(
"T"
));
198
lcd.print(i+1);
199
}
200
else
{
201
lcd.print(F(
" "
));
202
}
203
}
204
205
lcd.setCursor(9, 1);
//инфо на LCD
206
lcd.print(F(
"s="
));
207
lcd.print(TstatTemp,1);
208
if
( digitalRead(Relay) == RelayOn ) {
209
lcd.write(0x01);
// значок градуса с пламенем
210
}
211
else
{
212
lcd.write(0x02);
// значок градуса
213
}
214
215
// печатаем текущее время
216
PrintYesNo =
false
;
217
PrintRTC(0,0);
218
219
// термостатирование
220
if
( TstatTimer == 0 )
221
{
222
if
( Temperature > ( TstatTemp + Hysteresis ) )
// гистерезис
223
{
224
if
( digitalRead(Relay) == RelayOn )
// если горелка включена -
225
{
226
digitalWrite(Relay, !RelayOn);
// выключить горелку
227
TstatTimer = TstatTimerMax;
// горелку держать выключённой не менее заданного в TstatTimerMax времени
228
}
229
}
230
if
(Temperature < TstatTemp)
231
{
232
if
( digitalRead(Relay) == !RelayOn )
// если горелка выключена -
233
{
234
digitalWrite(Relay, RelayOn);
// включить горелку
235
TstatTimer = TstatTimerMax;
// горелку держать включённой не менее заданного в TstatTimerMax времени
236
}
237
}
238
}
239
240
// если прошла 1 секунда - делаем ежесекундные дела
241
if
(plus1sec) {
242
plus1sec =
false
;
// сбрасываем до следующей секунды
243
// обновляем часы
244
RTC.readClock();
245
Hours=RTC.getHours();
246
Minutes=RTC.getMinutes();
247
Seconds=RTC.getSeconds();
248
249
// измеряем температуру воздуха
250
DS18B20TempTmp = DS18B20.getTempCByIndex(0);
// получить температуру от датчика
251
//Serial.println(DS18B20TempTmp);
252
DS18B20.requestTemperatures();
// запустить новое измерение
253
if
(DS18B20TempTmp != -127)
254
{
255
DS18B20Temperature += DS18B20TempTmp;
// суммируем для усреднения
256
DS18B20iteration ++;
257
if
(DS18B20iteration == 10)
258
{
259
DS18B20iteration = 0;
260
Temperature = (DS18B20Temperature / 10) + TemperatureCorr;
//усреднённая + коррекция
261
DS18B20Temperature = 0;
262
}
263
}
264
265
// если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту
266
//(экономия ресурса EE)
267
if
((EEPROM.readFloat(
int
(&TstatTempEE)) != TstatTemp)&(Seconds == 0)) {
268
EEPROM.updateFloat(
int
(&TstatTempEE), TstatTemp);
269
}
270
271
// проверка таймеров и изменение уставки термостата при совпадении
272
for
(
int
i=0;i<4;i++)
273
{
274
if
((Hours == Timer[i].Hours)&(Minutes == Timer[i].Minutes)&(Timer[i].Enabled)&(Seconds == 0)) {
// время T совпадает с RTC
275
Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated =
false
;
276
Timer[i].Activated =
true
;
277
TstatTemp = Timer[i].Temperature;
278
EEPROM.updateFloat(
int
(&TstatTempEE), TstatTemp);
279
if
(BeepEnabled) {
280
tone(BeepPin,4000,5);
281
}
282
break
;
// это чтобы статус Activated остался взведённым
283
}
284
}
285
286
// дебаг-инфо - в терминал
287
#ifdef serialenabled
288
Serial
.print(F(
"Temp="
));
289
Serial
.print(Temperature, 1);
290
Serial
.print(F(
"("
));
291
Serial
.print(DS18B20Temperature, 4);
292
Serial
.print(F(
",corr "
));
293
Serial
.print(TemperatureCorr, 1);
294
Serial
.print(F(
"),TstatTimer="
));
295
Serial
.println(TstatTimer);
296
#endif
297
298
if
(Temperature < AlarmTemp) {
299
tone(BeepPin,4000,5);
300
}
301
}
302
303
// обработка поворота энкодера на лету (ручное изменение уставки температуры))
304
rotating =
true
;
// reset the debouncer
305
if
((encoderR)|(encoderL)) {
306
if
(encoderR) {
307
TstatTemp += 0.1;
308
}
309
else
310
{
311
TstatTemp -= 0.1;
312
}
313
TstatTemp = constrain(TstatTemp, 10, 35);
314
encoderR =
false
;
315
encoderL =
false
;
316
Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated =
false
;
317
}
318
319
// ================ по нажатию кнопки энкодера - меню настроек ====================
320
if
(digitalRead(encoderK) == 0) {
321
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
322
lcd.clear();
323
lcd.setCursor(0, 0);
//инфо на LCD
324
lcd.print(F(
"< SETUP >"
));
325
if
(BeepEnabled) {
326
tone(BeepPin,4000,50);
327
}
328
delay(200);
329
int
menuitem = 0;
330
331
do
{
332
rotating =
true
;
// reset the debouncer
333
if
((encoderR)|(encoderL)) {
334
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
335
if
(encoderR) {
336
menuitem += 1;
337
}
338
else
{
339
menuitem -= 1;
340
}
341
if
( menuitem > 9 ) {
342
menuitem = 0;
343
}
// границы пунктов меню
344
if
( menuitem < 0 ) {
345
menuitem = 9;
346
}
347
encoderR =
false
;
348
encoderL =
false
;
349
}
350
351
// индикация пункта меню (номер пункта - в menuitem)
352
lcd.setCursor(0, 1);
//инфо на LCD
353
switch
(menuitem)
354
{
355
case
0:
356
lcd.print(F(
"0.BACK "
));
357
break
;
358
case
1:
359
lcd.print(F(
"1.TIMER1 SET "
));
360
break
;
361
case
2:
362
lcd.print(F(
"2.TIMER2 SET "
));
363
break
;
364
case
3:
365
lcd.print(F(
"3.TIMER3 SET "
));
366
break
;
367
case
4:
368
lcd.print(F(
"4.TIMER4 SET "
));
369
break
;
370
case
5:
371
lcd.print(F(
"5.CLOCK SET "
));
372
break
;
373
case
6:
374
lcd.print(F(
"6.HYSTERESIS SET"
));
375
break
;
376
case
7:
377
lcd.print(F(
"7.T-CORRECT SET "
));
378
break
;
379
case
8:
380
lcd.print(F(
"8.SOUND SET "
));
381
break
;
382
case
9:
383
lcd.print(F(
"9.T-ALARM SET "
));
384
break
;
385
}
386
if
(MenuTimeoutTimer == 0) {
387
menuitem = 0;
388
}
389
390
}
391
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
392
// если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem)
393
if
(BeepEnabled) {
394
tone(BeepPin,4000,50);
395
}
396
switch
(menuitem)
397
{
398
// ====== пункт 0 - выход
399
case
0:
400
if
(BeepEnabled) {
401
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
402
}
//звук "NO"
403
break
;
// case 0 out
404
405
// ====== пункт 1 - установка Timer1
406
case
1:
407
TimerXSetup(0);
408
break
;
// case 1 out
409
410
// ====== пункт 2 - установка Timer2
411
case
2:
412
TimerXSetup(1);
413
break
;
// case 2 out
414
415
// ====== пункт 3 - установка Timer3
416
case
3:
417
TimerXSetup(2);
418
break
;
// case 3 out
419
420
// ====== пункт 4 - установка Timer4
421
case
4:
422
TimerXSetup(3);
423
break
;
// case 4 out
424
425
// ====== пункт 5 - установка RTC
426
case
5:
427
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
428
lcd.clear();
429
lcd.setCursor(0, 0);
//инфо на LCD
430
lcd.print(F(
"SETUP CLOCK"
));
431
delay(200);
432
RTC.readClock();
433
Hours=RTC.getHours();
434
Minutes=RTC.getMinutes();
435
SetYesNo =
false
;
436
PrintYesNo =
true
;
437
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
438
if
(MenuTimeoutTimer != 0) {
439
if
(SetYesNo)
440
{
441
if
(BeepEnabled) {
442
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
443
}
444
RTC.setHours(Hours);
445
RTC.setMinutes(Minutes);
446
RTC.setSeconds(0);
447
RTC.setClock();
448
RTC.start();
449
}
450
else
451
{
452
if
(BeepEnabled) {
453
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
454
}
455
}
456
}
457
else
{
458
if
(BeepEnabled) {
459
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
460
}
461
}
462
break
;
// case 5 out
463
464
// ====== пункт 6 - установка гистерезиса
465
case
6:
466
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
467
HysteresisOld = Hysteresis;
468
lcd.clear();
469
lcd.setCursor(0, 0);
//инфо на LCD
470
lcd.print(F(
"SETUP HYSTERESIS"
));
471
delay(200);
472
do
{
473
lcd.setCursor(0,1);
474
if
(blink500ms) {
475
lcd.print(
" "
);
476
}
477
else
{
478
lcd.print(Hysteresis, 1);
479
lcd.write(0x02);
// значок градуса
480
}
481
rotating =
true
;
// reset the debouncer
482
if
(encoderR) {
483
Hysteresis += 0.1;
484
encoderR =
false
;
485
}
486
if
(encoderL) {
487
Hysteresis -= 0.1;
488
encoderL =
false
;
489
}
490
Hysteresis = constrain(Hysteresis, 0.1, 1);
// крайние значения
491
}
492
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
493
if
(MenuTimeoutTimer != 0) {
494
EEPROM.updateFloat(
int
(&HysteresisEE), Hysteresis);
// запись в ЕЕПРОМ
495
if
(BeepEnabled) {
496
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
497
}
498
}
499
else
{
500
Hysteresis = HysteresisOld;
501
if
(BeepEnabled) {
502
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
503
}
504
}
505
break
;
// case 6 out
506
507
// ====== пункт 7 - установка коррекции температуры
508
case
7:
509
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
510
lcd.clear();
511
lcd.setCursor(0, 0);
//инфо на LCD
512
lcd.print(F(
"SETUP T-CORRECT "
));
513
delay(200);
514
do
{
515
lcd.setCursor(0,1);
516
if
(blink500ms) {
517
lcd.print(F(
" "
));
518
}
519
else
{
520
if
(TemperatureCorr >= 0) {
521
lcd.print(F(
"+"
));
522
}
523
524
lcd.print(TemperatureCorr, 1);
525
lcd.write(0x02);
// значок градуса
526
}
527
rotating =
true
;
// reset the debouncer
528
if
(encoderR) {
529
TemperatureCorr += 0.1;
530
encoderR =
false
;
531
}
532
if
(encoderL) {
533
TemperatureCorr -= 0.1;
534
encoderL =
false
;
535
}
536
TemperatureCorr = constrain(TemperatureCorr, -8, 8);
// крайние значения
537
}
538
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
539
540
if
(MenuTimeoutTimer != 0) {
541
EEPROM.updateFloat(
int
(&TemperatureCorrEE), TemperatureCorr);
// запись в ЕЕПРОМ
542
if
(BeepEnabled) {
543
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
544
}
545
}
546
else
{
547
TemperatureCorr = EEPROM.readFloat(
int
(&TemperatureCorrEE));
548
if
(BeepEnabled) {
549
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
550
}
551
}
552
break
;
// case 7 out
553
554
// ====== пункт 8 - вкл/выкл звука
555
case
8:
556
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
557
lcd.clear();
558
lcd.setCursor(0, 0);
//инфо на LCD
559
lcd.print(F(
"SOUND SET "
));
560
delay(200);
561
do
{
562
lcd.setCursor(0,1);
563
if
(BeepEnabled) {
564
lcd.print(F(
"BEEP ON "
));
565
}
566
else
{
567
lcd.print(F(
"BEEP OFF "
));
568
}
569
570
rotating =
true
;
// reset the debouncer
571
if
((encoderR)|(encoderL)) {
572
BeepEnabled = !BeepEnabled;
573
encoderR =
false
;
574
encoderL =
false
;
575
}
576
}
577
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
578
579
if
(MenuTimeoutTimer != 0) {
580
if
(BeepEnabled) {
581
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
582
}
583
EEPROM.updateByte(
int
(&BeepEnabledEE), BeepEnabled);
584
}
585
if
(MenuTimeoutTimer == 0) {
586
BeepEnabled = EEPROM.readByte(
int
(&BeepEnabledEE));
587
}
588
break
;
// case 8 out
589
590
// ====== пункт 9 - установка предупреждалки о холоде
591
case
9:
592
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
593
lcd.clear();
594
lcd.setCursor(0, 0);
//инфо на LCD
595
lcd.print(F(
"ALARM-TEMP SET "
));
596
delay(200);
597
do
{
598
lcd.setCursor(0,1);
599
if
(blink500ms) {
600
lcd.print(F(
" "
));
601
}
602
else
{
603
if
(AlarmTemp >= 0) {
604
lcd.print(F(
"+"
));
605
}
606
607
lcd.print(AlarmTemp, 0);
608
lcd.write(0x02);
// значок градуса
609
}
610
rotating =
true
;
// reset the debouncer
611
if
(encoderR) {
612
AlarmTemp += 1;
613
encoderR =
false
;
614
}
615
if
(encoderL) {
616
AlarmTemp -= 1;
617
encoderL =
false
;
618
}
619
AlarmTemp = constrain(AlarmTemp, 15, 30);
// крайние значения
620
}
621
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
622
623
if
(MenuTimeoutTimer != 0) {
624
EEPROM.updateFloat(
int
(&AlarmTempEE), AlarmTemp);
// запись в ЕЕПРОМ
625
if
(BeepEnabled) {
626
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
627
}
628
}
629
else
{
630
AlarmTemp = EEPROM.readFloat(
int
(&AlarmTempEE));
631
if
(BeepEnabled) {
632
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
633
}
634
}
635
break
;
// case 9 out
636
637
}
638
639
delay(200);
640
lcd.clear();
641
}
642
}
643
644
// ===== SUBROUTINES ==================================================================
645
646
// ========================================
647
void
SetTime(
char
x,
char
y)
648
{
649
// ========= set hours
650
SetH =
true
;
651
do
{
652
PrintRTC(x,y);
653
rotating =
true
;
// reset the debouncer
654
if
(encoderR) {
655
Hours += 1;
656
if
(Hours > 23) {
657
Hours = 0;
658
};
659
encoderR =
false
;
660
}
661
if
(encoderL) {
662
Hours -= 1;
663
if
(Hours < 0) {
664
Hours = 23;
665
};
666
encoderL =
false
;
667
}
668
}
669
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
670
if
(BeepEnabled) {
671
tone(BeepPin,4000,50);
//звук "YES"
672
}
673
SetH =
false
;
674
delay(200);
675
// ========= set minutes
676
SetM =
true
;
677
do
{
678
PrintRTC(0,1);
679
rotating =
true
;
// reset the debouncer
680
if
(encoderR) {
681
Minutes += 1;
682
if
(Minutes > 59) {
683
Minutes = 0;
684
};
685
encoderR =
false
;
686
}
687
if
(encoderL) {
688
Minutes -= 1;
689
if
(Minutes < 0) {
690
Minutes = 59;
691
};
692
encoderL =
false
;
693
}
694
}
695
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
696
if
(BeepEnabled) {
697
tone(BeepPin,4000,50);
//звук "YES"
698
}
699
if
(PrintYesNo) {
700
SetM =
false
;
701
delay(200);
702
// ========= set yes-no
703
SetYesNo =
false
;
704
do
{
705
PrintRTC(0,1);
706
rotating =
true
;
// reset the debouncer
707
if
((encoderR)||(encoderL)) {
708
SetYesNo = !SetYesNo;
709
encoderR =
false
;
710
encoderL =
false
;
711
}
712
}
713
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
714
delay(200);
715
}
716
717
}
718
719
// ========================================
720
void
PrintRTC(
char
x,
char
y)
721
{
722
lcd.setCursor(x,y);
723
if
(SetH&&blink500ms) {
724
lcd.print(F(
" "
));
725
}
726
else
{
727
if
(Hours < 10) {
728
lcd.print(F(
"0"
));
729
}
730
lcd.print(Hours);
731
}
732
733
// мигающее двоеточие, если не в режиме установки времени
734
if
(!(SetH||SetM||PrintYesNo||blink500ms))
735
{
736
lcd.print(F(
" "
));
737
}
738
else
{
739
lcd.print(F(
":"
));
740
}
741
742
if
(SetM&&blink500ms) {
743
lcd.print(F(
" "
));
744
}
745
else
{
746
if
(Minutes < 10) {
747
lcd.print(F(
"0"
));
748
}
749
lcd.print(Minutes);
750
}
751
lcd.print(F(
" "
));
752
753
if
(PrintYesNo) {
754
lcd.print(F(
"["
));
755
if
(!(SetH||SetM||blink500ms))
756
{
757
lcd.print(F(
" "
));
758
}
759
else
{
760
if
(SetYesNo)
761
{
762
lcd.print(F(
"YES"
));
763
}
764
else
{
765
lcd.print(F(
"NO "
));
766
}
767
}
768
lcd.print(F(
"]"
));
769
}
770
771
}
772
773
// ============================ Encoder interrupts =============================
774
// Interrupt on A changing state
775
void
doEncoderA(){
776
if
( rotating ) {
777
delay (1) ;
// wait a little until the bouncing is done
778
}
779
// Test transition, did things really change?
780
if
( digitalRead(encoderA) != A_set ) {
// debounce once more
781
A_set = !A_set;
782
// adjust counter + if A leads B
783
if
( A_set && !B_set )
784
{
785
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
786
if
(BeepEnabled) {
787
tone(BeepPin,4000,5);
788
}
789
encoderR =
true
;
790
rotating =
false
;
// no more debouncing until loop() hits again
791
}
792
}
793
}
794
// Interrupt on B changing state, same as A above
795
void
doEncoderB(){
796
if
( rotating ) {
797
delay (1);
798
}
799
if
( digitalRead(encoderB) != B_set ) {
800
B_set = !B_set;
801
// adjust counter - 1 if B leads A
802
if
( B_set && !A_set ) {
803
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
804
if
(BeepEnabled) {
805
tone(BeepPin,4000,5);
806
}
807
encoderL =
true
;
808
rotating =
false
;
809
}
810
}
811
}
812
// ============================ Timer0 interrupt =============================
813
// run every 500ms
814
void
timerIsr()
815
{
816
blink500ms = !blink500ms;
// инверсия мерцающего бита
817
if
(blink500ms) {
818
plus1sec =
true
;
// ежесекундно взводится
819
if
(TstatTimer != 0) {
820
TstatTimer --;
// ежесекундный декремент этого таймера
821
}
822
if
(MenuTimeoutTimer != 0) {
823
MenuTimeoutTimer --;
// ежесекундный декремент этого таймера
824
}
825
}
826
}
827
828
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
829
void
TimerXSetup(
int
X) {
830
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
831
lcd.clear();
832
lcd.setCursor(0, 0);
//инфо на LCD
833
lcd.print(F(
"SETUP TIMER"
));
834
lcd.print(X+1);
// выводим номер таймера на LCD
835
delay(200);
836
Hours=Timer[X].Hours;
837
Minutes=Timer[X].Minutes;
838
SetYesNo =
false
;
839
PrintYesNo =
true
;
840
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
841
if
(MenuTimeoutTimer != 0) {
842
if
(SetYesNo)
// если при установке времени выбрано "Yes"
843
{
844
if
(BeepEnabled) {
845
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
846
}
847
Timer[X].Hours = Hours;
848
Timer[X].Minutes = Minutes;
849
Timer[X].Enabled =
true
;
850
EEPROM.updateBlock(
int
(&TimerEE[X]), Timer[X]);
851
852
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
853
lcd.clear();
854
lcd.setCursor(0, 0);
//инфо на LCD
855
lcd.print(F(
"Timer"
));
856
lcd.print(X+1);
857
lcd.print(F(
" Temp. Set"
));
858
delay(200);
859
do
{
860
lcd.setCursor(0,1);
861
if
(blink500ms) {
862
lcd.print(F(
" "
));
863
}
864
else
{
865
lcd.print(Timer[X].Temperature, 1);
866
lcd.write(0x02);
// значок градуса
867
}
868
rotating =
true
;
// reset the debouncer
869
if
(encoderR) {
870
Timer[X].Temperature += 0.1;
871
encoderR =
false
;
872
}
873
if
(encoderL) {
874
Timer[X].Temperature -= 0.1;
875
encoderL =
false
;
876
}
877
Timer[X].Temperature = constrain(Timer[X].Temperature, 10, 35);
// крайние значения
878
}
879
while
((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0));
880
881
if
(MenuTimeoutTimer != 0) {
// если после выбора температуры нажата кнопка энкодера
882
EEPROM.updateBlock(
int
(&TimerEE[X]), Timer[X]);
883
if
(BeepEnabled) {
884
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
885
}
886
}
887
else
{
// если не нажата - используем старую температуру
888
EEPROM.readBlock(
int
(&TimerEE[X]), Timer[X]);
889
if
(BeepEnabled) {
890
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
891
}
892
}
893
894
}
895
else
// если при установке времени выбрано "No"
896
{
897
if
(BeepEnabled) {
898
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
899
}
900
EEPROM.readBlock(
int
(&TimerEE[X]), Timer[X]);
901
Timer[X].Enabled =
false
;
902
EEPROM.updateBlock(
int
(&TimerEE[X]), Timer[X]);
903
}
904
}
905
else
{
906
if
(BeepEnabled) {
907
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
908
}
909
}
910
}
911
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````
Всем привет и хорошего дня.
Я только знакомлюсь с ардуино и радиоэлектроникой прошу не судить строго.
Есть 3 вопроса.
1. Где можно найти схему проекта? Боюсь, не поставлю какой-нибудь резистор и все будет работать неправильно. Если схемы нет, то обясните пожалуйста как вы понимаете, что-куда.
2. Хочу сделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Может подскажете где копать и что допилить чтобы связвть ардуинкуи по радио?
3. Как организовать автономное питание для ардуинки-датчика и сколько это штука с такой обвязкой и таким скетчем сможет прожить автономно?
PS: В наличии есть UNO, Nano и Mini Pro 328, котёл baxi rocco neobit )
Заранее всем спасибо.
Что изменить я скетче, чтобы использовать часы DS3231? У меня DS3231 почему то не идут. Подключены sda-a4, scl-a5, +, gnd
Моим скетчем это назвать нельзя))) Это сектч уважаемого автора, я только добавил ЛСД 1602 с i2c. Вот что нужно сделать в скетче автора:
далее вводим:
Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.
Вопрос снят. Нужно покупать i2c модуль. Но подключиться ли он к lcd 16*2 мэлт?
Вопрос снят. Нужно покупать i2c модуль. Но подключиться ли он к lcd 16*2 мэлт?
вопрос не понятен...
ардуина и 16х2 по I2C - нужен преобразователь (цена у китайцев = 50р.)
ардуина и 16х2 с I2C - подключится !
Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом.
контроллер с котлом , может быть ?
а зачем менять два провода на +ардуина и два nrf24 ?
Всем привет. Собрал эту схему, но возникло желание отказаться от провода соединяющего датчик с котлом. Для этой цели присматриваюсь к nrf24l01+ Будет нано со всей обвязкой и передатчиком на базе nrf24l01+ и уно с приемником nrf24l01+ и реле чтобы включать-выключать котел. Вопрос в следующем - можно ли подключить все что описано выше (lсd 16*2 мэлт) и модуль nrf24l01+ к нано? Не хватит пинов для подключения или я чего-то не понимаю? Уважаемые знатоки - растолкуйте новичку.
чо за котёл-то ?
делаю свой проект (не себе) , сюда посматриваю , но делаю свой проект....
котёл тупой - уставка T подачи ручная , может работать от радиоТермометра...
у тибя такой ? есть наработки... нано ?
Нужно покупать i2c модуль.
мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)
мне хватило (пока) :
- 6 пинов для экрана 20х4
- 3 пина для датчиков Т : подача , обратка , улица (не хочЮ вешать датчики Т на один пин)
или 1 пин , если делать гирлянду из DS18
- 3 пина для кнопок управления уставками котла
- 1 пин для запуска котла (реле)
Дело в том, что не имею возможности запитать модуль к котлу по проводам. Так как в доме сделан ремонт и не хочеться ничего сверлить и т.п. Для этого решил cделать датчик с радио-модулем на базе модулей nRF24L01+, чтобы можно было его поставить в любой комнате. Cтолкунля с тем, что мне не хватает пинов и для их освобожднеия думаю использовать i2c . Возможно я в чем-то ошибаюсь.
@SU-27-16 для какой цели вы используете 3 датчкика (подача, обратка, улица) ? На мой взгляд главное иметь комфортную температуру в помещении. Для этого достаточно одного датчика в комнате.
Vitaly-V , сначала тоже хотел радиопульт для котла , заказчик перехотел.
Желает устройство иметь в "кочегарке" около котла.
Датчики - ВСЕ для контроля температур котла и улицы
1 и 2-ой - для управления котлом
2-ой - для компенсации "мороза"
например , в диапазоне -10..-30гр на улице добавляет пропорционально 10гр на подачу
при -20 подача будет на 5 больше чем при -9 , а при -40 - на 15
Vitaly-V , у заказчика уже есть EUROSTER 2006TX = 6300р. , круто !
если котёл с электроникой - то классно !
если котёл тупой как холодильник_СССР - то есть проблема... рассказать ?
https://www.teplo-serv.com/ru/prod3861
с точки зрения котла - это выходы реле ( два провода ) : греть / не греть :)
на моей схеме это "RF-приёмник КТВ"
никакой обратной связи !
тут цена погуманнее , но техОписание :(
https://www.teplo-serv.com/ru/prod3874
про "линию Деда Мороза"
ой-ой-ой !
Ldelta - получилось 20гр.... НЕ ПРАВИЛЬНО нарисовал :(
это значение на графике НЕОТОБРАЖАЕМО... ступил :(
Ldelta - можно прикрутить к нижнему "графику" , но сложнова-то....
SU-27-16 спасибо за советы. Котёл у меня - тупой (Baxi Roca Neobit) Делаю термостат ради интереса и для себя. Понимаю, что можно было купить готовый и дешевле, но мне хочеться разобраться и сделать самому.
а на вопрос - ответ
http://anydevices.ru/modules/i2c-serial-interface-adapter-board-module-f...
у "братьев" = 50р. :)
а не хочется ли иметь визуальный контроль за работой тупого котла ?
у заказчика - стрелочные-мембранные датчики Т подачи и обратки....
неудобно и нефейшуйно :)
заказчик - брат в другом городе , т.е. делаю как сибе !
а похожий девайс с недельным программированием?
[quote=rekrut007]
[code]
/* Программа
"Комнатный термостат"
Допоборудование - ds18b20(вывод 2 )- 3 датчика (комнатный, уличный, на котловую воду), ds3231(выводы 5-SCL и 4-SDA) и lcd1602.
Функция - замеряет температуру в помещении и на основании ее сравнения с установленными пользователями включает или выключает нагрузку.
Доброго времени суток
При проверке кода выдает следующее:
Доброго времени суток! Очень интересный проект! Только вот при компиляции сразу выдает ошибку :
001
In file included from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:0:
002
003
C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:159:22: error: conflicting declaration
'EEPROMClassEx EEPROM'
004
005
extern
EEPROMClassEx EEPROM;
006
007
^
008
009
In file included from C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:23:0,
010
011
from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:
012
013
C:\Program Files\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:145:20: note: previous declaration
as
'EEPROMClass EEPROM'
014
015
static
EEPROMClass EEPROM;
016
017
^
018
019
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function
'void setup()'
:
020
021
sketch_oct24c:119: error:
'doEncoderA'
was not declared
in
this
scope
022
023
sketch_oct24c:120: error:
'doEncoderB'
was not declared
in
this
scope
024
025
sketch_oct24c:122: error:
'timerIsr'
was not declared
in
this
scope
026
027
sketch_oct24c:123: error:
'struct EEPROMClass'
has no member named
'setMaxAllowedWrites'
028
029
sketch_oct24c:133: error:
'struct EEPROMClass'
has no member named
'updateBlock'
030
031
sketch_oct24c:135: error:
'struct EEPROMClass'
has no member named
'updateFloat'
032
033
sketch_oct24c:136: error:
'struct EEPROMClass'
has no member named
'updateByte'
034
035
sketch_oct24c:137: error:
'struct EEPROMClass'
has no member named
'updateFloat'
036
037
sketch_oct24c:138: error:
'struct EEPROMClass'
has no member named
'updateFloat'
038
039
sketch_oct24c:139: error:
'struct EEPROMClass'
has no member named
'updateFloat'
040
041
sketch_oct24c:150: error:
'struct EEPROMClass'
has no member named
'readByte'
042
043
sketch_oct24c:151: error:
'struct EEPROMClass'
has no member named
'readFloat'
044
045
sketch_oct24c:152: error:
'struct EEPROMClass'
has no member named
'readFloat'
046
047
sketch_oct24c:153: error:
'struct EEPROMClass'
has no member named
'readFloat'
048
049
sketch_oct24c:154: error:
'struct EEPROMClass'
has no member named
'readFloat'
050
051
sketch_oct24c:157: error:
'struct EEPROMClass'
has no member named
'readBlock'
052
053
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function
'void loop()'
:
054
055
sketch_oct24c:215: error:
'PrintRTC'
was not declared
in
this
scope
056
057
sketch_oct24c:264: error:
'struct EEPROMClass'
has no member named
'readFloat'
058
059
sketch_oct24c:265: error:
'struct EEPROMClass'
has no member named
'updateFloat'
060
061
sketch_oct24c:275: error:
'struct EEPROMClass'
has no member named
'updateFloat'
062
063
sketch_oct24c:404: error:
'TimerXSetup'
was not declared
in
this
scope
064
065
sketch_oct24c:434: error:
'SetTime'
was not declared
in
this
scope
066
067
sketch_oct24c:491: error:
'struct EEPROMClass'
has no member named
'updateFloat'
068
069
sketch_oct24c:538: error:
'struct EEPROMClass'
has no member named
'updateFloat'
070
071
sketch_oct24c:544: error:
'struct EEPROMClass'
has no member named
'readFloat'
072
073
sketch_oct24c:580: error:
'struct EEPROMClass'
has no member named
'updateByte'
074
075
sketch_oct24c:583: error:
'struct EEPROMClass'
has no member named
'readByte'
076
077
sketch_oct24c:621: error:
'struct EEPROMClass'
has no member named
'updateFloat'
078
079
sketch_oct24c:627: error:
'struct EEPROMClass'
has no member named
'readFloat'
080
081
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function
'void SetTime(char, char)'
:
082
083
sketch_oct24c:649: error:
'PrintRTC'
was not declared
in
this
scope
084
085
sketch_oct24c:675: error:
'PrintRTC'
was not declared
in
this
scope
086
087
sketch_oct24c:702: error:
'PrintRTC'
was not declared
in
this
scope
088
089
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function
'void TimerXSetup(int)'
:
090
091
sketch_oct24c:847: error:
'struct EEPROMClass'
has no member named
'updateBlock'
092
093
sketch_oct24c:879: error:
'struct EEPROMClass'
has no member named
'updateBlock'
094
095
sketch_oct24c:885: error:
'struct EEPROMClass'
has no member named
'readBlock'
096
097
sketch_oct24c:897: error:
'struct EEPROMClass'
has no member named
'readBlock'
098
099
sketch_oct24c:899: error:
'struct EEPROMClass'
has no member named
'updateBlock'
100
101
exit status 1
102
'doEncoderA'
was not declared
in
this
scope
по I2C часы и LCD работают.
добавил 4-й таймер. типа: утро, день, вечер, ночь.
Не затруднит поделиться скетчем? )))) или скиньте плиз на почту: dwk26111974@gmail.com буду признателен.
0001
#include <Wire.h>
0002
#include <hd44780.h>
0003
#include <hd44780ioClass/hd44780_I2Cexp.h>
0004
#include <RealTimeClockDS1307.h> // RTC
0005
#include <EEPROM.h> // EE
0006
#include <TimerOne.h> // прерывания по таймеру1
0007
#include <OneWire.h> // 1wire для DS18B20
0008
#include <DallasTemperature.h> // DS18B20
0009
0010
0011
hd44780_I2Cexp lcd;
// declare lcd object: auto locate & config exapander chip
0012
0013
// LCD geometry
0014
const
int
LCD_ROWS = 2;
0015
const
int
LCD_COLS = 16;
0016
0017
#define HD44780_LCDOBJECT
0018
0019
#define ONE_WIRE_BUS A1
0020
OneWire oneWire(ONE_WIRE_BUS);
0021
DallasTemperature DS18B20(&oneWire);
0022
DeviceAddress DS18B20Address;
0023
0024
#define encoderA 2 // энкодер - поворот вправо (об землю)
0025
#define encoderB 3 // энкодер - поворот влево (об землю)
0026
#define encoderK 4 // энкодер - кнопка (об землю)
0027
#define BeepPin 11 // пищалка
0028
#define BeepToneNo 2000 // тон звука "No", герц
0029
#define BeepToneYes 4000 // тон звука "Yes", герц
0030
#define BeepToneNoDuration 200 // длительность звука "No", мс
0031
#define BeepToneYesDuration 200 // длительность звука "Yes", мс
0032
#define Relay 12 // нога, к которой подключено реле
0033
#define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW)
0034
0035
byte
block1[8] = {
0036
0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F };
// значок градуса с пламенем снизу
0037
byte
block2[8] = {
0038
0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 };
// значок градуса
0039
byte
block3[8] = {
0040
0x06,0x0A,0x0A,0x0A,0x0A,0x1F,0x11,0x00 };
// буква Д
0041
byte
block4[8] = {
0042
0x11,0x11,0x11,0x0F,0x01,0x11,0x0E,0x00 };
// буква У
0043
0044
0045
//#define serialenabled // раскомментировать для выдачи в порт отладочной инфы!!!!!
0046
0047
#define TstatTimerMax 120 //минимальная пауза между включениями горелки, сек
0048
unsigned
int
TstatTimer = 20;
//таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса
0049
0050
float
DS18B20Temperature = 0;
//сырая температура от датчика
0051
float
Temperature = 0;
//вычисленная температура с коррекцией
0052
float
DS18B20TempTmp;
//времянка
0053
byte
DS18B20iteration = 0;
//счётчик измерений температуры для усреднения
0054
0055
float
TstatTemp = 23;
//температура термостатирования, может изменяться настройками
0056
float
TemperatureCorr = 0;
//коррекция температуры, может изменяться настройками
0057
float
Hysteresis = 0.1;
// гистерезис термостата, может изменяться настройками
0058
float
HysteresisOld;
0059
0060
int
Hours = 0;
// времянка часов RTC для отображения и установки
0061
int
Minutes = 0;
// времянка минут RTC для отображения и установки
0062
int
Seconds;
0063
boolean PrintYesNo =
false
;
// показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение)
0064
boolean SetH =
false
;
// выделение часов при отображении
0065
boolean SetM =
false
;
// выделение минут при отображении
0066
boolean SetYesNo =
false
;
// выделение Yes/No при установке часов
0067
0068
boolean blink500ms =
false
;
// мигающий бит, инвертируется каждые 500мс
0069
boolean plus1sec =
false
;
// ежесекундно взводится
0070
0071
boolean BeepEnabled =
true
;
0072
0073
byte
MenuTimeoutTimer;
0074
0075
byte
Timer1Hours = 0;
0076
byte
Timer1Minutes = 0;
0077
boolean Timer1Enabled =
false
;
0078
boolean Timer1Activated =
false
;
0079
float
Timer1Temp = 23;
//температура термостатирования по таймеру1, может изменяться настройками
0080
byte
Timer2Hours = 0;
0081
byte
Timer2Minutes = 0;
0082
boolean Timer2Enabled =
false
;
0083
boolean Timer2Activated =
false
;
0084
float
Timer2Temp = 23;
//температура термостатирования по таймеру2, может изменяться настройками
0085
byte
Timer3Hours = 0;
0086
byte
Timer3Minutes = 0;
0087
boolean Timer3Enabled =
false
;
0088
boolean Timer3Activated =
false
;
0089
float
Timer3Temp = 23;
//температура термостатирования по таймеру3, может изменяться настройками
0090
byte
Timer4Hours = 0;
0091
byte
Timer4Minutes = 0;
0092
boolean Timer4Enabled =
false
;
0093
boolean Timer4Activated =
false
;
0094
float
Timer4Temp = 23;
//температура термостатирования по таймеру4, может изменяться настройками
0095
float
AlarmTemp = 18;
// температура для замерзательного орала
0096
0097
// encoder vars
0098
static
boolean rotating=
false
;
// debounce management
0099
boolean A_set =
false
;
0100
boolean B_set =
false
;
0101
boolean encoderR =
false
;
0102
boolean encoderL =
false
;
0103
0104
// EEPROM addresses
0105
#define TstatTempEEaddr 0 // EE - адрес для сохранения температуры термостатирования, 4 байта(float)!
0106
#define TemperatureCorrEEaddr 4 // EE - адрес для сохранения коррекции температуры, 4 байта(float)!
0107
#define HysteresisEEaddr 8 // EE - адрес для сохранения гистерезиса, 4 байта(float)!
0108
#define Timer1HoursEEaddr 12 // EE - адрес для сохранения часов таймера 1 (byte)
0109
#define Timer1MinutesEEaddr 13 // EE - адрес для сохранения минут таймера 1 (byte)
0110
#define Timer1EnabledEEaddr 14 // EE - адрес для сохранения статуса таймера 1 (boolean)
0111
#define Timer1TempEEaddr 15 // EE - адрес для сохранения температуры таймера 1, 4 байта(float)!
0112
#define Timer2HoursEEaddr 19 // EE - адрес для сохранения часов таймера 2 (byte)
0113
#define Timer2MinutesEEaddr 20 // EE - адрес для сохранения минут таймера 2 (byte)
0114
#define Timer2EnabledEEaddr 21 // EE - адрес для сохранения статуса таймера 2 (boolean)
0115
#define Timer2TempEEaddr 22 // EE - адрес для сохранения температуры таймера 2, 4 байта(float)!
0116
#define Timer3HoursEEaddr 26 // EE - адрес для сохранения часов таймера 3 (byte)
0117
#define Timer3MinutesEEaddr 27 // EE - адрес для сохранения минут таймера 3 (byte)
0118
#define Timer3EnabledEEaddr 28 // EE - адрес для сохранения статуса таймера 3 (boolean)
0119
#define Timer3TempEEaddr 29 // EE - адрес для сохранения температуры таймера 3, 4 байта(float)!
0120
#define Timer4HoursEEaddr 38 // EE - адрес для сохранения часов таймера 4 (byte)
0121
#define Timer4MinutesEEaddr 39 // EE - адрес для сохранения минут таймера 4 (byte)
0122
#define Timer4EnabledEEaddr 40 // EE - адрес для сохранения статуса таймера 4 (boolean)
0123
#define Timer4TempEEaddr 41 // EE - адрес для сохранения температуры таймера 4, 4 байта(float)!
0124
#define BeepEnabledEEaddr 33 // EE - адрес для сохранения признака разрешения звука (boolean)
0125
#define AlarmTempEEaddr 34 // EE - адрес для сохранения значения недопустимого снижения температуры, 4 байта(float)!
0126
0127
// ===== SETUP ========================================================================
0128
void
setup
()
0129
{
0130
#ifdef serialenabled
0131
Serial
.begin(9600);
0132
#endif
0133
pinMode(Relay, OUTPUT);
0134
digitalWrite(Relay, HIGH);
0135
lcd.begin(LCD_COLS, LCD_ROWS);
0136
lcd.clear();
0137
lcd.createChar(1, block1);
0138
lcd.createChar(2, block2);
0139
lcd.createChar(3, block3);
0140
lcd.createChar(4, block4);
0141
pinMode(encoderA, INPUT);
0142
digitalWrite(encoderA, HIGH);
0143
pinMode(encoderB, INPUT);
0144
digitalWrite(encoderB, HIGH);
0145
pinMode(encoderK, INPUT);
0146
digitalWrite(encoderK, HIGH);
0147
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 0 (pin 2)
0148
attachInterrupt(1, doEncoderB, CHANGE);
// encoder pin on interrupt 1 (pin 3)
0149
Timer1.initialize(500000);
// Timer0 interrupt - set a timer of length 500000 microseconds
0150
Timer1.attachInterrupt( timerIsr );
// attach the service routine here
0151
if
(EEPROM.read(Timer1HoursEEaddr) > 23) {
// если первая запись однокристалки - записать начальные значения в EE
0152
EEPROM.write(BeepEnabledEEaddr, BeepEnabled);
0153
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0154
EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr);
0155
EEPROM_float_write(HysteresisEEaddr, Hysteresis);
0156
EEPROM.write(Timer1HoursEEaddr, Timer1Hours);
0157
EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes);
0158
EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
0159
EEPROM_float_write(Timer1TempEEaddr, Timer1Temp);
0160
EEPROM.write(Timer2HoursEEaddr, Timer2Hours);
0161
EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes);
0162
EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
0163
EEPROM_float_write(Timer2TempEEaddr, Timer2Temp);
0164
EEPROM.write(Timer3HoursEEaddr, Timer3Hours);
0165
EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes);
0166
EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
0167
EEPROM_float_write(Timer3TempEEaddr, Timer3Temp);
0168
EEPROM.write(Timer4HoursEEaddr, Timer4Hours);
0169
EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes);
0170
EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
0171
EEPROM_float_write(Timer4TempEEaddr, Timer4Temp);
0172
EEPROM_float_write(AlarmTempEEaddr, AlarmTemp);
0173
}
0174
BeepEnabled = EEPROM.read(BeepEnabledEEaddr);
0175
TstatTemp = EEPROM_float_read(TstatTempEEaddr);
0176
TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr);
0177
Hysteresis = EEPROM_float_read(HysteresisEEaddr);
0178
Timer1Hours = EEPROM.read(Timer1HoursEEaddr);
0179
Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr);
0180
Timer1Enabled = EEPROM.read(Timer1EnabledEEaddr);
0181
Timer1Temp = EEPROM_float_read(Timer1TempEEaddr);
0182
Timer2Hours = EEPROM.read(Timer2HoursEEaddr);
0183
Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr);
0184
Timer2Enabled = EEPROM.read(Timer2EnabledEEaddr);
0185
Timer2Temp = EEPROM_float_read(Timer2TempEEaddr);
0186
Timer3Hours = EEPROM.read(Timer3HoursEEaddr);
0187
Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr);
0188
Timer3Enabled = EEPROM.read(Timer3EnabledEEaddr);
0189
Timer3Temp = EEPROM_float_read(Timer3TempEEaddr);
0190
Timer4Hours = EEPROM.read(Timer4HoursEEaddr);
0191
Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr);
0192
Timer4Enabled = EEPROM.read(Timer4EnabledEEaddr);
0193
Timer4Temp = EEPROM_float_read(Timer4TempEEaddr);
0194
AlarmTemp = EEPROM_float_read(AlarmTempEEaddr);
0195
0196
DS18B20.begin();
0197
DS18B20.getAddress(DS18B20Address, 0);
0198
DS18B20.setResolution(DS18B20Address, 12);
0199
DS18B20.setWaitForConversion(
false
);
0200
DS18B20.requestTemperatures();
0201
0202
tone(BeepPin,2000,50);
0203
delay(50);
0204
tone(BeepPin,3000,50);
0205
delay(50);
0206
tone(BeepPin,4000,50);
0207
delay(50);
0208
}
0209
0210
// ===== MAIN CYCLE ===================================================================
0211
void
loop
()
0212
{
0213
0214
lcd.setCursor(8, 0);
//инфо на LCD
0215
if
((Temperature < AlarmTemp)&(blink500ms)) {
0216
lcd.print(F(
"*"
));
0217
}
else
{
0218
lcd.print(F(
" "
));
0219
}
0220
lcd.print(F(
"t="
));
0221
if
(Temperature < 10) {
0222
lcd.print(F(
" "
));
0223
}
0224
lcd.print(Temperature,1);
0225
lcd.write(0x02);
// значок градуса
0226
0227
// если таймер 1 включен - надпись светится, если сработал - мигает
0228
lcd.setCursor(0, 1);
//инфо на LCD
0229
if
((Timer1Enabled)&!((Timer1Activated)&(blink500ms))) {
0230
lcd.write(0x04);
0231
}
0232
else
{
0233
lcd.print(F(
" "
));
0234
}
0235
0236
// если таймер 2 включен - надпись светится, если сработал - мигает
0237
lcd.setCursor(2, 1);
//инфо на LCD
0238
if
((Timer2Enabled)&!((Timer2Activated)&(blink500ms))) {
0239
lcd.write(0x03);
0240
}
0241
else
{
0242
lcd.print(F(
" "
));
0243
}
0244
0245
// если таймер 3 включен - надпись светится, если сработал - мигает
0246
lcd.setCursor(4, 1);
//инфо на LCD
0247
if
((Timer3Enabled)&!((Timer3Activated)&(blink500ms))) {
0248
lcd.print(F(
"B"
));
0249
}
0250
else
{
0251
lcd.print(F(
" "
));
0252
}
0253
0254
// если таймер 4 включен - надпись светится, если сработал - мигает
0255
lcd.setCursor(6, 1);
//инфо на LCD
0256
if
((Timer4Enabled)&!((Timer4Activated)&(blink500ms))) {
0257
lcd.print(F(
"H"
));
0258
}
0259
else
{
0260
lcd.print(F(
" "
));
0261
}
0262
0263
lcd.setCursor(9, 1);
//инфо на LCD
0264
lcd.print(F(
"k="
));
0265
lcd.print(TstatTemp,1);
0266
if
( digitalRead(Relay) == RelayOn ) {
0267
lcd.write(0x01);
// значок градуса с пламенем
0268
}
0269
else
{
0270
lcd.write(0x02);
// значок градуса
0271
}
0272
0273
// печатаем текущее время
0274
PrintYesNo =
false
;
0275
PrintRTC(0,0);
0276
0277
// термостатирование
0278
if
( TstatTimer == 0 )
0279
{
0280
if
( Temperature > ( TstatTemp + Hysteresis ) )
// гистерезис
0281
{
0282
if
( digitalRead(Relay) == RelayOn )
// если горелка включена -
0283
{
0284
digitalWrite(Relay, !RelayOn);
// выключить горелку
0285
TstatTimer = TstatTimerMax;
// горелку держать выключённой не менее заданного в TstatTimerMax времени
0286
}
0287
}
0288
if
(Temperature < TstatTemp)
0289
{
0290
if
( digitalRead(Relay) == !RelayOn )
// если горелка выключена -
0291
{
0292
digitalWrite(Relay, RelayOn);
// включить горелку
0293
TstatTimer = TstatTimerMax;
// горелку держать включённой не менее заданного в TstatTimerMax времени
0294
}
0295
}
0296
}
0297
0298
// если прошла 1 секунда - делаем ежесекундные дела
0299
if
(plus1sec) {
0300
plus1sec =
false
;
// сбрасываем до следующей секунды
0301
// обновляем часы
0302
RTC.readClock();
0303
Hours=RTC.getHours();
0304
Minutes=RTC.getMinutes();
0305
Seconds=RTC.getSeconds();
0306
0307
// измеряем температуру воздуха
0308
DS18B20TempTmp = DS18B20.getTempCByIndex(0);
// получить температуру от датчика
0309
DS18B20.requestTemperatures();
// запустить новое измерение
0310
if
(DS18B20TempTmp != -127)
0311
{
0312
DS18B20Temperature += DS18B20TempTmp;
// суммируем для усреднения
0313
DS18B20iteration ++;
0314
if
(DS18B20iteration == 10)
0315
{
0316
DS18B20iteration = 0;
0317
Temperature = (DS18B20Temperature / 10) + TemperatureCorr;
//усреднённая + коррекция
0318
DS18B20Temperature = 0;
0319
}
0320
}
0321
0322
// если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту
0323
//(экономия ресурса EE)
0324
if
((EEPROM_float_read(TstatTempEEaddr) != TstatTemp)&(Seconds == 0)) {
0325
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0326
}
0327
0328
// проверка Timer1 и изменение уставки термостата при совпадении
0329
if
((Hours == Timer1Hours)&(Minutes == Timer1Minutes)&(Timer1Enabled)&(Seconds == 0)) {
// время T1 совпадает с RTC
0330
Timer1Activated =
true
;
0331
Timer2Activated =
false
;
0332
Timer3Activated =
false
;
0333
Timer4Activated =
false
;
0334
TstatTemp = Timer1Temp;
0335
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0336
if
(BeepEnabled) {
0337
tone(BeepPin,4000,5);
0338
}
0339
}
0340
0341
// проверка Timer2 и изменение уставки термостата при совпадении
0342
if
((Hours == Timer2Hours)&(Minutes == Timer2Minutes)&(Timer2Enabled)&(Seconds == 0)) {
// время T2 совпадает с RTC
0343
Timer1Activated =
false
;
0344
Timer2Activated =
true
;
0345
Timer3Activated =
false
;
0346
Timer4Activated =
false
;
0347
TstatTemp = Timer2Temp;
0348
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0349
if
(BeepEnabled) {
0350
tone(BeepPin,4000,5);
0351
}
0352
}
0353
0354
// проверка Timer3 и изменение уставки термостата при совпадении
0355
if
((Hours == Timer3Hours)&(Minutes == Timer3Minutes)&(Timer3Enabled)&(Seconds == 0)) {
// время T3 совпадает с RTC
0356
Timer1Activated =
false
;
0357
Timer2Activated =
false
;
0358
Timer3Activated =
true
;
0359
Timer4Activated =
false
;
0360
TstatTemp = Timer3Temp;
0361
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0362
if
(BeepEnabled) {
0363
tone(BeepPin,4000,5);
0364
}
0365
}
0366
0367
// проверка Timer4 и изменение уставки термостата при совпадении
0368
if
((Hours == Timer4Hours)&(Minutes == Timer4Minutes)&(Timer4Enabled)&(Seconds == 0)) {
// время T4 совпадает с RTC
0369
Timer1Activated =
false
;
0370
Timer2Activated =
false
;
0371
Timer3Activated =
false
;
0372
Timer4Activated =
true
;
0373
TstatTemp = Timer4Temp;
0374
EEPROM_float_write(TstatTempEEaddr, TstatTemp);
0375
if
(BeepEnabled) {
0376
tone(BeepPin,4000,5);
0377
}
0378
}
0379
0380
// дебаг-инфо - в терминал
0381
#ifdef serialenabled
0382
Serial
.print(F(
"Temp="
));
0383
Serial
.print(Temperature, 1);
0384
Serial
.print(F(
"("
));
0385
Serial
.print(DS18B20Temperature, 4);
0386
Serial
.print(F(
",corr "
));
0387
Serial
.print(TemperatureCorr, 1);
0388
Serial
.print(F(
"),TstatTimer="
));
0389
Serial
.println(TstatTimer);
0390
#endif
0391
0392
if
(Temperature < AlarmTemp) {
0393
tone(BeepPin,4000,5);
0394
}
0395
}
0396
0397
// обработка поворота энкодера на лету (ручное изменение уставки температуры))
0398
rotating =
true
;
// reset the debouncer
0399
if
((encoderR)^(encoderL)) {
0400
if
(encoderR) {
0401
TstatTemp += 0.1;
0402
}
0403
else
0404
{
0405
TstatTemp -= 0.1;
0406
}
0407
TstatTemp = constrain(TstatTemp, 10, 35);
0408
encoderR =
false
;
0409
encoderL =
false
;
0410
Timer1Activated =
false
;
0411
Timer2Activated =
false
;
0412
Timer3Activated =
false
;
0413
Timer4Activated =
false
;
0414
}
0415
0416
// ================ по нажатию кнопки энкодера - меню настроек ====================
0417
if
(digitalRead(encoderK) == 0) {
0418
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0419
lcd.clear();
0420
lcd.setCursor(0, 0);
//инфо на LCD
0421
lcd.print(F(
"< SETUP >"
));
0422
if
(BeepEnabled) {
0423
tone(BeepPin,4000,50);
0424
}
0425
delay(200);
0426
int
menuitem = 0;
0427
0428
do
{
0429
rotating =
true
;
// reset the debouncer
0430
if
((encoderR)^(encoderL)) {
0431
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0432
if
(encoderR) { menuitem += 1; }
0433
else
{ menuitem -= 1; }
0434
if
( menuitem > 8 ) { menuitem = 0; }
// границы пунктов меню
0435
if
( menuitem < 0 ) { menuitem = 8; }
0436
encoderR =
false
;
0437
encoderL =
false
;
0438
}
0439
0440
// индикация пункта меню (номер пункта - в menuitem)
0441
lcd.setCursor(0, 1);
//инфо на LCD
0442
switch
(menuitem)
0443
{
0444
case
0:
0445
lcd.print(F(
"0.BACK "
));
0446
break
;
0447
case
1:
0448
lcd.print(F(
"1.TIMER "
));
0449
lcd.write(0x04);
0450
lcd.print(F(
" SET"
));
0451
break
;
0452
case
2:
0453
lcd.print(F(
"2.TIMER "
));
0454
lcd.write(0x03);
0455
lcd.print(F(
" SET"
));
0456
break
;
0457
case
3:
0458
lcd.print(F(
"3.TIMER "
));
0459
lcd.print(F(
"B SET"
));
0460
break
;
0461
case
4:
0462
lcd.print(F(
"3.TIMER "
));
0463
lcd.print(F(
"H SET"
));
0464
break
;
0465
case
5:
0466
lcd.print(F(
"5.CLOCK SET "
));
0467
break
;
0468
case
6:
0469
lcd.print(F(
"6.HYSTERESIS SET"
));
0470
break
;
0471
case
7:
0472
lcd.print(F(
"7.T-CORRECT SET "
));
0473
break
;
0474
case
8:
0475
lcd.print(F(
"8.SOUND SET "
));
0476
break
;
0477
case
9:
0478
lcd.print(F(
"9.T-ALARM SET "
));
0479
break
; }
0480
if
(MenuTimeoutTimer == 0) {
0481
menuitem = 0;
0482
}
0483
0484
}
0485
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0486
// если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem)
0487
if
(BeepEnabled) {
0488
tone(BeepPin,4000,50);
0489
}
0490
switch
(menuitem)
0491
{
0492
// ====== пункт 0 - выход
0493
case
0:
0494
if
(BeepEnabled) {
0495
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
0496
}
//звук "NO"
0497
break
;
// case 0 out
0498
0499
// ====== пункт 1 - установка Timer1
0500
case
1:
0501
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0502
lcd.clear();
0503
lcd.setCursor(0, 0);
//инфо на LCD
0504
lcd.print(F(
"SETUP TIMER "
));
0505
lcd.write(0x04);
0506
delay(200);
0507
Hours=Timer1Hours;
0508
Minutes=Timer1Minutes;
0509
SetYesNo =
false
;
0510
PrintYesNo =
true
;
0511
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
0512
if
(MenuTimeoutTimer != 0) {
0513
if
(SetYesNo)
// если при установке времени выбрано "Yes"
0514
{
0515
if
(BeepEnabled) {
0516
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0517
}
0518
Timer1Hours = Hours;
0519
Timer1Minutes = Minutes;
0520
Timer1Enabled =
true
;
0521
EEPROM.write(Timer1HoursEEaddr, Timer1Hours);
0522
EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes);
0523
EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
0524
0525
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0526
lcd.clear();
0527
lcd.setCursor(0, 0);
//инфо на LCD
0528
lcd.print(F(
"Timer "
));
0529
lcd.write(0x04);
0530
lcd.print(F(
" Temp.Set"
));
0531
delay(200);
0532
do
{
0533
lcd.setCursor(0,1);
0534
if
(blink500ms) {
0535
lcd.print(F(
" "
));
0536
}
0537
else
{
0538
lcd.print(Timer1Temp, 1);
0539
lcd.write(0x02);
// значок градуса
0540
}
0541
rotating =
true
;
// reset the debouncer
0542
if
(encoderR) {
0543
Timer1Temp += 0.1;
0544
encoderR =
false
;
0545
}
0546
if
(encoderL) {
0547
Timer1Temp -= 0.1;
0548
encoderL =
false
;
0549
}
0550
Timer1Temp = constrain(Timer1Temp, 10, 35);
// крайние значения
0551
}
0552
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0553
0554
if
(MenuTimeoutTimer != 0) {
// если после выбора температуры нажата кнопка энкодера
0555
EEPROM_float_write(Timer1TempEEaddr, Timer1Temp);
0556
if
(BeepEnabled) {
0557
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0558
}
0559
}
0560
else
{
// если не нажата - используем старую температуру
0561
Timer1Temp = EEPROM_float_read(Timer1TempEEaddr);
0562
if
(BeepEnabled) {
0563
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0564
}
0565
}
0566
0567
}
0568
else
// если при установке времени выбрано "No"
0569
{
0570
if
(BeepEnabled) {
0571
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0572
}
0573
Timer1Enabled =
false
;
0574
EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled);
0575
Timer1Hours = EEPROM.read(Timer1HoursEEaddr);
0576
Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr);
0577
}
0578
}
0579
else
{
0580
if
(BeepEnabled) {
0581
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0582
}
0583
}
0584
break
;
// case 1 out
0585
0586
// ====== пункт 2 - установка Timer2
0587
case
2:
0588
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0589
lcd.clear();
0590
lcd.setCursor(0, 0);
//инфо на LCD
0591
lcd.print(F(
"SETUP TIMER "
));
0592
lcd.write(0x03);
0593
delay(200);
0594
Hours=Timer2Hours;
0595
Minutes=Timer2Minutes;
0596
SetYesNo =
false
;
0597
PrintYesNo =
true
;
0598
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
0599
if
(MenuTimeoutTimer != 0) {
0600
if
(SetYesNo)
// если при установке времени выбрано "Yes"
0601
{
0602
if
(BeepEnabled) {
0603
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0604
}
0605
Timer2Hours = Hours;
0606
Timer2Minutes = Minutes;
0607
Timer2Enabled =
true
;
0608
EEPROM.write(Timer2HoursEEaddr, Timer2Hours);
0609
EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes);
0610
EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
0611
0612
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0613
lcd.clear();
0614
lcd.setCursor(0, 0);
//инфо на LCD
0615
lcd.print(F(
"Timer "
));
0616
lcd.write(0x03);
0617
lcd.print(F(
" Temp.Set"
));
0618
delay(200);
0619
do
{
0620
lcd.setCursor(0,1);
0621
if
(blink500ms) {
0622
lcd.print(F(
" "
));
0623
}
0624
else
{
0625
lcd.print(Timer2Temp, 1);
0626
lcd.write(0x02);
// значок градуса
0627
}
0628
rotating =
true
;
// reset the debouncer
0629
if
(encoderR) {
0630
Timer2Temp += 0.1;
0631
encoderR =
false
;
0632
}
0633
if
(encoderL) {
0634
Timer2Temp -= 0.1;
0635
encoderL =
false
;
0636
}
0637
Timer2Temp = constrain(Timer2Temp, 10, 35);
// крайние значения
0638
}
0639
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0640
0641
if
(MenuTimeoutTimer != 0) {
// если после выбора температуры нажата кнопка энкодера
0642
EEPROM_float_write(Timer2TempEEaddr, Timer2Temp);
0643
if
(BeepEnabled) {
0644
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0645
}
0646
}
0647
else
{
// если не нажата - используем старую температуру
0648
Timer2Temp = EEPROM_float_read(Timer2TempEEaddr);
0649
if
(BeepEnabled) {
0650
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0651
}
0652
}
0653
0654
}
0655
else
// если при установке времени выбрано "No"
0656
{
0657
if
(BeepEnabled) {
0658
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0659
}
0660
Timer2Enabled =
false
;
0661
EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled);
0662
Timer2Hours = EEPROM.read(Timer2HoursEEaddr);
0663
Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr);
0664
}
0665
}
0666
else
{
0667
if
(BeepEnabled) {
0668
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0669
}
0670
}
0671
break
;
// case 2 out
0672
0673
// ====== пункт 3 - установка Timer3
0674
case
3:
0675
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0676
lcd.clear();
0677
lcd.setCursor(0, 0);
//инфо на LCD
0678
lcd.print(F(
"SETUP TIMER B"
));
0679
delay(200);
0680
Hours=Timer3Hours;
0681
Minutes=Timer3Minutes;
0682
SetYesNo =
false
;
0683
PrintYesNo =
true
;
0684
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
0685
if
(MenuTimeoutTimer != 0) {
0686
if
(SetYesNo)
// если при установке времени выбрано "Yes"
0687
{
0688
if
(BeepEnabled) {
0689
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0690
}
0691
Timer3Hours = Hours;
0692
Timer3Minutes = Minutes;
0693
Timer3Enabled =
true
;
0694
EEPROM.write(Timer3HoursEEaddr, Timer3Hours);
0695
EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes);
0696
EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
0697
0698
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0699
lcd.clear();
0700
lcd.setCursor(0, 0);
//инфо на LCD
0701
lcd.print(F(
"Timer B Temp.Set"
));
0702
delay(200);
0703
do
{
0704
lcd.setCursor(0,1);
0705
if
(blink500ms) {
0706
lcd.print(F(
" "
));
0707
}
0708
else
{
0709
lcd.print(Timer3Temp, 1);
0710
lcd.write(0x02);
// значок градуса
0711
}
0712
rotating =
true
;
// reset the debouncer
0713
if
(encoderR) {
0714
Timer3Temp += 0.1;
0715
encoderR =
false
;
0716
}
0717
if
(encoderL) {
0718
Timer3Temp -= 0.1;
0719
encoderL =
false
;
0720
}
0721
Timer3Temp = constrain(Timer3Temp, 10, 35);
// крайние значения
0722
}
0723
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0724
0725
if
(MenuTimeoutTimer != 0) {
// если после выбора температуры нажата кнопка энкодера
0726
EEPROM_float_write(Timer3TempEEaddr, Timer3Temp);
0727
if
(BeepEnabled) {
0728
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0729
}
0730
}
0731
else
{
// если не нажата - используем старую температуру
0732
Timer3Temp = EEPROM_float_read(Timer3TempEEaddr);
0733
if
(BeepEnabled) {
0734
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0735
}
0736
}
0737
0738
}
0739
else
// если при установке времени выбрано "No"
0740
{
0741
if
(BeepEnabled) {
0742
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0743
}
0744
Timer3Enabled =
false
;
0745
EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled);
0746
Timer3Hours = EEPROM.read(Timer3HoursEEaddr);
0747
Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr);
0748
}
0749
}
0750
else
{
0751
if
(BeepEnabled) {
0752
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0753
}
0754
}
0755
break
;
// case 3 out
0756
0757
// ====== пункт 4 - установка Timer4
0758
case
4:
0759
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0760
lcd.clear();
0761
lcd.setCursor(0, 0);
//инфо на LCD
0762
lcd.print(F(
"SETUP TIMER H"
));
0763
delay(200);
0764
Hours=Timer4Hours;
0765
Minutes=Timer4Minutes;
0766
SetYesNo =
false
;
0767
PrintYesNo =
true
;
0768
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
0769
if
(MenuTimeoutTimer != 0) {
0770
if
(SetYesNo)
// если при установке времени выбрано "Yes"
0771
{
0772
if
(BeepEnabled) {
0773
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0774
}
0775
Timer4Hours = Hours;
0776
Timer4Minutes = Minutes;
0777
Timer4Enabled =
true
;
0778
EEPROM.write(Timer4HoursEEaddr, Timer4Hours);
0779
EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes);
0780
EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
0781
0782
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0783
lcd.clear();
0784
lcd.setCursor(0, 0);
//инфо на LCD
0785
lcd.print(F(
"Timer H Temp.Set"
));
0786
delay(200);
0787
do
{
0788
lcd.setCursor(0,1);
0789
if
(blink500ms) {
0790
lcd.print(F(
" "
));
0791
}
0792
else
{
0793
lcd.print(Timer4Temp, 1);
0794
lcd.write(0x02);
// значок градуса
0795
}
0796
rotating =
true
;
// reset the debouncer
0797
if
(encoderR) {
0798
Timer4Temp += 0.1;
0799
encoderR =
false
;
0800
}
0801
if
(encoderL) {
0802
Timer4Temp -= 0.1;
0803
encoderL =
false
;
0804
}
0805
Timer4Temp = constrain(Timer4Temp, 10, 35);
// крайние значения
0806
}
0807
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0808
0809
if
(MenuTimeoutTimer != 0) {
// если после выбора температуры нажата кнопка энкодера
0810
EEPROM_float_write(Timer4TempEEaddr, Timer4Temp);
0811
if
(BeepEnabled) {
0812
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0813
}
0814
}
0815
else
{
// если не нажата - используем старую температуру
0816
Timer4Temp = EEPROM_float_read(Timer4TempEEaddr);
0817
if
(BeepEnabled) {
0818
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0819
}
0820
}
0821
0822
}
0823
else
// если при установке времени выбрано "No"
0824
{
0825
if
(BeepEnabled) {
0826
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0827
}
0828
Timer4Enabled =
false
;
0829
EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled);
0830
Timer4Hours = EEPROM.read(Timer4HoursEEaddr);
0831
Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr);
0832
}
0833
}
0834
else
{
0835
if
(BeepEnabled) {
0836
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0837
}
0838
}
0839
break
;
// case 4 out
0840
0841
// ====== пункт 5 - установка RTC
0842
case
5:
0843
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0844
lcd.clear();
0845
lcd.setCursor(0, 0);
//инфо на LCD
0846
lcd.print(F(
"SETUP CLOCK"
));
0847
delay(200);
0848
RTC.readClock();
0849
Hours=RTC.getHours();
0850
Minutes=RTC.getMinutes();
0851
SetYesNo =
false
;
0852
PrintYesNo =
true
;
0853
SetTime(0,1);
// в позиции 0,1 - запрос ввода времени
0854
if
(MenuTimeoutTimer != 0) {
0855
if
(SetYesNo)
0856
{
0857
if
(BeepEnabled) {
0858
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0859
}
0860
RTC.setHours(Hours);
0861
RTC.setMinutes(Minutes);
0862
RTC.setSeconds(0);
0863
RTC.setClock();
0864
RTC.start();
//старт часов
0865
}
0866
else
0867
{
0868
if
(BeepEnabled) {
0869
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0870
}
0871
}
0872
}
0873
else
{
0874
if
(BeepEnabled) {
0875
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0876
}
0877
}
0878
break
;
// case 5 out
0879
0880
// ====== пункт 6 - установка гистерезиса
0881
case
6:
0882
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0883
HysteresisOld = Hysteresis;
0884
lcd.clear();
0885
lcd.setCursor(0, 0);
//инфо на LCD
0886
lcd.print(F(
"SETUP HYSTERESIS"
));
0887
delay(200);
0888
do
{
0889
lcd.setCursor(0,1);
0890
if
(blink500ms) {
0891
lcd.print(
" "
);
0892
}
0893
else
{
0894
lcd.print(Hysteresis, 1);
0895
lcd.write(0x02);
// значок градуса
0896
}
0897
rotating =
true
;
// reset the debouncer
0898
if
(encoderR) {
0899
Hysteresis += 0.1;
0900
encoderR =
false
;
0901
}
0902
if
(encoderL) {
0903
Hysteresis -= 0.1;
0904
encoderL =
false
;
0905
}
0906
Hysteresis = constrain(Hysteresis, 0.1, 1);
// крайние значения
0907
}
0908
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0909
if
(MenuTimeoutTimer != 0) {
0910
EEPROM_float_write(HysteresisEEaddr, Hysteresis);
// запись в ЕЕПРОМ
0911
if
(BeepEnabled) {
0912
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0913
}
0914
}
0915
else
{
0916
Hysteresis = HysteresisOld;
0917
if
(BeepEnabled) {
0918
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0919
}
0920
}
0921
break
;
// case 6 out
0922
0923
// ====== пункт 7 - установка коррекции температуры
0924
case
7:
0925
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0926
lcd.clear();
0927
lcd.setCursor(0, 0);
//инфо на LCD
0928
lcd.print(F(
"SETUP T-CORRECT "
));
0929
delay(200);
0930
do
{
0931
lcd.setCursor(0,1);
0932
if
(blink500ms) {
0933
lcd.print(F(
" "
));
0934
}
0935
else
{
0936
if
(TemperatureCorr >= 0) {
0937
lcd.print(F(
"+"
));
0938
}
0939
0940
lcd.print(TemperatureCorr, 1);
0941
lcd.write(0x02);
// значок градуса
0942
}
0943
rotating =
true
;
// reset the debouncer
0944
if
(encoderR) {
0945
TemperatureCorr += 0.1;
0946
encoderR =
false
;
0947
}
0948
if
(encoderL) {
0949
TemperatureCorr -= 0.1;
0950
encoderL =
false
;
0951
}
0952
TemperatureCorr = constrain(TemperatureCorr, -8, 8);
// крайние значения
0953
}
0954
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0955
0956
if
(MenuTimeoutTimer != 0) {
0957
EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr);
// запись в ЕЕПРОМ
0958
if
(BeepEnabled) {
0959
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0960
}
0961
}
0962
else
{
0963
TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr);
0964
if
(BeepEnabled) {
0965
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
0966
}
0967
}
0968
break
;
// case 7 out
0969
0970
// ====== пункт 8 - вкл/выкл звука
0971
case
8:
0972
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
0973
lcd.clear();
0974
lcd.setCursor(0, 0);
//инфо на LCD
0975
lcd.print(F(
"SOUND SET "
));
0976
delay(200);
0977
do
{
0978
lcd.setCursor(0,1);
0979
if
(BeepEnabled) {
0980
lcd.print(F(
"BEEP ON "
));
0981
}
0982
else
{
0983
lcd.print(F(
"BEEP OFF "
));
0984
}
0985
0986
rotating =
true
;
// reset the debouncer
0987
if
((encoderR)^(encoderL)) {
0988
BeepEnabled = !BeepEnabled;
0989
encoderR =
false
;
0990
encoderL =
false
;
0991
}
0992
}
0993
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
0994
0995
if
(MenuTimeoutTimer != 0) {
0996
if
(BeepEnabled) {
0997
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
0998
}
0999
EEPROM.write(BeepEnabledEEaddr, BeepEnabled);
1000
}
1001
if
(MenuTimeoutTimer == 0) {
1002
BeepEnabled = EEPROM.read(BeepEnabledEEaddr);
1003
}
1004
break
;
// case 8 out
1005
1006
// ====== пункт 9 - установка коррекции температуры
1007
case
9:
1008
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
1009
lcd.clear();
1010
lcd.setCursor(0, 0);
//инфо на LCD
1011
lcd.print(F(
"ALARM-TEMP SET "
));
1012
delay(200);
1013
do
{
1014
lcd.setCursor(0,1);
1015
if
(blink500ms) {
1016
lcd.print(F(
" "
));
1017
}
1018
else
{
1019
if
(AlarmTemp >= 0) {
1020
lcd.print(F(
"+"
));
1021
}
1022
1023
lcd.print(AlarmTemp, 0);
1024
lcd.write(0x02);
// значок градуса
1025
}
1026
rotating =
true
;
// reset the debouncer
1027
if
(encoderR) {
1028
AlarmTemp += 1;
1029
encoderR =
false
;
1030
}
1031
if
(encoderL) {
1032
AlarmTemp -= 1;
1033
encoderL =
false
;
1034
}
1035
AlarmTemp = constrain(AlarmTemp, 15, 30);
// крайние значения
1036
}
1037
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
1038
1039
if
(MenuTimeoutTimer != 0) {
1040
EEPROM_float_write(AlarmTempEEaddr, AlarmTemp);
// запись в ЕЕПРОМ
1041
if
(BeepEnabled) {
1042
tone(BeepPin,BeepToneYes,BeepToneYesDuration);
//звук "YES"
1043
}
1044
}
1045
else
{
1046
AlarmTemp = EEPROM_float_read(AlarmTempEEaddr);
1047
if
(BeepEnabled) {
1048
tone(BeepPin,BeepToneNo,BeepToneNoDuration);
//звук "NO"
1049
}
1050
}
1051
break
;
// case 9 out
1052
1053
}
1054
1055
delay(200);
1056
lcd.clear();
1057
}
1058
}
1059
1060
// ===== SUBROUTINES ==================================================================
1061
1062
// ========================================
1063
void
SetTime(
char
x,
char
y)
1064
{
1065
// ========= set hours
1066
SetH =
true
;
1067
do
{
1068
PrintRTC(x,y);
1069
rotating =
true
;
// reset the debouncer
1070
if
(encoderR) {
1071
Hours += 1;
1072
if
(Hours > 23) {
1073
Hours = 0;
1074
};
1075
encoderR =
false
;
1076
}
1077
if
(encoderL) {
1078
Hours -= 1;
1079
if
(Hours < 0) {
1080
Hours = 23;
1081
};
1082
encoderL =
false
;
1083
}
1084
}
1085
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
1086
if
(BeepEnabled) {
1087
tone(BeepPin,4000,50);
//звук "YES"
1088
}
1089
SetH =
false
;
1090
delay(200);
1091
// ========= set minutes
1092
SetM =
true
;
1093
do
{
1094
PrintRTC(0,1);
1095
rotating =
true
;
// reset the debouncer
1096
if
(encoderR) {
1097
Minutes += 1;
1098
if
(Minutes > 59) {
1099
Minutes = 0;
1100
};
1101
encoderR =
false
;
1102
}
1103
if
(encoderL) {
1104
Minutes -= 1;
1105
if
(Minutes < 0) {
1106
Minutes = 59;
1107
};
1108
encoderL =
false
;
1109
}
1110
}
1111
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
1112
if
(BeepEnabled) {
1113
tone(BeepPin,4000,50);
//звук "YES"
1114
}
1115
if
(PrintYesNo) {
1116
SetM =
false
;
1117
delay(200);
1118
// ========= set yes-no
1119
SetYesNo =
false
;
1120
do
{
1121
PrintRTC(0,1);
1122
rotating =
true
;
// reset the debouncer
1123
if
((encoderR)||(encoderL)) {
1124
SetYesNo = !SetYesNo;
1125
encoderR =
false
;
1126
encoderL =
false
;
1127
}
1128
}
1129
while
((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0));
1130
delay(200);
1131
}
1132
1133
}
1134
1135
// ========================================
1136
void
PrintRTC(
char
x,
char
y)
1137
{
1138
lcd.setCursor(x,y);
1139
if
(SetH&&blink500ms) {
1140
lcd.print(F(
" "
));
1141
}
1142
else
{
1143
if
(Hours < 10) {
1144
lcd.print(F(
"0"
));
1145
}
1146
lcd.print(Hours);
1147
}
1148
1149
// мигающее двоеточие, если не в режиме установки времени
1150
if
(!(SetH||SetM||PrintYesNo||blink500ms))
1151
{
1152
lcd.print(F(
" "
));
1153
}
1154
else
{
1155
lcd.print(F(
":"
));
1156
}
1157
1158
if
(SetM&&blink500ms) {
1159
lcd.print(F(
" "
));
1160
}
1161
else
{
1162
if
(Minutes < 10) {
1163
lcd.print(F(
"0"
));
1164
}
1165
lcd.print(Minutes);
1166
}
1167
lcd.print(F(
" "
));
1168
1169
if
(PrintYesNo) {
1170
lcd.print(F(
"["
));
1171
if
(!(SetH||SetM||blink500ms))
1172
{
1173
lcd.print(F(
" "
));
1174
}
1175
else
{
1176
if
(SetYesNo)
1177
{
1178
lcd.print(F(
"YES"
));
1179
}
1180
else
{
1181
lcd.print(F(
"NO "
));
1182
}
1183
}
1184
lcd.print(F(
"]"
));
1185
}
1186
1187
}
1188
1189
// ========= чтение/запись float в EE =====
1190
void
EEPROM_float_write(
int
addr,
float
val)
// запись в ЕЕПРОМ
1191
{
1192
byte
*x = (
byte
*)&val;
1193
for
(
byte
i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
1194
}
1195
1196
float
EEPROM_float_read(
int
addr)
// чтение из ЕЕПРОМ
1197
{
1198
byte
x[4];
1199
for
(
byte
i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
1200
float
*y = (
float
*)&x;
1201
return
y[0];
1202
}
1203
// ========================================
1204
1205
// ============================ Encoder interrupts =============================
1206
// Interrupt on A changing state
1207
void
doEncoderA(){
1208
if
( rotating ) {
1209
delay (1) ;
// wait a little until the bouncing is done
1210
}
1211
// Test transition, did things really change?
1212
if
( digitalRead(encoderA) != A_set ) {
// debounce once more
1213
A_set = !A_set;
1214
// adjust counter + if A leads B
1215
if
( A_set && !B_set )
1216
{
1217
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
1218
if
(BeepEnabled) {
1219
tone(BeepPin,4000,5);
1220
}
1221
encoderR =
true
;
1222
rotating =
false
;
// no more debouncing until loop() hits again
1223
}
1224
}
1225
}
1226
// Interrupt on B changing state, same as A above
1227
void
doEncoderB(){
1228
if
( rotating ) {
1229
delay (1);
1230
}
1231
if
( digitalRead(encoderB) != B_set ) {
1232
B_set = !B_set;
1233
// adjust counter - 1 if B leads A
1234
if
( B_set && !A_set ) {
1235
MenuTimeoutTimer = 10;
//таймер таймаута, секунд
1236
if
(BeepEnabled) {
1237
tone(BeepPin,4000,5);
1238
}
1239
encoderL =
true
;
1240
rotating =
false
;
1241
}
1242
}
1243
}
1244
// ============================ Timer0 interrupt =============================
1245
// run every 500ms
1246
void
timerIsr()
1247
{
1248
blink500ms = !blink500ms;
// инверсия мерцающего бита
1249
if
(blink500ms) {
1250
plus1sec =
true
;
// ежесекундно взводится
1251
if
(TstatTimer != 0) {
1252
TstatTimer --;
// ежесекундный декремент этого таймера
1253
}
1254
if
(MenuTimeoutTimer != 0) {
1255
MenuTimeoutTimer --;
// ежесекундный декремент этого таймера
1256
}
1257
}
1258
}
Доброе время суток!!!! Проект очень нравится, собрал со второй станицы, но есть промблема - нет показания температуры - в верхней строке в правом углу показывает моргающую звезду в так пищалки и одни нули. Дотчик исправный в другом проекте работает, схема без ошибок. Прошу помощи. Спасибо. С уважением Виктор R2PM
надо воспользоваться этим:
//#define serialenabled // раскомментировать для выдачи в порт отладочной инфы
и в мониторе порта проверить показания датчика
надо воспользоваться этим:
//#define serialenabled // раскомментировать для выдачи в порт отладочной инфы
и в мониторе порта проверить показания датчика
Спасибо за ответ! Какую команду подавать в мониторинге порта?
Что на экране при работающем модуле. Спасибо.
Виктор
ни какую. Там либо будут показания датчика температуры либо нули.
[quote=bagotu]
ни какую. Там либо будут показания датчика температуры либо нули.
[/quote
ПОДСКАЖИТЕ - ЧТО НА ЭКРАНЕ В ШТАТНОМ РЕЖИМЕ??
У меня на одним из термостатов была такая же проблема - оказалось энкодер был бракованный...сменил-заработало.
В штатном режиме на ЛСД- показания: часы, температура с датчика
Р1Р2Р3Р4 (программы) , заданная температура
#include <hd44780.h>
0003
#include <hd44780ioClass/hd44780_I2Cexp.h>
Выдает ошибку..а какую библиотеку использовали?
Ошибочка))) не Р1, а Т1Т2Т3Т4
#include <hd44780.h>
0003
#include <hd44780ioClass/hd44780_I2Cexp.h>
Выдает ошибку..а какую библиотеку использовали?
Доброе время суток!!!!
Спасибо за отвкт!!!! библиотека стандартная из среды 1.6.13, остальные погружал
Так у меня часы то тикают - нет промблем, в нижней строчке правом углу с энкодера идёт изменение величины температуры, а вверху одни нули
Сейчас дома запускаю мониторинг порта.
Виктор
Всем привет!!!
Мониторинг порта выдаёт 0.0 - что и вижу на экране.
Вот блин дела - не пойму что не так, с датчика с вывода данных резистор подтягивающий есть, сам вывод подключен к А1, может что ешё надо подключить, да и реле не срабатывает, что с Д12, нет надо с "бубном". Кто знает "пните" в нужном направлении.
С уважением Виктор R2PM
по дисплею
ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.
в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,
а затем внести их в скетч.
по датчику.
в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))
вам там по месту виднее
по дисплею
ясно будет выдавать скорее всего. надо смотреть какой у вас дисплей и подгружать ему свою библиотеку.
в идеале надо с ним отдельно поиграться через примеры в программе ардуино до появления заветного Hello World,
а затем внести их в скетч.
по датчику.
в общим он не работает. по этому и нули на дисплее. может где-то обрыв. питание на него приходит? заменить его на такой же вместе с исправными проводами... )))
вам там по месту виднее
Так весь прикол, что в другой кострукции он работает, он же , фикус да и только, Объясните пожалуста LCD здесь причём он всё отображает, или я что то "не догоняю"
Виктор
это к этому:
#include <hd44780.h>
0003
#include <hd44780ioClass/hd44780_I2Cexp.h>
Выдает ошибку..а какую библиотеку использовали?
LCD к градуснику не причем.
надо внимательно просмотреть и прозвонить цепи. бывает.
может отвалилось чего...