Przewodnik: ESP32-C3 z czujnikiem DHT11 i MQTT

Instrukcja dla studentów - konfiguracja od A do Z


1. Instalacja wsparcia dla ESP32

Dodanie URL do menedżera płytek:

  1. Otwórz Arduino IDE
  2. Przejdź do File → Preferences (lub Arduino IDE → Preferences na macOS)
  3. W polu "Additional boards manager URLs" wklej:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
    
  4. Kliknij OK

Instalacja pakietu ESP32:

  1. Kliknij ikonę Boards Manager (druga ikona z lewej strony)
  2. Wyszukaj: "esp32"
  3. Znajdź "esp32 by Espressif Systems"
  4. Wybierz wersję 3.0.7 (stabilna, unikaj 3.3.x - ma błędy!)
  5. Kliknij INSTALL
  6. Poczekaj na zakończenie instalacji (~5 minut)
  7. Zrestartuj Arduino IDE

2. Instalacja wymaganych bibliotek

Biblioteki do zainstalowania:

  1. Kliknij ikonę Library Manager (ikona książek po lewej stronie)
  2. Zainstaluj kolejno:

a) DHT sensor library

b) Adafruit Unified Sensor

c) PubSubClient


3. Konfiguracja płytki ESP32-C3

Wybór płytki:

  1. Tools → Board → esp32 → ESP32C3 Dev Module

Konfiguracja portów i ustawień:

Po wybraniu płytki ustaw:

Parametr Wartość
USB CDC On Boot Enabled ← WAŻNE!
CPU Frequency 160MHz
Flash Size 4MB
Flash Mode QIO
Upload Speed 921600
Core Debug Level None (wyłącza debug ESP-IDF)

Wybór portu:

Tools → Port → Wybierz port z ESP32-C3 (np. /dev/cu.usbmodem1101 na Mac, COM3 na Windows)


4. Podłączenie czujnika DHT11

Schemat połączeń:

DHT11 (moduł PCB z 3 pinami):
┌─────────────┐
│   DHT11     │
│  ┌───────┐  │
│  │  │ │ │  │
└──┼──┼─┼─┼──┘
   │  │ │ │
   VCC│ │GND
     DATA
      │
      ↓
ESP32-C3:
┌──────────────┐
│ VCC → 3.3V   │
│ DATA→ GPIO10 │
│ GND → GND    │
└──────────────┘

Uwaga: Jeśli masz czysty czujnik DHT11 (4 piny), potrzebujesz rezystora pull-up 10kΩ między DATA a VCC. Moduły PCB mają go już wbudowany.


5. Wgrywanie kodu na ESP32-C3

⚠️ WAŻNE: Tryb programowania

ESP32-C3 ma natywny USB, ale czasami wymaga manualnego wejścia w tryb bootloadera:

Procedura wgrywania:

Sposób 1 - Automatyczny (zazwyczaj działa):

  1. Podłącz ESP32-C3 przez USB-C
  2. Kliknij przycisk Upload (strzałka w prawo)
  3. Poczekaj na kompilację i upload

Sposób 2 - Manualny (jeśli automatyczny nie działa):

  1. Przytrzymaj przycisk BOOT na ESP32-C3
  2. Naciśnij i puść przycisk RESET (nadal trzymając BOOT)
  3. Puść przycisk BOOT po ~1 sekundzie
  4. Natychmiast kliknij Upload w Arduino IDE
  5. ESP32 jest teraz w trybie bootloadera i gotowy do programowania

Sposób 3 - Przez Serial Monitor (gdy już jest wgrany kod):

  1. Otwórz Serial Monitor (ikona lupy w górnym prawym rogu)
  2. Ustaw baudrate na 115200
  3. Kliknij Upload - kod zostanie wgrany automatycznie przez USB CDC

6. Testowanie

Po wgraniu kodu:

  1. Otwórz Serial Monitor (ikona lupy, góra po prawej)
  2. Ustaw baudrate: 115200
  3. Naciśnij przycisk RESET na ESP32-C3
  4. Powinieneś zobaczyć:
    === ESP32-C3 DHT11 MQTT ===
    DHT11 zainicjalizowany
    ✓ DHT11 OK: 23.00°C, 45.00%
    ✓ WiFi połączone!
    ✓ MQTT połączono
    

7. Wzorcowy kod Arduino

Przed wgraniem zmień:

const char* ssid = "NAZWA_TWOJEJ_SIECI";          // ← Twoja sieć WiFi (2.4GHz!)
const char* password = "HASLO_DO_SIECI";          // ← Hasło WiFi
const char* mqtt_server = "test.mosquitto.org";   // ← Adres brokera MQTT
const int mqtt_port = 1884;                       // ← Port MQTT

Pełny kod:

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// Konfiguracja WiFi
const char* ssid = "NAZWA_TWOJEJ_SIECI";
const char* password = "HASLO_DO_SIECI";

// Konfiguracja MQTT
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1884;
const char* mqtt_user = "rw";
const char* mqtt_password = "readwrite";

// Topiki MQTT
const char* temp_topic = "dom/salon/temperatura";
const char* hum_topic = "dom/salon/wilgotnosc";

