Esp32/esp32 bme680 http
From Federal Burro of Information
< Esp32
This needs cleanup. This also blinks the onboard neopixel of exp32 from green to red as it processes the request.
#include <Wire.h> #include <SPI.h> #include <Adafruit_NeoPixel.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" // https://www.arduino.cc/reference/en/libraries/wifi// #include <WiFi.h> // #include <Adafruit_NeoPixel.h> // esp32 onboard Neopixel stuff #define PIN 8 #define NUMPIXELS 1 #define DELAYVAL 500 #define SEALEVELPRESSURE_HPA (1013.25) #define I2C_SDA 0 #define I2C_SCL 1 const char* ssid = "Tomato24"; const char* password = ""; // Set web server port number to 80 WiFiServer server(80); Adafruit_BME680 bme; // Variable to store the HTTP request String header; Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Current time unsigned long currentTime = millis(); // Previous time unsigned long previousTime = 0; // Define timeout time in milliseconds (example: 2000ms = 2s) const long timeoutTime = 2000; void setup() { Serial.begin(115200); Serial.print("pixel being"); pixels.begin(); Serial.print("pixel done"); Serial.println(F("BME680 begin")); Wire.begin(I2C_SDA, I2C_SCL); if (!bme.begin()) { Serial.println("Could not find a valid BME680 sensor, check wiring!"); while (1); } // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); } void loop(){ pixels.clear(); WiFiClient client = server.available(); // Listen for incoming clients if (client) { // If a new client connects, currentTime = millis(); previousTime = currentTime; pixels.setPixelColor(0, pixels.Color(255, 0, 0)); // red pixels.show(); Serial.println("New Client."); // print a message out in the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected currentTime = millis(); if (client.available()) { // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor header += c; if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) { // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println("Connection: close"); client.println(); // turns the GPIOs on and off if (header.indexOf("GET /metrics") >= 0) { Serial.println("GET /metrics"); Serial.print("bme.performReading()"); if (! bme.performReading()) { Serial.println("Failed to perform reading."); client.println("Failed to perform reading."); return; } Serial.println("Reading done, sending...."); // # HELP temperature Temperature in Celcius" // # TYPE temperature guage") String message = "temperature "; message += bme.temperature; message += " "; // Serial.println("# HELP barometric_pressure in hectopascals (hPa)" // Serial.println("# TYPE barometric_pressure guage") message += "barometric_pressure "; message += (bme.pressure / 100.0); message += " "; // Serial.println("# HELP humidity relative humidity percent (%)" // Serial.println("# TYPE humidity guage") message += "humidity "; message += bme.humidity; message += " "; // Serial.println("# HELP gas_resistance Gas Resistance in KOhms" // Serial.println("# TYPE gas_resistance guage") message += "gas_resistance "; message += (bme.gas_resistance / 1000.0); message += " "; // Serial.println("# HELP approximate_altitude in meters KOhms" // Serial.println("# TYPE approximate_altitude guage") message += "approximate_altitude "; message += bme.readAltitude(SEALEVELPRESSURE_HPA); message += "\n"; client.println(message); } else { Serial.println("NOT /metrics"); // Display the HTML web page client.println("<!DOCTYPE html><html>"); client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}"); client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;"); client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}"); client.println(".button2 {background-color: #555555;}</style></head>"); // Web Page Heading client.println("<body><h1>ESP32 Web Server</h1>"); client.println("</body></html>"); // The HTTP response ends with another blank line client.println(); } break; } else { // if you got a newline, then clear currentLine currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } // Clear the header variable header = ""; // Close the connection client.stop(); pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //green pixels.show(); Serial.println("Client disconnected."); Serial.println(""); } }