Temperaturføler med ESP32, DS18B20 og OLED-skærm

From munkjensen.net/wiki
Revision as of 20:58, 11 December 2024 by Admin (talk | contribs)

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

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

Kopier denne kode til Arduino IDE -->
#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);
    }
  }
}

Diverse links

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.