Noob problem with NodeMCU and OneWire



  • Ciao to all,
    I'm moving to MySensors network in my home to be used with Domoticz... after a first phase made by a gateway on a raspberry PI2, a rain (on/off), I'm now approaching to reorganize the entire network and move to a nodeMCU (12e) gateway which include the rain sensor and I would like to add a DS18B20 too (to gather external temp)
    While the gateway and the on/off switch works pretty fine, I'm having a bad problem with OneWire: even if the sketch is compiled with no error, I see no device, nr presented, nor updated, no device at all

    Wirings are ok: using D1 pin (no luck with other pins), with a 4k7 resistor... 3.3v are provided from an external 5v (2A) power supply and a AMS1117 3.3
    I checked the same sketch on a ATMega328p nano and it works... seems to be a NodeMCU device issue
    does anyone experienced the same?
    Is there a solution for this (which does not include to move to DHT22 :P :P )
    thanks
    ciao
    M


  • Mod

    @emme welcome to the MySensors community. Are you still stuck on this? If so, could you post your sketch and describe all your wiring?



  • still unsolved, but workaround by replacing the onewire with a DHT22 :P :P

    this is my sketch:

    // Gateway MySensors on NodeMCU with some Devices 
    // OneWire for DS18B20 
    // Bounce for S_DOOR (Rain Sensor)
    #define MY_DEBUG
    #define MY_BAUD_RATE 115200
    #define MY_RADIO_NRF24
    
    // #define MY_GATEWAY_SERIAL
    #define MY_GATEWAY_ESP8266
    #define MY_ESP8266_SSID "myWiFi"
    #define MY_ESP8266_PASSWORD "******"
    #define MY_ESP8266_HOSTNAME "sensor-gateway"
    #define MY_PORT 5003
    #define MY_GATEWAY_MAX_CLIENTS 3
    #include <ESP8266WiFi.h>
    
    #define MY_INCLUSION_MODE_FEATURE
    
    #include <MySensors.h>
    #include <SPI.h>
    #include <DallasTemperature.h>
    #include <OneWire.h>
    
    #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No
    #define ONE_WIRE_BUS D1 // Pin where dallase sensor is connected 
    #define MAX_ATTACHED_DS18B20 5
    
    unsigned long temp_Sleep = 30000; // Sleep time between reads (in milliseconds)
    unsigned long temp_nTime;
    
    OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
    DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. 
    float lastTemperature[MAX_ATTACHED_DS18B20];
    int numSensors=0;
    bool receivedConfig = false;
    bool metric = true;
    // Initialize temperature message
    MyMessage msgTemp(0,V_TEMP);
    
    #include <Bounce2.h>
    // RAIN Sensor Definitions and settings
    #define CHILD_ID 10
    #define BUTTON_PIN D4  // Arduino Digital I/O pin for button/reed switch
    Bounce debouncer = Bounce(); 
    int oldValue=-1;
    MyMessage msgRain(CHILD_ID,V_TRIPPED);
    
    unsigned long cTime;  // Current Time
    void before()
    {
      // Startup up the OneWire library
      sensors.begin();
    }
    
    void setup()  
    { 
      // requestTemperatures() will not block current thread
      sensors.setWaitForConversion(false);
    
      pinMode(BUTTON_PIN,INPUT);
      digitalWrite(BUTTON_PIN,HIGH);
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5);
    }
    
    void presentation() {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Temperature Sensor", "1.1");
    
      // Fetch the number of attached temperature sensors  
      numSensors = sensors.getDeviceCount();
    
      // Present all sensors to controller
      for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
         present(i, S_TEMP);
      }
      
      present(CHILD_ID, S_DOOR);  
    }
    
    void loop()     
    {
      cTime = millis();  // Get current Timing
    
      if ((cTime - temp_nTime) >= temp_Sleep) {     // this is supposed to replace the sleep function 
        sensors.requestTemperatures();
        for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
          float temperature = static_cast<float>(static_cast<int>(sensors.getTempCByIndex(i)));
          #if COMPARE_TEMP == 1
          if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) {
          #else
          if (temperature != -127.00 && temperature != 85.00) {
          #endif
            send(msgTemp.setSensor(i).set(temperature,1));
            lastTemperature[i]=temperature;
          }
        }
        temp_nTime = millis();
      }
      
      debouncer.update();
      int value = debouncer.read();
      if (value != oldValue) {
         // Send in the new value
         send(msgRain.set(value==HIGH ? 1 : 0));
         oldValue = value;
      }
      
    }
    

    if I enter a

    Serial.print("Sensors Count over 1W bus: ");
    Serial.println(sensors.getDeviceCount()); 
    

    I got 0 :(

    wirings are ok... I checked with the tester and I get correct voltage (3,3) and impedence (4,7k)
    DHT works fine at first try on the same PIN

    thanks for the help
    ciao
    Marco



  • Hello,
    I have exactly the same issue with ESP8266 nodemcu as Gateway + sensor DHT22.
    I tested with 2 different libraries DHT22.
    And I also tested with mySensors 2.1.0 and 2.1.1

    Console serial write out: Failed reading from DHT

    Otherwise the gateway works well without sensor (so alone) and with the DHT22 sensor on a node (arduino nano)


  • Mod

    I'm moving to I2C sensors to avoid these kinds of problems 😀


  • Hardware Contributor

    I tried with two different Dallas Onewire and checked out the library at github. Have build these sensors before but got -127 all the time. Just adding this here if it pops up alof of people having issues...


Log in to reply
 

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.