Связка Arduino + NRF24L01 -> NRF24L01 + Raspberry Pi3

Тема в разделе "Raspberry Pi", создана пользователем Albert1977, 7 авг 2017.

  1. Albert1977

    Albert1977 Нерд

    Здравствуйте форумчане!
    Есть связка Arduino + NRF24L01 и Raspberry Pi3 + NRF24L01. Друг друга видят, тестовое "Hello World!" с ардуины передает, а Raspberry ловит, обрадовался, так как в будущем есть замысел построить умный дом на множестве ардуин с NRF. Решил пойти дальше и подключил к ардуинке DHT11, чтобы передавать данные о температуре и влажности в массиве. Но не тут-то было. Ардуина передает, а Raspberry (программа на питоне) с трубы ловит сразу два значения (температура и влажность) и выдает на экран. Попытки выдернуть из массива только одно значение не венчались успехом. Борюсь уже который день и никак не могу допетрить как это сделать. Обращаюсь к вам, уважаемы форумчане, может кто сталкивался, подскажите пожалуйста, буду весьма признателен. Спасибо. Прошу не закидывать помидорами :)

    Код Arduino:
    Код (C++):

    #include <TroykaDHT11.h>
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"


    RF24 radio(9, 10);
    DHT11 dht(5);

    byte td[2]; // массив, хранящий передаваемые данные

    void setup() {
      Serial.begin(9600);

      radio.begin();
      radio.enableDynamicPayloads();
      radio.setChannel(0x76);
      radio.openWritingPipe(0xF0F0F0F0E1LL);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_250KBPS);

      radio.powerUp();
    //  radio.stopListening();
    }

    void loop() {
      int check;

      td[0] = dht.getTemperatureC();
      td[1] = dht.getHumidity();

        radio.write(&td, sizeof(td)); // отправить по радио

    }
     

    Код Raspberry Pi (Python):

    Код (C++):
    import Rpi.GPIO as GPIO
    from lib_nrf24 import NRF24
    import time
    import spidev

    GPIO.setmode(GPIO.BCM)

    pipes = [[0xE8, 0xE8, 0xF0, 0xF0, 0xE1], [0xF0, 0xF0, 0xF0, 0xF0, 0xE1]]

    radio = NRF24(GPIO, spidev.SpiDev())
    radio.begin(0, 17)

    radio.setPayloadSize(32)
    radio.setChannel(0x76)
    radio.setDataRate(NRF24.BR_1MBPS)
    radio.setPALevel(NRF24.PA_MIN)

    radio.setAutoAck(true)
    radio.enableDynamicPayloads()
    radio.enableAckPayload()

    radio.openReadingPipe(1, pipes[1])
    radio.printDetails()
    radio.startListening()
      while True:
     
        while not radio.available(0):
           time.sleep (1/100)

        receivedMessage = []
        radio.read(receivedMessage, radio.getDynamicPayLoadSize())

      print ("Температура: {}".format(receivedMessage))
     
  2. Neu

    Neu Нерд

    Как так? Должны увенчаться, потому как это и нужно сделать. Вы отправляете два байта в одной посылке: в первом байте - темпер, во втором - влажность. Ну и вычитывайте их соответственно:
    Код (C++):

    byte t; // темпер
    byte h; // влажность
    byte len = radio.getDynamicPayloadSize();
    byte receivedMessage [len] = {0};
    radio.read(&receivedMessage, len);
    t = receivedMessage[0];
    h = receivedMessage[1];
    printf("Температура: %d, влажность: %d", t, h);
     
    Код на Си и не проверен, но идея наверняка понятна будет и на Питон перевести получиться.
     
    arkadyf нравится это.
  3. Albert1977

    Albert1977 Нерд

    Спасибо большое. Код работает. Адаптировал по питон и все пошло. Сделал так:
    Код (C++):
    a = []
    b =[]
    len = radio.getDynamicPayloadSize()
    receivedMessage = []
    radio.read(receivedMessage, len)
    a = receivedMessage[0]
    b = receivedMessage[1]
    print("Температура: ", a, "Влажность: ", b)
    Действительно всё гениальное, просто
    Спасибо!
     
    arkadyf нравится это.