#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// WiFi ve MQTT Bilgileri
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "252.150.131.19";//1^2^1
const char* mqtt_user = "alitan";
const char* mqtt_pass = "";
const int port = 1883;
// Pin Tanımlamaları
const int pinGreen = 16;
const int doorSensorPin = 15;
const int wifiStatus = 2;
// MT8870 DTMF Pinleri
const int Q1 = 33;
const int Q2 = 32;
const int Q3 = 13;
const int Q4 = 12;
const int StD = 26;
// DTMF Değişkenleri
volatile bool yeniTusVar = false;
String girilenRakamlar = "";
int secilenDaireIndex = -1; // Yıldız tuşunu bekleyen daire indeksi
// Daire Tanımlamaları
struct Daire {
String tuslananKod;
String mqttEtiketi;
String blok;
String daireNo;
};
Daire daireListesi[] = {
{"0101", "A11", "A1", "1"},
{"1220", "A21", "A2", "1"},
{"1230", "B11", "B1", "1"},
{"0124", "A21", "A2", "1"},
{"2011", "C11", "C1", "1"}
};
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;
// Status LED için Zamanlayıcı Değişkenleri
unsigned long lastLedBlinkTime = 0;
bool ledState = LOW;
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 updateStatusLED() {
bool wifiOk = (WiFi.status() == WL_CONNECTED);
bool mqttOk = client.connected();
if (wifiOk && mqttOk) {
digitalWrite(wifiStatus, HIGH); // Wi-Fi ve MQTT Bağlı -> Sürekli YANAR
}
else if (wifiOk && !mqttOk) {
// Sadece Wi-Fi Bağlı -> Yanıp Söner (500ms aralıkla)
if (millis() - lastLedBlinkTime >= 250) {
lastLedBlinkTime = millis();
ledState = !ledState;
digitalWrite(wifiStatus, ledState);
}
}
else {
digitalWrite(wifiStatus, LOW); // Hiçbiri yoksa -> SÖNÜK
}
}
void lcdDefaultEkran() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("HOSGELDiNiZ");
lcd.setCursor(0, 1);
lcd.print("Kod: ");
}
void setup() {
Serial.begin(115200);
snprintf(clientId, sizeof(clientId), "ESP32-%ld", random(1000000));
pinMode(pinGreen, OUTPUT);
digitalWrite(pinGreen, LOW);
pinMode(doorSensorPin, INPUT_PULLUP);
pinMode(wifiStatus, OUTPUT);
pinMode(Q1, INPUT_PULLDOWN);
pinMode(Q2, INPUT_PULLDOWN);
pinMode(Q3, INPUT_PULLDOWN);
pinMode(Q4, INPUT_PULLDOWN);
pinMode(StD, INPUT_PULLDOWN);
attachInterrupt(digitalPinToInterrupt(StD), stdInterrupt, RISING);
lcd.init();
lcd.backlight();
lcdDefaultEkran();
//WiFi.mode(WIFI_STA);
//WiFi.begin(ssid, password);
wifiConnect();
client.setServer(mqttServer, port);
client.setCallback(callback);
}
char dtmfToChar(int n) {
if (n == 10 || n == 0) return '0';
if (n >= 1 && n <= 9) return (char)(n + '0');
if (n == 11) return '*';
if (n == 12) return '#';
return ' ';
}
void checkDTMF() {
if (yeniTusVar) {
delay(200); // Debounce süresi
int sayi = (digitalRead(Q4) << 3) | (digitalRead(Q3) << 2) | (digitalRead(Q2) << 1) | digitalRead(Q1);
char tus = dtmfToChar(sayi);
yeniTusVar = false;
if (tus == ' ') return;
Serial.print("Tuşlandı: "); Serial.println(tus);
// Eğer Onay Bekleme Aşamasındaysak (* Tuşu Bekleniyor)
if (secilenDaireIndex != -1) {
if (tus == '*') {
// MQTT Açma Sinyali Gönder
char tpc[50];
sprintf(tpc, "daire/%s/open", daireListesi[secilenDaireIndex].mqttEtiketi.c_str());
client.publish(tpc, "DING");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Zil Caliniyor...");
delay(2000);
// Sıfırla
girilenRakamlar = "";
secilenDaireIndex = -1;
lcdDefaultEkran();
}
else if (tus == '#') {
// İptal Et
girilenRakamlar = "";
secilenDaireIndex = -1;
lcdDefaultEkran();
}
return;
}
// Normal Kod Girme Aşaması
if (tus >= '0' && tus <= '9') {
girilenRakamlar += tus;
// LCD 2. satır 0. sütundan itibaren yazdır
lcd.setCursor(0, 1);
lcd.print("Kod: " + girilenRakamlar + " ");
if (girilenRakamlar.length() == 4) {
daireyiBulVeHazirla(girilenRakamlar);
}
}
else if (tus == '#') {
// Temizle
girilenRakamlar = "";
lcdDefaultEkran();
}
}
}
void daireyiBulVeHazirla(String kod) {
bool bulundu = false;
for (int i = 0; i < daireSayisi; i++) {
if (daireListesi[i].tuslananKod == kod) {
secilenDaireIndex = i;
bulundu = true;
// LCD Ekranını Güncelle
lcd.clear();
lcd.setCursor(0, 0);
// Örnek: "A1 Blok Daire 1"
lcd.print(daireListesi[i].blok + " Blk D:" + daireListesi[i].daireNo);
lcd.setCursor(0, 1);
lcd.print("* Bekleniyor...");
break;
}
}
if (!bulundu) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tanimsiz Daire!");
delay(2000);
girilenRakamlar = "";
lcdDefaultEkran();
}
}
void loop() {
// Wi-Fi ve MQTT Bağlantı Kontrolleri Non-Blocking (Döngüyü tıkamayan) Mantıkla
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
mqttReconnect();
}
client.loop();
}
updateStatusLED(); // Status LED durumunu sürekli güncelle
checkDTMF();
// 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() {
static unsigned long lastReconnectAttempt = 0;
// Her 5 saniyede bir bağlanmayı dene (Sistemi dondurmadan)
if (millis() - lastReconnectAttempt > 5000) {
lastReconnectAttempt = millis();
if (client.connect(clientId, mqtt_user, mqtt_pass)) {
client.subscribe("role/lock");
Serial.println("MQTT Bagli");
}
}
}Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
KAPI DURUM SW
KAPI OMATİĞİ RÖLE
DTMF
WiFi-MQTT DURUM