Всем привет! У меня уже больше двух лет трудится термостат для газового котла, собранный по скетчу с другого форума. Работает великолепно, но вот захотелось его немного усовершенствовать. В частности, сделать так, чтобы возле котла стояла всего лишь маленькая коробочка, внутри которой находится реле, а в удаленной комнате стояла полноценная "метеостанция" ну или "основной управляющий блок" Планируется, что Основной блок при превышении заданной температуры будет отправлять Ведомому блоку команду на включение или выключение реле посредством NRF24l01. Сразу скажу, что на пару лет отошел от темы Ардуино и сейчас приходится все вспоминать заново. Ну а пока, по ходу воспоминаний, сделал самый простенький терморегулятор. Авось кому-нибудь да пригодится......... Ну и постепенно буду добавлять в скетч все, что касается NRF24l01 (они ко мне только приехали, так что разбираюсь с ними, благодаря нашим форумчанам ИгорьК и Пушной звер тестовые скетчи заработали сразу).
Код (C++): #include <DallasTemperature.h> #include <OneWire.h> #include <Wire.h> // Подключаем библиотеку Wire #include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C LiquidCrystal_I2C lcd(0x27,20,4); // Задаем адрес и размер дисплея const int relayPin = 2; // Реле на D2 float MaxTemp; // Максимальная температура float temp; // Температура с датчика DS18b20 OneWire oneWire(8); // вход датчика DS18b20 DallasTemperature ds(&oneWire); DeviceAddress sensor1 = {0x28, 0xff, 0xe1, 0x2d, 0x01, 0x17, 0x04, 0xfa }; //здесь задаем адрес датчика DS18b20 void setup() { ds.begin(); // начинаем работу с датчиками pinMode(relayPin, OUTPUT); // объявляем выход реле MaxTemp=27; // устанавливаем максимальную температуру, при которой срабатывает реле Serial.begin(9600); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("Temp"); // Выводим текст } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков float temp=ds.getTempC(sensor1); Serial.println(temp); // создаем переменную с плавающей точкой(для более точного вывода значения) delay(1000); if (temp>=MaxTemp) // если температура с датчика превысила максимальную digitalWrite(relayPin, LOW); else digitalWrite(relayPin, HIGH); delay(2000); Serial.print("Температура = "); lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(ds.getTempCByIndex(0)); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст }
Доделал, как и обещал. Передатчик (с дисплеем 2004 по I2C и датчиком DS18b20) Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <DallasTemperature.h> #include <OneWire.h> #include <Wire.h> // Подключаем библиотеку Wire #include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C LiquidCrystal_I2C lcd(0x27,20,4); // Задаем адрес и размер дисплея const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" RF24 radio(9, 10); // CE, CSN float temp; // Температура с датчика DS18b20 OneWire oneWire(8); // вход датчика DS18b20 DallasTemperature ds(&oneWire); DeviceAddress sensor1 = {0x28, 0xff, 0xe1, 0x2d, 0x01, 0x17, 0x04, 0xfa }; //здесь задаем адрес датчика DS18b20 НЕОБХОДИМО ЗАДАВАТЬ ВАШ АДРЕС!!! void setup() { ds.begin(); // начинаем работу с датчиками Serial.begin(9600); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.setCursor(2,0); // Устанавливаем курсор на 1 строку, ячейка 2 lcd.print("Temp"); // Выводим текст radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { ds.requestTemperatures(); // считываем температуру с датчиков float temp=ds.getTempC(sensor1); Serial.println(temp); // создаем переменную с плавающей точкой(для более точного вывода значения) delay(1000); lcd.setCursor(7,0); // Устанавливаем курсор на 1 строку, ячейка 7 lcd.print(ds.getTempCByIndex(0)); // Выводим показания температуры lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12 lcd.setCursor(13,0); // Устанавливаем курсор на 1 строку, ячейка 13 lcd.print("C"); // Выводим текст Serial.print("Температура = "); radio.write(&temp, sizeof(temp)); // отправляем данные и указываем сколько байт пакет }
Код (C++): /// приемник термостата #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> const int relayPin = 2; // Реле на D2 float MaxTemp; // Максимальная температура const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" //const uint64_t pipe02 = 0xF0F1F2F3F1LL; // могут различатся только на младший байт RF24 radio(9, 10); // CE, CSN void setup(){ pinMode(relayPin, OUTPUT); // объявляем выход реле MaxTemp=28; // устанавливаем максимальную температуру, при которой срабатывает реле Serial.begin(9600); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe01); // открываем трубу с идентификатором "pipe01" // radio.openReadingPipe(2,pipe02); // открываем трубу с идентификатором "pipe02" // radio.openReadingPipe(0,pipe01); // или открываем все трубы разом radio.startListening(); // включаем приемник, начинаем слушать трубу } // radio.stopListening(); // останавливает приём (нужно перед началом передачи) void loop() { uint8_t pipeNum = 0; if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер. if (pipeNum == 1){ float temp = 0; radio.read(&temp, sizeof(temp)); Serial.println(pipeNum); if (temp < 0) Serial.print("-"); else Serial.print("+"); Serial.println(temp); Serial.println(); delay(1000); if (temp>=MaxTemp) // если температура с датчика превысила максимальную digitalWrite(relayPin, HIGH); else digitalWrite(relayPin, LOW); delay(2000); } if (pipeNum == 2){ int data[2] = {0}; radio.read(&data, sizeof(data)); Serial.println(pipeNum); if (data[0] < 0) Serial.print("-"); else Serial.print("+"); Serial.print(data[0]); Serial.print("C "); Serial.print(data[1]); Serial.println("%"); Serial.println(); } } } Приемник (тут только ардуинка и реле)
Еще раз хочу выразить огромную благодарность двум форумчанам - ИгорьК и Пушной звер за то, что толково все разъясняют, приводят примеры скетчей и подробно их комментируют!!!