Код приемника NRF24L01 для приема температуры

AntonHT
Offline
Зарегистрирован: 29.12.2017

Выкладываю код приемника, может кому пригодится. 

В краце информация с передатчика, поступает на приемник и выводится на экран 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]);
    
}
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Зря вы это выложили.

Предлагать свой код стоит в двух случаях - либо он демонстрирует какой-то принципиально новый подход к решению задачи. либо настолько хорош, что может случить образцом для подражания.

В вашем коде никакой новизны я не вижу, процентов на 80% он повторяет пример из библиотеки RF24. А что касается качества - "вы сами-то как думаете?" (с)

Навскидку

- массив с именами труб следует обьявить как константы (строка 20)

- передаваемые данные - почему массив recieved_data[2] имеет размер 3 элемента, payloadsize радиоканала установлен в 32 байта, если вы передаете всегда только один флоат?

 

 

AntonHT
Offline
Зарегистрирован: 29.12.2017

b707 пишет:

А что касается качества - "вы сами-то как думаете?" (с)

Да тоже думаю что полное дерьмо, а выложил с двумя целями: 

- первая и самая важная, что бы вылели ведро говна на голову

- помогли сделать его лучше