#include <Arduino.h>
// --- ピン定義 (ESP32-C3) ---
const int PIN_ENC_CLK = 4;
const int PIN_ENC_DT = 5;
const int PIN_ENC_SW = 6;
const int PIN_LED_MOSFET = 7; // MOSFETのGateに繋ぐピン
// --- パラメータ設定 ---
const int PWM_FREQ = 5000; // PWM周波数 (5kHz)
const int PWM_RES = 8; // 分解能 (8bit: 0-255)
// --- 変数 ---
volatile int brightness = 128; // 初期輝度 (0-255)
bool isLightOn = true; // 点灯状態フラグ
int lastClk = HIGH;
unsigned long lastButtonPress = 0;
// プロトタイプ宣言
void updateLight();
void setup() {
Serial.begin(115200);
// ピンモード設定
pinMode(PIN_ENC_CLK, INPUT);
pinMode(PIN_ENC_DT, INPUT);
pinMode(PIN_ENC_SW, INPUT_PULLUP);
// --- PWM設定 (ESP32 Core v3.0以降) ---
// ledcAttach(pin, freq, resolution) で設定と割り当てを一括で行う
// 戻り値がfalseの場合は設定失敗の可能性があるが、今回は簡易的に無視する
if (!ledcAttach(PIN_LED_MOSFET, PWM_FREQ, PWM_RES)) {
Serial.println("PWM Attach Failed!");
}
// 初期出力
updateLight();
Serial.println("System Ready: Rotate to dim, Click to toggle.");
}
void loop() {
// 1. エンコーダ回転検知
int newClk = digitalRead(PIN_ENC_CLK);
if (newClk != lastClk) {
// CLKが変化したタイミングでDTを確認して回転方向を判定
if (digitalRead(PIN_ENC_DT) != newClk) {
brightness += 10; // 時計回り
} else {
brightness -= 10; // 反時計回り
}
// 範囲制限 (0-255)
if (brightness > 255) brightness = 255;
if (brightness < 0) brightness = 0;
if (isLightOn) {
updateLight();
Serial.printf("Brightness: %d\n", brightness);
}
}
lastClk = newClk;
// 2. ボタン押し込み検知 (ON/OFF)
if (digitalRead(PIN_ENC_SW) == LOW) {
// 簡易デバウンス (200ms)
if (millis() - lastButtonPress > 200) {
isLightOn = !isLightOn;
updateLight();
Serial.printf("Light: %s\n", isLightOn ? "ON" : "OFF");
lastButtonPress = millis();
}
}
delay(1); // ループの安定化
}
// ライトの出力を更新する関数
void updateLight() {
if (isLightOn) {
// v3.0以降: ledcWrite(pin, value)
ledcWrite(PIN_LED_MOSFET, brightness);
} else {
ledcWrite(PIN_LED_MOSFET, 0); // 消灯
}
}