Týden 9 - Wifi komunikace
O projektu
Cílem tohoto projektu bylo vyzkoušet oboustrannou kominkaci přes lokální wifi server. Zvolil jsem modul ESP32CAM, který hodlám použít i ve finálním projektu. Zvolil jsem si vyzkoušení webserveru zobrazující měřená data z čidla BMP280. Toto jsem si vybral, protože jsem chtěl pochopit jak funguje webserver a POST metoda.
Zapojení
Jelikož ESP32CAM nemá usb port, je třeba použít FTDI převodník. Naštěstí v JVC kitu laskakit CH9102 programátor, kterým lze nahrávat kód do ESP32CAM. Při programování je třeba přepnout ESP32 do programovacího módu. Toho docílíme připojením GPIO0 na GND. Při samostatném spuštění kódu je pak třeba GPIO0 odpojit od GND. Pozor! Během zapojení jsem zjistil, že programátor nezvládne uživit proudem ESP32CAM a čidlo BMP280 dohromady. Musel jsem proto použít externí napájení ve formě arduino MEGA desky. Všechny ostatní piny jsou připojeny podle schématu:
Zapojení senzoru
Program
Program je napsán v Arduino IDE. Používám knihovnu Adafruit_BMP280 pro čidlo a WebServer.h pro webserver. Vytvořil jsem jednoduchou stránku, která zobrazuje aktuální hodnoty z čidla. Následně jsem přidal možnost nastavení refresh rate stránky. Náčrt architekutry webserveru je zobrazen na obrázku níže.
Architektura serveru
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <WebServer.h>
// Wifi setup
const char* ssid = "YOUR WIFI SSID";
const char* password = "YOUR WIFI PASSWORD";
// I2C ppins - ESP32CAM cant do it automatically!
#define I2C_SDA 14
#define I2C_SCL 15
Adafruit_BMP280 bmp; // I2C interface
WebServer server(80);
unsigned long refreshRate = 3; // Default refresh
// HTML for refresh rate setting - clickable window
String settingsForm() {
return "<form action='/settings' method='POST'>"
"<label for='refreshRate'>Refresh Rate (seconds):</label>"
"<input type='number' id='refreshRate' name='refreshRate' value='" + String(refreshRate) + "' min='1' max='10'><br>"
"<input type='submit' value='Apply Settings'>"
"</form>";
}
// Handle main codes
void mainprocess() {
float temp = bmp.readTemperature();
float pressure = bmp.readPressure();
float altitude = bmp.readAltitude(1013.25); // Local sea level - Ricany (Future - take from CHMU)
String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'>";
html += "<meta http-equiv='refresh' content='" + String(refreshRate) + "'>"; // Set refresh rate
html += "<title>BMP280 Sensor Data</title></head><body>";
html += "<h2>BMP280 Sensor Data</h2>";
html += "<p><strong>Temperature:</strong> " + String(temp, 2) + " °C</p>";
html += "<p><strong>Pressure:</strong> " + String(pressure / 100.0, 2) + " hPa</p>";
html += "<p><strong>Altitude:</strong> " + String(altitude, 2) + " m</p>";
html += "<p><em>Auto-refresh every " + String(refreshRate) + " seconds</em></p>";
html += settingsForm();
html += "