← Back to Hub
Teacher's Curriculum Supplement

Blynk IoT Alternative Modules

ESP32 Cloud Integration (Days 3 & 4)

C++ Arduino IDE Blynk 2.0 Cloud Sensor Fusion Autonomous Logic
Standalone alternative curriculum focusing strictly on IoT Cloud Infrastructure and Non-blocking Logic.

Table of Contents

Instructor Theory: Architecture & C++ Logic

BÖLÜM 1: Mimariyi Anlamak (Donanım - Yazılım - Bulut)
BÖLÜM 2: Fiziksel Pinler vs. Sanal Pinler (Virtual Pins)
BÖLÜM 3: Geliş ve Gidiş Kodlama Şablonları (BLYNK_WRITE)
BÖLÜM 4: Eğitmen İçin Kritik İpuçları (Delay & Güç Çökmesi)

DAY 3: ESP32 & Blynk IoT Cloud Architecture

Session 3.1 — ESP Sınırları & Wi-Fi Provisioning (Bulut Bağlantısı)
Session 3.2 — Seviye 1: Uzaktan Röle ve Pompa Kontrolü (BLYNK_WRITE)
Session 3.3 — Seviye 2: Analog Veri Okuma ve Görselleştirme (BlynkTimer)
Session 3.4 — Seviye 3: Dijital Sensörler ve Şartlı Push Bildirimler

DAY 4: Autonomous IoT Systems & Hackathon Setup

Session 4.1 — Seviye 4: Akıllı ve Otonom Sera Sistemi (Mimari ve Kablolama)
Session 4.2 — Seviye 4: Otonom Mantık (Auto/Manual Mod) & SuperChart
Session 4.3 — Eğitmen İpuçları: Edge Cases & Kopmaları Yönetme
Session 4.4 — Hackathon İdeasyonu: IoT Proje Planlarını Kilitle
Instructor Guide

Blynk IoT Sistemleri & Temel Kavramlar

BÖLÜM 1: MiMARiYi ANLAMAK

Bir IoT (Nesnelerin İnterneti) projesi yaparken sistemimiz üç ana ayaktan oluşur:

İletişim Nasıl Gerçekleşir?
Sensör → Fiziksel Pin üzerinden ESP karta ulaşır → ESP bu veriyi Wi-Fi üzerinden Blynk Sunucusuna gönderir → Sunucu bu veriyi telefonundaki Blynk uygulamasına yansıtır.

BÖLÜM 2: FİZİKSEL PİNLER VS. SANAL PİNLER (VIRTUAL PINS)

Blynk platformunu öğrenirken kavranması gereken en kritik konu Sanal Pin (Virtual Pin) mantığıdır.

1. Fiziksel Pinler Nedir?

Fiziksel pinler, kartın üzerinde gördüğün metal bacaklardır (GPIO 5, GPIO 4, GPIO 34 vb.). Gerçek dünyadaki akımı (voltajı) okurlar veya dışarıya akım verirler.

2. Sanal Pinler (Virtual Pins) Nedir?

Sanal pinler kartın üzerinde fiziksel olarak bulunmayan, sadece Blynk sunucusu ile senin kartın arasında havadan (Wi-Fi) veri taşımak için oluşturulmuş "Haberleşme Kanallarıdır" (V0, V1, V2... V255).

Neden Sanal Pin Kullanmalıyız?Eğer telefondaki butonu doğrudan fiziksel bir pine (örneğin GPIO 5'e) bağlarsan, kodun içinde o veriyi işleyemez, kontrol edemez veya şarta bağlayamazsın. Sanal pinler veriyi önce koda getirir, sen kodda "Eğer V0'dan komut gelirse ve sıcaklık da uygunsa şu fiziksel pini aç" gibi akıllı kararlar alabilirsin.

BÖLÜM 3: SANAL PİN KODLAMASI (İKİ YÖNLÜ İLETİŞİM)

A) Telefondan Karta Emir Göndermek (Geliş Yönü)

Telefondaki bir butona (V0) basıldığında koddaki bu BLYNK_WRITE bloğu anında çalışır:

BLYNK_WRITE(V0) {
  int gelenDeger = param.asInt(); // Telefondan gelen 0 veya 1 komutunu yakala
  
  if (gelenDeger == 1) {
    digitalWrite(5, HIGH); // GPIO 5 pinine bağlı Röleyi AÇ
  } else {
    digitalWrite(5, LOW);  // Röleyi KAPAT
  }
}

B) Karttan Telefona Veri Göndermek (Gidiş Yönü)

