Skip to main content

IoT Lab - Connect ESP32 with Homebridge

If you haven't setup the ESP32 microcontroller and Homebridge before, you should setup that first!

Schematic – ESP32 with Humidity and Temperature Sensor and LED Lights

Code

#include "DHT.h"
#include <HTTPClient.h>
#include <WiFi.h>
#include <WebServer.h>
 
#define DHTPIN 25     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define LED 12 // LED pin

DHT dht(DHTPIN, DHTTYPE);

// Replace with your network credentials
const char* ssid     = "WiFi-name";
const char* password = "password";

WebServer server(80);

void setup() {
  Serial.begin(115200); 

  // Start humidity sensor
  dht.begin();

  pinMode(LED, OUTPUT); // Set the LED pin as an OUTPUT 

  // Connect to Wi-Fi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Start the server
  server.on("/", handleRoot);
  server.on("/on", ledOn);
  server.on("/off", ledOff);
  server.begin();
  Serial.println("Server started");
}

void loop() {
  // Open connection
  server.handleClient();

  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius
  float t = dht.readTemperature();
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  
  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");

  // Send the current temperature to Homebridge for updating value
  if(WiFi.status() == WL_CONNECTED){
      HTTPClient http;

      // http://192.168.137.253:51828/?accessoryId=sn1&value=23

      String serverName = "http://192.168.137.253:51828/"; // Your homebridge IP
      String accessoryId = "sn1"; // Your accessory id
      String serverPath = serverName + "?accessoryId=" + accessoryId + "&value=" + t;
      
      // Your Domain name with URL path or IP address with path
      http.begin(serverPath.c_str());
      
      // If you need Node-RED/server authentication, insert user and password below
      //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
      
      // Send HTTP GET request (Send the current temperature to Homebridge)
      int httpResponseCode = http.GET();
      
      if (httpResponseCode>0) {
        Serial.print("HTTP Response code: ");
        Serial.println(httpResponseCode);
        String payload = http.getString();
        Serial.println(payload);
      }
      else {
        Serial.print("Error code: ");
        Serial.println(httpResponseCode);
      }
      // Free resources
      http.end();
    }
    else {
      Serial.println("WiFi Disconnected");
    }
}

void handleRoot() {
  // return message for testing
  server.send(200, "text/plain", "Hello from ESP32!");
}

void ledOn() {
  digitalWrite(LED,HIGH);
  greenLedStatus = true;
  // return light status to Homebridge
  server.send(200, "text/plain", "The light is on!");
}

void ledOff() {
  digitalWrite(LED,LOW);
  greenLedStatus = false;
  // return light status to Homebridge
  server.send(200, "text/plain", "The light is off");
}

After that, save your code and upload your code to the microcontroller.

When your code uploads completely, you can see the Serial Monitor which is a console of your microcontroller by clicking the Magnifier icon at the top right of the screen.

In the Serial monitor you can change the speed of exchange messages with the Serial Monitor and microcontroller by clicking the dropdown at the bottom right of the screen. (The speed should be the same with your speed in the code Serial.begin(115200))