nRF24L01 + DS18B20. Конфликт?
- Войдите на сайт для отправки комментариев
Чт, 22/10/2015 - 16:13
Пытаюсь передать данные с датчика DS18B20 по воздуху.
Есть вот такой скетч:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer;
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10); // CE, CSN
void setup(){
Serial.begin(9600);
radio.begin();
delay(2);
radio.setChannel(9);
radio.setDataRate(RF24_1MBPS);
radio.setPALevel(RF24_PA_HIGH);
radio.openWritingPipe(pipe);
sensors.begin();
sensors.getAddress(Thermometer, 0);
sensors.setResolution(Thermometer, 9);
}
void loop()
{
sensors.requestTemperatures();
int data = analogRead(0);
radio.write(&data, sizeof(data));
Serial.print("data: ");
Serial.println(data);
}
Ничего не передает nRF24L01.
Стоит закомментировать строку "sensors.requestTemperatures();" - nRF24L01 передает данные отлично.
Куда копать?
А где получение температуры в лупе после замера?
Я специально убрал все лишнее из кода.
Вот эта строка: "sensors.requestTemperatures();" уже "отключает" модуль NRF.
Причем в Serial идут данные.
А приёмник есть? write() возвращает FALSE, если эфир никто не слушает. ну и попробуй скорость снизить до минимальной.
Ну и исходный скетч покажи, а то гадать в конце дня жутко лень.
Ну и исходный скетч покажи, а то гадать в конце дня жутко лень.
Там ничего такого нет. Получение температуры и отпрака ее по радио.
Я вот что заметил: Любой delay больше 10 в скетче вешает польностью модуль NRF.
А приёмник есть? write() возвращает FALSE, если эфир никто не слушает. ну и попробуй скорость снизить до минимальной.
Возвращает true, если delay нет в коде, и false если есть delay.
Скорее всего delay есть в <RF24.h>.
Вот такой код:
Результат выдает в порт.
В этом случае первый раз ОК потом всегда FALSE.
Если delay закомментировать, то всегда OK.
Вот специально написал "пингер" для двух модулей.
#include <CyberLib.h> #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include "printf.h" #define RX_ON D6_Low #define RX_OFF D6_High #define TX_ON D10_Low #define TX_OFF D10_High const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radioTX(9, 10); // CE, CSN RF24 radioRX(7, 6); // CE, CSN void setup() { Serial.begin(9600); printf_begin(); D10_Out; D6_Out; RX_OFF; TX_ON; radioTX.begin(); radioTX.setChannel(8); // канал (0-127) radioTX.setDataRate(RF24_250KBPS); radioTX.openWritingPipe(pipe); // открываем трубу на передачу. Serial.println("==========================="); radioTX.printDetails(); TX_OFF; Serial.println("==========================="); RX_ON; radioRX.begin(); radioRX.setChannel(8); // канал (0-127) radioRX.setDataRate(RF24_250KBPS); radioRX.openReadingPipe(1, pipe); // открываем трубу на передачу. radioRX.startListening(); radioRX.printDetails(); Serial.println("==========================="); RX_OFF; } void loop() { int data = analogRead(0); // читаем значение Serial.print("Sending: "); Serial.println(data); RX_OFF; TX_ON; if (radioTX.write(&data, sizeof(data))) { Serial.println("Send OK!"); // отправляем данные и указываем сколько байт пакет } else { Serial.println("Send ERR!"); } delay_ms(100); TX_OFF; RX_ON; if ( radioRX.available() ) { bool done = false; while (!done) { done = radioRX.read( &data, sizeof(data)); Serial.print("Received: "); Serial.println(data); } } RX_OFF; TX_ON; Serial.println("==========================="); delay_ms(1000); }printf.h
/* Copyright (C) 2011 J. Coliz <maniacbug@ymail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. */ /** * @file printf.h * * Setup necessary to direct stdout to the Arduino Serial library, which * enables 'printf' */ #ifndef __PRINTF_H__ #define __PRINTF_H__ #ifdef ARDUINO int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); } #else #error This example is only for use on Arduino. #endif // ARDUINO #endif // __PRINTF_H__Вывод:
Ищи сопли в схеме.
Вангую, что проблема либо в принимающей стороне либо в питании. Ну или еще что не так с соединениями.
Ну и, как Вам уже советовали, попробуйте уменьшить скорость работы приемника - должно положительно сказаться на стабильности.