ESP32'de Interrupt ve Timer: Zamanlama Yazılımı Rehberi

Interrupt, mikrodenetleyiciye "Şu anda ne yapıyorsan bırak, acil bir şey var" demektir. Timer ise belirli zaman aralıklarında otomatik olarak bir işlemi tetikler.

ESP32'de bu iki kavram birleşerek güçlü zamanlama sistemleri oluşturur. Örneğin her 1 saniyede bir LED yakıp söndürmek, sensör okumak veya veri göndermek gibi görevleri interrupt ve timer ile yapabilirsiniz.

Interrupt: Dış bir olay (düğme basılması, sinyal değişimi) programı kesintiye uğratır.

Timer: Dahili saat, belirli zaman geçtiğinde işlemi tetikler.

Bu örnekte hardware timer kullanarak LED'i otomatik kontrol edeceğiz.

1#include <Arduino.h>
2
3const int LED_PIN = 2;
4volatile int timerCounter = 0;
5volatile bool ledState = false;
6
7// Timer interrupt fonksiyonu
8void IRAM_ATTR onTimer() {
9timerCounter++;
10if (timerCounter >= 2) { // 2 saniye geçti
11ledState =!ledState; // LED durumunu değiştir
12digitalWrite(LED_PIN, ledState);
13timerCounter = 0;
14}
15}
16
17void setup() {
18Serial.begin(115200);
19pinMode(LED_PIN, OUTPUT);
20
21// 1 MHz timer oluştur (her 1 mikrosaniyede artır)
22hw_timer_t *timer = timerBegin(0, 80, true);
23timerAttachInterrupt(timer, &onTimer, true);
24// 1 saniye = 1.000.000 mikrosaniye
25timerAlarmWrite(timer, 1000000, true);
26timerAlarmEnable(timer);
27
28Serial.println("Timer başladı");
29}
30
31void loop() {
32Serial.println(ledState? "LED AÇIK": "LED KAPALI");
33delay(500);
34}

Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1Timer başladı
2LED AÇIK
3LED KAPALI
4LED AÇIK...

volatile: Interrupt içinde kullanılan değişkenler `volatile` olmalı, çünkü derleyici bu değişkenleri optimize etmemelidir.

IRAM_ATTR: Interrupt fonksiyonu hızlı olmalı, bu yüzden RAM'de tutulur.

timerBegin(0, 80, true): İlk parametre timer numarası, ikinci parametre prescaler (80 MHz'i 1 MHz'e düşürür), üçüncü parametre sayma yönüdür.

timerAlarmWrite(): Kaç mikrosaniyede tetikleneceğini belirtir.

Düğme basılınca LED'i yakıp söndürmek:

1const int BUTTON_PIN = 4;
2const int LED_PIN = 2;
3volatile bool ledState = false;
4
5void IRAM_ATTR buttonPressed() {
6ledState =!ledState;
7digitalWrite(LED_PIN, ledState);
8}
9
10void setup() {
11pinMode(LED_PIN, OUTPUT);
12pinMode(BUTTON_PIN, INPUT_PULLUP);
13
14attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressed, FALLING);
15}
16
17void loop() {
18// Ana program burada çalışır
19}

Interrupt ve timer, ESP32'de zaman hassas işlemler için kullanılır. Timer periyodik görevler, interrupt ise ani olaylar için idealdir. Her ikisini birlikte kullanarak karmaşık zamanlama sistemleri oluşturabilirsiniz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz