#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;
// MT8870 DTMF Pinleri
const int Q1 = 33; // Eski dipPins[0] yerine
const int Q2 = 32; // Eski dipPins[1] yerine
const int Q3 = 13; // Eski dipPins[2] yerine
const int Q4 = 12; // Eski dipPins[3] yerine
const int StD = 26; // Interrupt pini
// DTMF Değişkenleri
volatile bool yeniTusVar = false;
String girilenRakamlar = "";
// Daire Tanımlamaları
struct Daire {
String tuslananKod;
String mqttEtiketi;
};
Daire daireListesi[] = {
{"121", "A11"},
{"122", "A21"},
{"123", "B11"},
{"124", "B21"},
{"211", "C11"}
};
const int daireSayisi = sizeof(daireListesi) / sizeof(daireListesi[0]);
char clientId[50];
WiFiClient espClient;
PubSubClient client(espClient);
Ticker relayTimer;
unsigned long lastPublishTime = 0;
const long interval = 2000;
bool lastSentState = HIGH;
// Kesme Servis Fonksiyonu (ISR)
void IRAM_ATTR stdInterrupt() {
yeniTusVar = true;
}
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);
// DTMF Pinleri
pinMode(Q1, INPUT_PULLDOWN); //INPUT du switch ile INPUT_PULLDOWN yaptım
pinMode(Q2, INPUT_PULLDOWN);
pinMode(Q3, INPUT_PULLDOWN);
pinMode(Q4, INPUT_PULLDOWN);
pinMode(StD, INPUT_PULLDOWN);
attachInterrupt(digitalPinToInterrupt(StD), stdInterrupt, RISING);
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
}
void checkDTMF() {
if (yeniTusVar) {
delay(300); // Debounce
int sayi = (digitalRead(Q4) << 3) | (digitalRead(Q3) << 2) | (digitalRead(Q2) << 1) | digitalRead(Q1);
char tus = dtmfToChar(sayi);
if (tus != ' ') {
girilenRakamlar += tus;
Serial.print("Tuşlandı: "); Serial.println(tus);
if (girilenRakamlar.length() == 3) {
daireyiBulVeYayinla(girilenRakamlar);
girilenRakamlar = ""; // Kodu sıfırla
}
}
yeniTusVar = false;
}
}
void daireyiBulVeYayinla(String kod) {
bool bulundu = false;
for (int i = 0; i < daireSayisi; i++) {
if (daireListesi[i].tuslananKod == kod) {
char tpc[50];
sprintf(tpc, "daire/%s/open", daireListesi[i].mqttEtiketi.c_str());
client.publish(tpc, "DING");
Serial.print("Hedef Daire MQTT Yayını: "); Serial.println(tpc);
bulundu = true;
break;
}
}
if (!bulundu) {
Serial.print("Hata: Tanımsız Daire Kodu: "); Serial.println(kod);
}
}
char dtmfToChar(int n) {
if (n >= 1 && n <= 9) return (char)(n + '0');
if (n == 10) return '0';
if (n == 11) return '*';
if (n == 12) return '#';
return ' ';
}
void loop() {
if (!client.connected()) {
mqttReconnect();
}
client.loop();
checkDTMF();
// Kapı Sensörü Mantığı (Değişmedi)
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;
}
}
// WiFi, MQTT Reconnect ve Callback fonksiyonları aynı kalmıştır...
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); }
}
}KAPI DURUM SW
KAPI OMATİĞİ RÖLE
DTMF