// ESP32 + Telegram + DHT11 + PIR (Wokwi uyumlu, optimize)
// Kaynak projeler: Wokwi 453683655222059009 ve 428299772806786049 (temizlenmiş sürüm)
// --- Kütüphaneler ---
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "DHT.h"
// --- Donanım pinleri ---
#define LED_PIN 2
#define PIR_PIN 34
#define DHT_PIN 4
#define DHT_TYPE DHT22
// --- Nesneler ---
DHT dht(DHT_PIN, DHT_TYPE);
// --- WiFi bilgileri (Wokwi) ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- Telegram ---
#define BOTtoken "7685692805:AAFp2s6oqgQ49LTtm4NxjnS6zxdBrn5rSdI"
#define CHAT_ID "6691037752"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// --- Durum değişkenleri ---
volatile bool hareketAlgilandi = false;
bool ledDurum = LOW;
float temperature = NAN;
float humidity = NAN;
// --- Polling ayarları ---
const unsigned long botBeklemeSuresi = 300; // ms
unsigned long lastTimeBotRan = 0;
// --- WiFi yardımcıları ---
bool connectWiFi(unsigned long timeoutMs = 15000) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && (millis() - start) < timeoutMs) {
Serial.println("Wifi Baglaniliyor..");
delay(500);
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Internet baglantisi saglandi..");
Serial.print("IP: "); Serial.println(WiFi.localIP());
return true;
}
Serial.println("WiFi baglantisi basarisiz (timeout).");
return false;
}
// --- PIR interrupt ---
void IRAM_ATTR PIR_ISR() {
hareketAlgilandi = true;
}
// --- Yardımcı: güvenli istemci ayarı (Wokwi için) ---
void setupSecureClient() {
// Wokwi simülasyonunda TLS doğrulaması gerekmiyor:
client.setInsecure();
// Gerçek cihazda kullanacaksanız:
// client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
}
// --- Komut işleyici ---
void handleNewMessages(int numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
String text = bot.messages[i].text;
String from = bot.messages[i].from_name;
// Yetkilendirme
if (chat_id != CHAT_ID) {
bot.sendMessage(chat_id, "Kayitsiz kullanici ID!", "");
continue;
}
if (text == "/start") {
String welcome = "Hosgeldin, " + from + ".\n"
"/led_on LED ac\n"
"/led_off LED kapat\n"
"/sicaklik DHT sicaklik\n"
"/nem DHT nem\n"
"/hareket PIR durumu\n"
"/durum Ozet\n";
bot.sendMessage(chat_id, welcome, "");
}
else if (text == "/led_on") {
ledDurum = HIGH;
digitalWrite(LED_PIN, ledDurum);
bot.sendMessage(chat_id, "LED acildi", "");
}
else if (text == "/led_off") {
ledDurum = LOW;
digitalWrite(LED_PIN, ledDurum);
bot.sendMessage(chat_id, "LED kapatildi", "");
}
else if (text == "/sicaklik") {
String msg = isnan(temperature) ? "Sicaklik okunamadi"
: ("Sicaklik:\t" + String(temperature) + " °C");
bot.sendMessage(chat_id, msg, "");
}
else if (text == "/nem") {
String msg = isnan(humidity) ? "Nem okunamadi"
: ("Nem:\t" + String(humidity) + " %");
bot.sendMessage(chat_id, msg, "");
}
else if (text == "/hareket") {
bool pirState = digitalRead(PIR_PIN);
bot.sendMessage(chat_id, pirState ? "Hareket var!" : "Hareket yok!", "");
}
else if (text == "/durum") {
String msg = "";
msg += digitalRead(LED_PIN) ? "LED acik,\n" : "LED kapali,\n";
msg += digitalRead(PIR_PIN) ? "Hareket var,\n" : "Hareket yok,\n";
msg += "Sicaklik:\t" + (isnan(temperature) ? String("N/A") : String(temperature) + " °C") + "\n";
msg += "Nem:\t" + (isnan(humidity) ? String("N/A") : String(humidity) + " %");
bot.sendMessage(chat_id, msg, "");
}
else {
bot.sendMessage(chat_id, "Gecersiz komut! /start", "");
}
}
}
// --- Kurulum ---
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, ledDurum);
pinMode(PIR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIR_PIN), PIR_ISR, RISING);
dht.begin();
setupSecureClient();
// WiFi bağlan ve gerekirse yeniden dene
if (!connectWiFi(15000)) {
// Kısa bekle, tekrar dene
delay(2000);
connectWiFi(15000);
}
// Bot hazır mesajı (WiFi bağlıysa)
if (WiFi.status() == WL_CONNECTED) {
bot.sendMessage(CHAT_ID, "ESP32 baslatildi, seni dinlemeye hazirim. /start", "");
}
}
// --- Döngü ---
void loop() {
// DHT okumaları (2 saniyede bir güvenli)
static unsigned long lastDhtRead = 0;
if (millis() - lastDhtRead > 2000) {
float t = dht.readTemperature();
float h = dht.readHumidity();
temperature = t;
humidity = h;
lastDhtRead = millis();
}
// PIR olayı bildirimi (debounce benzeri basit kontrol)
static bool pirNotified = false;
if (hareketAlgilandi) {
hareketAlgilandi = false;
if (!pirNotified && WiFi.status() == WL_CONNECTED) {
bot.sendMessage(CHAT_ID, "Hareket Tespit Edildi!!", "");
pirNotified = true;
}
} else {
pirNotified = false;
}
// Telegram polling
if (WiFi.status() == WL_CONNECTED && millis() - lastTimeBotRan > botBeklemeSuresi) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
lastTimeBotRan = millis();
}
// WiFi düşerse tekrar bağlanmayı dene (hafif strateji)
static unsigned long lastWiFiCheck = 0;
if (millis() - lastWiFiCheck > 5000) {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi(8000);
}
lastWiFiCheck = millis();
}
}