Sensörden okuduğumuz toprak nemi gibi bir bilgiyi telefondaki grafiğe (V1) göndermek için kullanılır:

BlynkTimer timer; // Zamanlayıcı oluştur (ÇOK ÖNEMLİ)

void toprakVerisiYolla() {
  int toprakNemi = analogRead(34); // GPIO 34 (ADC1) pininden sensörü oku
  Blynk.virtualWrite(V1, toprakNemi); // Okunan değeri V1 Sanal kanalından telefona yolla
}

void setup() {
  timer.setInterval(1000L, toprakVerisiYolla); // Her 1000ms'de bir gönder
}

void loop() {
  Blynk.run(); // Bulut iletişimini sağla
  timer.run(); // Zamanlayıcıyı çalıştır
}

BÖLÜM 4: EĞİTMEN İÇİN KRİTİK İPUÇLARI

Day 3

ESP32 & Blynk IoT Cloud Architecture

Session 3.1 — Setup
ESP Sınırları & Wi-Fi Provisioning (Bulut Bağlantısı)
Arduino UNO'dan ESP32'ye geçiş. 3.3V mantık seviyesi, pin sınırlamaları ve Arduino IDE kurulumu yapılır. Donanım, C++ kodlarıyla Blynk sunucusuna (Wi-Fi) bağlanır.
Hardware Requirements
ESP32 Dev Module Micro-USB Kablosu Windows/Mac PC (Arduino IDE)
Objectives & Key Outcomes
ESP pinout şemasını okumak.
3.3V ile 5V tolerans farklarını anlamak ve kısa devreleri önlemek.
Blynk IoT (v2) üzerinde Template ve Device profillerini doğru oluşturmak.
C++ kodu içine Auth Token, SSID ve Password girerek cihazı Wi-Fi üzerinden ağa bağlamak.

💻 Örnek C++ Kodu: Wi-Fi ve Blynk Bulutuna Bağlanma

🤖 AI Generation Prompt:

"Write a C++ code for an ESP32 using the BlynkSimpleEsp32 library to connect to Wi-Fi. It should define BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME, and BLYNK_AUTH_TOKEN at the top. Setup should include Serial.begin(115200) and Blynk.begin(). The void loop should just run Blynk.run()."

💻 Base Connectivity Code
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx"
#define BLYNK_TEMPLATE_NAME "Device"
#define BLYNK_AUTH_TOKEN "YourAuthToken"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char ssid[] = "NetworkName";
char pass[] = "Password";

void setup() {
  Serial.begin(115200);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}

void loop() {
  Blynk.run();
}
Bu Oturumda Ne Yapacağız?
  1. Arduino IDE’yi açın → File → Preferences → Additional Board Manager URLs: ESP32 için https://dl.espressif.com/dl/package_esp32_index.json, ESP32 için https://dl.espressif.com/dl/package_esp32_index.json yapıştırın.
  2. Tools → Board → Board Manager'dan “ESP32” veya “ESP32” arayıp yükleyin.
  3. Sketch → Include Library → Manage Libraries'dan “Blynk” arayıp Blynk by Volodymyr Shymanskyy kütüphanesini kurun.
  4. ESP kartı USB ile bağlayın. Tools → Board'dan kartınızı (ESP32 1.0 veya ESP32 Dev Module), Tools → Port'dan COM portunu seçin.
  5. Yukarıdaki kodu yapıştırıp SSID/Password/Token değiştirin, Upload butonuna basın.
  6. Serial Monitor (115200 baud) açın → “Connected to Blynk” mesajını görmelisiniz.
Blynk Dashboard Kurulumu (Web & Mobil)
  1. blynk.cloud adresine giriş yap → Sol menüden "Templates" sekmesine tíkla.
  2. "+ New Template" butonuna bas. Ayarlar:
    AlanDeğer
    Template NameSmartGreenhouse (veya ders adı)
    HardwareESP32
    Connection TypeWiFi
  3. Template açıldıktan sonra "Datastreams" sekmesine geç. Şimdilik hiçbir Datastream ekleme; ilerideki oturumlarda eklenecek.
  4. Sol menüden "Devices" → "+ New Device" → "From Template" seç. Template'ını seçip cihaza isim ver ("Grup-1-ESP" gibi).
  5. Açılan ekranda BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME ve BLYNK_AUTH_TOKEN otomatik görünür. Bunları yukarıdaki C++ koduna kopyala.
