Created
March 17, 2016 19:39
-
-
Save justindarc/913533557e2ebb1bc9e2 to your computer and use it in GitHub Desktop.
esp8266-ap-flyweb-temperature-server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Install ESP8266 Board v2.1.0 by adding this | |
// to the "Additional Board Manager URLs" in | |
// "Preferences..." and then select it for | |
// installation via "Boards Manager..." under | |
// the "Tools" -> "Board: XXX" menu. | |
// http://arduino.esp8266.com/stable/package_esp8266com_index.json | |
#include <ESP8266WiFi.h> | |
#include <ESP8266WebServer.h> | |
#include <ESP8266mDNS.h> | |
#include <WiFiUdp.h> | |
// OneWire v2.3.2 (Install via "Manage Libraries...") | |
#include <OneWire.h> | |
// DallasTemperature v3.7.6 (Install via "Manage Libraries...") | |
#include <DallasTemperature.h> | |
// NOTES: | |
// * Use 74880 baud rate in "Serial Monitor" | |
// to view logger info. | |
// * Select 921600 baud rate under the | |
// "Tools" -> "Upload Speed: XXX" menu for | |
// faster flash programming (tested and | |
// works fine with "SparkFun Thing Dev"). | |
// Pin definitions | |
const int ONE_WIRE_BUS = 0; // OneWire bus | |
const int DISCOVER_PIN = 2; // Button for toggling discovery | |
const int LED_PIN = 5; // Thing's onboard, green LED | |
const int MIN_DEBOUNCE_COUNT = 10; | |
// Debounce variables | |
bool discoveryMode = false; | |
int discoverValue = LOW; | |
int discoverCount = 0; | |
int discoverLastValue; | |
long discoverLastTime = 0; | |
OneWire oneWire(ONE_WIRE_BUS); | |
DallasTemperature sensors(&oneWire); | |
ESP8266WebServer server(80); | |
String selectedSSID = ""; | |
String selectedKey = ""; | |
String getDeviceName() { | |
uint8_t mac[WL_MAC_ADDR_LENGTH]; | |
WiFi.softAPmacAddress(mac); | |
String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + | |
String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); | |
macID.toUpperCase(); | |
return "TemperatureSensor-" + macID; | |
} | |
void startAccessPoint() { | |
discoveryMode = true; | |
Serial.println("DISCOVERY MODE"); | |
digitalWrite(LED_PIN, LOW); | |
WiFi.disconnect(); | |
delay(4000); | |
WiFi.mode(WIFI_AP); | |
String AP_NameString = getDeviceName(); | |
char AP_NameChar[AP_NameString.length() + 1]; | |
memset(AP_NameChar, 0, AP_NameString.length() + 1); | |
for (int i=0; i<AP_NameString.length(); i++) | |
AP_NameChar[i] = AP_NameString.charAt(i); | |
WiFi.softAP(AP_NameChar); | |
IPAddress ipAddress = WiFi.softAPIP(); | |
Serial.println("Access point: " + AP_NameString); | |
Serial.println("IP address: " + ipAddress.toString()); | |
} | |
void stopAccessPoint() { | |
discoveryMode = false; | |
Serial.println("TEMPERATURE MODE"); | |
digitalWrite(LED_PIN, HIGH); | |
WiFi.softAPdisconnect(); | |
delay(4000); | |
WiFi.mode(WIFI_STA); | |
WiFi.begin(selectedSSID.c_str(), selectedKey.c_str()); | |
Serial.print("Connecting to: " + selectedSSID); | |
while (WiFi.status() != WL_CONNECTED && !discoveryMode) { | |
delay(500); | |
Serial.print("."); | |
} | |
IPAddress ipAddress = WiFi.localIP(); | |
Serial.println(""); | |
Serial.println("IP address: " + ipAddress.toString()); | |
MDNS.begin(getDeviceName().c_str(), ipAddress); | |
MDNS.addService("http", "tcp", 80); | |
} | |
void loop() { | |
if (millis() != discoverLastTime) { | |
discoverLastValue = digitalRead(DISCOVER_PIN); | |
if (discoverLastValue == discoverValue && discoverCount > 0) { | |
discoverCount--; | |
} | |
if (discoverLastValue != discoverValue) { | |
discoverCount++; | |
} | |
if (discoverCount >= MIN_DEBOUNCE_COUNT) { | |
discoverCount = 0; | |
discoverValue = discoverLastValue; | |
if (discoverValue == LOW) { | |
if (discoveryMode) { | |
stopAccessPoint(); | |
} | |
else { | |
startAccessPoint(); | |
} | |
} | |
} | |
discoverLastTime = millis(); | |
} | |
server.handleClient(); | |
} | |
void handleIndex_temperature() { | |
String s = ""; | |
// Read the temperature from the OneWire bus. | |
sensors.requestTemperatures(); | |
float tempC = sensors.getTempCByIndex(0); | |
float tempF = DallasTemperature::toFahrenheit(tempC); | |
char buffer[10]; | |
String tempString = dtostrf(tempF, 4, 1, buffer); | |
s += "<!DOCTYPE html>\r\n"; | |
s += "<html>\r\n"; | |
s += "<head>\r\n"; | |
s += "<title>ESP8266 Temperature Monitor</title>\r\n"; | |
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=no,initial-scale=1\">\r\n"; | |
s += "<meta http-equiv=\"refresh\" content=\"5\">\r\n"; | |
s += "</head>\r\n"; | |
s += "<body>\r\n"; | |
s += "<h1>Temperature: " + tempString + "</h1>\r\n"; | |
s += "</body>\r\n"; | |
s += "</html>\r\n"; | |
server.send(200, "text/html", s); | |
} | |
void handleIndex_connecting() { | |
String s = ""; | |
s += "<!DOCTYPE html>\r\n"; | |
s += "<html>\r\n"; | |
s += "<head>\r\n"; | |
s += "<title>ESP8266 Temperature Monitor</title>\r\n"; | |
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=no,initial-scale=1\">\r\n"; | |
s += "</head>\r\n"; | |
s += "<body>\r\n"; | |
s += "<h1>Network settings saved! Restarting...</h1>\r\n"; | |
s += "</body>\r\n"; | |
s += "</html>\r\n"; | |
server.send(200, "text/html", s); | |
} | |
void handleIndex_discovery() { | |
String s = ""; | |
if (server.method() == HTTP_POST) { | |
selectedSSID = server.arg("ssid"); | |
selectedKey = server.arg("key"); | |
handleIndex_connecting(); | |
stopAccessPoint(); | |
} | |
s += "<!DOCTYPE html>\r\n"; | |
s += "<html>\r\n"; | |
s += "<head>\r\n"; | |
s += "<title>ESP8266 Temperature Monitor</title>\r\n"; | |
s += "<meta name=\"viewport\" content=\"width=device-width,user-scalable=no,initial-scale=1\">\r\n"; | |
s += "</head>\r\n"; | |
s += "<body>\r\n"; | |
s += "<h1>Select your network</h1>\r\n"; | |
s += "<form method=\"POST\" action=\"/\">\r\n"; | |
s += "<p>\r\n"; | |
s += "<label for=\"ssid\">SSID</label>\r\n"; | |
s += "<select id=\"ssid\" name=\"ssid\">\r\n"; | |
s += "<option value=\"\">-- Select a network --</option>\r\n"; | |
int networksLength = WiFi.scanNetworks(); | |
for (int networkIndex = 0; networkIndex < networksLength; networkIndex++) { | |
String ssid = WiFi.SSID(networkIndex); | |
s += "<option value=\"" + ssid + "\"" + | |
(selectedSSID == ssid ? " selected" : "") + | |
">" + ssid + "</option>\r\n"; | |
} | |
s += "</select>\r\n"; | |
s += "</p>\r\n"; | |
s += "<p>\r\n"; | |
s += "<label for=\"key\">Key</label>\r\n"; | |
s += "<input type=\"password\" id=\"key\" name=\"key\"" + selectedKey + ">\r\n"; | |
s += "</p>\r\n"; | |
s += "<p>\r\n"; | |
s += "<input type=\"submit\" value=\"Connect\">\r\n"; | |
s += "</p>\r\n"; | |
s += "</form>\r\n"; | |
s += "</body>\r\n"; | |
s += "</html>\r\n"; | |
server.send(200, "text/html", s); | |
} | |
void handleIndex() { | |
if (discoveryMode) { | |
handleIndex_discovery(); | |
} | |
else { | |
handleIndex_temperature(); | |
} | |
} | |
void setup() { | |
// Start logging to serial console | |
Serial.begin(74880); | |
// Setup I/O pins | |
pinMode(LED_PIN, OUTPUT); | |
pinMode(DISCOVER_PIN, INPUT); | |
digitalWrite(LED_PIN, HIGH); | |
digitalWrite(DISCOVER_PIN, HIGH); | |
startAccessPoint(); | |
sensors.begin(); | |
server.on("/", handleIndex); | |
server.begin(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment