Код приемника NRF24L01 для приема температуры
- Войдите на сайт для отправки комментариев
Чт, 18/01/2018 - 12:55
Выкладываю код приемника, может кому пригодится.
В краце информация с передатчика, поступает на приемник и выводится на экран 1602 (через I2C). Выводится воказания влажности, текущая температура, максимальная зарегистрированная, и минимальная.
Была проблема в том что иногда по радиоканалу прилетала ерунда, которая сбивала показания минимума и максимума зафиксированной температуры. Проблема была решена програмно.
Код не окончательный, в дальнейшем прикручу часы, сменю экран на побольше, сделаю ведение лога температуры по дням, за неделю или месяц.......
#include <Wire.h> //#include <WolfCrystal.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" float tMin = 99; float tMax = 99; RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно float recieved_data[2]; // массив принятых данных byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { Serial.begin(9600); //открываем порт для связи с ПК lcd.init(); lcd.backlight(); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) // radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { // byte pipeNo; while (radio.available()){ radio.read( &recieved_data, sizeof(recieved_data) ); ////////////////////////////////// if (recieved_data[0] != tMin){ if (tMin == 99){ tMin = recieved_data[0]; } if (recieved_data[0] < tMin){ if (abs(tMin) - abs(recieved_data[0]) <= 1){ if (abs(tMin) - abs(recieved_data[0]) >= -1){ tMin = recieved_data[0]; } } } } if (recieved_data[0] != tMax){ if (tMax == 99){ tMax = recieved_data[0]; } if (recieved_data[0] > tMax){ if (abs(recieved_data[0]) - abs(tMax) <= 1){ if (abs(recieved_data[0]) - abs(tMax) >= -1){ tMax = recieved_data[0]; } } } } ////////////////////////////////// lcd.setCursor(0, 0); lcd.print(recieved_data[0]); // Serial.println(tT); lcd.setCursor(0, 1); lcd.print(recieved_data[1]); lcd.setCursor(7, 0); lcd.print("Min"); lcd.setCursor(11, 0); lcd.print(tMin); lcd.setCursor(7, 1); lcd.print("Max"); lcd.setCursor(11, 1); lcd.print(tMax); // Serial.println(recieved_data[0]); } }
Зря вы это выложили.
Предлагать свой код стоит в двух случаях - либо он демонстрирует какой-то принципиально новый подход к решению задачи. либо настолько хорош, что может случить образцом для подражания.
В вашем коде никакой новизны я не вижу, процентов на 80% он повторяет пример из библиотеки RF24. А что касается качества - "вы сами-то как думаете?" (с)
Навскидку
- массив с именами труб следует обьявить как константы (строка 20)
- передаваемые данные - почему массив recieved_data[2] имеет размер 3 элемента, payloadsize радиоканала установлен в 32 байта, если вы передаете всегда только один флоат?
А что касается качества - "вы сами-то как думаете?" (с)
Да тоже думаю что полное дерьмо, а выложил с двумя целями:
- первая и самая важная, что бы вылели ведро говна на голову
- помогли сделать его лучше