Skip to content

Instantly share code, notes, and snippets.

@adamrunner
Last active March 27, 2016 21:45
Show Gist options
  • Save adamrunner/700dda463f25ab56b97b to your computer and use it in GitHub Desktop.
Save adamrunner/700dda463f25ab56b97b to your computer and use it in GitHub Desktop.
A simple ESP8266 web server that acts as a microservice, reports the temperature at http://ip-address/ or http://ip-address/temp
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
const char* ssid = "wifi";
const char* password = "password";
const long pollTempInterval = 10000;
String displayedTempF = "n/a";
unsigned long previousMillisTemp;
OneWire ds(2); // on pin 2 (a 4.7K resistor is necessary)
ESP8266WebServer server(80);
float getTemp() {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
//NOTE: Search for sensors here?
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
// Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
// Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
// Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
// Serial.println("Device is not a DS18x20 family device.");
return 0.0;
}
ds.reset();
ds.select(addr);
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.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
OneWire::crc8(data, 8);
// 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;
return celsius;
}
void setupWiFi(){
Serial.println("Connecting to Wifi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println(WiFi.localIP());
}
float convertToF(float celsius){
float fahrenheit;
fahrenheit = celsius * 1.8 + 32.0;
return fahrenheit;
}
bool updateInterval(){
unsigned long currentMillis = millis();
if (currentMillis - previousMillisTemp >= pollTempInterval) {
previousMillisTemp = currentMillis;
return true;
}else{
return false;
}
}
void handleRoot() {
server.send(200, "text/plain", "Current Temp: " + displayedTempF + (char)176 + "F");
}
void handleNumberOnly() {
server.send(200, "text/plain", displayedTempF);
}
void handleNotFound(){
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
float updateTempAndConvert(){
float celsius;
float fahrenheit;
celsius = getTemp();
fahrenheit = convertToF(celsius);
displayedTempF = fahrenheit;
return fahrenheit;
}
void setup(void) {
Serial.begin(115200);
setupWiFi();
server.on("/", handleRoot);
server.on("/temp", handleNumberOnly);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
updateTempAndConvert();
}
void loop(void) {
float fahrenheit;
float outside_temp;
server.handleClient();
//NOTE: only update every 10 seconds or so, keeps the load down, lets the MCU do wifi things.
if(updateInterval()){
fahrenheit = updateTempAndConvert();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment