Your new topic does not fit any of the above??? Check first. Then post here. Thanks.

Moderator: igrr

User avatar
By Bilathon
#34885 This is my first serious Arduino/ESP8266 project so please bear with me...

I am trying to get a DS18B20 temperature sensor working win an ESP8266. I have wired the sensor on my breadboard with the required resistor (tried both 2.2K Ohm and 3.7K Ohm). Everything is working fine when I connect an Arduino to the breadboard (ground, +3.3V, and data pin 2) in combination with the example code that comes with the OneWire library.

The board I am using is this one (I bought two of them, both behave exactly the same): ... 17059.html

Here is a picture of my breadboard setup:

As mentioned above, if I connect the wires that are now connected to D2, 3V3, and GND to the equivalent Arduino pins the Arduino can read the temperature sensor just fine.

I use the Arduino IDE in combination with esp8266 board manager. This works great! Except when I wire this board up to the breadboard instead of my Arduino. I quadruple checked that I use the OneWire library and example that come with the ESP8266 board manager. I even added prints in the library to see where things go south.

This is what my minimalistic sketch looks like:

Code: Select all#include <ESP8266OneWire.h>

OneWire  ds(2);  // on pin 2 (a 4.7K resistor is necessary)

void setup(void) {

void loop(void) {
  byte addr[8];

  if ( ! {
    Serial.println("No more addresses.");
  Serial.println("search ok.");


Note that I renamed the OneWire library to make sure I use the right one. I cut out all the stuff after this code in the example because this code already fails. The output shows a continuous stream of "No more addresses.".

The 'OneWire::reset' method (called from the OneWire::search method) always returns false. This is the method straight from the ESP8266 OneWire library:

Code: Select alluint8_t OneWire::reset(void)
        IO_REG_TYPE mask = bitmask;
        volatile IO_REG_TYPE *reg IO_REG_ASM = baseReg;
        uint8_t r;
        uint8_t retries = 125;

        DIRECT_MODE_INPUT(reg, mask);
        // wait until the wire is high... just in case
        do {
                if (--retries == 0) return 0;
        } while ( !DIRECT_READ(reg, mask));

        DIRECT_WRITE_LOW(reg, mask);
        DIRECT_MODE_OUTPUT(reg, mask);  // drive output low
        DIRECT_MODE_INPUT(reg, mask);   // allow it to float
        r = !DIRECT_READ(reg, mask);
        return r;

The last DIRECT_READ always returns TRUE, making r false and the method fail.

Do you have any idea what I am doing wrong?
User avatar
By bbx10node
#34910 Try connecting the DS to the pin labelled D4. Or change the sketch to use pin 4 instead of 2. The reason is the labels on the board do not match up with Arduino IDE GPIO numbers. See the following for more details.
User avatar
By lorneb
#48659 Just posting my findings: getting the DS18X20_Tempreture sketch to work with ESP8266

Pin 2 of the ESP8266 supports a pullup with input, so my sketch worked fine without the external pull up resister
with the following addition to the setup()
pinMode(2, INPUT_PULLUP);