И снова NRF24L01
- Войдите на сайт для отправки комментариев
Пт, 23/11/2018 - 10:38
После долгих мучений nrf заводится работает только на некоторых каналах, хотя все выбранные каналы чистые, но это пол беды, после включения они отваливаются и перестают передавить\принимать данные кондеры стоят керамика на 0.47 и полярник на 220
Передатчик
#include <SPI.h> // библиотека для работы с SD-картами #include <OneWire.h> #include <Wire.h> #include <DallasTemperature.h> #include "nRF24L01.h" // библиотека радиомодуля #include "RF24.h" // ещё библиотека радиомодуля #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress i247={0x28, 0xFF ,0xDD ,0x02 ,0x01 ,0x17 ,0x04 ,0xB5}; DeviceAddress o247={0x28 ,0xFF ,0xD3 ,0x40 ,0x01 ,0x17 ,0x05 ,0xAE}; DeviceAddress i248={0x28 ,0xFF ,0xF0 ,0x0F ,0x01 ,0x17 ,0x05 ,0x62}; DeviceAddress o248={0x28 ,0xFF ,0x3B ,0x1A ,0x01 ,0x17 ,0x05 ,0x89}; DeviceAddress i250={0x28 ,0xFF ,0x8C ,0x03 ,0x01 ,0x17 ,0x04 ,0x62}; DeviceAddress o250={0x28 ,0xFF ,0x04 ,0xBF ,0x00 ,0x17 ,0x05 ,0xE1}; int data[6]; RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // для Меги byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { // put your setup code here, to run once: Serial.begin(9600); //открываем порт для связи с ПК sensors.begin();// открываем последовательный порт на скорости 9600 бод sensors.setResolution(i247, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o247, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i248, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o248, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i250, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o250, TEMPERATURE_PRECISION); delay(50); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x5f); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик Serial.println("SETTING DONE"); } void loop() { // put your main code here, to run repeatedly: Serial.println("LOOP"); sensors.requestTemperatures(); delay(100); data[0] = sensors.getTempC(i247); data[1] = sensors.getTempC(o247); data[2] = sensors.getTempC(i248); data[3] = sensors.getTempC(o248); data[4] = sensors.getTempC(i250); data[5] = sensors.getTempC(o250); for(int i=0;i<6;i++) { Serial.println(data[i]); } radio.flush_tx(); radio.write(&data, sizeof(data)); }
Приемник
#include <SPI.h> // библиотека для работы с SD-картами #include "nRF24L01.h" #include "RF24.h" #include <OneWire.h> #include <Wire.h> #include <DallasTemperature.h> #include <ModbusRtu.h> #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 9 int data[6]; RF24 radio(9,10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб uint32_t startTime = millis(), currentMillis,previousMillis=0,cooldown=15000; //n1=i235,n18=o235 //n0=i237,n16=o237 //n15=i242,n8=o242 //n17=i-srednetemp;n2=o-srende; //n3=osred1,n5=osred2 //n7=o234,n19=i234 //n4-o244,n10-i244 //n12=o241,n14=o240 //n6-n11-245 /* 0x28, 0xFF, 0x38, 0x71, 0x00, 0x17, 0x05, 0x68, r237 isparitelb 0x28, 0xFF, 0x63, 00x0, 0x01, 0x17, 0x03, 0xDC, r237 obiem 0x28, 0xFF, 0xCF, 0x37, 0x01, 0x17, 0x04, 0x83, r236 obiem 0x28, 0xFF, 0x94, 0xDD, 0x00, 0x17, 0x05, 0xC1, r236 isparitelb 0x28, 0xFF, 0xAB, 0x07, 0x01, 0x17, 0x04, 0xC5, without isparitelb sred temperatur 0x28, 0xFF, 0xF4, 0x01, 0x01, 0x17, 0x04, 0x36, without obiem sred temperatur 0x28, 0xFF, 0x2C, 0x23, 0x01, 0x17, 0x03, 0xA2, polka holodilnik n2 obiem 0x28, 0xFF, 0xEA, 0x1C, 0x01, 0x17, 0x05, 0x13, polka holodilnik n1 obiem 0x28, 0xFF, 0xB6, 0x56, 0x01, 0x17, 0x03, 0x81, r245 obiem 0x28, 0xFF, 00xD, 0xDE, 0x00, 0x17, 0x05, 00xD, r245 isparitelb 0x28, 0xFF, 0x9F, 0x17, 0x01, 0x17, 0x05, 0x38, r234-isparitelb 0x28, 0xFF, 0x61, 0xC2, 0x00, 0x17, 0x05, 0x17, r234-obiem 0x28, 0xFF, 0x7D, 0xBE, 0x00, 0x17, 0x03, 0x2D, r235 isparitelb 0x28, 0xFF, 0xC9, 0xAC, 0xD0, 0x16, 0x05, 0x42, r235 obiem 0x28, 0xFF, 0xE2, 0xCA, 0x00, 0x17, 0x05, 0x8E, r244 obiem 0x28, 0xFF, 00x5, 0xE0, 0x00, 0x17, 0x05, 0x6E, r244 isparitelb 0x28, 0xFF, 0xBD, 0xCF, 0xA4, 0x16, 0x05, 0x59, r241 obierm 0x28, 0xFF, 0x43, 0x3E, 0x01, 0x17, 0x05, 0xA4, r240 obiem 0x28, 0xFF, 0x11, 0x17, 0x01, 0x17, 0x04, 0x0F, without number obiem nizkotemperatur 0x28, 0xFF, 0xA3, 0xBA, 0x00, 0x17, 0x03, 0xDF, without isparitelb nizkotemperatur */ //235=1,18;- //237=0,16;- //242=15,8;- //hz=17,2;- //234=7,19;- //244=4,10;- //245=6,11;- OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress i237={0x28, 0xFF, 0x38, 0x71, 0x00, 0x17, 0x05, 0x68}; DeviceAddress o237={0x28, 0xFF, 0x63, 0x00, 0x01, 0x17, 0x03, 0xDC}; DeviceAddress i236={0x28, 0xFF, 0x94, 0xDD, 0x00, 0x17, 0x05, 0xC1}; DeviceAddress o236={0x28, 0xFF, 0xCF, 0x37, 0x01, 0x17, 0x04, 0x83}; DeviceAddress i245={0x28, 0xFF, 0x0D, 0xDE, 0x00, 0x17, 0x05, 0x0D}; DeviceAddress o245={0x28, 0xFF, 0xB6, 0x56, 0x01, 0x17, 0x03, 0x81}; DeviceAddress i234={0x28, 0xFF, 0x9F, 0x17, 0x01, 0x17, 0x05, 0x38}; DeviceAddress o234={0x28, 0xFF, 0x61, 0xC2, 0x00, 0x17, 0x05, 0x17}; DeviceAddress i235={0x28, 0xFF, 0x7D, 0xBE, 0x00, 0x17, 0x03, 0x2D}; DeviceAddress o235={0x28, 0xFF, 0xC9, 0xAC, 0xD0, 0x16, 0x05, 0x42}; DeviceAddress o241={0x28, 0xFF, 0xBD, 0xCF, 0xA4, 0x16, 0x05, 0x59}; DeviceAddress o240={0x28, 0xFF, 0x43, 0x3E, 0x01, 0x17, 0x05, 0xA4}; DeviceAddress i242={0x28, 0xFF, 0x11, 0x17, 0x01, 0x17, 0x04, 0x0F}; DeviceAddress o242={0x28, 0xFF, 0xA3, 0xBA, 0x00, 0x17, 0x03, 0xDF}; DeviceAddress i370={0x28, 0xFF, 0xAB, 0x07, 0x01, 0x17, 0x04, 0xC5}; DeviceAddress o370={0x28, 0xFF, 0xF4, 0x01, 0x01, 0x17, 0x04, 0x36}; DeviceAddress o239={0x28, 0xFF, 0x2C, 0x23, 0x01, 0x17, 0x03, 0xA2}; DeviceAddress o238={0x28, 0xFF, 0xEA, 0x1C, 0x01, 0x17, 0x05, 0x13}; DeviceAddress i244={0x28, 0xFF, 0xE2, 0xCA, 0x00, 0x17, 0x05, 0x8E}; DeviceAddress o244={0x28, 0xFF, 0x05, 0xE0, 0x00, 0x17, 0x05, 0x6E}; // data array for modbus network sharing uint16_t au16data[44],timer=0; int tempC[44]; /** * Modbus object declaration * u8id : node id = 0 for master, = 1..247 for slave * u8serno : serial port (use 0 for Serial) * u8txenpin : 0 for RS-232 and USB-FTDI * or any pin number > 1 for RS-485 */ Modbus slave(4,0,2); // this is slave @1 and RS-232 or USB-FTDI void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print("0x"); Serial.print(deviceAddress[i],HEX); Serial.print(", "); } Serial.println(" "); } void setup() { slave.begin(9600); // 19200 baud, 8-bits, even, 1-bit stop sensors.begin();// открываем последовательный порт на скорости 9600 бод sensors.setResolution(i237, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o237, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i236, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o236, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i245, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o245, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i234, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o234, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i235, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o235, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o241, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o240, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i242, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o242, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i370, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o370, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o239, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o238, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(i244, TEMPERATURE_PRECISION); delay(50); sensors.setResolution(o244, TEMPERATURE_PRECISION); delay(50); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0 radio.setChannel(0x5f); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { currentMillis = millis(); if(currentMillis-startTime>cooldown) { startTime=millis(); sensors.requestTemperatures(); delay(1000); tempC[0] = sensors.getTempC(i237); tempC[1] = sensors.getTempC(o237); tempC[2] = sensors.getTempC(i236); tempC[3] = sensors.getTempC(o236); tempC[4] = sensors.getTempC(i245); tempC[5] = sensors.getTempC(o245); tempC[6] = sensors.getTempC(i234); tempC[7] = sensors.getTempC(o234); tempC[8] = sensors.getTempC(i235); tempC[9] = sensors.getTempC(o235); tempC[10] = sensors.getTempC(o241); tempC[11] = sensors.getTempC(o240); tempC[12] = sensors.getTempC(i242); tempC[13] = sensors.getTempC(o242); tempC[14] = sensors.getTempC(i370); tempC[15] = sensors.getTempC(o370); tempC[16] = sensors.getTempC(o239); tempC[17] = sensors.getTempC(o238); tempC[18] = sensors.getTempC(i244); tempC[19] = sensors.getTempC(o244); timer=0; /*tempC[20] = sensors.getTempC(tempsens21); tempC[21] = sensors.getTempC(tempsens22); tempC[22] = sensors.getTempC(tempsens23); tempC[23] = sensors.getTempC(tempsens24); tempC[24] = sensors.getTempC(tempsens25); tempC[25] = sensors.getTempC(tempsens26); tempC[26] = sensors.getTempC(tempsens27); tempC[27] = sensors.getTempC(tempsens28); tempC[28] = sensors.getTempC(tempsens29); tempC[29] = sensors.getTempC(tempsens30); tempC[30] = sensors.getTempC(tempsens31); tempC[31] = sensors.getTempC(tempsens32); tempC[32] = sensors.getTempC(tempsens33); tempC[33] = sensors.getTempC(tempsens34); tempC[34] = sensors.getTempC(tempsens35); tempC[35] = sensors.getTempC(tempsens36); tempC[36] = sensors.getTempC(tempsens37); tempC[37] = sensors.getTempC(tempsens38); tempC[38] = sensors.getTempC(tempsens39); tempC[39] = sensors.getTempC(tempsens30); tempC[40] = sensors.getTempC(tempsens31); tempC[41] = sensors.getTempC(tempsens32); tempC[42] = sensors.getTempC(tempsens33); tempC[43] = sensors.getTempC(tempsens34); */ for(int i=0;i<20;i++) { au16data[i]=100+tempC[i];//i235 // Serial.print("number= "); // Serial.print(i); // Serial.print(" temp= "); // Serial.println(tempC[i]); } byte pipeNo, gotByte; if( radio.available(&pipeNo)){ // слушаем эфир со всех труб radio.read( &data, sizeof(data) ); // чиатем входящий сигнал for(int i=0;i<6;i++) { au16data[21+i]=100+data[i]; } } } slave.poll( au16data, 30 ); } ///////////////////////////////////////
Афтар? Зачем вы отлаживаете связь на передаче двух десятков датчиков температуры? Выкиньте для начала все лишнее из скетча, передавайте, к примеру, одно целое число . Добейтесь устойчивой работы передатчика и приемника - и только потом нагружайте их кучей данных.
И еще замечание по коду - к радио отношения не имеет -
вы положили 20 значений температуры в массив, это правильно. Только надо было и адреса датчиков тоже массивом описать - тогда вместо 20 опросов температуры и двадцати строк получения - имели бы один элегантный цикл.
Связь уже была отлажена, работала, НО через 8-10 часов радиомодуль отрубается
несколько замесаний по инициализации NRF :
- по скорости 250К в инете много нареканий на работу модулей, попробуйте сменить на что-то другое
- размер передаваемых данных и размер Payload желательно делать одинаковым. а у вас не совпадает
Ничего другого сходу в коде не вижу. Вообще, такие проблемы, когда код несколько часов работает. а потом валится - ловить крайне сложно. Тут может быть все что угодно, не только NRF - проблемы по питанию, глюки другого железа и тд...
По питанию ну просто не может быть проблем) 3.3 как в аптеке берется с кренки 3.3 и кондеры)
Со скоростью интересная версия) попробую
По питанию ну просто не может быть проблем)
Вот эту вот фразу Вы лучше сразу забудьте. Сколько раз она звучала, и сколько раз в итоге оказывалась лишней - не передать. :) И проверьте питание в том числе, потому как NRF к его чистоте весьма критично относится.
По питанию ну просто не может быть проблем)
Вот эту вот фразу Вы лучше сразу забудьте. Сколько раз она звучала, и сколько раз в итоге оказывалась лишней - не передать. :) И проверьте питание в том числе, потому как NRF к его чистоте весьма критично относится.
Ну, гля, после этих слов и начинаются ГЛАВНЫЕ проблемы. А датчики и процессор работают...