Session 3.2 — Hardware & Coding
Seviye 1: Uzaktan Röle ve Pompa Kontrolü (BLYNK_WRITE)
Fiziksel pinler ile Sanal pinler (Virtual Pins) arasındaki fark öğrenilir. Dünyanın herhangi bir yerinden telefondaki Buton Widget'ı (V0) kullanılarak fiziksel röle (GPIO 5) tetiklenir.
Hardware Requirements
ESP32 5V Röle Modülü Mini Su Pompası Dış Batarya
Kablolama Tablosu (ESP Pin → Bileşen)
BileşenBileşen PiniESP32 PiniNot
5V Röle ModülüVCCVIN (5V)VIN (5V)3.3V'dan besleme! Röleyi donanıp resetler
5V Röle ModülüGNDGNDGND
5V Röle ModülüIN (Signal)GPIO 5GPIO 5Kodda: digitalWrite(5, HIGH)
Mini Su Pompası+Röle COM & NO terminalineDış batarya ile paralel bağlanır
Mini Su PompasıDış batarya GND'ye
Bu Oturumda Ne Yapacağız?
  1. Röleyi breadboard üzerine yerleştirin. VCC → VIN (5V), GND → GND, IN → GPIO 5 bağlayın.
  2. Mini su pompasının + kablosunu rölenin NO (Normally Open) terminaline, dış bataryanın + kablosunu COM terminaline bağlayın. Pompanın − kablosu ve bataryanın − kablosu birbirine bağlanır.
  3. Yukarıdaki C++ kodunu yükleyin. Serial Monitor’da “Connected” görün.
  4. Blynk mobil uygulamasındaki V0 Butonuna basın → Röle tıklamalı, pompa dönmeli.
  5. Deney: Butonu bırakın → Pompa durmalı. Fiziksel pinden değil, Sanal Pin (V0)’dan kontrol ettiğinizi öğrencilere vurgulayın.
Objectives & Key Outcomes
Fiziksel vs. Sanal (V0) Pin mantığını, aralarındaki köprüyü teknik olarak kavramak.
BLYNK_WRITE fonksiyonunu C++ ile kullanmak ve tetikleyici oluşturmak.
Blynk içinden Buton durumunu parametre param.asInt() olarak koda dökmek.
Röle üzerinden bir su pompasının (motor yükünün) elektriksel yalıtımını (izolasyon) sağlamak.

💻 Örnek C++ Kodu: BLYNK_WRITE ile Pompaya Hükmetmek

#define RELAY_PIN 5 // GPIO 5 on ESP32

// Bu fonksiyon, telefondaki V0 butonuna basıldığı an anında tetiklenir
BLYNK_WRITE(V0) {
  int butonDurumu = param.asInt(); // Telefondan gelen değeri (0 veya 1) al
  
  if (butonDurumu == 1) {
    digitalWrite(RELAY_PIN, HIGH); // Pompayı aç
  } else {
    digitalWrite(RELAY_PIN, LOW); // Pompayı kapat
  }
}

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW); // Başlangıçta güvenli modda kapalı olsun
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}

void loop() {
  Blynk.run();
}
Blynk Dashboard: Buton Widget Ekleme
  1. Templates → Datastreams sekmesine git. "+ New Datastream" → "Virtual Pin" seç.
  2. Datastream ayarları:
    AlanDeğer
    NamePompa Kontrol
    PinV0
    Data TypeInteger
    Min / Max0 / 1
  3. "Web Dashboard" sekmesine geç. Sağ panelden "Switch" (veya Button) widget'ını sürükle & bırak.
  4. Widget'a tıkla → Datastream = "V0 (Pompa Kontrol)" seç. Label'ları "AÇ" / "KAPAT" olarak ayarla.
  5. Mobil uygulama için: Blynk uygulamasını aç → Device'ı seç → "Edit" → Button widget ekle → V0'a bağla → Mode: "Switch" yap.
