#include <Arduino.h>
#include <esp_sleep.h>
#include <driver/rtc_io.h>
#include <FS.h>
#include <ArduinoJson.h>
const int pirPin = 14; // Pin input PIR sensor
const int ledPin = 13; // Pin output LED (PWM)
RTC_DATA_ATTR int bootCount = 0; // Variabel untuk menghitung jumlah boot
void pirTask(void *pvParameters) {
for (;;) {
// Baca status PIR sensor
int pirState = digitalRead(pirPin);
if (pirState == HIGH) {
// Deteksi gerakan
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(ledPin, brightness); // Mengatur kecerahan LED
delay(10);
}
// Tambahan tugas dapat ditambahkan di sini
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness); // Mengatur kecerahan LED
delay(10);
}
}
// Menambahkan delay kecil untuk menghindari pengecekan yang terus-menerus dan memberikan waktu tugas lain berjalan
delay(10);
}
}
void deepSleepTask(void *pvParameters) {
for (;;) {
// Menambahkan delay kecil untuk menghindari pengecekan yang terus-menerus dan memberikan waktu tugas lain berjalan
delay(10);
// Membaca dan mencetak boot count dari SPIFFS
if (SPIFFS.begin()) {
File configFile = SPIFFS.open("/settings.json", "r");
if (configFile) {
size_t size = configFile.size();
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
configFile.close();
// Parsing JSON dan mendapatkan nilai bootCount
DynamicJsonDocument doc(1024);
deserializeJson(doc, buf.get());
bootCount = doc["bootCount"].as<int>();
}
SPIFFS.end();
}
// Menambahkan boot count sebelum tidur
bootCount++;
// Mengonfigurasi ESP32 untuk bangun setiap 10 detik
esp_sleep_enable_timer_wakeup(10 * 1000000); // 10 detik dalam mikrodetik
Serial.println("Boot count: " + String(bootCount));
Serial.println("Going to sleep.");
// Menyimpan boot count ke SPIFFS
if (SPIFFS.begin()) {
File configFile = SPIFFS.open("/settings.json", "w");
if (configFile) {
DynamicJsonDocument doc(1024);
doc["bootCount"] = bootCount;
serializeJson(doc, configFile);
configFile.close();
}
SPIFFS.end();
}
delay(100); // Mengizinkan print serial untuk selesai
esp_deep_sleep_start();
}
}
void setup() {
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
ledcSetup(0, 5000, 8); // Kanal PWM 0, frekuensi 5000 Hz, resolusi 8-bit
ledcAttachPin(ledPin, 0);
Serial.begin(115200);
xTaskCreatePinnedToCore(
pirTask, // Fungsi untuk mengimplementasikan tugas
"PIR Task", // Nama tugas
10000, // Ukuran stack (kata)
NULL, // Parameter input tugas
1, // Prioritas (1 adalah prioritas tertinggi)
NULL, // Penanganan tugas
0 // Core untuk menjalankan tugas (0 atau 1)
);
xTaskCreatePinnedToCore(
deepSleepTask, // Fungsi untuk mengimplementasikan tugas
"Deep Sleep Task", // Nama tugas
10000, // Ukuran stack (kata)
NULL, // Parameter input tugas
1, // Prioritas (1 adalah prioritas tertinggi)
NULL, // Penanganan tugas
0 // Core untuk menjalankan tugas (0 atau 1)
);
}
void loop() {
// Loop ini kosong karena tugas akan berjalan di latar belakang
}