Temperaturføler med ESP32, DS18B20 og OLED-skærm
Indledning
Dette projekt beskriver en ESP32-baseret temperaturmåler, der bruger en DS18B20-sensor til at måle temperaturer fra -5 °C til 50 °C. Temperaturen vises på en OLED-skærm og kan tilgås via en webserver. Projektet inkluderer konfiguration af Wi-Fi og mulighed for at sende data til en MQTT-server med fejlhåndtering og konfigurationsmuligheder.
Indkøbsliste
- ESP32 USB-C IoT bundkort DevKitC CP2102 38PIN
- 0,96" I2C 128x64 OLED-display
- DS18B20 vandtæt digital termisk sonde (1 meter kabel)
- HLK-PMxx 220VAC til 5VDC Step Down Converter
- Sonoff IP66 vandtæt etui
- Prototype PCB print - Type 1
Byggevejledning
1. Tilslutninger:
- DS18B20: - VCC (rød) → 3.3V på ESP32 - GND (sort) → GND på ESP32 - Data (gul) → GPIO 4 på ESP32 - Tilføj en 4,7kΩ pull-up modstand mellem Data og VCC.
- OLED-skærm (I2C): - VCC → 3.3V på ESP32 - GND → GND på ESP32 - SDA → GPIO 21 på ESP32 - SCL → GPIO 22 på ESP32
2. Strømforsyning:
Tilslut ESP32 og OLED til 5V strømforsyning via HLK-PMxx-modulet.
3. Montering:
- Montér komponenterne på prototype-PCB. - Placér hele opsætningen i Sonoff IP66 vandtæt etui for beskyttelse mod vejr og støv.
Kode til ESP32
#include <WiFi.h> #include <WebServer.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Adafruit_SSD1306.h> #include <PubSubClient.h> // === PIN-konfigurationer === #define ONE_WIRE_BUS 4 #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 // === Globale objekter === OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); WebServer server(80); WiFiClient espClient; PubSubClient mqttClient(espClient); // === Netværksindstillinger === const char* ssid = "Din_SSID"; const char* password = "Dit_Password"; // === MQTT-indstillinger (konfigureres senere) === const char* mqtt_server = "MQTT_SERVER_IP"; const int mqtt_port = 1883; const char* mqtt_user = "MQTT_USER"; const char* mqtt_password = "MQTT_PASSWORD"; void setup() { Serial.begin(115200); sensors.begin(); // OLED-initialisering if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("OLED fejl!")); for (;;); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); // Wi-Fi-forbindelse connectWiFi(); // Webserver-ruter server.on("/", handleRoot); server.on("/reset", handleReset); server.begin(); } void loop() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); displayTemperature(tempC); server.handleClient(); // MQTT-forbindelse if (!mqttClient.connected()) { reconnectMQTT(); } mqttClient.loop(); } void connectWiFi() { displayMessage("Forbinder til Wi-Fi..."); WiFi.begin(ssid, password); int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 10) { delay(1000); attempts++; displayMessage("Forbinder..."); } if (WiFi.status() != WL_CONNECTED) { displayMessage("Wi-Fi fejlede"); } else { displayMessage("Wi-Fi forbundet!"); Serial.println(WiFi.localIP()); } } void displayTemperature(float temp) { display.clearDisplay(); display.setCursor(0, 0); display.print("Temp: "); display.print(temp); display.println(" C"); display.display(); } void displayMessage(String message) { display.clearDisplay(); display.setCursor(0, 0); display.println(message); display.display(); } void handleRoot() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); server.send(200, "text/plain", "Temperatur: " + String(tempC) + " C"); } void handleReset() { WiFi.disconnect(); server.send(200, "text/plain", "Wi-Fi nulstillet. Genstart ESP32."); delay(1000); ESP.restart(); } void reconnectMQTT() { while (!mqttClient.connected()) { if (mqttClient.connect("ESP32Client", mqtt_user, mqtt_password)) { mqttClient.publish("sensor/temperature", "Forbundet til MQTT"); } else { delay(5000); } } }
Afslutning
Dette projekt giver dig en robust ESP32-baseret temperaturmåler med webinterface og mulighed for MQTT-dataoverførsel. Fejlhåndteringen sikrer, at enheden fungerer stabilt, selv under netværksproblemer. Du kan nemt nulstille Wi-Fi og MQTT-konfiguration via webinterfacet.