nRF24L01 + DS18B20. Конфликт?

Ricci
Offline
Зарегистрирован: 24.01.2012

Пытаюсь передать данные с датчика 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 передает данные отлично.

Куда копать?

 

 

Radjah
Offline
Зарегистрирован: 06.08.2014

А где получение температуры в лупе после замера?

Ricci
Offline
Зарегистрирован: 24.01.2012

Я специально убрал все лишнее из кода.

Вот эта строка: "sensors.requestTemperatures();" уже "отключает" модуль NRF.

Причем в Serial идут данные.

Radjah
Offline
Зарегистрирован: 06.08.2014

А приёмник есть? write() возвращает FALSE, если эфир никто не слушает. ну и попробуй скорость снизить до минимальной.

 

Ну и исходный скетч покажи,  а то гадать в конце дня жутко лень.

Ricci
Offline
Зарегистрирован: 24.01.2012

Radjah пишет:

Ну и исходный скетч покажи,  а то гадать в конце дня жутко лень.

Там ничего такого нет. Получение температуры и отпрака ее по радио.

Я вот что заметил: Любой delay больше 10 в скетче вешает польностью модуль NRF.

Ricci
Offline
Зарегистрирован: 24.01.2012

Radjah пишет:

А приёмник есть? write() возвращает FALSE, если эфир никто не слушает. ну и попробуй скорость снизить до минимальной.

Возвращает true, если delay нет в коде, и false если есть delay.

Скорее всего delay есть в <RF24.h>.

 

Ricci
Offline
Зарегистрирован: 24.01.2012

Вот такой код:

#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(8); // канал (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.setPALevel(RF24_PA_MIN);

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop()   
{
  
  int data = analogRead(0); // читаем значение
  
  if (radio.write(&data, sizeof(data))) {Serial.print("OK ");} // отправляем данные и указываем сколько байт пакет
  else {Serial.print("FALSE ");}
  
  Serial.print("data: ");
  Serial.println(data);
 
  delay(1000);
} 

Результат выдает в порт.

В этом случае первый раз ОК потом всегда FALSE.

Если delay закомментировать, то всегда OK.

Radjah
Offline
Зарегистрирован: 06.08.2014

Вот специально написал "пингер" для двух модулей.

#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__

Вывод:

===========================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xf0f1f2f3f4 0xf0f1f2f3f4
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0xf0f1f2f3f4
RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA            = 0x3f
EN_RXADDR        = 0x03
RF_CH            = 0x08
RF_SETUP         = 0x27
CONFIG           = 0x0c
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 250KBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_HIGH
===========================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xe7e7e7e7e7 0xf0f1f2f3f4
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR          = 0xe7e7e7e7e7
RX_PW_P0-6       = 0x00 0x20 0x00 0x00 0x00 0x00
EN_AA            = 0x3f
EN_RXADDR        = 0x03
RF_CH            = 0x08
RF_SETUP         = 0x27
CONFIG           = 0x0f
DYNPD/FEATURE    = 0x00 0x00
Data Rate        = 250KBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_HIGH
===========================
Sending: 563
Send OK!
Received: 563
===========================
Sending: 517
Send OK!
Received: 517
===========================
Sending: 482
Send OK!
Received: 482
===========================
Sending: 484
Send OK!
Received: 484
===========================

Ищи сопли в схеме.

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Вангую, что проблема либо в принимающей стороне либо в питании. Ну или еще что не так с соединениями.

Ну и, как Вам уже советовали, попробуйте уменьшить скорость работы приемника - должно положительно сказаться на стабильности.