Датчик ds18b20 и nrf24l01 не работают вместе.

Тема в разделе "Arduino & Shields", создана пользователем smile, 23 май 2017.

  1. smile

    smile Нерд

    Столкнулся со странной проблемой.
    При одновременном подключении датчика температуры ds18b20 и модуля nrf24 программа не работает.
    Может кто-то сталкивался?
    Если схему не трогать, а просто убрать из кода радио или датчик, то по отдельности работает, т.е. именно в коде проблема скорее всего.

    Код (C++):
    #include <CyberLib.h>
    #include <SPI.h>
    #include <OneWire.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    OneWire  ds(10);
    RF24 radio(7, 8);
    const uint64_t pipe = 0xAABBCCDDE1LL;
    uint8_t relMode, msgArr[32];
    float celsius;
    bool tx_flag;

    void setup()
    {
      Serial.begin(9600);
      delay(1000);
      radio.begin();
      radio.setAutoAck(1);
      radio.setRetries(10, 10);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_250KBPS);
      radio.openReadingPipe(1, pipe);
      radio.powerUp();
      radio.startListening();

      D5_In; // сенсорная кнопка
      D5_High;

      D3_Out; //выход на реле*
      D3_Low;

      D4_Out; //выход на светодиод
      D4_Low;

      D6_Out; //выход на вентилятор
      D6_Low;
    }

    void loop()
    {
    if (millis() % 1000 == 0) {
        byte i;
        byte present = 0;
        byte type_s;
        byte data[12];
        byte addr[8];

        if ( !ds.search(addr)) {
          ds.reset_search();
          return;
        }

        type_s = 0;

        ds.reset();
        ds.select(addr);
        ds.write(0x44, 1);

        present = ds.reset();
        ds.select(addr);
        ds.write(0xBE);

        for ( i = 0; i < 9; i++) {
          data[i] = ds.read();
        }

        int16_t raw = (data[1] << 8) | data[0];
        if (type_s) {
          raw = raw << 3;
          if (data[7] == 0x10) {
            raw = (raw & 0xFFF0) + 12 - data[6];
          }
        } else {
          byte cfg = (data[4] & 0x60);
          // at lower res, the low bits are undefined, so let's zero them
          if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
          else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
          else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
          //// default is 12 bit resolution, 750 ms conversion time
        }
        celsius = (float)raw / 16.0;
        Serial.println(celsius);
     
    Программа выполняется до (!ds.search(addr)) и виснет.
    Если убрать код модуля nrf24, то всё ок, температуру кажет.

    Из кода убрал всё лишнее, оставил только то, то имеет значение в данной проблеме.
     
  2. smile

    smile Нерд

    Грешу на CyberLib.h, без неё ещё не пробовал, но по отдельности то с ней модули работают...
     
  3. smile

    smile Нерд

    Проблема решена.
    Дело в pin10, на который был назначен oneWire.
    При инициализации SPI пин 10 видимо автоматом отдается под нужды интерфейса, в итоге oneWire на нем работать не может.
     
    arkadyf нравится это.