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

Moderator: igrr

User avatar
By SwiCago
#78337 OK, so I bought a sonoff th16 with the intention of running my own firmware. I am using the DALLAS sensor ds18x20. With the original firmware, it reads temperature fine, so I know the sensor and board are fine.

I am running latest arduino IDE 1.8.7 and latest ESP arduino 2.4.2
I have the latest OneWire library 2.3 and latest DallasTemperature library (milesburton)

When I upload the firmware using DallasTemperature I only get back -127
If I use a demo that searched for addresses, I get back "No more addresses"

I checked that the io pin is gpio14, by runnning a sketch that tuens it high/low and see if it is being set. And it is, so I know it is gpio14.

I go back to the original firmware and all is fine.
I searched the forum for similar issues and in all the posts it was a wiring issue or bad pin or bad voltage. In my case it is not any of the, as original firmware works.

I want to use this sensor, as it is waterproof. But I do not want to use sonoff firmware, as I do not like cloud services and what I need this for is too important to use cloud and risk failure.

Any help/tips would be greatly appreciated

Here are the two sketches I tested with

Sketch that returns -127
Code: Select all#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
#define loopmaxcount 10

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress ds18x20;

const int interval = 1000;           // defines interval between DHT readout in sec
unsigned long currentread = 0;
unsigned long previousread = 0;        // timestamp needed for DHT reading interval#
float temp = 0;

void setup() {
  // Search for devices on the bus and assign based on an index.
  sensors.getAddress(ds18x20, 0);
  // set the resolution to 9 bit per device
  sensors.setResolution(ds18x20, TEMPERATURE_PRECISION);

void loop() {
  currentread = millis();
  if (currentread - previousread >= interval) {
    previousread = currentread; // save the last time temp was read
    temp = sensors.getTempC(ds18x20);
    Serial.print("Temp: ");

This one prints "No more addresses"
Code: Select all#include <ESP8266WiFi.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 14

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
// The DallasTemperature library can do all this work for you!

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

void setup(void) {

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  if ( ! {
    Serial.println("No more addresses.");
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      Serial.println("Device is not a DS18x20 family device.");

  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();;   
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] =;
    Serial.print(data[i], HEX);
    Serial.print(" ");
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      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;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(" Celsius, ");
  Serial.println(" Fahrenheit");
User avatar
By rudy
#78339 I ran your code (with the same library) on a ESP-12 board and it worked just fine. No changes other than using I/O pin5 since that was what I had a sensor connected to.

This is when I would pull out a scope and see what is going on. Obviously that doesn't help if you don't have one.
User avatar
By SwiCago
#78357 @rudy, what version of IDE, and libraries are you running? All really the same? I am wondering if it is a version issue.
Funny thing is, original firmware works fine. I dumped it before I uploaded my own.
Even funnier is, I tried Espurna firmware. Once compiled on my PC and once just downloaded a prebuilt version from the their git download section. Both failed to read the dallas sensor.
I am going to try a th22 next and see if that is nurfed too on this board. Maybe there is some initialization delay that is required of this sensor version I have and the OneWire library isn't getting it. Anyhow, thanks for chiming in.
User avatar
By rudy
#78362 Arduino 1.85
OneWire version 2.3.4
Using library DallasTemperature at version 3.8.0
ESP8266-Arduino git version from 2018-05-11

I am using the Dallas sensor in three wire mode. Vcc, gnd, data.