ESP32 Projeleri
#01Orta

OTA Kablosuz Firmware Güncelleme Sistemi

~1-1,5 saatWiFi ile temel bağlanma deneyimi

Proje Amacı

ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.

Gerekli Malzemeler

  • ESP32 DevKit V1 (38 pin)
  • Durum LED'i
  • 220Ω direnç
  • Breadboard
  • Jumper kablolar
  • USB kablo (yalnızca ilk yükleme için)

Gerekli Kütüphaneler

WiFi.h, ArduinoOTA.h (ikisi de ESP32 Arduino core ile birlikte gelir, ek kurulum gerekmez). Arduino IDE'de 'Kartlar Yöneticisi'nden esp32 board paketi güncel olmalı (>= 2.0.x).

Pin Bağlantıları

Bileşen PiniBağlantı
Durum LED anot (220Ω üzerinden)
GPIO4
LED katot
GND

Devre Şeması

ESP32 Kodu

esp32-01-ota-kablosuz-firmware-guncelleme-sistemi.ino
1#include <WiFi.h>
2#include <ArduinoOTA.h>
3
4const char* ssid = "WIFI_ADINIZ";
5const char* password = "WIFI_SIFRENIZ";
6const int LED = 4;
7
8void setup() {
9 Serial.begin(115200);
10 pinMode(LED, OUTPUT);
11
12 WiFi.mode(WIFI_STA);
13 WiFi.begin(ssid, password);
14 Serial.print("WiFi'ye bağlanıyor");
15 while (WiFi.status() != WL_CONNECTED) {
16 delay(400);
17 Serial.print(".");
18 digitalWrite(LED, !digitalRead(LED)); // bağlanana kadar LED yanıp söner
19 }
20 Serial.println("\nBağlandı: " + WiFi.localIP().toString());
21 digitalWrite(LED, HIGH); // sabit yanma = ağa bağlı ve OTA'ya hazır
22
23 ArduinoOTA.setHostname("esp32-ota-cihaz");
24
25 ArduinoOTA.onStart([]() {
26 String tur = (ArduinoOTA.getCommand() == U_FLASH) ? "firmware" : "dosya sistemi";
27 Serial.println("OTA güncelleme başladı: " + tur);
28 });
29 ArduinoOTA.onEnd([]() {
30 Serial.println("\nOTA güncelleme tamamlandı, yeniden başlatılıyor.");
31 });
32 ArduinoOTA.onProgress([](unsigned int islenen, unsigned int toplam) {
33 Serial.printf("İlerleme: %u%%\r", (islenen / (toplam / 100)));
34 });
35 ArduinoOTA.onError([](ota_error_t hata) {
36 Serial.printf("OTA Hatası[%u]: ", hata);
37 if (hata == OTA_AUTH_ERROR) Serial.println("Kimlik doğrulama başarısız");
38 else if (hata == OTA_BEGIN_ERROR) Serial.println("Başlatma başarısız (yetersiz alan?)");
39 else if (hata == OTA_CONNECT_ERROR) Serial.println("Bağlantı hatası");
40 else if (hata == OTA_RECEIVE_ERROR) Serial.println("Alım hatası");
41 else if (hata == OTA_END_ERROR) Serial.println("Sonlandırma hatası");
42 });
43
44 ArduinoOTA.begin();
45 Serial.println("OTA hazır. Arduino IDE > Port menüsünden ağ üzerinden görünecek.");
46}
47
48void loop() {
49 ArduinoOTA.handle(); // her döngüde çağrılmalı, aksi halde OTA isteklerini yakalayamaz
50}

Çalışma Açıklaması

OTA yalnızca cihaz zaten çalışır durumda ve ağa bağlıyken işe yarar; hiç firmware yüklenmemiş yepyeni bir karta yapılan İLK yükleme her zaman USB ile yapılmalıdır — OTA bir ilk kurulum yöntemi değil, mevcut bir cihazı güncelleme yöntemidir. ArduinoOTA.handle() fonksiyonu loop() içinde sık ve bloklamadan çağrılmalıdır; loop() içine delay(5000) gibi uzun bekleme süreleri eklemek gelen OTA isteğinin zamanında yakalanamamasına ve güncellemenin başarısız olmasına yol açabilir. Sahada birden fazla cihaz varsa, her birine seri numarasını içeren benzersiz bir hostname vermek doğru cihazı seçmeyi kolaylaştırır.

Test Bilgisi

İlk yüklemeyi her zaman USB ile yapın ve Seri Monitör'den (115200 baud) cihazın aldığı IP adresini not edin — bu, ağ üzerinden görülebilirliğin ilk kanıtıdır. Ardından Arduino IDE'yi kapatıp yeniden açın; Araçlar > Port menüsünde artık 'esp32-ota-cihaz' adında ağ tabanlı bir port görünmelidir (mDNS/Bonjour üzerinden reklamı yapılır). Kodda küçük, gözle görülür bir değişiklik yapın (örn. LED yanıp sönme hızını değiştirin) ve bu ağ portunu seçip yükleyin; ilerleme yüzdesinin Seri Monitör'de arttığını, güncellemenin sorunsuz tamamlanıp cihazın otomatik yeniden başladığını ve yeni davranışın devreye girdiğini doğrulayın.

Olası Sorunlar ve Çözümleri

OTA portu Arduino IDE'de görünmüyorsa: önce bilgisayar ve ESP32'nin gerçekten aynı WiFi ağında olduğunu doğrulayın — kurumsal/misafir ağlarda uygulanan cihaz izolasyonu (AP isolation) mDNS reklamının bilgisayara ulaşmasını engelleyebilir; bu durumda IP adresini elle Arduino IDE'ye girmek de işe yarar. 'OTA_BEGIN_ERROR' hatası alıyorsanız: yeni firmware mevcut partisyon boyutuna sığmıyor demektir, Tools > Partition Scheme menüsünden 'Minimal SPIFFS' gibi uygulamaya daha fazla alan ayıran bir şema seçin. Güncelleme %100'e yaklaşıp aniden kopuyorsa: WiFi sinyali zayıf olabilir veya router güç tasarrufu modunda istemciyi geçici uykuya alıyor olabilir; cihazı router'a yakın tutarak veya router'ın güç tasarrufu ayarını kapatarak sorunu giderin.

Alternatif Çözümler

Üretim cihazlarında ArduinoOTA.setPassword() ile bir kimlik doğrulama şifresi eklemek neredeyse zorunlu sayılmalıdır, aksi halde aynı ağdaki herkes cihaza yeni firmware yükleyebilir. Yerel ağ sınırını aşıp internet üzerinden güncelleme yapmak isteyenler için HTTP/HTTPS tabanlı 'web güncelleme' (ESP32 HTTPUpdate kütüphanesi) daha uygun bir seçenektir, çünkü ArduinoOTA aynı yerel ağ segmentiyle sınırlıdır. Başarısız veya yarım kalan güncellemelerde otomatik olarak önceki çalışan sürüme dönebilmek için esp_ota_mark_app_valid_cancel_rollback() ile 'yeni sürüm birkaç dakika sorunsuz çalışmazsa otomatik eski sürüme dön' mantığı (self-test + rollback) eklemek, sahadaki cihazların hatalı bir güncellemeyle kalıcı olarak devre dışı kalmasını önler.

Bu projenin kodunu AI ile özelleştir

Farklı pin, ek özellik ya da başka bir sensör mü istiyorsun?

Benzer Projeler

Orta

SPIFFS/LittleFS ile Dahili Dosya Sisteminden Web Üzerinden Medya Streaming

ESP32'nin 4MB'lık dahili flash belleğinin bir kısmını LittleFS dosya sistemi olarak bölümleyip, içine yüklenen bir ses veya görüntü dosyasını WiFi üzerinden HTTP ile parça parça (chunked) akış olarak tarayıcıya sunmayı öğretir — harici bir SD kart olmadan, cihazın kendi hafızasından medya sunumu yapılabilmesini sağlar. ESP32'nin yeterli dahili flash'ı LittleFS gibi gerçek bir dosya sistemi partisyonuna ayırabilir ve WiFi ile bu dosyaları HTTP response olarak akıtabilecek bir ağ yığınına sahiptir. Bu senaryo Arduino Uno'da kurulamaz: toplam 32KB flash zaten sketch koduna gittiğinden bir medya dosyası bir yana, birkaç kilobaytlık bir metin dosyası için bile dosya sistemi partisyonu ayıracak yer kalmaz; WiFi de bulunmadığından zaten akıtacak bir ağ arayüzü de yoktur.

Orta

Watchdog + Otomatik Yeniden Bağlanma ile Endüstriyel Güvenilirlik

ESP-IDF'in görev bazlı donanımsal Task Watchdog Timer'ını (TWDT) kullanarak, ana döngü belirli bir süre 'nefes almazsa' (donarsa) cihazı otomatik olarak yeniden başlatmayı; ayrıca WiFi bağlantısı koptuğunda üstel geri çekilmeyle (exponential backoff) otomatik yeniden bağlanmayı öğretir — insansız çalışan sahadaki bir cihazın kendi kendini toparlaması için endüstriyel projelerde standart kabul edilen bir güvenilirlik desenidir. ESP32'nin FreeRTOS çekirdeği, her görevi (task) ayrı ayrı izleyebilen donanım destekli bir watchdog mekanizması sunar. Bu düzeyde bir izleme Arduino Uno'da kurulamaz: Uno'nun donanımsal watchdog'u (WDT) çok daha kaba bir genel zamanlayıcıdır, görev/task kavramı yoktur (bir RTOS çalıştıramaz) ve zaten yeniden bağlanacak bir WiFi bağlantısı da bulunmaz.

Orta

TLS/SSL ile Şifreli MQTT Veri Yayını

Sıcaklık/nem verisini, sertifika tabanlı TLS/SSL şifrelemesiyle (WiFiClientSecure) bir MQTT broker'a güvenli şekilde yayınlamayı öğretir — düz metin (plaintext) MQTT'nin aksine veri yolda kimse tarafından okunamaz veya değiştirilemez. ESP32'nin donanımsal AES/SHA kripto hızlandırıcısı, TLS el sıkışmasını (handshake) makul bir sürede tamamlayacak işlem gücünü sağlar; 520KB SRAM'i ise TLS oturum arabelleklerini, sertifika zincirini ve şifreleme durumunu aynı anda bellekte tutabilir. Bu kapasite Arduino Uno'da bulunmaz: kartın sadece 2KB SRAM'i vardır ve tek bir TLS sertifikası bile bu belleğe sığmaz; kripto hızlandırma donanımı ve WiFi radyosu da zaten mevcut değildir, dolayısıyla şifreli bir ağ bağlantısı kurmanın önünde temel bir donanım sınırı vardır.