Bu uygulamada, akıllı ev ve endüstriyel otomasyon sistemlerinin en kritik güvenlik çözümlerinden birini ele alacağız. ESP32'nin enerjisi kesildiğinde (elektrik kesintisi veya reset anında) LED'in en son hangi konumda (Açık veya Kapalı) olduğunu hatırlamasını sağlayacağız. Bu işlem için geleneksel EEPROM yerine, ESP32'nin güncel flaş bellek yönetim birimi olan Preferences kütüphanesini kullanacağız.
Sistemde hem manuel kontrol sağlamak hem de hafıza testini gerçekleştirebilmek için bir buton ve bir LED yer alacaktır. Buton için yine dahili pull-up direnci kullanılacaktır.
GPIO 2; Katot (-) → 220Ω direnç → GND.GPIO 4; Karşı bacak → GND.
Görsel 1: ESP32 Flaş Bellek ve LED Kontrolü Şeması
Aşağıdaki kod, butona her basıldığında LED'in durumunu değiştirir ve bu yeni durumu anlık olarak ESP32'nin flaş belleğindeki kalıcı bir alana kaydeder. Cihaz yeniden başladığında setup() fonksiyonu bu hafıza alanını okuyarak LED'i eski konumunda kaldığı yerden başlatır.
#include <Preferences.h>
#define BUTTON_PIN 4
#define LED_PIN 2
Preferences preferences; // Kütüphane nesnesini tanımlıyoruz
int ledDurumu = LOW;
int butonSonDurumu = HIGH;
unsigned long sonDebounceZamani = 0;
unsigned long debounceGecikmesi = 50;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// "hafiza" adında bir isim alanı (namespace) açıyoruz. false = Okuma/Yazma modu
preferences.begin("hafiza", false);
// Bellekten "led_konum" anahtarına ait veriyi okuyoruz.
// Eğer bellek daha önce boşsa varsayılan olarak 0 (LOW) döner.
ledDurumu = preferences.getInt("led_konum", LOW);
// LED'i hafızadan okunan son duruma getiriyoruz
digitalWrite(LED_PIN, ledDurumu);
Serial.print("Sistem Baslatildi. Hafizadan Okunan LED Durumu: ");
Serial.println(ledDurumu == HIGH ? "ACIK" : "KAPALI");
}
void loop() {
int okuma = digitalRead(BUTTON_PIN);
if (okuma != butonSonDurumu) {
sonDebounceZamani = millis();
}
if ((millis() - sonDebounceZamani) > debounceGecikmesi) {
if (okuma == LOW) {
// LED durumunu tersine çevir
ledDurumu = !ledDurumu;
digitalWrite(LED_PIN, ledDurumu);
// Yeni durumu kalıcı hafızaya kaydet
preferences.putInt("led_konum", ledDurumu);
Serial.print("LED Durumu Degisti ve Hafizaya Kaydedildi: ");
Serial.println(ledDurumu == HIGH ? "ACIK" : "KAPALI");
while(digitalRead(BUTTON_PIN) == LOW); // Butondan el çekilene kadar bekle
}
}
butonSonDurumu = okuma;
}
Preferences kütüphanesi ise verileri "anahtar-değer" (Key-Value) çiftleri halinde tutar. Bu sayede flaş belleğin ömrünü uzatır ve sadece değişen verinin üzerine yazılmasını sağlayarak çok daha kararlı bir dosya sistemi sunar.putInt) loop() içerisinde sürekli çalıştırmak yerine, yukarıdaki kodda yapıldığı gibi sadece buton tetiklendiğinde (durum değiştiğinde) bir kez çalışacak şekilde kurgulamak donanım sağlığı açısından zorunludur.Henüz yorum yapılmamış. İlk yorumu siz yapın!