Здравствуйте форумчане! Есть связка 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))
Как так? Должны увенчаться, потому как это и нужно сделать. Вы отправляете два байта в одной посылке: в первом байте - темпер, во втором - влажность. Ну и вычитывайте их соответственно: Код (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); Код на Си и не проверен, но идея наверняка понятна будет и на Питон перевести получиться.
Спасибо большое. Код работает. Адаптировал по питон и все пошло. Сделал так: Код (C++): a = [] b =[] len = radio.getDynamicPayloadSize() receivedMessage = [] radio.read(receivedMessage, len) a = receivedMessage[0] b = receivedMessage[1] print("Температура: ", a, "Влажность: ", b) Действительно всё гениальное, просто Спасибо!