ESP8266-DS18S20

From Hackerspace ACKspace
Revision as of 08:21, 13 July 2015 by Xopr (talk | contribs) (projectified page (forgot to submit this change))
Jump to: navigation, search
Project: ESP8266-DS18S20
Featured:
State Complete"Complete" is not in the list (Active, Planned, Completed, Stalled, Impossible) of allowed values for the "State of Project" property.
Members xopr
GitHub No GitHub project defined. Add your project here.
Description Creating a wireless SpaceAPI-like sensor
Picture
No project picture! Fill in form Picture or Upload a jpeg here


This code is somewhat ugly (and deprecated), but it works..

the PCB that powers the ESP8266

This sketch provides a webserver-like interface and provides a json file (somewhat compatible with SpaceAPI).

The json will provide the DS18S20 temperature sensor's address and temperature in °C, and will look like:

{
  "sensors":{
    "ext_temp_count":2,
    "temperature":[
      {
        "ext_index":0,
        "value":-127.0,
        "unit":"°C",
        "ext_address":"00112233445566"
      },
      {
        "ext_index":0,
        "value":85.0,
        "unit":"°C",
        "ext_address":"99AABBCCDDEEFF"
      }
    ]
  }
}

Note: the ext_temp_count and ext_index fields are only visible in debug mode (GPIO0 pulled to ground)

There is a version running in the space in a 'hot' zone, and accessible on http://192.168.1.132 within the space.

/*
  2015-07-04: Created by xopr
  
  Code based on http://iot-playground.com/2-uncategorised/41-esp8266-ds18b20-temperature-sensor-arduino-ide by Igor Jarc
 
  External libraries:
  - https://github.com/milesburton/Arduino-Temperature-Control-Library
 
  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  version 2 as published by the Free Software Foundation.
*/

#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// AP definitions
#define AP_SSID "ACKspaceWifi"
#define AP_PASSWORD "nospacenet"

#define ONE_WIRE_BUS 2  // DS18B20 pin
OneWire oneWire( ONE_WIRE_BUS );
DallasTemperature DS18B20( &oneWire );
WiFiServer server( 80 );

void setup()
{
  Serial.begin( 115200 );

  // Make sure GPIO doesn't float if we try and read it
  pinMode( 0, INPUT_PULLUP );
  wifiConnect( );
}

const char* strIndent = "  ";
bool bDebug;

void loop()
{
  float temp;

  // Check if a client has connected
  WiFiClient client = server.available( );
  if ( !client )
    return;

  // Wait until the client sends some data
  Serial.println( "new client" );
  while(!client.available( ))
    delay(1);

  DS18B20.begin();

  // Read the first line of the request
  String req = client.readStringUntil( '\r' );
  Serial.println( req );
  client.flush( );

  bDebug = !digitalRead( 0 );

  DS18B20.requestTemperatures( );
  //delay(1);
  uint8_t nDevicecount = DS18B20.getDeviceCount( );

  // Output JSON, keep the spaceAPI (v0.13) standard.
  // NOTE: proper json decoders handle utf-8 at least. Also, you need this for the degree symbol
  client.print( "HTTP/1.1 200 OK\r\nContent-Type: application/json;charset=utf8\r\n\r\n" );

  client.print( "{\n" );

  client.print( strIndent );
  client.print( "\"sensors\":{\n" );

  if ( bDebug )
  {
    client.print( strIndent );
    client.print( strIndent );
    client.print( "\"ext_temp_count\":" );
    client.print( nDevicecount );
    client.print( ",\n" );
  }

  client.print( strIndent );
  client.print( strIndent );
  client.print( "\"temperature\":[\n" );

  for ( uint8_t nDevice = 0; nDevice < nDevicecount; nDevice++ )
  {
    DeviceAddress address;
    byte nTry = 10;
    boolean bFail = true;

    // Try and retrieve the sensor's value
    while ( nTry-- && bFail )
    {
      if ( DS18B20.getAddress( address, nDevice ) )
      {
        temp = DS18B20.getTempCByIndex( nDevice );

        if ( temp == 85.0 || temp == ( -127.0 ) )
          bFail = true;
        else
          bFail = false;
      }

      delay(1);
    }

    if ( nTry )
    {


      // Sensor
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( "{\n" );

      // sensor index (in debug only)
      if ( bDebug )
      {
        client.print( strIndent );
        client.print( strIndent );
        client.print( strIndent );
        client.print( strIndent );
        client.print( "\"ext_index\":" );
        client.print( nDevice );
        client.print( ",\n" );
      }

      // Temperature value
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( "\"value\":" );

      if ( temp == ( -127.0 ) )
        client.print( "null," );
      else if ( temp == 85.0 )
        client.print( "false," );
      else
        client.print( temp );

      client.print( ",\n" );

      // Temperature unit
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( "\"unit\":\"°C\",\n" );

      // Sensor address
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( "\"ext_address\":" );
      client.print( "\"" );
      client.print( address[1], HEX );
      client.print( address[2], HEX );
      client.print( address[3], HEX );
      client.print( address[4], HEX );
      client.print( address[5], HEX );
      client.print( address[6], HEX );
      client.print( address[7], HEX );
      client.print( "\"\n" );


      client.print( strIndent );
      client.print( strIndent );
      client.print( strIndent );
      client.print( "}" );

      if ( nDevice + 1 < nDevicecount )
        client.print( "," );

      client.print( "\n" );

    }

  // /Sensor
  }
  
  client.print( strIndent );
  client.print( strIndent );
  client.print( "]\n" );
  
  client.print( strIndent );
  client.print( "}\n}" );

  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected 
  // when the function returns and 'client' object is detroyed
}

void wifiConnect()
{
    Serial.print( "Connecting to " );
    Serial.print( AP_SSID );
    WiFi.begin( AP_SSID, AP_PASSWORD );
    while ( WiFi.status() != WL_CONNECTED )
    {
        delay( 1000 );
        Serial.print( "." );
    }
  
    Serial.println( "" );
    Serial.println( "WiFi connected" );

    server.begin();
    Serial.println( "Server started" );

    // Print the IP address
    Serial.println(WiFi.localIP( ) );
}