// https://alitan37.github.io/Esp32-mqtt-project/
// Proje: ESP32 MQTT Interkom Kontrol Ünitesi
// Proje: ESP32 MQTT Interkom Kontrol Ünitesi (Otomatik Kapanan Röle)
#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// WiFi ve MQTT Bilgileri
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.emqx.io";
const int port = 1883;
// Pin Tanımlamaları
const int pinGreen = 16;
const int doorSensorPin = 15;
// DIP Switch Pinleri ve Durum Takibi
const int dipPins[] = {33, 32, 13, 12, 14, 27, 26, 25};
bool lastDipStates[8] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
String blokDaire[] = {"A11","A21","B11","B21","C11","C21","D11","D21"};
char topic[50]; // sprintf için yeterli uzunlukta buffer
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
Ticker relayTimer;
unsigned long lastPublishTime = 0;
const long interval = 2000;
bool lastSentState = HIGH;
void turnOffRelay() {
digitalWrite(pinGreen, LOW);
Serial.println("Zaman Doldu: Röle otomatik KAPATILDI");
client.publish("role/lock", "OFF");
}
void setup() {
Serial.begin(115200);
snprintf(clientId, sizeof(clientId), "ESP32-%ld", random(1000000));
pinMode(pinGreen, OUTPUT);
digitalWrite(pinGreen, LOW);
pinMode(doorSensorPin, INPUT_PULLUP);
// DIP Switch Pinlerini Giriş Olarak Ayarla
// INPUT_PULLDOWN kullanıyoruz, switch 3.3V verince HIGH olur
for (int i = 0; i < 8; i++) {
pinMode(dipPins[i], INPUT_PULLDOWN);
}
// İlk durumları oku ki açılışta "değişim var" sanmasın
for (int i = 0; i < 8; i++) {
lastDipStates[i] = digitalRead(dipPins[i]);
}
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
}
void checkDipSwitches() {
for (int i = 0; i < 8; i++) {
bool currentState = digitalRead(dipPins[i]);
// Eğer switch OFF'tan ON konumuna geçtiyse (Yükselen Kenar)
if (currentState == HIGH && lastDipStates[i] == LOW) {
char topic[30];
sprintf(topic, "daire/%s/open", blokDaire[i]); // daire/A11/open, daire/A21/open...
client.publish(topic, "DING");
Serial.print("Daire Butonu Basildi: ");
Serial.println(topic);
delay(50); // Basit bir debounce (titreşim engelleme)
}
lastDipStates[i] = currentState; // Mevcut durumu kaydet
}
}
void loop() {
if (!client.connected()) {
mqttReconnect();
}
client.loop();
// DIP Switch kontrolü
checkDipSwitches();
// Kapı Sensörü Mantığı
bool currentDoorState = digitalRead(doorSensorPin);
unsigned long currentMillis = millis();
if (currentDoorState == LOW) {
if (currentMillis - lastPublishTime >= interval) {
lastPublishTime = currentMillis;
client.publish("door/status", "DOOROPEN");
lastSentState = LOW;
}
}
else if (currentDoorState == HIGH && lastSentState == LOW) {
client.publish("door/status", "DOORCLOSE");
lastSentState = HIGH;
}
}
void callback(char* topic, byte* message, unsigned int length) {
String payload = "";
for (unsigned int i = 0; i < length; i++) payload += (char)message[i];
if (payload == "ON") {
digitalWrite(pinGreen, HIGH);
relayTimer.once(1.5, turnOffRelay);
}
else if (payload == "OFF") {
digitalWrite(pinGreen, LOW);
relayTimer.detach();
}
}
void wifiConnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println("\nWiFi Baglandi!");
}
void mqttReconnect() {
while (!client.connected()) {
if (client.connect(clientId)) {
client.subscribe("role/lock");
Serial.println("MQTT Bagli");
} else { delay(5000); }
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
KAPI DURUM SW
KAPI OMATİĞİ RÖLE
DAİRE NO