Session 3.3 — Cloud Integration
Seviye 2: Analog Veri Okuma ve Görselleştirme (BlynkTimer)
Saksıdaki toprak nemi (veya MQ-2 gaz verisi) okunarak telefondaki Gauge (İbre) widget'ına aktarılır. Sistem çökmesini (Flooding ping limitlerini) önlemek için delay() komutu yerine BlynkTimer kullanılır.
Hardware Requirements
ESP32 Toprak Nem Sensörü veya MQ-2 S. Jumper Kablolar (F-F, M-M)
Kablolama Tablosu (ESP Pin → Bileşen)
BileşenBileşen PiniESP32 PiniNot
Toprak Nem SensörüVCC3.3V3.3V
Toprak Nem SensörüGNDGNDGND
Toprak Nem SensörüAnalog OutGPIO 34GPIO 34 (ADC)ESP32 ADC pinlerinden biri
Bu Oturumda Ne Yapacağız?
  1. Toprak Nem Sensörünü VCC → 3.3V, GND → GND, ADC → GPIO 34 (ESP32'de GPIO 34) olarak bağlayın.
  2. Sensör probını kuru bir bardaktaki toprağa sokun.
  3. C++ kodunu yükleyin. Serial Monitor’da analogRead çıktılarını izleyin (kuru = yüksek, ıslak = düşük).
  4. Blynk Dashboard'taki Gauge widget'ına bakın — ibre canlı olarak hareket etmeli.
  5. Deney: Toprağa biraz su dökün → Değerin düştüğünü hem Serial Monitor'da hem Blynk Gauge'da görmelisiniz.
  6. Tartışma: Neden delay(2000) yerine BlynkTimer kullandık? (Cevap: delay kullanılsaydı Blynk.run() çağrılmayacak ve cihaz buluttan kopacaktı.)
Objectives & Key Outcomes
ESP32'nin ADC pinlerinden (GPIO 34, 35 vb.) analog veri yakalamak.
analogRead() mantığını C++'da uygulayıp 0-4095 arası sayısal değeri ölçeklemek (Map).
Kritik: Cihazda neden delay() kullanılmaması gerektiğini (Flooding) anlayıp donanımsal BlynkTimer yapısı kurmak.
Blynk.virtualWrite() fonksiyonu aracılığıyla yerel verileri V1 üzerinden Gauge grafiğine atmak.

💻 Örnek C++ Kodu: Sensör Verisini Buluta Gönderme

#define SENSOR_PIN 34 // GPIO 34 (ADC) 
BlynkTimer timer;

void toprakVerisiYolla() {
  int nemSeviyesi = analogRead(SENSOR_PIN); // 0 ile 4095 arası analog değer oku
  Blynk.virtualWrite(V1, nemSeviyesi);      // Değeri V1 kanalından telefona ("Buluta") yolla
}

void setup() {
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  
  // Her 2000 milisaniyede (2 sn) bir toprakVerisiYolla() fonksiyonunu çalıştır
  // (NOT: delay(2000) kullansaydık cihaz buluttan kopardı. Timer hayat kurtarır!)
  timer.setInterval(2000L, toprakVerisiYolla);
}

void loop() {
  Blynk.run();
  timer.run(); // Timer'ın arka planda tik tak saymasını başlat
}
Blynk Dashboard: Gauge (İbre) Widget Ekleme
  1. Templates → Datastreams sekmesinden "+ New Datastream" → Virtual Pin:
  2. Ayarlar:
    AlanDeğer
    NameToprak Nemi
    PinV1
    Data TypeInteger
    Min / Max0 / 4095
    Default Value0
  3. Web Dashboard'a geç. Widget listesinden "Gauge" sürükle.
  4. Widget ayarlarında Datastream = "V1 (Toprak Nemi)" seç. Renk skalasını yeşil-sarı-kırmızı olarak düzenle (düşük nem = kırmızı).
  5. Mobil: Device → Edit → Gauge widget ekle → V1 → Scale: 0-4095.
    İbre canlı olarak topraktıki neme göre hareket edecektir.
Session 3.4 — AI / Conditionals
Seviye 3: Dijital Sensörler ve Şartlı Push Bildirimler
DHT11 (Isı/Nem) ve Alev sensörlerinden gelen veriler şartlı ifadelere (If/Else) sokulur. Alev algılandığında veya sıcaklık eşiği aştığında donanımsal Buzzer öter ve telefona Push Notification gider.
Hardware Requirements
ESP32 DHT11 (Sıcaklık/Nem Modülü) Alev Sensörü (KY-026) Buzzer (Aktif)
Kablolama Tablosu (ESP Pin → Bileşen)
BileşenBileşen PiniESP32 PiniNot
DHT11 ModülüVCC3.3V3.3V
DHT11 ModülüGNDGNDGND
DHT11 ModülüDATAGPIO 4GPIO 4Kodda: #define DHTPIN 4
Alev Sensörü (KY-026)VCC3.3V3.3V
Alev Sensörü (KY-026)GNDGNDGND
Alev Sensörü (KY-026)DO (Digital Out)GPIO 14GPIO 14Alev görünce LOW döner
Aktif Buzzer+ (Uzun Bacak)GPIO 12GPIO 12Kodda: #define BUZZER_PIN 12Not: GPIO 12 bir bootstrap pinidir. Başlangıçta LOW olduğundan sorun çıkmaz; ancak alternatif olarak GPIO 13 kullanılabilir.
Aktif Buzzer− (Kısa Bacak)GNDGND
Bu Oturumda Ne Yapacağız?
  1. DHT11 sensörünü bağlayın: DATA → GPIO 4, VCC → 3.3V, GND → GND.
  2. Alev Sensörü KY-026'yı bağlayın: DO → GPIO 14, VCC/GND.
  3. Buzzer'ı bağlayın: + (uzun bacak) → GPIO 12, − → GND.
  4. Arduino IDE’de Library Manager'dan “DHT sensor library” (Adafruit) ve “Adafruit Unified Sensor” kütüphanelerini yükleyin.
  5. Kodu yükleyin. Serial Monitor'da sıcaklık ve alev durumunu gözleyin.
  6. Deney 1: Sensöre çakmak/mum yaklaştırın → Buzzer ötmeli + Blynk uygulamasına Push Notification düşmeli.
  7. Deney 2: DHT11'i elin arasında tutup ısıtın → Sıcaklık değerinin Blynk'teki Labeled Value widget'ında yükseldiğini izleyin.
Objectives & Key Outcomes
Arduino kütüphanelerini kurmak (DHT.h) ve projeye (include) metodolojisiyle çekmek.
Dijital ortamda okuma gerçekleştirmek ve digitalRead() kullanarak ardışık if operatörleri (&&, ||) bağlamak.
Blynk Automations (Events) sekmesini konfigüre edip telefona giden kritik tetikleyiciler kurmak.
Buluttaki sanal tetikleme ağacı ile yerel analog sistemi %100 senkron hale getirmek.

💻 Örnek C++ Kodu: Şartlı İşlemler ve Push Bildirimi

🤖 AI Generation Prompt:

"Can you create an ESP32 Blynk code that acts as a fire alarm? It should use a DHT11 sensor on GPIO 4 to read temperature and a Flame sensor on GPIO 14 (returns LOW on fire). Use a BlynkTimer running every 2 seconds. In the timer function, if temperature > 35.0 OR flame is LOW, turn ON a buzzer on GPIO 12 and push a notification using Blynk.logEvent('fire_alert', 'Fire!'). Send the temperature to Virtual Pin V2. Include the full Blynk C++ setup."

💻 Code: Conditional Logic & Push Alerts
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx"
#define BLYNK_TEMPLATE_NAME "Device"
#define BLYNK_AUTH_TOKEN "YourAuthToken"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>

char ssid[] = "NetworkName";
char pass[] = "Password";

#define DHTPIN 4      // GPIO 4
#define DHTTYPE DHT11
#define FLAME_PIN 14  // GPIO 14 (Digital Input)
#define BUZZER_PIN 12 // GPIO 12 (Digital Output)

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;

void sensorAlgorithm() {
  float temp = dht.readTemperature();
  int flameStatus = digitalRead(FLAME_PIN); // LOW means FIRE
  
  Blynk.virtualWrite(V2, temp); // Send Temp to V2 channel on dashboard
  
  // If temp > 35 OR flame is detected:
  if (temp > 35.0 || flameStatus == LOW) { 
    digitalWrite(BUZZER_PIN, HIGH); // Sound Alarm!
    Blynk.logEvent("fire_alert", "Warning! Fire or Extreme Heat!"); // Phone Notification
  } else {
    digitalWrite(BUZZER_PIN, LOW); // Safe
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(FLAME_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  dht.begin();
  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(2000L, sensorAlgorithm);
}

void loop() {
  Blynk.run(); 
  timer.run();
}
Blynk Dashboard: Sıcaklık Göstergesi + Event (Bildirim) Kurulumu
  1. Datastreams'e yeni bir Virtual Pin ekle:
    AlanDeğer
    NameSıcaklık
    PinV2
    Data TypeDouble
    Min / Max-10 / 60
    Units°C
  2. Web Dashboard'a "Labeled Value" widget'ı sürükle → V2 bağla. Böylece sıcaklık sayısal olarak görünür.
  3. Events sekmesi (Template → Events):
    AlanDeğer
    Event NameFire Alert
    Event Codefire_alert (kodda Blynk.logEvent("fire_alert",...) ile tetiklenir)
    TypeWarning
    Notifications✓ E-mail, ✓ Push, ✓ SMS (opsiyonel)
    LimitMaks. 100 event/gün (ücretsiz plan). Blynk.logEvent() her çağrıda 1 olay tüketir.
  4. Mobil: Device → Edit → Labeled Value ekle → V2 bağla → Label: "{value}°C". Push bildirimleri otomatiktir (Event tetiklendiğinde).
Day 4

Autonomous IoT Systems & Hackathon Setup

Session 4.1 — Hardware Assembly
Seviye 4: Akıllı ve Otonom Sera Sistemi (Mimari ve Kablolama)
Büyük proje (Bitirme) donanım kurulumu. DHT11, Toprak Nem sensörü, LDR, Röle ve Su Pompası aynı ESP ağına bağlanır. ESP'nin güç darboğazını aşmak için 5V bileşenler doğrudan VIN pinine taşınır.
Hardware Requirements
ESP32 DHT11 Sensörü Toprak Nem Sensörü LDR (Işık Direnci) Röle & Pompa Bütünlemesi
Kablolama Tablosu — Tam Sera Sistemi (ESP Pin → Bileşen)
BileşenBileşen PiniESP32 PiniNot
DHT11DATAGPIO 4GPIO 4Isı + Nem
DHT11VCC / GND3.3V / GND3.3V / GND
Toprak Nem SensörüAnalog OutGPIO 34GPIO 34ADC1 — Analog okuma
Toprak Nem SensörüVCC / GND3.3V / GND3.3V / GND
LDR ModülüAnalog OutGPIO 35GPIO 35ADC1 — Toprak Nemi ile eş zamanlı okunabilir
LDR ModülüVCC / GND3.3V / GND3.3V / GND
5V RöleINGPIO 5GPIO 5Pompa tetikleyici
5V RöleVCCVIN (5V)VIN (5V)3.3V'dan ASLA beslemeyiniz
5V RöleGNDGNDGND
Pompa+/−Röle NO/COM + Dış BataryaMotor yükü izole
Bu Oturumda Ne Yapacağız?
  1. Önceki günlerde kullanılan bütün bileşenleri (DHT11, Toprak Nem, LDR, Röle, Pompa) tek bir breadboard üzerinde birleştirin.
  2. Yukarıdaki kablolama tablosunu tahtaya çizin. Her grubun kendi fiziksel şemasını kağıda çizmesini sağlayın.
  3. Güç hattını kontrol edin: Röle VCC'yi ESP'nin VIN (5V) pinine bağlayın. 3.3V'dan asla beslememeye dikkat!
  4. LDR sensörünü GPIO 35 ADC pinine bağlayın.
  5. Bütün bağlantıları tamamladıktan sonra güç vermeden eğitmen kontrolüne gönderin (kısa devre riski).
  6. Onaydan sonra USB bağlayıp bir önceki oturumun temel kodunu yükleyerek her sensörü tek tek test edin.
Objectives & Key Outcomes
Endüstriyel çaplı büyük birden çok sensörlü bir sistemin karmaşık güç şemasını kurgulamak.
Röle ve Pompa tahribatından kartı korumak için 5V ihtiyacını VIN (veya VU) pinleriyle çözmek.
Pin çakışmalarını (Aynı pinde iki verici) önceden fark edip kağıt üzerinde donanım diyagramı çizmek.
Blynk Dashboard: Sera Projesi İçin Tam Pin Haritası
  1. Bu oturumda yeni Datastream eklemiyoruz fakat mevcut tüm pin atamalarını tek bir tabloda derleyin (projekte/tahtada):
Sanal PinWidgetVeri YönüAçıklama
V0Button (Switch)Telefon → KartManuel Pompa Aç/Kapat
V1Gauge / SuperChartKart → TelefonToprak Nem Değeri (0-4095)
V2Button (Switch)Telefon → KartOtonom/Manuel Mod Seçici
V3Labeled ValueKart → TelefonSıcaklık (°C — DHT11)
V4Labeled ValueKart → TelefonNem (% — DHT11)
V5GaugeKart → TelefonIşık Şiddeti (LDR)
Session 4.2 — Cloud & Logic Fusion
Seviye 4: Otonom Mantık (Auto/Manual Mod) & SuperChart
Koda akıl katıyoruz. Telefondan 'Otomatik/Manuel' seçimi (V2) yapılır. Manuelde kullanıcı basarsa pompayı sular. Otomatikteyse toprak nemi < 1500 (kuru) olduğunda kendi karar verip sular. Veriler SuperChart'ta canlı loglanır.
Hardware Requirements
Bağlantısı tamamlanmış Sera Sistemi
Bu Oturumda Ne Yapacağız?
  1. Blynk Dashboard'a V2 Switch widget'ı ekleyin (OTOMATİK / MANUEL etiketleriyle).
  2. Kodu yükleyin. Önce Manuel moda alın → V0 butonuyla pompayı açıp kapatın.
  3. Sonra Otomatik moda geçin → Toprağı kurutun (sensörü havaya kaldırın) → 3 saniye içinde pompa kendiliğinden açılmalı.
  4. Sensörü ıslak toprağa geri koyun → Pompa kendiliğinden kapanmalı.
  5. SuperChart widget'ını açın → Nem (V1) ve Sıcaklık (V3) çizgilerinin canlı olarak yükselip düştüğünü gözleyin.
  6. Tartışma: Neden başlangıçta pompa LOW (kapalı)? Wi-Fi kopsa ne olur? (Sonraki oturumda cevaplanacak.)
Objectives & Key Outcomes
Derinlemesine C++ If/Else State Machine kullanarak "Mod Değiştiricilik" (Auto vs Manual) sağlamak.
Otonom kodun BlynkTimer akışının içindeki kontrol dengesini sağlamak (Pompayı açınca bir Timer tetikleyip 3 saniye sonra durdurmak gibi).
Sistem durum loglaması, sıcaklık geçmişi ve otonom sülama sürelerini "SuperChart" ile dashboard arayüzüne taşımak.

💻 Örnek C++ Kodu: Otonom vs Manuel Karar Ağacı Serası

🤖 AI Generation Prompt:

"Write an advanced ESP32 Blynk code for an autonomous greenhouse. It must use a 5V relay (Pump/GPIO 5) and an analog soil moisture sensor (GPIO 34). Implement an Auto/Manual state machine using Blynk Virtual Pin V2 as a mode switch. When V2=1 (Auto Mode), check soil every 3 seconds using BlynkTimer; if moisture < 1500, turn pump ON, else OFF. When V2=0 (Manual Mode), the pump is only controlled by a button on Virtual Pin V0. Send soil moisture to Virtual Pin V1."

💻 Code: Auto/Manual Decision Tree
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx"
#define BLYNK_TEMPLATE_NAME "Device"
#define BLYNK_AUTH_TOKEN "YourAuthToken"

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char ssid[] = "NetworkName";
char pass[] = "Password";

#define PUMP_PIN 5 // GPIO 5
BlynkTimer timer;

int modeStatus = 0; // 0=Manual, 1=Auto
int dryThreshold = 1500;

// V2 Switch (Auto/Manual Mode Selector)
BLYNK_WRITE(V2) {
  modeStatus = param.asInt();
}

// V0 Manual Watering Button
BLYNK_WRITE(V0) {
  if (modeStatus == 0) { // ONLY works in Manual mode
    digitalWrite(PUMP_PIN, param.asInt());
  }
}

void autoGreenhouseLogic() {
  int soilMoisture = analogRead(34);
  Blynk.virtualWrite(V1, soilMoisture); // Send data to SuperChart on V1
  
  if (modeStatus == 1) { // If system is in AUTO mode, let the code decide
    if (soilMoisture < dryThreshold) {
      digitalWrite(PUMP_PIN, HIGH); // Soil is dry: Turn pump ON
    } else {
      digitalWrite(PUMP_PIN, LOW);  // Soil is wet: Turn pump OFF
    }
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(PUMP_PIN, OUTPUT);
  digitalWrite(PUMP_PIN, LOW);
  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(3000L, autoGreenhouseLogic);
}

void loop() {
  Blynk.run(); 
  timer.run();
}
Blynk Dashboard: Auto/Manual Butonu + SuperChart Kurulumu
  1. Datastreams'e yeni Virtual Pin ekle:
    AlanDeğer
    NameMod Seçici (Auto/Manual)
    PinV2
    Data TypeInteger
    Min / Max0 / 1
  2. Web Dashboard'a "Switch" widget ekle → V2'ye bağla. On Label: "OTOMATİK", Off Label: "MANUEL".
  3. SuperChart widget'ı ekle → İçine birden fazla Datastream ekleyebilirsin:
    Çizgi AdıPinRenk
    Toprak NemiV1Mavi
    SıcaklıkV3Kırmızı
    NemV4Yeşil
  4. SuperChart ayarlarından "Show X-Axis" aktifle ve zaman aralığını "Live" / "1h" / "1d" seçeneklerinden canlı olarak değiştirilebilir hale getir.
  5. Mobil: Device → Edit → SuperChart ekle → V1, V3, V4 stream'lerini seç. Gerçek zamanlı çizgiler telefonunuzda görünecektir.
Session 4.3 — Deep Dive Analysis
Eğitmen İpuçları: Edge Cases & Kopmaları Yönetme
Gerçek dünyadaki IoT sorunları. Ya cihaz Wi-Fi'dan koparsa? Uygulama donduğunda pompa sonsuza kadar açık kalıp serayı sel basar mı? Gecikmesiz (Non-blocking) C++ felsefesi ve donanım zorlukları.
Hardware Requirements
ESP32 Boards
Bu Oturumda Ne Yapacağız?
  1. Önceki oturumun çalışan sera kodunu açın. connectionWatchdog() fonksiyonunu koda ekleyin.
  2. Deney: Pompayı Otomatik modda açık hale getirin, sonra Wi-Fi router'ı kapatın → 10 saniye içinde pompa kendiliğinden kapanmalı.
  3. Wi-Fi'yı tekrar açın → Cihaz otomatik bağlanmalı ve kontrole devam etmeli.
  4. Tahta Tartışması: “Watchdog olmadan sera projen 3 saat çalışsa ve Wi-Fi kopsa, pompa sonsuza kadar açık kalır. Ne olur?” → Sel, motor yangını, batarya tükenmesi.
  5. Ekstra Kavram: ESP32'nin çoklu ADC1 pinlerini (GPIO 32-39) kullanarak birden fazla analog sensörü aynı anda farklı pinlere bağlayıp eş zamanlı okuma yapabilirsiniz. Multiplexer gerekmez!
Objectives & Key Outcomes
Wi-Fi Disconnect durumunda ESP32'nun sonsuz döngüde beklemesini önleyen donanımsal koruma blokları.
Öğrencilerin yaptığı kodlarda potansiyel güvenlik açıklarını / kilitlenme senaryolarını hackathon öncesi analiz etmek.

💻 Eğitmen Kodu: Wi-Fi Koptuğunda Sistemi Güvene Almak (Fail-Safe)

void connectionWatchdog() {
  if(!Blynk.connected()){
    // Kritik Donanım! Wi-Fi koptuğunda sunucudan kapatma emri gelemez.
    // O yüzden donanımı serayı sel basmasın veya motor yanmasın diye GÜVENLİ KONUMA (LOW) çek.
    digitalWrite(PUMP_PIN, LOW);
    
    Serial.println("Bağlantı koptu, motorlar durduruldu! Tekrar bağlanılıyor...");
    Blynk.connect(); // Yeniden bağlanmayı tetikle
  }
}

void setup() {
  // ... diğer kurulum kodları
  // Sistemin arka planında her 10 saniyede bir bağlantının canlılığını test et
  timer.setInterval(10000L, connectionWatchdog);
}
// Bu basit güvenlik yaklaşımı Hackathon jürisinden ekstra teknik puan getirecektir!
Session 4.4 — Planning Stage
Hackathon İdeasyonu: IoT Proje Planlarını Kilitle
Gruplar hackathon temalarını belirler. Kullanacakları sensörü (Fiziksel) ve bulut arayüzünü (Sanal) kararlaştırıp Sistem Mimari Diyagramını çizerler. Eğitmen onayından sonra taslaklar kilitlenir.
Hardware Requirements
Beyaz Tahta / Proje Şablon Formları Tüm Sensör Envanteri
Bu Oturumda Ne Yapacağız?
  1. Her grup bir proje fikri belirler (Akıllı Ev, Sera, Güvenlik Sistemi vb.).
  2. Grup tahtaya Sistem Mimari Diyagramı çizer: Sensörler → ESP → Blynk Cloud → Mobil Uygulama → Aktüatörler.
  3. Hangi Virtual Pin'lerin hangi sensör/aktüatöre atanacağını tablo halinde yazarlar.
  4. Görev dağılımı yaparlar: (1) Donanım Mühendisi — kablolama, (2) Yazılım Geliştirici — C++ kodu, (3) Arayüz Tasarımcısı — Blynk Dashboard widget'ları.
  5. Eğitmen her grubun planını inceleyip onaylar veya geri bildirim verir.
  6. Onaylanan planlar kilitlenir — artık değiştirilemez. Yarın hackathon başlıyor!
Objectives & Key Outcomes
Bulut Dashboard'u + Sensör Algısı + Aktüatör etkileşimi içeren yenilikçi bir fikir (Prototip) kurgulamak.
Blynk bağlantı mimarisini kağıt üzerinde şematize ederek hangi Virtual Pin'lerin hangi sensörleri okuyacağını haritalamak.
Grup için Sprint bazlı görev dağılımı (UI Tasarımcısı, Donanım Çizimcisi, C++ Kod Geliştiricisi) yapıp onay almak.