#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <esp_task_wdt.h>
#define WDT_TIMEOUT 10
// กำหนดขนาดหน้าจอ OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// กำหนด pin I2C สำหรับ ESP32
#define SDA_PIN 22
#define SCL_PIN 23
// กำหนดที่อยู่ I2C สำหรับอุปกรณ์
#define OLED_ADDRESS 0x3C
// สร้างอ็อบเจกต์สำหรับ OLED และ MCP23017
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define LED_ONBOARD 5
#define SW1 17
#define SW2 16
#define PIR 21
#define POTEN 34
bool toogleLED = true;
bool autoMode = true;
bool manualLED = true;
unsigned long lasttime1000ms;
unsigned long lasttime10000ms;
unsigned long lastMovement;
int val = 0;
int val_POTEN = 0;
int brightness = 0;
void setup() {
Serial.begin(115200);
pinMode(LED_ONBOARD, OUTPUT);
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(PIR, INPUT);
digitalWrite(LED_ONBOARD, LOW);
// เริ่มต้น Wire (I2C)
Wire.begin(SDA_PIN, SCL_PIN);
// เริ่มต้น OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // ไม่ทำงานต่อหาก OLED ไม่พร้อม
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("ESP32 I2C MCP23017");
display.display();
Serial.println("Configuring WDT...");
esp_task_wdt_init(WDT_TIMEOUT, true); //enable panic so ESP32 restarts
esp_task_wdt_add(NULL); //add current thread to WDT watch
}
void loop() {
if(millis()-lasttime1000ms>=1000){
lasttime1000ms = millis();
if (digitalRead(SW1) == LOW) {
autoMode = !autoMode;
}
if(autoMode == true){
if(toogleLED == true){
digitalWrite(LED_ONBOARD, LOW);
toogleLED = false;
} else {
digitalWrite(LED_ONBOARD, HIGH);
toogleLED = true;
}
} else {
if (digitalRead(SW2) == LOW) {
manualLED = !manualLED;
}
if(manualLED == true){
digitalWrite(LED_ONBOARD, HIGH);
} else {
digitalWrite(LED_ONBOARD, LOW);
}
}
val = digitalRead(PIR);
val_POTEN = analogRead(POTEN);
brightness = map(val_POTEN, 0, 4095, 0, 255);
if (val == 0) {
if(millis()-lastMovement>=10000){
digitalWrite(LED_ONBOARD, LOW);
}
Serial.println("No movement.");
display.clearDisplay();
display.setCursor(0, 0);
display.println("No movement.");
display.display();
}
else {
Serial.println("There is movement.");
Serial.println(brightness);
digitalWrite(LED_ONBOARD, brightness);
lastMovement = millis();
display.clearDisplay();
display.setCursor(0, 0);
display.println("There is movement.");
display.display();
}
}
}