Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save justindarc/913533557e2ebb1bc9e2 to your computer and use it in GitHub Desktop.
Save justindarc/913533557e2ebb1bc9e2 to your computer and use it in GitHub Desktop.
esp8266-ap-flyweb-temperature-server
// 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