не могу получить данные по NRF24L01 с DHT22
- Войдите на сайт для отправки комментариев
Втр, 10/03/2015 - 21:15
взял коды с просторов интернета, и немного переделал под себ. Проблема в том, что приемник, не принимает(или передатчик не отдает) данные с датчика DHT22, причем передачик, когда подключен по USB в сериал данные шлет отлично. вот скетчи, подскажите если кто ошибку видит, заранее благодарен.
Приемник:
#include "SPI.h" #include "nRF24L01.h" #include "RF24.h" // https://github.com/maniacbug/RF24 const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radio(9, 10); // CE, CSN void setup(){ Serial.begin(9600); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) неработает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу } // radio.stopListening(); // останавливает приём (нужно перед началом передачи) void loop() { if (radio.available()){ // проверяем не пришло ли чего в буфер. int data[3]; radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать Serial.print("Humidity (%): "); Serial.println(data[1]); Serial.print("Temperature (oC): "); Serial.println(data[0]); Serial.print("chislo: "); Serial.println(data[3]); } else Serial.println("no data");// это уж сам дописал, именно это и пишется в сериале, зн нужные данные не получает delay(1000); }
Перредатчик:
#include "SPI.h" #include "nRF24L01.h" #include "RF24.h" // https://github.com/maniacbug/RF24 #include "DHT.h" #define DHTPIN 7 // what pin we're connected to const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radio(9, 10); // CE, CSN #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) неработает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу. delay(1000); } void loop() { int data[3]; data[0] = int(dht.readHumidity()); // заполняем массив data[1] = int(dht.readTemperature()); data[2] = int(5); delay(100); radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет Serial.print("Humidity (%): "); Serial.print(data[0]); Serial.print(" chislo: "); Serial.print(data[2]); Serial.print(" Temperature (oC): "); Serial.println(data[1]); delay(1000); }
заремируй ВСЕ что связано с датчиками
и попробуй передать зарание( в ручную) заполненный масив
если не помогло убирай весь Serial который у тебя после отсылки данных стоит
------
у меня тоже постоянно глюки были пока приемную часть не перевел на внешнее прерывание
на nrf24 и пин для этого есть
переделал приемник на прерывание, теперь такая картина, когда на ардуинке с кодом передатчика нажимаю резет, приходит в сериал два раза мой массив на приемник с задержкой в 1 сек, как в приемника и написано. видимо что-то с отправкой у меня не то.
Даже пробовал NRFки отдельно запитывать.
Передатчик:
#include <SPI.h> #include "RF24.h" #include "DHT.h" #define DHTPIN 7 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); RF24 radio(9, 10); const uint64_t pipes = 0xF0F0F0F000LL;// адреса каналов приема и передачи void setup(){ dht.begin(); Serial.begin(9600); radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 //radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes); // Открываем канал передачи //radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема //radio.startListening(); // Начинаем слушать эфир } void loop() { int data[3]; data[0] = int(dht.readHumidity()); // заполняем массив data[1] = int(dht.readTemperature()); data[2] = int(5); delay(1000); radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет /* Serial.print("Humidity (%): "); Serial.print(data[0]); Serial.print(" chislo: "); Serial.print(data[2]); Serial.print(" Temperature (oC): "); Serial.println(data[1]); //delay(1000);*/ }Приемник:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10); volatile boolean flag_tx, flag_fail, flag_rx; const uint64_t pipes = 0xF0F0F0F000LL;// адреса каналов приема и передачи void setup() { attachInterrupt(1, check_radio, FALLING); Serial.begin(9600); radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 //radio.setRetries(15,15); // Кол-во попыток и время между попытками //radio.openWritingPipe(pipes[0]); // Открываем канал передачи radio.openReadingPipe(1, pipes); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир } void check_radio(){ // обработчик прерывания bool tx, fail, rx; radio.whatHappened(tx,fail,rx); // читаем регистр flag_tx = tx; // 1 если успешно отправили данные flag_fail = fail; // 1 если данные не отправленны flag_rx = rx; // 1 если пришли данные для чтения } void loop(){ if (flag_rx){ // если пришли данные для чтения int data[3]; // забераем их и выводим на экран radio.read(&data, sizeof(data)); Serial.print(data[1]); Serial.println(" - temperatura"); Serial.print(data[0]); Serial.println(" - Humi"); Serial.print(data[2]); Serial.println(" - chislo"); delay(1000); flag_rx = 0; } if (flag_fail){ // если данные не отправленны flag_fail = 0; } if (flag_tx){ // если данные отправленны flag_tx = 0; } }100 лет назад перешёл на Serial.begin(115200) и жалею что в ИДЕ больше нельзя ......
В Realterm проверял - даже Serial.begin(921600) прекрасно работает.
Дмаю, здесь это не спасет...
radio.write возвращает bool с результатом выполения, попробуй добавить if на этот bool.
Я для передатчика всё равно пайп на чтение открывал, ибо не знаю, как там отчет о приёме ходит. :)
Ну и DHT22 чаще раза в 2 секунды опрашивать смысла нет.
переписал вообще все. сделал счетчик для опроса датчика, т.е. получаю их каждые 10 секунд, и только потом пишу в массив и отправляю этот массив. от руки заполняю массив цифрами, все приходит, как только пытаюсь запихнуть значения с датчика, все... тишина. приходит 2 раза, только при нажатии на резет на передатчике. пробовал слать с потенциометра данные, летят как миленькие, все пишет в сериал с приемника. Припаял кандеры на NRFки, проблему не решило. вот какой скетч на данный момент:
Приемник:
#include <SPI.h> #include "RF24.h" //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino //SCK -> 13//MISO -> 12//MOSI -> 11 RF24 radio(9,10); //CSN -> 10//CE -> 9 const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала int msg[2]; //объявляем массив void setup() { radio.begin(); Serial.begin(9600); radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир } void loop() { if (radio.available()){ radio.read(&msg, sizeof(msg)); Serial.print("Temperatura "); Serial.print(msg[0]); Serial.print(" "); Serial.print("Vlagnost "); Serial.print(msg[1]); Serial.print(" "); } }Передатчик:
#include <SPI.h> #include "DHT.h" #include "RF24.h" int msg[2]; int temp; int humi; #define DHTPIN 4 //Пин подключения DHT #define DHTTYPE DHT11 //Прописываем тип датчика температуры DHT dht(DHTPIN, DHTTYPE); //Контакты от радиомодуля NRF24L01 подключаем к пинамнам -> Arduino //SCK -> 13//MISO -> 12//MOSI -> 11 RF24 radio(9,10);//CSN -> 10//CE -> 9 unsigned long temp_old; //время последнего опроса датчика unsigned long time_over; //Для переполнения счетчика const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи //------------------------------------Функция для опроса датчика с определенной переодичностью------------------------------------- boolean get_temp(int t)//получаем температуру с периодичностью t(миллисекунды) { unsigned long m; m=get_millis(); if (m-temp_old>t)//если период наступил { int temp_new; int humi_new; //temp_kitchen_new=sensors.getTempC(t2); //temp_bath_new=sensors.getTempC(t1); temp_new=dht.readTemperature();//Читаем показания датчиков humi_new=dht.readHumidity(); if ((temp_new>10) & (temp_new<50)) temp=temp_new; if ((humi_new>10) & (humi_new<100)) humi=humi_new; temp_old=m; return true; } else return false; //если период не наступил возвращаем false } //-----------------------------------------Т.к. мы работаем с счетчиками миллисекунд, то напишем функцию для обработки их переполнения.--------------------------------------------------- unsigned long get_millis()//избавляемся от переполнения { unsigned long m; m=millis(); if(m<time_over)//если произошло переполнение то обнуляем все переменные времени { time_over=0; temp_old=0; } return m; } //--------------------------------------------------- void setup(void) { dht.begin(); radio.begin(); Serial.begin(9600); radio.openWritingPipe(pipe); // Открываем канал передачи } void loop(void){ if (get_temp(10000)==true) \\Если условия счетчика выполнились, заполняем массив { msg[0] = temp; msg[1] = humi; } radio.write(&msg, sizeof(msg));//отправляем данные //Serial.println(msg[0]); //Serial.println(msg[1]); delay(100); }ПС: Щас попробую для экспиримента даллас подключить, или датчик дыма
А не проще впиндюрить delay?
аааа, пендюрил... все одно. щас вон с youtube взял пример готовый, и библиотеки все по новой качнул по егоссылкам, у чела шлется все, у меня нет.. и NRFки менял и дуины менял. не работает... именно DHT 22 и DHT11, пробовал по командам 1,2,3,4 гасить и зажигать светодиоды - все работает(брал у Осипова примеры), массив заполненный рукой - шлет, с потенциометра - шлет, ХЗ что такое
Самое интересное, они приходят 2 раза!!! когда на передатчике жмешь резет.
Я делал не через массив, а через структуру.
Клиент на UNO https://github.com/radjah/arduino/blob/master/RF24/temp_nw/client_SHT21/...
Сервер на NANO https://github.com/radjah/arduino/blob/master/ReadSHT2x_nosd_nolcd/ReadS...
С DHT тоже работало.
Огромное спасибо, мир не без добрых людей!:) щас попробую перепилить под себя.
Собственно вот. Только на передающей стороне дисплея уже нет, и туда я еще RTC добавил.
Собственно вот. Только на передающей стороне дисплея уже нет, и туда я еще RTC добавил.
можете дать скетч?