Добрый день отличный скейтч только вот немогу разобраться как подключить термодатчики? какие вы использываете и где прописаны пины для их подключения? буду благодарен за помощь, кстати часы поставил 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) Делаю термостат ради интереса и для себя. Понимаю, что можно было купить готовый и дешевле, но мне хочеться разобраться и сделать самому.
а не хочется ли иметь визуальный контроль за работой тупого котла ?
у заказчика - стрелочные-мембранные датчики Т подачи и обратки....
неудобно и нефейшуйно :)
заказчик - брат в другом городе , т.е. делаю как сибе !
[code]
/* Программа "Комнатный термостат"
Допоборудование - ds18b20(вывод 2 )- 3 датчика (комнатный, уличный, на котловую воду), ds3231(выводы 5-SCL и 4-SDA) и lcd1602.
Функция - замеряет температуру в помещении и на основании ее сравнения с установленными пользователями включает или выключает нагрузку.
Доброго времени суток
При проверке кода выдает следующее:
(как лечить?)
C:\Users\Ihor\Documents\Arduino\sketch_oct21_main_code\sketch_oct21_main_code.ino: In function 'void poluchenie_wremeni()':
Доброго времени суток! Очень интересный проект! Только вот при компиляции сразу выдает ошибку :
In file included from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:0:
C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:159:22: error: conflicting declaration 'EEPROMClassEx EEPROM'
extern EEPROMClassEx EEPROM;
^
In file included from C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:23:0,
from C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:
C:\Program Files\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:145:20: note: previous declaration as 'EEPROMClass EEPROM'
static EEPROMClass EEPROM;
^
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void setup()':
sketch_oct24c:119: error: 'doEncoderA' was not declared in this scope
sketch_oct24c:120: error: 'doEncoderB' was not declared in this scope
sketch_oct24c:122: error: 'timerIsr' was not declared in this scope
sketch_oct24c:123: error: 'struct EEPROMClass' has no member named 'setMaxAllowedWrites'
sketch_oct24c:133: error: 'struct EEPROMClass' has no member named 'updateBlock'
sketch_oct24c:135: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:136: error: 'struct EEPROMClass' has no member named 'updateByte'
sketch_oct24c:137: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:138: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:139: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:150: error: 'struct EEPROMClass' has no member named 'readByte'
sketch_oct24c:151: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:152: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:153: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:154: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:157: error: 'struct EEPROMClass' has no member named 'readBlock'
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void loop()':
sketch_oct24c:215: error: 'PrintRTC' was not declared in this scope
sketch_oct24c:264: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:265: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:275: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:404: error: 'TimerXSetup' was not declared in this scope
sketch_oct24c:434: error: 'SetTime' was not declared in this scope
sketch_oct24c:491: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:538: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:544: error: 'struct EEPROMClass' has no member named 'readFloat'
sketch_oct24c:580: error: 'struct EEPROMClass' has no member named 'updateByte'
sketch_oct24c:583: error: 'struct EEPROMClass' has no member named 'readByte'
sketch_oct24c:621: error: 'struct EEPROMClass' has no member named 'updateFloat'
sketch_oct24c:627: error: 'struct EEPROMClass' has no member named 'readFloat'
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void SetTime(char, char)':
sketch_oct24c:649: error: 'PrintRTC' was not declared in this scope
sketch_oct24c:675: error: 'PrintRTC' was not declared in this scope
sketch_oct24c:702: error: 'PrintRTC' was not declared in this scope
C:\Documents and Settings\123\Мои документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void TimerXSetup(int)':
sketch_oct24c:847: error: 'struct EEPROMClass' has no member named 'updateBlock'
sketch_oct24c:879: error: 'struct EEPROMClass' has no member named 'updateBlock'
sketch_oct24c:885: error: 'struct EEPROMClass' has no member named 'readBlock'
sketch_oct24c:897: error: 'struct EEPROMClass' has no member named 'readBlock'
sketch_oct24c:899: error: 'struct EEPROMClass' has no member named 'updateBlock'
exit status 1
'doEncoderA' was not declared in this scope
Мониторинг порта выдаёт 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, номера выходов под себя менял:
/* Суточный термостат для котла Baxi Mainfour 240F >Encoder control >DS18B20 thermal sensor >LCD1602 parallel >DS1307 RTC */ //#include <avr\eeprom.h> #include <Wire.h> // i2c (для RTC) #include <RealTimeClockDS1307.h> // RTC #include <EEPROMex.h> // EE #include <LiquidCrystal_I2C.h> #include <TimerOne.h> // прерывания по таймеру1 #include <OneWire.h> // 1wire для DS18B20 #include <DallasTemperature.h> // DS18B20 #define ONE_WIRE_BUS 15 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); DeviceAddress DS18B20Address; #define encoderA 2 // энкодер - поворот вправо (об землю) #define encoderB 3 // энкодер - поворот влево (об землю) #define encoderK 4 // энкодер - кнопка (об землю) #define BeepPin 11 // пищалка #define BeepToneNo 2000 // тон звука "No", герц #define BeepToneYes 4000 // тон звука "Yes", герц #define BeepToneNoDuration 200 // длительность звука "No", мс #define BeepToneYesDuration 200 // длительность звука "Yes", мс #define Relay 12 // нога, к которой подключено реле #define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW) // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); byte block1[8] = { 0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F }; // значок градуса с пламенем снизу byte block2[8] = { 0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 }; // значок градуса #define serialenabled // раскомментировать для выдачи в порт отладочной инфы #define TstatTimerMax 180 //минимальная пауза между включениями горелки, сек unsigned int TstatTimer = 20; //таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса float DS18B20Temperature = 0; //сырая температура от датчика float Temperature = 0; //вычисленная температура с коррекцией float DS18B20TempTmp; //времянка byte DS18B20iteration = 0; //счётчик измерений температуры для усреднения float TstatTemp = 23; //температура термостатирования, может изменяться настройками float TemperatureCorr = 0; //коррекция температуры, может изменяться настройками float Hysteresis = 0.1; // гистерезис термостата, может изменяться настройками float HysteresisOld; int Hours = 0; // времянка часов RTC для отображения и установки int Minutes = 0; // времянка минут RTC для отображения и установки int Seconds; boolean PrintYesNo = false; // показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение) boolean SetH = false; // выделение часов при отображении boolean SetM = false; // выделение минут при отображении boolean SetYesNo = false; // выделение Yes/No при установке часов boolean blink500ms = false; // мигающий бит, инвертируется каждые 500мс boolean plus1sec = false; // ежесекундно взводится boolean BeepEnabled = true; byte MenuTimeoutTimer; // структура для суточных таймеров (8 байт) struct buffer_template { byte Hours; byte Minutes; float Temperature; boolean Enabled; boolean Activated; }; buffer_template Timer[4] = { 0, 0, 23.0, false, false}; //объявление 4-х суточных таймеров и их начальные значения float AlarmTemp = 10; // температура для замерзательного орала // encoder vars static boolean rotating=false; // debounce management boolean A_set = false; boolean B_set = false; boolean encoderR = false; boolean encoderL = false; // EEPROM EEMEM float TstatTempEE; //EE температура термостатирования EEMEM float TemperatureCorrEE; // EE коррекция температуры EEMEM float HysteresisEE; // EE гистерезис EEMEM boolean BeepEnabledEE; // EE признак разрешения звука EEMEM float AlarmTempEE; // EE значение недопустимого снижения температуры EEMEM buffer_template TimerEE[4]; // EE структуры для 4 суточных таймеров // ===== SETUP ======================================================================== void setup() { #ifdef serialenabled Serial.begin(9600); #endif pinMode(Relay, OUTPUT); digitalWrite(Relay, HIGH); // initialize the LCD lcd.begin(); // Turn on the blacklight and print a message. lcd.backlight(); lcd.createChar(1, block1); lcd.createChar(2, block2); pinMode(encoderA, INPUT); digitalWrite(encoderA, HIGH); pinMode(encoderB, INPUT); digitalWrite(encoderB, HIGH); pinMode(encoderK, INPUT); digitalWrite(encoderK, HIGH); attachInterrupt(0, doEncoderA, CHANGE); // encoder pin on interrupt 0 (pin 2) attachInterrupt(1, doEncoderB, CHANGE); // encoder pin on interrupt 1 (pin 3) Timer1.initialize(500000); // Timer0 interrupt - set a timer of length 500000 microseconds Timer1.attachInterrupt( timerIsr ); // attach the service routine here EEPROM.setMaxAllowedWrites(32767); if ((digitalRead(encoderK)) == 0) { // если первая запись однокристалки (зажата кнопка при включении питания)- записать начальные значения в EE lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Cold start...")); for (int i=0; i<4; i++) { // Timer[i].Hours = Timer[i].Minutes = 0; // Timer[i].Temperature = 23.0; // Timer[i].Enabled = Timer[i].Activated = false; EEPROM.updateBlock(int(&TimerEE[i]), Timer[i]); } EEPROM.updateFloat(int(&TstatTempEE), TstatTemp); EEPROM.updateByte(int(&BeepEnabledEE), BeepEnabled); EEPROM.updateFloat(int(&TemperatureCorrEE), TemperatureCorr); EEPROM.updateFloat(int(&HysteresisEE), Hysteresis); EEPROM.updateFloat(int(&AlarmTempEE), AlarmTemp); tone(BeepPin,2000,50); delay(50); tone(BeepPin,3000,50); delay(50); tone(BeepPin,4000,50); delay(1000); } lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Read settings...")); BeepEnabled = EEPROM.readByte(int(&BeepEnabledEE)); TstatTemp = EEPROM.readFloat(int(&TstatTempEE)); TemperatureCorr = EEPROM.readFloat(int(&TemperatureCorrEE)); Hysteresis = EEPROM.readFloat(int(&HysteresisEE)); AlarmTemp = EEPROM.readFloat(int(&AlarmTempEE)); for (int i=0; i<4; i++) { EEPROM.readBlock(int(&TimerEE[i]), Timer[i]); } DS18B20.begin(); DS18B20.getAddress(DS18B20Address, 0); DS18B20.setResolution(DS18B20Address, 12); DS18B20.setWaitForConversion(false); DS18B20.requestTemperatures(); tone(BeepPin,4000,50); delay(100); tone(BeepPin,4000,50); delay(1000); lcd.clear(); RTC.start(); } // ===== MAIN CYCLE =================================================================== void loop() { lcd.setCursor(8, 0); //инфо на LCD if ((Temperature < AlarmTemp)&(blink500ms)) { lcd.print(F("*")); } else { lcd.print(F(" ")); } lcd.print(F("t=")); if (Temperature < 10) { lcd.print(F(" ")); } lcd.print(Temperature,1); lcd.write(0x02); // значок градуса // если таймер включен - надпись светится, если сработал - мигает, обрабатываем все 4 таймера lcd.setCursor(0, 1); //инфо на LCD for (int i=0;i<4;i++){ if ((Timer[i].Enabled)&!((Timer[i].Activated)&(blink500ms))) { lcd.print(F("T")); lcd.print(i+1); } else { lcd.print(F(" ")); } } lcd.setCursor(9, 1); //инфо на LCD lcd.print(F("s=")); lcd.print(TstatTemp,1); if ( digitalRead(Relay) == RelayOn ) { lcd.write(0x01); // значок градуса с пламенем } else { lcd.write(0x02); // значок градуса } // печатаем текущее время PrintYesNo = false; PrintRTC(0,0); // термостатирование if ( TstatTimer == 0 ) { if ( Temperature > ( TstatTemp + Hysteresis ) ) // гистерезис { if ( digitalRead(Relay) == RelayOn ) // если горелка включена - { digitalWrite(Relay, !RelayOn); // выключить горелку TstatTimer = TstatTimerMax; // горелку держать выключённой не менее заданного в TstatTimerMax времени } } if (Temperature < TstatTemp) { if ( digitalRead(Relay) == !RelayOn ) // если горелка выключена - { digitalWrite(Relay, RelayOn); // включить горелку TstatTimer = TstatTimerMax; // горелку держать включённой не менее заданного в TstatTimerMax времени } } } // если прошла 1 секунда - делаем ежесекундные дела if (plus1sec) { plus1sec = false; // сбрасываем до следующей секунды // обновляем часы RTC.readClock(); Hours=RTC.getHours(); Minutes=RTC.getMinutes(); Seconds=RTC.getSeconds(); // измеряем температуру воздуха DS18B20TempTmp = DS18B20.getTempCByIndex(0); // получить температуру от датчика //Serial.println(DS18B20TempTmp); DS18B20.requestTemperatures(); // запустить новое измерение if (DS18B20TempTmp != -127) { DS18B20Temperature += DS18B20TempTmp; // суммируем для усреднения DS18B20iteration ++; if (DS18B20iteration == 10) { DS18B20iteration = 0; Temperature = (DS18B20Temperature / 10) + TemperatureCorr; //усреднённая + коррекция DS18B20Temperature = 0; } } // если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту //(экономия ресурса EE) if ((EEPROM.readFloat(int(&TstatTempEE)) != TstatTemp)&(Seconds == 0)) { EEPROM.updateFloat(int(&TstatTempEE), TstatTemp); } // проверка таймеров и изменение уставки термостата при совпадении for (int i=0;i<4;i++) { if ((Hours == Timer[i].Hours)&(Minutes == Timer[i].Minutes)&(Timer[i].Enabled)&(Seconds == 0)) { // время T совпадает с RTC Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated = false; Timer[i].Activated = true; TstatTemp = Timer[i].Temperature; EEPROM.updateFloat(int(&TstatTempEE), TstatTemp); if (BeepEnabled) { tone(BeepPin,4000,5); } break; // это чтобы статус Activated остался взведённым } } // дебаг-инфо - в терминал #ifdef serialenabled Serial.print(F("Temp=")); Serial.print(Temperature, 1); Serial.print(F("(")); Serial.print(DS18B20Temperature, 4); Serial.print(F(",corr ")); Serial.print(TemperatureCorr, 1); Serial.print(F("),TstatTimer=")); Serial.println(TstatTimer); #endif if (Temperature < AlarmTemp) { tone(BeepPin,4000,5); } } // обработка поворота энкодера на лету (ручное изменение уставки температуры)) rotating = true; // reset the debouncer if ((encoderR)|(encoderL)) { if (encoderR) { TstatTemp += 0.1; } else { TstatTemp -= 0.1; } TstatTemp = constrain(TstatTemp, 10, 35); encoderR = false; encoderL = false; Timer[0].Activated = Timer[1].Activated = Timer[2].Activated = Timer[3].Activated = false; } // ================ по нажатию кнопки энкодера - меню настроек ==================== if(digitalRead(encoderK) == 0) { MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("< SETUP >")); if (BeepEnabled) { tone(BeepPin,4000,50); } delay(200); int menuitem = 0; do { rotating = true; // reset the debouncer if ((encoderR)|(encoderL)) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (encoderR) { menuitem += 1; } else { menuitem -= 1; } if ( menuitem > 9 ) { menuitem = 0; } // границы пунктов меню if ( menuitem < 0 ) { menuitem = 9; } encoderR = false; encoderL = false; } // индикация пункта меню (номер пункта - в menuitem) lcd.setCursor(0, 1); //инфо на LCD switch(menuitem) { case 0: lcd.print(F("0.BACK ")); break; case 1: lcd.print(F("1.TIMER1 SET ")); break; case 2: lcd.print(F("2.TIMER2 SET ")); break; case 3: lcd.print(F("3.TIMER3 SET ")); break; case 4: lcd.print(F("4.TIMER4 SET ")); break; case 5: lcd.print(F("5.CLOCK SET ")); break; case 6: lcd.print(F("6.HYSTERESIS SET")); break; case 7: lcd.print(F("7.T-CORRECT SET ")); break; case 8: lcd.print(F("8.SOUND SET ")); break; case 9: lcd.print(F("9.T-ALARM SET ")); break; } if (MenuTimeoutTimer == 0) { menuitem = 0; } } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); // если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem) if (BeepEnabled) { tone(BeepPin,4000,50); } switch(menuitem) { // ====== пункт 0 - выход case 0: if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); } //звук "NO" break; // case 0 out // ====== пункт 1 - установка Timer1 case 1: TimerXSetup(0); break; // case 1 out // ====== пункт 2 - установка Timer2 case 2: TimerXSetup(1); break; // case 2 out // ====== пункт 3 - установка Timer3 case 3: TimerXSetup(2); break; // case 3 out // ====== пункт 4 - установка Timer4 case 4: TimerXSetup(3); break; // case 4 out // ====== пункт 5 - установка RTC case 5: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP CLOCK")); delay(200); RTC.readClock(); Hours=RTC.getHours(); Minutes=RTC.getMinutes(); SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } RTC.setHours(Hours); RTC.setMinutes(Minutes); RTC.setSeconds(0); RTC.setClock(); RTC.start(); } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 5 out // ====== пункт 6 - установка гистерезиса case 6: MenuTimeoutTimer = 10; //таймер таймаута, секунд HysteresisOld = Hysteresis; lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP HYSTERESIS")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(" "); } else { lcd.print(Hysteresis, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Hysteresis += 0.1; encoderR = false; } if (encoderL) { Hysteresis -= 0.1; encoderL = false; } Hysteresis = constrain(Hysteresis, 0.1, 1); // крайние значения } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM.updateFloat(int(&HysteresisEE), Hysteresis); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { Hysteresis = HysteresisOld; if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 6 out // ====== пункт 7 - установка коррекции температуры case 7: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP T-CORRECT ")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { if (TemperatureCorr >= 0) { lcd.print(F("+")); } lcd.print(TemperatureCorr, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { TemperatureCorr += 0.1; encoderR = false; } if (encoderL) { TemperatureCorr -= 0.1; encoderL = false; } TemperatureCorr = constrain(TemperatureCorr, -8, 8); // крайние значения } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM.updateFloat(int(&TemperatureCorrEE), TemperatureCorr); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { TemperatureCorr = EEPROM.readFloat(int(&TemperatureCorrEE)); if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 7 out // ====== пункт 8 - вкл/выкл звука case 8: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SOUND SET ")); delay(200); do { lcd.setCursor(0,1); if (BeepEnabled) { lcd.print(F("BEEP ON ")); } else { lcd.print(F("BEEP OFF ")); } rotating = true; // reset the debouncer if ((encoderR)|(encoderL)) { BeepEnabled = !BeepEnabled; encoderR = false; encoderL = false; } } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } EEPROM.updateByte(int(&BeepEnabledEE), BeepEnabled); } if (MenuTimeoutTimer == 0) { BeepEnabled = EEPROM.readByte(int(&BeepEnabledEE)); } break; // case 8 out // ====== пункт 9 - установка предупреждалки о холоде case 9: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("ALARM-TEMP SET ")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { if (AlarmTemp >= 0) { lcd.print(F("+")); } lcd.print(AlarmTemp, 0); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { AlarmTemp += 1; encoderR = false; } if (encoderL) { AlarmTemp -= 1; encoderL = false; } AlarmTemp = constrain(AlarmTemp, 15, 30); // крайние значения } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM.updateFloat(int(&AlarmTempEE), AlarmTemp); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { AlarmTemp = EEPROM.readFloat(int(&AlarmTempEE)); if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 9 out } delay(200); lcd.clear(); } } // ===== SUBROUTINES ================================================================== // ======================================== void SetTime(char x, char y) { // ========= set hours SetH = true; do { PrintRTC(x,y); rotating = true; // reset the debouncer if (encoderR) { Hours += 1; if(Hours > 23) { Hours = 0; }; encoderR = false; } if (encoderL) { Hours -= 1; if(Hours < 0) { Hours = 23; }; encoderL = false; } } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (BeepEnabled) { tone(BeepPin,4000,50); //звук "YES" } SetH = false; delay(200); // ========= set minutes SetM = true; do { PrintRTC(0,1); rotating = true; // reset the debouncer if (encoderR) { Minutes += 1; if(Minutes > 59) { Minutes = 0; }; encoderR = false; } if (encoderL) { Minutes -= 1; if(Minutes < 0) { Minutes = 59; }; encoderL = false; } } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (BeepEnabled) { tone(BeepPin,4000,50); //звук "YES" } if (PrintYesNo) { SetM = false; delay(200); // ========= set yes-no SetYesNo = false; do { PrintRTC(0,1); rotating = true; // reset the debouncer if ((encoderR)||(encoderL)) { SetYesNo = !SetYesNo; encoderR = false; encoderL = false; } } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); delay(200); } } // ======================================== void PrintRTC(char x, char y) { lcd.setCursor(x,y); if (SetH&&blink500ms) { lcd.print(F(" ")); } else { if (Hours < 10) { lcd.print(F("0")); } lcd.print(Hours); } // мигающее двоеточие, если не в режиме установки времени if (!(SetH||SetM||PrintYesNo||blink500ms)) { lcd.print(F(" ")); } else { lcd.print(F(":")); } if (SetM&&blink500ms) { lcd.print(F(" ")); } else { if (Minutes < 10) { lcd.print(F("0")); } lcd.print(Minutes); } lcd.print(F(" ")); if (PrintYesNo) { lcd.print(F("[")); if (!(SetH||SetM||blink500ms)) { lcd.print(F(" ")); } else { if (SetYesNo) { lcd.print(F("YES")); } else { lcd.print(F("NO ")); } } lcd.print(F("]")); } } // ============================ Encoder interrupts ============================= // Interrupt on A changing state void doEncoderA(){ if ( rotating ) { delay (1) ; // wait a little until the bouncing is done } // Test transition, did things really change? if( digitalRead(encoderA) != A_set ) { // debounce once more A_set = !A_set; // adjust counter + if A leads B if ( A_set && !B_set ) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (BeepEnabled) { tone(BeepPin,4000,5); } encoderR = true; rotating = false; // no more debouncing until loop() hits again } } } // Interrupt on B changing state, same as A above void doEncoderB(){ if ( rotating ) { delay (1); } if( digitalRead(encoderB) != B_set ) { B_set = !B_set; // adjust counter - 1 if B leads A if( B_set && !A_set ) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (BeepEnabled) { tone(BeepPin,4000,5); } encoderL = true; rotating = false; } } } // ============================ Timer0 interrupt ============================= // run every 500ms void timerIsr() { blink500ms = !blink500ms; // инверсия мерцающего бита if(blink500ms) { plus1sec = true; // ежесекундно взводится if (TstatTimer != 0) { TstatTimer --; // ежесекундный декремент этого таймера } if (MenuTimeoutTimer != 0) { MenuTimeoutTimer --; // ежесекундный декремент этого таймера } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void TimerXSetup(int X) { MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP TIMER")); lcd.print(X+1); // выводим номер таймера на LCD delay(200); Hours=Timer[X].Hours; Minutes=Timer[X].Minutes; SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) // если при установке времени выбрано "Yes" { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } Timer[X].Hours = Hours; Timer[X].Minutes = Minutes; Timer[X].Enabled = true; EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]); MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Timer")); lcd.print(X+1); lcd.print(F(" Temp. Set")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { lcd.print(Timer[X].Temperature, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Timer[X].Temperature += 0.1; encoderR = false; } if (encoderL) { Timer[X].Temperature -= 0.1; encoderL = false; } Timer[X].Temperature = constrain(Timer[X].Temperature, 10, 35); // крайние значения } while ((digitalRead(encoderK)==1)|(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { // если не нажата - используем старую температуру EEPROM.readBlock(int(&TimerEE[X]), Timer[X]); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } } else // если при установке времени выбрано "No" { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } EEPROM.readBlock(int(&TimerEE[X]), Timer[X]); Timer[X].Enabled = false; EEPROM.updateBlock(int(&TimerEE[X]), Timer[X]); } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~````Всем привет и хорошего дня.
Я только знакомлюсь с ардуино и радиоэлектроникой прошу не судить строго.
Есть 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]
Доброго времени суток
При проверке кода выдает следующее:
Доброго времени суток! Очень интересный проект! Только вот при компиляции сразу выдает ошибку :
In file included from C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12:0: C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:159:22: error: conflicting declaration 'EEPROMClassEx EEPROM' extern EEPROMClassEx EEPROM; ^ In file included from C:\Documents and Settings\123\Мои документы\Arduino\libraries\EEPROMex-master/EEPROMex.h:23:0, from C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino:12: C:\Program Files\Arduino\hardware\arduino\avr\libraries\EEPROM\src/EEPROM.h:145:20: note: previous declaration as 'EEPROMClass EEPROM' static EEPROMClass EEPROM; ^ C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void setup()': sketch_oct24c:119: error: 'doEncoderA' was not declared in this scope sketch_oct24c:120: error: 'doEncoderB' was not declared in this scope sketch_oct24c:122: error: 'timerIsr' was not declared in this scope sketch_oct24c:123: error: 'struct EEPROMClass' has no member named 'setMaxAllowedWrites' sketch_oct24c:133: error: 'struct EEPROMClass' has no member named 'updateBlock' sketch_oct24c:135: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:136: error: 'struct EEPROMClass' has no member named 'updateByte' sketch_oct24c:137: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:138: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:139: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:150: error: 'struct EEPROMClass' has no member named 'readByte' sketch_oct24c:151: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:152: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:153: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:154: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:157: error: 'struct EEPROMClass' has no member named 'readBlock' C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void loop()': sketch_oct24c:215: error: 'PrintRTC' was not declared in this scope sketch_oct24c:264: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:265: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:275: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:404: error: 'TimerXSetup' was not declared in this scope sketch_oct24c:434: error: 'SetTime' was not declared in this scope sketch_oct24c:491: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:538: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:544: error: 'struct EEPROMClass' has no member named 'readFloat' sketch_oct24c:580: error: 'struct EEPROMClass' has no member named 'updateByte' sketch_oct24c:583: error: 'struct EEPROMClass' has no member named 'readByte' sketch_oct24c:621: error: 'struct EEPROMClass' has no member named 'updateFloat' sketch_oct24c:627: error: 'struct EEPROMClass' has no member named 'readFloat' C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void SetTime(char, char)': sketch_oct24c:649: error: 'PrintRTC' was not declared in this scope sketch_oct24c:675: error: 'PrintRTC' was not declared in this scope sketch_oct24c:702: error: 'PrintRTC' was not declared in this scope C:\Documents and Settings\123\РњРѕРё документы\Arduino\sketch_oct24c\sketch_oct24c.ino: In function 'void TimerXSetup(int)': sketch_oct24c:847: error: 'struct EEPROMClass' has no member named 'updateBlock' sketch_oct24c:879: error: 'struct EEPROMClass' has no member named 'updateBlock' sketch_oct24c:885: error: 'struct EEPROMClass' has no member named 'readBlock' sketch_oct24c:897: error: 'struct EEPROMClass' has no member named 'readBlock' sketch_oct24c:899: error: 'struct EEPROMClass' has no member named 'updateBlock' exit status 1 'doEncoderA' was not declared in this scopeпо I2C часы и LCD работают.
добавил 4-й таймер. типа: утро, день, вечер, ночь.
Не затруднит поделиться скетчем? )))) или скиньте плиз на почту: dwk26111974@gmail.com буду признателен.
#include <Wire.h> #include <hd44780.h> #include <hd44780ioClass/hd44780_I2Cexp.h> #include <RealTimeClockDS1307.h> // RTC #include <EEPROM.h> // EE #include <TimerOne.h> // прерывания по таймеру1 #include <OneWire.h> // 1wire для DS18B20 #include <DallasTemperature.h> // DS18B20 hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip // LCD geometry const int LCD_ROWS = 2; const int LCD_COLS = 16; #define HD44780_LCDOBJECT #define ONE_WIRE_BUS A1 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); DeviceAddress DS18B20Address; #define encoderA 2 // энкодер - поворот вправо (об землю) #define encoderB 3 // энкодер - поворот влево (об землю) #define encoderK 4 // энкодер - кнопка (об землю) #define BeepPin 11 // пищалка #define BeepToneNo 2000 // тон звука "No", герц #define BeepToneYes 4000 // тон звука "Yes", герц #define BeepToneNoDuration 200 // длительность звука "No", мс #define BeepToneYesDuration 200 // длительность звука "Yes", мс #define Relay 12 // нога, к которой подключено реле #define RelayOn LOW // полярность сигнала включения реде (HIGH/LOW) byte block1[8] = { 0x06,0x09,0x09,0x06,0x00,0x04,0x0E,0x1F }; // значок градуса с пламенем снизу byte block2[8] = { 0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00 }; // значок градуса byte block3[8] = { 0x06,0x0A,0x0A,0x0A,0x0A,0x1F,0x11,0x00 }; // буква Д byte block4[8] = { 0x11,0x11,0x11,0x0F,0x01,0x11,0x0E,0x00 }; // буква У //#define serialenabled // раскомментировать для выдачи в порт отладочной инфы!!!!! #define TstatTimerMax 120 //минимальная пауза между включениями горелки, сек unsigned int TstatTimer = 20; //таймер паузы между включениями/выключениями, начальная установка 20 сек для устаканивания системы после сброса float DS18B20Temperature = 0; //сырая температура от датчика float Temperature = 0; //вычисленная температура с коррекцией float DS18B20TempTmp; //времянка byte DS18B20iteration = 0; //счётчик измерений температуры для усреднения float TstatTemp = 23; //температура термостатирования, может изменяться настройками float TemperatureCorr = 0; //коррекция температуры, может изменяться настройками float Hysteresis = 0.1; // гистерезис термостата, может изменяться настройками float HysteresisOld; int Hours = 0; // времянка часов RTC для отображения и установки int Minutes = 0; // времянка минут RTC для отображения и установки int Seconds; boolean PrintYesNo = false; // показывать ли после времени Yes/No (косвенно - указание на режим установка/отображение) boolean SetH = false; // выделение часов при отображении boolean SetM = false; // выделение минут при отображении boolean SetYesNo = false; // выделение Yes/No при установке часов boolean blink500ms = false; // мигающий бит, инвертируется каждые 500мс boolean plus1sec = false; // ежесекундно взводится boolean BeepEnabled = true; byte MenuTimeoutTimer; byte Timer1Hours = 0; byte Timer1Minutes = 0; boolean Timer1Enabled = false; boolean Timer1Activated = false; float Timer1Temp = 23; //температура термостатирования по таймеру1, может изменяться настройками byte Timer2Hours = 0; byte Timer2Minutes = 0; boolean Timer2Enabled = false; boolean Timer2Activated = false; float Timer2Temp = 23; //температура термостатирования по таймеру2, может изменяться настройками byte Timer3Hours = 0; byte Timer3Minutes = 0; boolean Timer3Enabled = false; boolean Timer3Activated = false; float Timer3Temp = 23; //температура термостатирования по таймеру3, может изменяться настройками byte Timer4Hours = 0; byte Timer4Minutes = 0; boolean Timer4Enabled = false; boolean Timer4Activated = false; float Timer4Temp = 23; //температура термостатирования по таймеру4, может изменяться настройками float AlarmTemp = 18; // температура для замерзательного орала // encoder vars static boolean rotating=false; // debounce management boolean A_set = false; boolean B_set = false; boolean encoderR = false; boolean encoderL = false; // EEPROM addresses #define TstatTempEEaddr 0 // EE - адрес для сохранения температуры термостатирования, 4 байта(float)! #define TemperatureCorrEEaddr 4 // EE - адрес для сохранения коррекции температуры, 4 байта(float)! #define HysteresisEEaddr 8 // EE - адрес для сохранения гистерезиса, 4 байта(float)! #define Timer1HoursEEaddr 12 // EE - адрес для сохранения часов таймера 1 (byte) #define Timer1MinutesEEaddr 13 // EE - адрес для сохранения минут таймера 1 (byte) #define Timer1EnabledEEaddr 14 // EE - адрес для сохранения статуса таймера 1 (boolean) #define Timer1TempEEaddr 15 // EE - адрес для сохранения температуры таймера 1, 4 байта(float)! #define Timer2HoursEEaddr 19 // EE - адрес для сохранения часов таймера 2 (byte) #define Timer2MinutesEEaddr 20 // EE - адрес для сохранения минут таймера 2 (byte) #define Timer2EnabledEEaddr 21 // EE - адрес для сохранения статуса таймера 2 (boolean) #define Timer2TempEEaddr 22 // EE - адрес для сохранения температуры таймера 2, 4 байта(float)! #define Timer3HoursEEaddr 26 // EE - адрес для сохранения часов таймера 3 (byte) #define Timer3MinutesEEaddr 27 // EE - адрес для сохранения минут таймера 3 (byte) #define Timer3EnabledEEaddr 28 // EE - адрес для сохранения статуса таймера 3 (boolean) #define Timer3TempEEaddr 29 // EE - адрес для сохранения температуры таймера 3, 4 байта(float)! #define Timer4HoursEEaddr 38 // EE - адрес для сохранения часов таймера 4 (byte) #define Timer4MinutesEEaddr 39 // EE - адрес для сохранения минут таймера 4 (byte) #define Timer4EnabledEEaddr 40 // EE - адрес для сохранения статуса таймера 4 (boolean) #define Timer4TempEEaddr 41 // EE - адрес для сохранения температуры таймера 4, 4 байта(float)! #define BeepEnabledEEaddr 33 // EE - адрес для сохранения признака разрешения звука (boolean) #define AlarmTempEEaddr 34 // EE - адрес для сохранения значения недопустимого снижения температуры, 4 байта(float)! // ===== SETUP ======================================================================== void setup() { #ifdef serialenabled Serial.begin(9600); #endif pinMode(Relay, OUTPUT); digitalWrite(Relay, HIGH); lcd.begin(LCD_COLS, LCD_ROWS); lcd.clear(); lcd.createChar(1, block1); lcd.createChar(2, block2); lcd.createChar(3, block3); lcd.createChar(4, block4); pinMode(encoderA, INPUT); digitalWrite(encoderA, HIGH); pinMode(encoderB, INPUT); digitalWrite(encoderB, HIGH); pinMode(encoderK, INPUT); digitalWrite(encoderK, HIGH); attachInterrupt(0, doEncoderA, CHANGE); // encoder pin on interrupt 0 (pin 2) attachInterrupt(1, doEncoderB, CHANGE); // encoder pin on interrupt 1 (pin 3) Timer1.initialize(500000); // Timer0 interrupt - set a timer of length 500000 microseconds Timer1.attachInterrupt( timerIsr ); // attach the service routine here if (EEPROM.read(Timer1HoursEEaddr) > 23) { // если первая запись однокристалки - записать начальные значения в EE EEPROM.write(BeepEnabledEEaddr, BeepEnabled); EEPROM_float_write(TstatTempEEaddr, TstatTemp); EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr); EEPROM_float_write(HysteresisEEaddr, Hysteresis); EEPROM.write(Timer1HoursEEaddr, Timer1Hours); EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes); EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled); EEPROM_float_write(Timer1TempEEaddr, Timer1Temp); EEPROM.write(Timer2HoursEEaddr, Timer2Hours); EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes); EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled); EEPROM_float_write(Timer2TempEEaddr, Timer2Temp); EEPROM.write(Timer3HoursEEaddr, Timer3Hours); EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes); EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled); EEPROM_float_write(Timer3TempEEaddr, Timer3Temp); EEPROM.write(Timer4HoursEEaddr, Timer4Hours); EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes); EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled); EEPROM_float_write(Timer4TempEEaddr, Timer4Temp); EEPROM_float_write(AlarmTempEEaddr, AlarmTemp); } BeepEnabled = EEPROM.read(BeepEnabledEEaddr); TstatTemp = EEPROM_float_read(TstatTempEEaddr); TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr); Hysteresis = EEPROM_float_read(HysteresisEEaddr); Timer1Hours = EEPROM.read(Timer1HoursEEaddr); Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr); Timer1Enabled = EEPROM.read(Timer1EnabledEEaddr); Timer1Temp = EEPROM_float_read(Timer1TempEEaddr); Timer2Hours = EEPROM.read(Timer2HoursEEaddr); Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr); Timer2Enabled = EEPROM.read(Timer2EnabledEEaddr); Timer2Temp = EEPROM_float_read(Timer2TempEEaddr); Timer3Hours = EEPROM.read(Timer3HoursEEaddr); Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr); Timer3Enabled = EEPROM.read(Timer3EnabledEEaddr); Timer3Temp = EEPROM_float_read(Timer3TempEEaddr); Timer4Hours = EEPROM.read(Timer4HoursEEaddr); Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr); Timer4Enabled = EEPROM.read(Timer4EnabledEEaddr); Timer4Temp = EEPROM_float_read(Timer4TempEEaddr); AlarmTemp = EEPROM_float_read(AlarmTempEEaddr); DS18B20.begin(); DS18B20.getAddress(DS18B20Address, 0); DS18B20.setResolution(DS18B20Address, 12); DS18B20.setWaitForConversion(false); DS18B20.requestTemperatures(); tone(BeepPin,2000,50); delay(50); tone(BeepPin,3000,50); delay(50); tone(BeepPin,4000,50); delay(50); } // ===== MAIN CYCLE =================================================================== void loop() { lcd.setCursor(8, 0); //инфо на LCD if ((Temperature < AlarmTemp)&(blink500ms)) { lcd.print(F("*")); } else { lcd.print(F(" ")); } lcd.print(F("t=")); if (Temperature < 10) { lcd.print(F(" ")); } lcd.print(Temperature,1); lcd.write(0x02); // значок градуса // если таймер 1 включен - надпись светится, если сработал - мигает lcd.setCursor(0, 1); //инфо на LCD if ((Timer1Enabled)&!((Timer1Activated)&(blink500ms))) { lcd.write(0x04); } else { lcd.print(F(" ")); } // если таймер 2 включен - надпись светится, если сработал - мигает lcd.setCursor(2, 1); //инфо на LCD if ((Timer2Enabled)&!((Timer2Activated)&(blink500ms))) { lcd.write(0x03); } else { lcd.print(F(" ")); } // если таймер 3 включен - надпись светится, если сработал - мигает lcd.setCursor(4, 1); //инфо на LCD if ((Timer3Enabled)&!((Timer3Activated)&(blink500ms))) { lcd.print(F("B")); } else { lcd.print(F(" ")); } // если таймер 4 включен - надпись светится, если сработал - мигает lcd.setCursor(6, 1); //инфо на LCD if ((Timer4Enabled)&!((Timer4Activated)&(blink500ms))) { lcd.print(F("H")); } else { lcd.print(F(" ")); } lcd.setCursor(9, 1); //инфо на LCD lcd.print(F("k=")); lcd.print(TstatTemp,1); if ( digitalRead(Relay) == RelayOn ) { lcd.write(0x01); // значок градуса с пламенем } else { lcd.write(0x02); // значок градуса } // печатаем текущее время PrintYesNo = false; PrintRTC(0,0); // термостатирование if ( TstatTimer == 0 ) { if ( Temperature > ( TstatTemp + Hysteresis ) ) // гистерезис { if ( digitalRead(Relay) == RelayOn ) // если горелка включена - { digitalWrite(Relay, !RelayOn); // выключить горелку TstatTimer = TstatTimerMax; // горелку держать выключённой не менее заданного в TstatTimerMax времени } } if (Temperature < TstatTemp) { if ( digitalRead(Relay) == !RelayOn ) // если горелка выключена - { digitalWrite(Relay, RelayOn); // включить горелку TstatTimer = TstatTimerMax; // горелку держать включённой не менее заданного в TstatTimerMax времени } } } // если прошла 1 секунда - делаем ежесекундные дела if (plus1sec) { plus1sec = false; // сбрасываем до следующей секунды // обновляем часы RTC.readClock(); Hours=RTC.getHours(); Minutes=RTC.getMinutes(); Seconds=RTC.getSeconds(); // измеряем температуру воздуха DS18B20TempTmp = DS18B20.getTempCByIndex(0); // получить температуру от датчика DS18B20.requestTemperatures(); // запустить новое измерение if (DS18B20TempTmp != -127) { DS18B20Temperature += DS18B20TempTmp; // суммируем для усреднения DS18B20iteration ++; if (DS18B20iteration == 10) { DS18B20iteration = 0; Temperature = (DS18B20Temperature / 10) + TemperatureCorr; //усреднённая + коррекция DS18B20Temperature = 0; } } // если уставку термостата поменяли вручную - запись её в EE, не чаще 1 раза в минуту //(экономия ресурса EE) if ((EEPROM_float_read(TstatTempEEaddr) != TstatTemp)&(Seconds == 0)) { EEPROM_float_write(TstatTempEEaddr, TstatTemp); } // проверка Timer1 и изменение уставки термостата при совпадении if ((Hours == Timer1Hours)&(Minutes == Timer1Minutes)&(Timer1Enabled)&(Seconds == 0)) { // время T1 совпадает с RTC Timer1Activated = true; Timer2Activated = false; Timer3Activated = false; Timer4Activated = false; TstatTemp = Timer1Temp; EEPROM_float_write(TstatTempEEaddr, TstatTemp); if (BeepEnabled) { tone(BeepPin,4000,5); } } // проверка Timer2 и изменение уставки термостата при совпадении if ((Hours == Timer2Hours)&(Minutes == Timer2Minutes)&(Timer2Enabled)&(Seconds == 0)) { // время T2 совпадает с RTC Timer1Activated = false; Timer2Activated = true; Timer3Activated = false; Timer4Activated = false; TstatTemp = Timer2Temp; EEPROM_float_write(TstatTempEEaddr, TstatTemp); if (BeepEnabled) { tone(BeepPin,4000,5); } } // проверка Timer3 и изменение уставки термостата при совпадении if ((Hours == Timer3Hours)&(Minutes == Timer3Minutes)&(Timer3Enabled)&(Seconds == 0)) { // время T3 совпадает с RTC Timer1Activated = false; Timer2Activated = false; Timer3Activated = true; Timer4Activated = false; TstatTemp = Timer3Temp; EEPROM_float_write(TstatTempEEaddr, TstatTemp); if (BeepEnabled) { tone(BeepPin,4000,5); } } // проверка Timer4 и изменение уставки термостата при совпадении if ((Hours == Timer4Hours)&(Minutes == Timer4Minutes)&(Timer4Enabled)&(Seconds == 0)) { // время T4 совпадает с RTC Timer1Activated = false; Timer2Activated = false; Timer3Activated = false; Timer4Activated = true; TstatTemp = Timer4Temp; EEPROM_float_write(TstatTempEEaddr, TstatTemp); if (BeepEnabled) { tone(BeepPin,4000,5); } } // дебаг-инфо - в терминал #ifdef serialenabled Serial.print(F("Temp=")); Serial.print(Temperature, 1); Serial.print(F("(")); Serial.print(DS18B20Temperature, 4); Serial.print(F(",corr ")); Serial.print(TemperatureCorr, 1); Serial.print(F("),TstatTimer=")); Serial.println(TstatTimer); #endif if (Temperature < AlarmTemp) { tone(BeepPin,4000,5); } } // обработка поворота энкодера на лету (ручное изменение уставки температуры)) rotating = true; // reset the debouncer if ((encoderR)^(encoderL)) { if (encoderR) { TstatTemp += 0.1; } else { TstatTemp -= 0.1; } TstatTemp = constrain(TstatTemp, 10, 35); encoderR = false; encoderL = false; Timer1Activated = false; Timer2Activated = false; Timer3Activated = false; Timer4Activated = false; } // ================ по нажатию кнопки энкодера - меню настроек ==================== if(digitalRead(encoderK) == 0) { MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("< SETUP >")); if (BeepEnabled) { tone(BeepPin,4000,50); } delay(200); int menuitem = 0; do { rotating = true; // reset the debouncer if ((encoderR)^(encoderL)) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (encoderR) { menuitem += 1; } else { menuitem -= 1; } if ( menuitem > 8 ) { menuitem = 0; } // границы пунктов меню if ( menuitem < 0 ) { menuitem = 8; } encoderR = false; encoderL = false; } // индикация пункта меню (номер пункта - в menuitem) lcd.setCursor(0, 1); //инфо на LCD switch(menuitem) { case 0: lcd.print(F("0.BACK ")); break; case 1: lcd.print(F("1.TIMER ")); lcd.write(0x04); lcd.print(F(" SET")); break; case 2: lcd.print(F("2.TIMER ")); lcd.write(0x03); lcd.print(F(" SET")); break; case 3: lcd.print(F("3.TIMER ")); lcd.print(F("B SET")); break; case 4: lcd.print(F("3.TIMER ")); lcd.print(F("H SET")); break; case 5: lcd.print(F("5.CLOCK SET ")); break; case 6: lcd.print(F("6.HYSTERESIS SET")); break; case 7: lcd.print(F("7.T-CORRECT SET ")); break; case 8: lcd.print(F("8.SOUND SET ")); break; case 9: lcd.print(F("9.T-ALARM SET ")); break; } if (MenuTimeoutTimer == 0) { menuitem = 0; } } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); // если нажата кнопка энкодера или таймаут - обработка пункта меню (номер пункта - в menuitem) if (BeepEnabled) { tone(BeepPin,4000,50); } switch(menuitem) { // ====== пункт 0 - выход case 0: if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); } //звук "NO" break; // case 0 out // ====== пункт 1 - установка Timer1 case 1: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP TIMER ")); lcd.write(0x04); delay(200); Hours=Timer1Hours; Minutes=Timer1Minutes; SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) // если при установке времени выбрано "Yes" { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } Timer1Hours = Hours; Timer1Minutes = Minutes; Timer1Enabled = true; EEPROM.write(Timer1HoursEEaddr, Timer1Hours); EEPROM.write(Timer1MinutesEEaddr, Timer1Minutes); EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled); MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Timer ")); lcd.write(0x04); lcd.print(F(" Temp.Set")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { lcd.print(Timer1Temp, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Timer1Temp += 0.1; encoderR = false; } if (encoderL) { Timer1Temp -= 0.1; encoderL = false; } Timer1Temp = constrain(Timer1Temp, 10, 35); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера EEPROM_float_write(Timer1TempEEaddr, Timer1Temp); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { // если не нажата - используем старую температуру Timer1Temp = EEPROM_float_read(Timer1TempEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } } else // если при установке времени выбрано "No" { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } Timer1Enabled = false; EEPROM.write(Timer1EnabledEEaddr, Timer1Enabled); Timer1Hours = EEPROM.read(Timer1HoursEEaddr); Timer1Minutes = EEPROM.read(Timer1MinutesEEaddr); } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 1 out // ====== пункт 2 - установка Timer2 case 2: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP TIMER ")); lcd.write(0x03); delay(200); Hours=Timer2Hours; Minutes=Timer2Minutes; SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) // если при установке времени выбрано "Yes" { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } Timer2Hours = Hours; Timer2Minutes = Minutes; Timer2Enabled = true; EEPROM.write(Timer2HoursEEaddr, Timer2Hours); EEPROM.write(Timer2MinutesEEaddr, Timer2Minutes); EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled); MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Timer ")); lcd.write(0x03); lcd.print(F(" Temp.Set")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { lcd.print(Timer2Temp, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Timer2Temp += 0.1; encoderR = false; } if (encoderL) { Timer2Temp -= 0.1; encoderL = false; } Timer2Temp = constrain(Timer2Temp, 10, 35); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера EEPROM_float_write(Timer2TempEEaddr, Timer2Temp); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { // если не нажата - используем старую температуру Timer2Temp = EEPROM_float_read(Timer2TempEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } } else // если при установке времени выбрано "No" { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } Timer2Enabled = false; EEPROM.write(Timer2EnabledEEaddr, Timer2Enabled); Timer2Hours = EEPROM.read(Timer2HoursEEaddr); Timer2Minutes = EEPROM.read(Timer2MinutesEEaddr); } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 2 out // ====== пункт 3 - установка Timer3 case 3: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP TIMER B")); delay(200); Hours=Timer3Hours; Minutes=Timer3Minutes; SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) // если при установке времени выбрано "Yes" { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } Timer3Hours = Hours; Timer3Minutes = Minutes; Timer3Enabled = true; EEPROM.write(Timer3HoursEEaddr, Timer3Hours); EEPROM.write(Timer3MinutesEEaddr, Timer3Minutes); EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled); MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Timer B Temp.Set")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { lcd.print(Timer3Temp, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Timer3Temp += 0.1; encoderR = false; } if (encoderL) { Timer3Temp -= 0.1; encoderL = false; } Timer3Temp = constrain(Timer3Temp, 10, 35); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера EEPROM_float_write(Timer3TempEEaddr, Timer3Temp); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { // если не нажата - используем старую температуру Timer3Temp = EEPROM_float_read(Timer3TempEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } } else // если при установке времени выбрано "No" { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } Timer3Enabled = false; EEPROM.write(Timer3EnabledEEaddr, Timer3Enabled); Timer3Hours = EEPROM.read(Timer3HoursEEaddr); Timer3Minutes = EEPROM.read(Timer3MinutesEEaddr); } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 3 out // ====== пункт 4 - установка Timer4 case 4: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP TIMER H")); delay(200); Hours=Timer4Hours; Minutes=Timer4Minutes; SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) // если при установке времени выбрано "Yes" { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } Timer4Hours = Hours; Timer4Minutes = Minutes; Timer4Enabled = true; EEPROM.write(Timer4HoursEEaddr, Timer4Hours); EEPROM.write(Timer4MinutesEEaddr, Timer4Minutes); EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled); MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("Timer H Temp.Set")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { lcd.print(Timer4Temp, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Timer4Temp += 0.1; encoderR = false; } if (encoderL) { Timer4Temp -= 0.1; encoderL = false; } Timer4Temp = constrain(Timer4Temp, 10, 35); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { // если после выбора температуры нажата кнопка энкодера EEPROM_float_write(Timer4TempEEaddr, Timer4Temp); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { // если не нажата - используем старую температуру Timer4Temp = EEPROM_float_read(Timer4TempEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } } else // если при установке времени выбрано "No" { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } Timer4Enabled = false; EEPROM.write(Timer4EnabledEEaddr, Timer4Enabled); Timer4Hours = EEPROM.read(Timer4HoursEEaddr); Timer4Minutes = EEPROM.read(Timer4MinutesEEaddr); } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 4 out // ====== пункт 5 - установка RTC case 5: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP CLOCK")); delay(200); RTC.readClock(); Hours=RTC.getHours(); Minutes=RTC.getMinutes(); SetYesNo = false; PrintYesNo = true; SetTime(0,1); // в позиции 0,1 - запрос ввода времени if (MenuTimeoutTimer != 0) { if (SetYesNo) { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } RTC.setHours(Hours); RTC.setMinutes(Minutes); RTC.setSeconds(0); RTC.setClock(); RTC.start(); //старт часов } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } } else { if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 5 out // ====== пункт 6 - установка гистерезиса case 6: MenuTimeoutTimer = 10; //таймер таймаута, секунд HysteresisOld = Hysteresis; lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP HYSTERESIS")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(" "); } else { lcd.print(Hysteresis, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { Hysteresis += 0.1; encoderR = false; } if (encoderL) { Hysteresis -= 0.1; encoderL = false; } Hysteresis = constrain(Hysteresis, 0.1, 1); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM_float_write(HysteresisEEaddr, Hysteresis); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { Hysteresis = HysteresisOld; if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 6 out // ====== пункт 7 - установка коррекции температуры case 7: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SETUP T-CORRECT ")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { if (TemperatureCorr >= 0) { lcd.print(F("+")); } lcd.print(TemperatureCorr, 1); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { TemperatureCorr += 0.1; encoderR = false; } if (encoderL) { TemperatureCorr -= 0.1; encoderL = false; } TemperatureCorr = constrain(TemperatureCorr, -8, 8); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM_float_write(TemperatureCorrEEaddr, TemperatureCorr); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { TemperatureCorr = EEPROM_float_read(TemperatureCorrEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 7 out // ====== пункт 8 - вкл/выкл звука case 8: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("SOUND SET ")); delay(200); do { lcd.setCursor(0,1); if (BeepEnabled) { lcd.print(F("BEEP ON ")); } else { lcd.print(F("BEEP OFF ")); } rotating = true; // reset the debouncer if ((encoderR)^(encoderL)) { BeepEnabled = !BeepEnabled; encoderR = false; encoderL = false; } } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } EEPROM.write(BeepEnabledEEaddr, BeepEnabled); } if (MenuTimeoutTimer == 0) { BeepEnabled = EEPROM.read(BeepEnabledEEaddr); } break; // case 8 out // ====== пункт 9 - установка коррекции температуры case 9: MenuTimeoutTimer = 10; //таймер таймаута, секунд lcd.clear(); lcd.setCursor(0, 0); //инфо на LCD lcd.print(F("ALARM-TEMP SET ")); delay(200); do { lcd.setCursor(0,1); if (blink500ms) { lcd.print(F(" ")); } else { if (AlarmTemp >= 0) { lcd.print(F("+")); } lcd.print(AlarmTemp, 0); lcd.write(0x02); // значок градуса } rotating = true; // reset the debouncer if (encoderR) { AlarmTemp += 1; encoderR = false; } if (encoderL) { AlarmTemp -= 1; encoderL = false; } AlarmTemp = constrain(AlarmTemp, 15, 30); // крайние значения } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (MenuTimeoutTimer != 0) { EEPROM_float_write(AlarmTempEEaddr, AlarmTemp); // запись в ЕЕПРОМ if (BeepEnabled) { tone(BeepPin,BeepToneYes,BeepToneYesDuration); //звук "YES" } } else { AlarmTemp = EEPROM_float_read(AlarmTempEEaddr); if (BeepEnabled) { tone(BeepPin,BeepToneNo,BeepToneNoDuration); //звук "NO" } } break; // case 9 out } delay(200); lcd.clear(); } } // ===== SUBROUTINES ================================================================== // ======================================== void SetTime(char x, char y) { // ========= set hours SetH = true; do { PrintRTC(x,y); rotating = true; // reset the debouncer if (encoderR) { Hours += 1; if(Hours > 23) { Hours = 0; }; encoderR = false; } if (encoderL) { Hours -= 1; if(Hours < 0) { Hours = 23; }; encoderL = false; } } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (BeepEnabled) { tone(BeepPin,4000,50); //звук "YES" } SetH = false; delay(200); // ========= set minutes SetM = true; do { PrintRTC(0,1); rotating = true; // reset the debouncer if (encoderR) { Minutes += 1; if(Minutes > 59) { Minutes = 0; }; encoderR = false; } if (encoderL) { Minutes -= 1; if(Minutes < 0) { Minutes = 59; }; encoderL = false; } } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); if (BeepEnabled) { tone(BeepPin,4000,50); //звук "YES" } if (PrintYesNo) { SetM = false; delay(200); // ========= set yes-no SetYesNo = false; do { PrintRTC(0,1); rotating = true; // reset the debouncer if ((encoderR)||(encoderL)) { SetYesNo = !SetYesNo; encoderR = false; encoderL = false; } } while ((digitalRead(encoderK)==1)^(MenuTimeoutTimer==0)); delay(200); } } // ======================================== void PrintRTC(char x, char y) { lcd.setCursor(x,y); if (SetH&&blink500ms) { lcd.print(F(" ")); } else { if (Hours < 10) { lcd.print(F("0")); } lcd.print(Hours); } // мигающее двоеточие, если не в режиме установки времени if (!(SetH||SetM||PrintYesNo||blink500ms)) { lcd.print(F(" ")); } else { lcd.print(F(":")); } if (SetM&&blink500ms) { lcd.print(F(" ")); } else { if (Minutes < 10) { lcd.print(F("0")); } lcd.print(Minutes); } lcd.print(F(" ")); if (PrintYesNo) { lcd.print(F("[")); if (!(SetH||SetM||blink500ms)) { lcd.print(F(" ")); } else { if (SetYesNo) { lcd.print(F("YES")); } else { lcd.print(F("NO ")); } } lcd.print(F("]")); } } // ========= чтение/запись float в EE ===== void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ { byte *x = (byte *)&val; for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]); } float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ { byte x[4]; for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr); float *y = (float *)&x; return y[0]; } // ======================================== // ============================ Encoder interrupts ============================= // Interrupt on A changing state void doEncoderA(){ if ( rotating ) { delay (1) ; // wait a little until the bouncing is done } // Test transition, did things really change? if( digitalRead(encoderA) != A_set ) { // debounce once more A_set = !A_set; // adjust counter + if A leads B if ( A_set && !B_set ) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (BeepEnabled) { tone(BeepPin,4000,5); } encoderR = true; rotating = false; // no more debouncing until loop() hits again } } } // Interrupt on B changing state, same as A above void doEncoderB(){ if ( rotating ) { delay (1); } if( digitalRead(encoderB) != B_set ) { B_set = !B_set; // adjust counter - 1 if B leads A if( B_set && !A_set ) { MenuTimeoutTimer = 10; //таймер таймаута, секунд if (BeepEnabled) { tone(BeepPin,4000,5); } encoderL = true; rotating = false; } } } // ============================ Timer0 interrupt ============================= // run every 500ms void timerIsr() { blink500ms = !blink500ms; // инверсия мерцающего бита if(blink500ms) { plus1sec = true; // ежесекундно взводится if (TstatTimer != 0) { TstatTimer --; // ежесекундный декремент этого таймера } if (MenuTimeoutTimer != 0) { MenuTimeoutTimer --; // ежесекундный декремент этого таймера } } }Доброе время суток!!!! Проект очень нравится, собрал со второй станицы, но есть промблема - нет показания температуры - в верхней строке в правом углу показывает моргающую звезду в так пищалки и одни нули. Дотчик исправный в другом проекте работает, схема без ошибок. Прошу помощи. Спасибо. С уважением Виктор 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 к градуснику не причем.
надо внимательно просмотреть и прозвонить цепи. бывает.
может отвалилось чего...