ESP32_MQTT_Sensor_System (1)
ESP32_MQTT_Sensor_System (1)
h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TM1637Display.h>
#include <ESP32Servo.h>
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("\nWiFi connected");
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
while (!client.connected()) {
String clientId = "esp32-" + String(WiFi.macAddress());
if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
Serial.println("MQTT connected");
} else {
Serial.print("MQTT failed, state: ");
Serial.println(client.state());
delay(2000);
}
}
// Initialize hardware
pinMode(14, OUTPUT); // LED
pinMode(23, OUTPUT); // Success LED
pinMode(0, INPUT_PULLUP); // Button
pinMode(2, OUTPUT); // Buzzer
pinMode(34, INPUT); // Gas DOUT
servo.attach(5);
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED failed");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Enter password:");
display.display();
display7seg.setBrightness(0x0f);
if (strcmp(topic, "topic/password") == 0) {
inputPassword = msg;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Password: ");
display.println(msg);
if (msg == correctPassword) {
display.println("Unlock successful");
doorState = true;
digitalWrite(23, HIGH);
client.publish("topic/door_state", "Open");
} else {
display.println("Wrong password");
doorState = false;
digitalWrite(23, LOW);
client.publish("topic/door_state", "Closed");
}
display.display();
} else if (strcmp(topic, "topic/led_switch") == 0) {
ledSwitchState = (msg == "1" || msg == "true");
digitalWrite(14, ledSwitchState);
} else if (strcmp(topic, "topic/tm1637") == 0) {
tm1637Value = msg.toInt();
if (tm1637Value >= 0 && tm1637Value <= 1000) {
display7seg.showNumberDec(tm1637Value, false);
}
}
}
void loop() {
client.loop();
// Read sensors
float h = dht.readHumidity();
float t = dht.readTemperature();
bool gasDetected = digitalRead(34) == LOW;
int gasValue = analogRead(35);
int lightValue = analogRead(32);
digitalWrite(18, LOW);
delayMicroseconds(2);
digitalWrite(18, HIGH);
delayMicroseconds(10);
digitalWrite(18, LOW);
long duration = pulseIn(19, HIGH);
float distance = duration * 0.034 / 2;
// Control servo
if (distance >= 99 && distance <= 101) {
servo.write(180);
} else {
servo.write(0);
}
// Control buzzer
if (gasDetected) {
tone(2, 1000);
} else {
noTone(2);
}
// Update LED
digitalWrite(14, ledSwitchState);
// Update displays
display7seg.showNumberDec(tm1637Value, false);
if (inputPassword == "") {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Enter password:");
display.display();
}
// Serial output
Serial.print(h);
Serial.print(" ");
Serial.print(t);
Serial.print(" ");
Serial.print(gasValue);
Serial.print(" ");
Serial.print(lightValue);
Serial.print(" ");
Serial.println(distance);
}
}