|
// Ide Kod
#include <WiFi.h> #include <PubSubClient.h> #include <DHT.h>
const char* ssid = "wifi adımız"; const char* password = "wifi şifremiz"; const char* mqtt_server = "broker.hivemq.com"; const int mqtt_port = 1883;
#define PIN_SOIL_MOISTURE 34 #define PIN_WATER_LEVEL 35 #define PIN_LDR 32 #define PIN_DHT 33 #define PIN_RAIN 12 #define PIN_RELAY 25 #define DHT_TYPE DHT11
DHT dht(PIN_DHT, DHT_TYPE); const char* TOPIC_DATA = "isabet/iot/data"; const char* TOPIC_CTRL = "isabet/iot/ctrl";
WiFiClient espClient; PubSubClient mqttClient(espClient); unsigned long lastPublishTime = 0; const unsigned long PUBLISH_INTERVAL_MS = 3000UL;
void setup() { Serial.begin(115200); pinMode(PIN_RAIN, INPUT_PULLUP); pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, HIGH); dht.begin(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } mqttClient.setServer(mqtt_server, mqtt_port); mqttClient.setCallback(mqttCallback); }
void mqttCallback(char* topic, byte* payload, unsigned int length) { String msg = ""; for (int i = 0; i < length; i++) msg += (char)payload;
if (msg == "PUMP_ON") { digitalWrite(PIN_RELAY, LOW); } else if (msg == "PUMP_OFF") { digitalWrite(PIN_RELAY, HIGH); } }
void loop() { if (!mqttClient.connected()) { if (mqttClient.connect("ESP32_Isabet_IoT")) { mqttClient.subscribe(TOPIC_CTRL); } } mqttClient.loop();
unsigned long now = millis(); if (now - lastPublishTime >= PUBLISH_INTERVAL_MS) { lastPublishTime = now; float t = dht.readTemperature(); int sRaw = analogRead(PIN_SOIL_MOISTURE); int soil = map(sRaw, 4095, 1500, 0, 100); soil = constrain(soil, 0, 100); int rain = (digitalRead(PIN_RAIN) == LOW) ? 1 : 0; int tank = (analogRead(PIN_WATER_LEVEL) > 2000) ? 1 : 0;
char payload[128]; snprintf(payload, sizeof(payload), "{\"temp\":\"%.1f\",\"soil\":\"%d\",\"rain\":\"%d\",\"tank\":\"%d\"}", t, soil, rain, tank); mqttClient.publish(TOPIC_DATA, payload); } }
/// clomosy var AnaForm: TclForm; MqttIstemci: TCLMqttClient; SicaklikYazi, ToprakYazi, DepoYazi, YagmurYazi, BaslikYazi: TclProLabel; PompaDugme: TclProButton; BaslikPanel, SicaklikPanel, ToprakPanel, DepoPanel, YagmurPanel: TclProPanel; LogoResim: TclProImage; void BaglantiKuruldu { ShowMessage('MQTT Bağlantısı Başarıyla Kuruldu! ✅'); MqttIstemci.Subscribe('isabet/iot/data', 1); } void MesajGeldi var mesaj: String; { mesaj = AnaForm.clPayload; if (mesaj == '') Exit; SicaklikYazi.Text = '🌡️ Hava: ' + Clomosy.CLParseJSON(mesaj, 'temp') + '°C'; ToprakYazi.Text = '💧 Toprak Nemi: %' + Clomosy.CLParseJSON(mesaj, 'soil'); if (Clomosy.CLParseJSON(mesaj, 'rain') == '1') { YagmurYazi.Text = '🌧️ Durum: Yagmur Yagiyor'; YagmurYazi.clProSettings.FontColor = clAlphaColor.clRed; } else { YagmurYazi.Text = '☀️ Durum: Hava Acik'; YagmurYazi.clProSettings.FontColor = clAlphaColor.clLightgreen; } YagmurYazi.SetclProSettings(YagmurYazi.clProSettings); if (Clomosy.CLParseJSON(mesaj, 'tank') == '1') { DepoYazi.Text = '🌊 Depo: DOLU'; DepoYazi.clProSettings.FontColor = clAlphaColor.clLightgreen; } else { DepoYazi.Text = '🌊 Depo: BOS ⚠️'; DepoYazi.clProSettings.FontColor = clAlphaColor.clRed; } DepoYazi.SetclProSettings(DepoYazi.clProSettings); } void PompaDugmeTiklandi { if (not MqttIstemci.Connected) { ShowMessage('Hata: MQTT Bağlı Değil! Yeniden bağlanıyor...'); MqttIstemci.Connect; Exit; }
MqttIstemci.Channel = 'isabet/iot/ctrl'; if (PompaDugme.Text == 'SULAMAYI BASLAT') { MqttIstemci.Send('PUMP_ON', 1, False); PompaDugme.Text = 'DURDUR'; PompaDugme.clProSettings.BackgroundColor = clAlphaColor.clRed; } else { MqttIstemci.Send('PUMP_OFF', 1, False); PompaDugme.Text = 'SULAMAYI BASLAT'; PompaDugme.clProSettings.BackgroundColor = clAlphaColor.clDarkgreen; } PompaDugme.SetclProSettings(PompaDugme.clProSettings); } { AnaForm = TclForm.Create(Self); AnaForm.SetFormColor('#1B2631', '', clGNone); MqttIstemci = AnaForm.AddNewMQTTClient(AnaForm, 'MqttIstemci'); AnaForm.AddNewEvent(MqttIstemci, tbeOnMQTTClientMessage, 'MesajGeldi'); AnaForm.AddNewEvent(MqttIstemci, tbeOnMQTTClientConnected, 'BaglantiKuruldu'); MqttIstemci.BrokerHost = 'broker.hivemq.com'; MqttIstemci.Port = 1883; MqttIstemci.Connect; BaslikPanel = AnaForm.AddNewProPanel(AnaForm, 'BaslikPanel'); BaslikPanel.Align = alTop; BaslikPanel.Height = 60; BaslikPanel.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#2C3E50'); BaslikPanel.SetclProSettings(BaslikPanel.clProSettings); BaslikYazi = AnaForm.AddNewProLabel(BaslikPanel, 'BaslikYazi', 'Isabet-IoT Akilli Sulama Sistemi'); BaslikYazi.Align = alClient; BaslikYazi.clProSettings.FontSize = 18; BaslikYazi.clProSettings.FontColor = clAlphaColor.clWhite; BaslikYazi.clProSettings.FontHorzAlign = palCenter; BaslikYazi.clProSettings.FontVertAlign = palCenter; BaslikYazi.SetclProSettings(BaslikYazi.clProSettings); LogoResim = AnaForm.AddNewProImage(AnaForm, 'LogoResim'); LogoResim.Align = alTop; LogoResim.Height = 180; LogoResim.clProSettings.PictureSource = ' https://resmim.net/cdn/2026/04/19/Cg0ZYD.png" rel="nofollow - https://resmim.net/cdn/2026/04/19/Cg0ZYD.png '; LogoResim.clProSettings.PictureStretch = True; LogoResim.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#1B2631'); LogoResim.SetclProSettings(LogoResim.clProSettings); SicaklikPanel = AnaForm.AddNewProPanel(AnaForm, 'SicaklikPanel'); SicaklikPanel.Align = alTop; SicaklikPanel.Height = 70; SicaklikPanel.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#34495E'); SicaklikPanel.clProSettings.RoundHeight = 15; SicaklikPanel.SetclProSettings(SicaklikPanel.clProSettings); SicaklikYazi = AnaForm.AddNewProLabel(SicaklikPanel, 'SicaklikYazi', '🌡️ Hava: --°C'); SicaklikYazi.Align = alClient; SicaklikYazi.clProSettings.FontSize = 16; SicaklikYazi.clProSettings.FontColor = clAlphaColor.clWhite; SicaklikYazi.clProSettings.FontHorzAlign = palCenter; SicaklikYazi.clProSettings.FontVertAlign = palCenter; SicaklikYazi.SetclProSettings(SicaklikYazi.clProSettings); ToprakPanel = AnaForm.AddNewProPanel(AnaForm, 'ToprakPanel'); ToprakPanel.Align = alTop; ToprakPanel.Height = 70; ToprakPanel.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#34495E'); ToprakPanel.clProSettings.RoundHeight = 15; ToprakPanel.SetclProSettings(ToprakPanel.clProSettings); ToprakYazi = AnaForm.AddNewProLabel(ToprakPanel, 'ToprakYazi', '💧 Toprak Nemi: --%'); ToprakYazi.Align = alClient; ToprakYazi.clProSettings.FontSize = 16; ToprakYazi.clProSettings.FontColor = clAlphaColor.clWhite; ToprakYazi.clProSettings.FontHorzAlign = palCenter; ToprakYazi.clProSettings.FontVertAlign = palCenter; ToprakYazi.SetclProSettings(ToprakYazi.clProSettings); YagmurPanel = AnaForm.AddNewProPanel(AnaForm, 'YagmurPanel'); YagmurPanel.Align = alTop; YagmurPanel.Height = 70; YagmurPanel.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#34495E'); YagmurPanel.clProSettings.RoundHeight = 15; YagmurPanel.SetclProSettings(YagmurPanel.clProSettings); YagmurYazi = AnaForm.AddNewProLabel(YagmurPanel, 'YagmurYazi', '☀️ Durum: --'); YagmurYazi.Align = alClient; YagmurYazi.clProSettings.FontSize = 16; YagmurYazi.clProSettings.FontColor = clAlphaColor.clWhite; YagmurYazi.clProSettings.FontHorzAlign = palCenter; YagmurYazi.clProSettings.FontVertAlign = palCenter; YagmurYazi.SetclProSettings(YagmurYazi.clProSettings); DepoPanel = AnaForm.AddNewProPanel(AnaForm, 'DepoPanel'); DepoPanel.Align = alTop; DepoPanel.Height = 70; DepoPanel.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#34495E'); DepoPanel.clProSettings.RoundHeight = 15; DepoPanel.SetclProSettings(DepoPanel.clProSettings); DepoYazi = AnaForm.AddNewProLabel(DepoPanel, 'DepoYazi', '🌊 Depo: --'); DepoYazi.Align = alClient; DepoYazi.clProSettings.FontSize = 16; DepoYazi.clProSettings.FontColor = clAlphaColor.clWhite; DepoYazi.clProSettings.FontHorzAlign = palCenter; DepoYazi.clProSettings.FontVertAlign = palCenter; DepoYazi.SetclProSettings(DepoYazi.clProSettings); PompaDugme = AnaForm.AddNewProButton(AnaForm, 'PompaDugme', 'SULAMAYI BASLAT'); PompaDugme.Align = alBottom; PompaDugme.Height = 80; PompaDugme.clProSettings.BackgroundColor = clAlphaColor.clDarkgreen; PompaDugme.clProSettings.FontColor = clAlphaColor.clWhite; PompaDugme.clProSettings.FontSize = 18; PompaDugme.clProSettings.RoundHeight = 20; PompaDugme.SetclProSettings(PompaDugme.clProSettings); AnaForm.AddNewEvent(PompaDugme, tbeOnClick, 'PompaDugmeTiklandi'); AnaForm.Run; } 1. olarak esp32 nin mqtt bağlantısı başarılı olmasına rağmen ide de seri post ekranında dht 11 sıcaklık sensöründen çıkan veride [hata] dht11 sensörü veri almıyor tarzı bir hata alıyorum 2. pinoutları doğru konumlandırmama rağmen bağlantı olarak hiçbir veri alışverişi yapamıyorum 3. normal seri ekrwanda (arduino ıde) rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0030,len:4640 load:0x40078000,len:15620 ho 0 tail 12 room 4 load:0x40080400,len:3164 csum err:0xa7!=0xb8 ets_main.c 384 ets Jul 29 2019 12:21:46 bu hataı alıyorum
4. (ileriye dönük) Sistemi ileride güneş paneli veya pille beslemek istersek, MQTT bağlantısını sürekli açık tutmak (Keep-alive) yerine ESP32'nin Deep Sleep modunu kullanmamız gerekecek. Bu durumda, mobil uygulamadan (Clomosy) gelen anlık 'Pompayı Aç' komutunu cihaz uykudayken kaçırmamak için hangi özelliği kullanmak sağlıklı bir çözüm müdür?
|