65.9K
CodeProject is changing. Read more.
Home

Connecting an ESP8266-12 to a DS1820 Thermometer and Do a HTTP Post Data to the Internet

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2 votes)

Dec 4, 2016

CPOL

1 min read

viewsIcon

8952

Here's how to connect an ESP8266-12 to a DS1820 thermometer and do an HTTP post data to the internet.

Pre-requisites!

I'll be using these components:

  • A standard ESP8266-12 on a breakout-board such as the one shown
  • Three 4.7k resistors
  • A 3v battery (I use a CR123a) for powering the ESP826612
  • A DS1820 (I use the DO-92 packaged version below)

The following requirements should be met:

  • All connections, including those on the The ESP 8266-12 on the breakout-board, are solid and conduct power as they should.
  • The battery holds at least 2.8v of power.
  • The ESP8266-12 has been programmed with the following sketch:
    #include OneWire.h
    #include DallasTemperature.h
    #include ESP8266WiFi.h
    #include ESP8266WiFiMulti.h
    #include ESP8266HTTPClient.h
    
    #define ONEWIRE_PIN 13
    
    OneWire oneWire(ONEWIRE_PIN);
    DallasTemperature sensors(&oneWire);
    
    boolean TempSensorAvailable = false;
    DeviceAddress TempSensor;
    float tempCtry1;
    float tempCtry2;
    
    //AP definitions
    #define AP_SSID "your wifi-network name here<your-wifi-network-name-here>"
    #define AP_PASSWORD "wifi password here<your-wifi-network-password-here>"
    
    void setup() {
    
    //enable this to test from the arduino serial monitor
    Serial.begin(74880);
    
    sensors.begin();
    
    Serial.print("Found ");
    Serial.print(sensors.getDeviceCount(), DEC);
    Serial.println(" OneWire device(s).");
    
    // report parasite power requirements
    Serial.print("Parasite power: ");
    if (sensors.isParasitePowerMode()) Serial.println("ON");
    else Serial.println("OFF");
    
    if (!sensors.getAddress(TempSensor, 0)) {
    Serial.println("No OneWire Device Found");
    } else {
    TempSensorAvailable = true;
    Serial.println("OneWire Device Found");
    sensors.setResolution(TempSensor, 12);
    }
    }
    
    void loop() {
    
    wifiConnect();
    postTemperature();
    <onewire .h=""><dallastemperature 
    .h=""><esp8266wifi .h=""><esp8266wifimulti 
    .h=""><esp8266httpclient 
    .h=""><your-wifi-network-name-here><your-wifi-network-password-here>
    <onewire .h=""><dallastemperature 
    .h=""><esp8266wifi .h=""><esp8266wifimulti 
    .h=""><esp8266httpclient 
    .h=""><your-wifi-network-name-here>
    <your-wifi-network-password-here>delay(60 * 1000);
    }
    
    void postTemperature()
    {
    sensors.requestTemperatures();            // Get temprature
    tempCtry1 = sensors.getTempC(TempSensor); // save temperature
    sensors.requestTemperatures();            // Get temprature
    tempCtry2 = sensors.getTempC(TempSensor); // save temprature
    
    HTTPClient http;
    http.begin("http://<your-http-post-endpoint-here>");
    http.addHeader("Content-Type", "application/json");
    String postMessagePart1 = String("{ 'sensorId' : 
    'L15-Out1', 'temperature' : '");
    String postMessagePart2 = String("', 'postAttempts' : '");
    String postMessagePart3 = String("', 'batteryVoltage' : '");
    String postMessagePart4 = String("' }");
    String postMessage = postMessagePart1 + ((tempCtry1+tempCtry2)/2) + 
    postMessagePart2 + retries + postMessagePart3 + vdd + postMessagePart4 ;
    int httpCode = http.POST(postMessage);
    Serial.print("http result:");
    Serial.println(httpCode);
    
    http.writeToStream(&Serial);
    http.end();
    
    if ( httpCode != 200 && httpCode != 201)
    {
    delay(1000);
    postTemperature();
    }
    }
    
    void wifiConnect()
    {
    Serial.print("Connecting to AP");
    WiFi.begin(AP_SSID, AP_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    }
    
    Serial.println("");
    Serial.println("WiFi connected");
    }

Don't forget to import the libraries into the Arduino IDE environment.

Given the above is in order, go ahead and connect the components as per the following picture:

  • The RESET and GPIO16 pins should be connected - this enables the ESP 8266-12 to wake up from deep sleep mode.
  • The GPIO0 and GPIO2 should be connected to VCC with a 4.7k resistor in the middle. This is to prevent a so-called 'zombie-mode', in which the ESP8266-12 has trouble waking up from deep sleep.
  • The data-line and the VCC line of the DS1820 should be joined by a 4.7k resistor, or the temperature will not be read.
  • The data-line of the DS1820 should be connected to the GPIO13-pin of the stand-alone ESP8266-12, as this corresponds with the "#define ONEWIRE_PIN 13" statement of the code.

With the ESP connected like so, my ESP8266-12 happily does an HTTP post to my web-service every 60 seconds, before repeating the cycle.

You should put the ESP8266-12 into deep sleep mode if you power your thermometer via battery.