NRF24L01 + LowPower(реализация приёма и передачи на одном модуле NRF24L01)
- Войдите на сайт для отправки комментариев
Чт, 04/04/2019 - 00:26
Всем привет!. Прошу указать на ошибки и косяки в коде.
есть ардуино 1: включается, опрашивает датчики, отправляет через NRF24L01, засыпает, просыпается, проверяет изменились ли показания датчиков и предшествующие значения(если изменились - отправить новые значения)
Ардуино 2: включается, ожидает и принимает данные.
не получается реализовать: ардуино 2 включается, отправляет команду на ардуино1 опросить датчики и отправить, начинает ожидать данные.
Код передатчика:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <Wire.h> #include "LowPower.h" //#define RADAR_DEBUG 1 #define PIN_RAIN_SENSOR 0 ///////////////////////////////////////////////////////////////////////// int WaitCount = 10; const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL}; ////////////////////////////////////////////////////////////////////////// RF24 radio(9, 10); Adafruit_BME280 bme; ////////////////////////////////////////////////////////////////////////// struct package { int temperature; int pressure; int humidity; bool enabled; int rain; bool check; }; typedef struct package Package; Package data; //////////////////////////////////////////////////////////////////////// int t; int h; int p; int dataReceived; ////////////////////////////////////////////////////////////////////// void setup() { #ifdef RADAR_DEBUG Serial.begin(115200); #endif radio.begin(); pinMode(PIN_RAIN_SENSOR, INPUT); #ifdef RADAR_DEBUG Serial.println("Power Up"); #endif radio.setChannel(0x6e); radio.setDataRate (RF24_1MBPS); radio.setPALevel (RF24_PA_HIGH); radio.openWritingPipe(pipes[1]); // Открываем канал передачи radio.openReadingPipe(1, pipes[0]); // Открываем канал приема delay(1000); if (!bme.begin()) { Serial.println("Could not find a valid BMP280 sensor, check wiring!"); while (1); } #ifdef RADAR_DEBUG Serial.print("--- Wireless Weather Station ---\n"); Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" ºC"); Serial.print("Pressure = "); Serial.print(bme.readPressure() / 133.32239F); // 100 Pa = 1 millibar Serial.println(" mmHg"); Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); Serial.print("rain = "); Serial.println(analogRead(PIN_RAIN_SENSOR)); Serial.print("--------------------------------\n\n"); #endif readSensor(); radio.write(&data, sizeof(data)); #ifdef RADAR_DEBUG Serial.println("radio send"); #endif t = int(bme.readTemperature()); p = int(bme.readPressure()) / 133.32239F; h = int(bme.readHumidity()); radio.powerDown(); #ifdef RADAR_DEBUG Serial.println("radio down"); #endif } void loop() { getWeather(); // отправляем погоду после сна getData(); sleep(); } void sleep() { for (byte i = 0; i <= WaitCount; i++) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // уходим спать } } void readSensor() { if (!bme.begin()) { #ifdef RADAR_DEBUG Serial.println("Could not find a valid BMP280 sensor, check wiring!"); #endif data.enabled = false; } else { data.humidity = bme.readHumidity(); data.temperature = bme.readTemperature(); data.pressure = bme.readPressure() / 133.32239F;; data.rain = analogRead(PIN_RAIN_SENSOR); data.enabled = true; } } void getWeather() { int tt; int hh; int pp; tt = int(bme.readTemperature()); pp = int(bme.readPressure() / 133.32239F); hh = int(bme.readHumidity()); if (tt != t || pp != p || hh != h ) { radio.powerUp(); #ifdef RADAR_DEBUG Serial.println(t); Serial.println(tt); Serial.println(p); Serial.println(pp); Serial.println(h); Serial.println(hh); Serial.println("Radio PowerUP"); #endif readSensor(); radio.write(&data, sizeof(data)); t = tt; p = pp; h = hh; radio.powerDown(); } } void getData() { #ifdef RADAR_DEBUG Serial.println("check data"); #endif radio.startListening (); delay(800); #ifdef RADAR_DEBUG Serial.println("open radio"); #endif if ( radio.available() ) { #ifdef RADAR_DEBUG Serial.println("data wait"); #endif radio.read(&dataReceived, sizeof(dataReceived) ); if (dataReceived == 1) { radio.stopListening (); #ifdef RADAR_DEBUG Serial.println("data ok"); #endif getWeather(); delay (1000); } } else { radio.stopListening (); } }
Код приёмника
#include <SPI.h> // библиотека для работы с шиной SPI #include "nRF24L01.h" // библиотека радиомодуля #include "RF24.h" RF24 radio(7, 8); int dataReceived; struct package { int temperature; int pressure; int humidity; bool enabled; int rain; bool check; }; typedef struct package Package; Package data; const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL}; void setup() { Serial.begin(115200); radio.begin(); radio.setChannel(0x6e); radio.setDataRate (RF24_1MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек radio.setPALevel (RF24_PA_HIGH); radio.openWritingPipe(pipes[1]); // Открываем канал передачи radio.openReadingPipe(1, pipes[0]); // Открываем канал приема SendCheck(); } void loop() { if (radio.available()) { radio.read(&data, sizeof(data)); Serial.println((String)"Температура: " + data.temperature + " \t\t Давление: " + data.pressure + " \t\t Влажность: " + data.humidity ); if (data.enabled == true ) { Serial.println("Sensor OK"); } else { Serial.println("Sensor not found"); } // Serial.println("$"); // Serial.println(int(data.temperature)); // Serial.println(" "); // Serial.println(int(data.humidity)); // Serial.println(" "); /// Serial.println(int(data.pressure)); //Serial.println(";"); } } void SendCheck() { Serial.println((String)"start"); dataReceived = 1; radio.stopListening(); Serial.println((String)"stop listen"); Serial.println((String)"OpenWrite"); radio.write(&dataReceived, sizeof(dataReceived)); Serial.println((String)"SendData"); radio.startListening (); Serial.println((String)"StartListen"); if (radio.available()) { radio.read(&data, sizeof(data)); Serial.println((String)"Температура: " + data.temperature + " \t\t Давление: " + data.pressure + " \t\t Влажность: " + data.humidity ); if (data.enabled == true ) { Serial.println("Sensor OK"); } else { Serial.println("Sensor not found"); } } }