// Konfiguracja DHT11
#define DHTPIN 10
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long lastMsg = 0;
const long interval = 10000;

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  Serial.println("\n\n=== ESP32-C3 DHT11 MQTT ===");
  
  // Inicjalizacja DHT11
  Serial.println("=== TEST DHT11 ===");
  Serial.print("Pin: GPIO");
  Serial.println(DHTPIN);

  dht.begin();
  Serial.println("DHT11 zainicjalizowany");
  
  // Czekaj 2 sekundy na stabilizację czujnika
  Serial.println("Czekam 2s na stabilizację DHT11...");
  delay(2000);
  
  // Test odczytu DHT11 PRZED WiFi
  Serial.println("Test odczytu DHT11:");
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  if (isnan(h) || isnan(t)) {
    Serial.println("✗ DHT11 nie odpowiada!");
  } else {
    Serial.print("✓ DHT11 OK: ");
    Serial.print(t);
    Serial.print("°C, ");
    Serial.print(h);
    Serial.println("%");
  }
    
  // Połączenie z WiFi
  setup_wifi();
  
  // Konfiguracja MQTT
  client.setServer(mqtt_server, mqtt_port);
  client.setKeepAlive(60); 
  client.setCallback(callback);
  
  Serial.println("Setup zakończony");
}

void setup_wifi() {
  delay(10);
  Serial.println("\n--- Konfiguracja WiFi ---");
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("Hasło długość: ");
  Serial.println(strlen(password));

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  
  Serial.println("Rozpoczynam łączenie...");
  WiFi.begin(ssid, password);

  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 30) {
    delay(500);
    Serial.print(".");
    attempts++;
    
    if (attempts % 10 == 0) {
      Serial.print("\nStatus WiFi: ");
      Serial.println(WiFi.status());
    }
  }
  
  Serial.println();
  
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("✓ WiFi połączone!");
    Serial.print("Adres IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("RSSI: ");
    Serial.print(WiFi.RSSI());
    Serial.println(" dBm");
  } else {
    Serial.println("✗ Błąd połączenia WiFi!");
    Serial.print("Status: ");
    Serial.println(WiFi.status());
    Serial.println("Sprawdź:");
    Serial.println("- Czy SSID jest poprawne");
    Serial.println("- Czy hasło jest poprawne");
    Serial.println("- Czy sieć to 2.4GHz (nie 5GHz)");
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Wiadomość [");
  Serial.print(topic);
  Serial.print("]: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Łączenie z MQTT...");
    
    String clientId = "ESP32C3-";
    clientId += String(random(0xffff), HEX);
    
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
      Serial.println(" ✓ połączono");
    } else {
      Serial.print(" ✗ błąd, rc=");
      Serial.print(client.state());
      Serial.println(" | ponowna próba za 5s");
      delay(5000);
    }
  }
}

void loop() {
  // Sprawdź połączenie WiFi
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi rozłączone! Ponowne łączenie...");
    setup_wifi();
    return;
  }
  
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > interval) {
    lastMsg = now;
    
    Serial.println("\n--- Odczyt czujnika ---");
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    
    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("✗ Błąd odczytu DHT11 (czujnik niepodłączony?)");
      return;
    }
    
    Serial.print("Temperatura: ");
    Serial.print(temperature);
    Serial.print("°C | Wilgotność: ");
    Serial.print(humidity);
    Serial.println("%");
    
    char tempString[8];
    char humString[8];
    dtostrf(temperature, 1, 2, tempString);
    dtostrf(humidity, 1, 2, humString);
    
    bool temp_sent = client.publish(temp_topic, tempString);
    bool hum_sent = client.publish(hum_topic, humString);
    
    Serial.print("Temperatura: ");
    Serial.println(temp_sent ? "✓ wysłana" : "✗ błąd");
    Serial.print("Wilgotność: ");
    Serial.println(hum_sent ? "✓ wysłana" : "✗ błąd");
  }
  delay(10);
}

8. Monitorowanie danych MQTT

Opcja 1 - MQTT Explorer (rekomendowane dla początkujących):

  1. Pobierz z http://mqtt-explorer.com/
  2. Połącz się z brokerem: test.mosquitto.org:1884
  3. Username: rw, Password: readwrite
  4. Obserwuj topiki: dom/salon/temperatura i dom/salon/wilgotnosc

Opcja 2 - Mosquitto Client (linia poleceń):

mosquitto_sub -h test.mosquitto.org -p 1884 -u rw -P readwrite -t "dom/salon/#" -v

9. Najczęstsze problemy i rozwiązania

Problem: "Set status to INIT" w Serial Monitor

Rozwiązanie: Ustaw Core Debug Level → None w Tools

Problem: Błąd kompilacji z partitions.csv

Rozwiązanie: Zainstaluj ESP32 wersję 3.0.7 (nie 3.3.x)

Problem: DHT11 nie odpowiada

Rozwiązanie:

Problem: WiFi status = 4 (WL_CONNECT_FAILED)

Rozwiązanie:

Problem: MQTT timeout disconnect

Rozwiązanie:

Problem: Nie mogę wgrać kodu

Rozwiązanie:


11. Zadania dla studentów

Zadanie 1: Zmień interwał odczytu z 10s na 5s

Zadanie 2: Dodaj kontrolkę LED na GPIO8, która miga gdy dane są wysyłane

Zadanie 3: Zmodyfikuj kod tak, aby wysyłał dane tylko gdy temperatura lub wilgotność zmieni się o więcej niż 0.5°C / 2%

Zadanie 4: Dodaj punkt rosy (Dew Point) jako dodatkowy topik MQTT


Powodzenia z projektem IoT! 🚀