Создание радиоканала между двумя ардуинками

thefaded
Offline
Зарегистрирован: 13.05.2019

 

Здравствуйте! Ардуино пробую первый раз и сейчас пытаюсь сделать один проект. Одна плата нано передает информацию с двух датчиков BME280 и GY-30 по радиоканалу NRF24L01 на другую плату нано. Два скетча работают практически как надо и происходит передача данных в реальном времени от датчика BME280, но от датчика GY-30 передается лишь значение, полученное при подаче питания на схему. Я проверил, чтобы датчик начинал работать в режиме реального времени, надо дать датчику "передохнуть" чтоли с помощью delay(100), но тогда нарушается работа радиоканала и происходит передача 1-2 пакетов с информацией, не более. Может ли кто-нибудь помочь с данной проблемой? (Я пытался дать задержку и на приемнике, но тогда окончательно все перестает работать)

Скетч передатчика:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <BH1750.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
BH1750 lightMeter;
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
unsigned long delayTime;
RF24 radio(9, 10);
 
void setup(){
    radio.begin();
    radio.setChannel(100);
    radio.setDataRate (RF24_1MBPS);
    radio.setPALevel (RF24_PA_HIGH);
    radio.openWritingPipe (0x1234567890LL);
    Serial.begin(9600);
    Wire.begin();
    lightMeter.begin();
    Serial.println(F("BH1750 Test begin"));
    Serial.println(F("BME280 test"));
    bool status;
    status = bme.begin();
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    Serial.println("-- Default Test --");
    delayTime = 1000;
    Serial.println();
    delay(delayTime);
}
void loop(){ 
    float lux = lightMeter.readLightLevel();
  
    float data[4]= {0, 0, 0, 0};
    data[0] = lux;
    data[1] = bme.readTemperature();
    data[2] = (bme.readPressure() / 100.0F);
    data[3] = bme.readHumidity();
   
    radio.write(&data, sizeof(data));
}


// Скетч приемника:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);
 
void setup(){
    radio.begin();
    radio.setChannel(100);
    radio.setDataRate (RF24_1MBPS);
    radio.setPALevel (RF24_PA_HIGH);
    radio.openReadingPipe (1, 0x1234567890LL);
    radio.startListening ();
 
    Serial.begin(9600);
}
 
void loop(){ 
float data[4]={0, 0, 0, 0};
 
    if (radio.available())
    {   
        radio.read(&data, sizeof(data));
        Serial.print("Light = ");
        Serial.print(data[0]);
        Serial.println(" lx");
        Serial.print("Temperature = ");
        Serial.print(data[1]);
        Serial.println(" *C");
        Serial.print("Pressure = ");
        Serial.print(data[2]);
        Serial.println(" hPa");
        Serial.print("Humidity = ");
        Serial.print(data[3]);
        Serial.println(" %");
        Serial.println(" ");
    }
   
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

thefaded, на будущее, код пожалуйста вставляйте, как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

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

thefaded - странно, что у вас только один датчик зависает, должно бы виснуть все!

Вы же передаете данные в непрерывном режиме, наверно десятки и даже сотни раз в секунду. Вы думаете температура или давление так часто меняются? :)

Сделайте отсчет времени и передавайте данные, скажем. раз в минуту. А еще лучше - запоминайте последний переданный пакет и передавайте новый. только когда что-нибудь изменилось.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Открой для себя JDY-40.  NRF для тебя еще рано.

thefaded
Offline
Зарегистрирован: 13.05.2019

b707 пишет:

thefaded - странно, что у вас только один датчик зависает, должно бы виснуть все!

Вы же передаете данные в непрерывном режиме, наверно десятки и даже сотни раз в секунду. Вы думаете температура или давление так часто меняются? :)

Сделайте отсчет времени и передавайте данные, скажем. раз в минуту. А еще лучше - запоминайте последний переданный пакет и передавайте новый. только когда что-нибудь изменилось.

Я в программировании полный ноль, просто необходимо такую вещь сделать. Нужно просто перед считыванием данных поставить задержку в 30-60 секунд или отсчет времени происходит с помощью отдельного оператора. Скетч приемника при этом менять же никак не надо получается, ведь он не будет выводить данные до тех пор, пока передатчик не отправит пакет с информацией?