Skip to content

Instantly share code, notes, and snippets.

@maesoser
Last active February 22, 2020 23:33
Show Gist options
  • Select an option

  • Save maesoser/4222c2d2b8ef7a743b18b651e9ce4fba to your computer and use it in GitHub Desktop.

Select an option

Save maesoser/4222c2d2b8ef7a743b18b651e9ce4fba to your computer and use it in GitHub Desktop.
#include <Adafruit_NeoPixel.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <ESP8266mDNS.h>
#include <ArduinoJson.h>
#define SEALEVELPRESSURE_HPA (1013.25)
#define PIN D5
#define N_LEDS 16
#define MDNS_HOSTNAME "lightsensor"
struct RGBSetup {
byte r;
byte g;
byte b;
byte mode;
};
Adafruit_BME280 bme;
float temperature, humidity, pressure, altitude;
const char* ssid = ""; // Enter SSID here
const char* password = ""; //Enter Password here
ESP8266WebServer server(80);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(D4, OUTPUT);
digitalWrite(D4, HIGH);
strip.begin();
Serial.begin(115200);
delay(100);
bme.begin(0x76);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
while (!MDNS.begin(MDNS_HOSTNAME)) {
delay(1000);
}
StaticJsonBuffer<200> jsonBuffer;
server.on("/metrics", HTTP_GET, handle_PromMetrics);
server.on("/api", HTTP_GET, handle_getLed);
server.on("/api", HTTP_POST, handle_setLed);
server.onNotFound(handle_NotFound);
server.begin();
}
void loop() {
server.handleClient();
chase(strip.Color(255, 0, 0)); // Red
chase(strip.Color(0, 255, 0)); // Green
chase(strip.Color(0, 0, 255)); // Blue
}
static void chase(uint32_t c) {
for(uint16_t i=0; i<strip.numPixels()+4; i++) {
strip.setPixelColor(i , c); // Draw new pixel
strip.setPixelColor(i-4, 0); // Erase pixel a few steps back
strip.show();
delay(25);
}
}
void handle_PromMetrics() {
temperature = bme.readTemperature();
humidity = bme.readHumidity();
pressure = bme.readPressure() / 100.0F;
altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
server.send(200, "text/plain", PromMetrics(temperature,humidity,pressure,altitude));
}
void handle_getLed() {
server.send(200, "text/plain", "not_implemented");
}
void handle_setLed() {
/*JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) {
server.send(500, "text/plain", "ParseObject() Failed");
return;
}
*/
//const char* sensor = root["sensor"];
//long time = root["time"];
//double latitude = root["data"][0];
//double longitude = root["data"][1];
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
String addMetric(String input, String name, float val){
input += MDNS_HOSTNAME;
input += "_" + name + " ";
input += val;
input += "\n";
return input;
}
String PromMetrics(float temperature,float humidity,float pressure,float altitude){
String ptr = "";
ptr = addMetric(ptr,"temperature", temperature);
ptr = addMetric(ptr,"humidity_pcnt", humidity);
ptr = addMetric(ptr,"pressure", pressure);
ptr = addMetric(ptr,"altitude_meters", altitude);
ptr = addMetric(ptr,"heap_free_bytes", ESP.getFreeHeap());
ptr = addMetric(ptr,"heap_fragmentation_pcnt", ESP.getHeapFragmentation());
ptr = addMetric(ptr,"heap_max_block_bytes", ESP.getMaxFreeBlockSize());
return ptr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment