#define ENCODER_CLK 2
#define ENCODER_DT 3
#define LED 5
#define ENCODER_SW 7
int led_light=125;// 表征led亮度,0~255之间,每次点亮时为125
int led_state=0;// 表征led的状态,0为熄灭,1为点亮
int button_state=0;// 表征按钮的状态,0为断开,1为按下
int button_state_old=0;// 按钮过去的状态,检测上升沿用
void setup() {
Serial.begin(115200);// 用串口监控led亮度,实际显示有些问题
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
// 监控旋钮的选装用中断实现,在loop中监控是否按下旋钮顺便消抖(似乎可以用中断,但我没想好怎么写)
}
void loop() {
// step.1 监测旋钮是否被按下,“按下”代表led的状态翻转
// step.2 监测led_light是否越界,再根据其调整led亮度,同时将亮度输出至监视器
// step.1
button_state=1-digitalRead(ENCODER_SW);
// ENDODER_SW输入为0时表示被按下,这里翻转为正逻辑方便判断
if ((button_state == HIGH) && (button_state_old == LOW)){
led_state = 1 - led_state; // led逻辑翻转
delay(10);
}// 消抖用
button_state_old=button_state;
if ( led_state == LOW ){
led_light=125; // 关灯时将亮度从新调回原始值
}
// step.2
// 判断led_light是否越界,如有强制拉回边界
if (led_light > 255){
led_light = 255;
}
else if ( led_light <0 ){
led_light = 0;
}
// 输出
if ( led_state == HIGH ){
analogWrite(LED , led_light);
digitalWrite(LED_BUILTIN, HIGH); // 板载led用于硬件检测是否亮灯
Serial.print("当前状态:亮灯 ");
Serial.print("当前亮度:");
Serial.println(led_light);
}
else{
analogWrite(LED , 0);
digitalWrite(LED_BUILTIN , LOW);
Serial.print("当前状态:熄灭 ");
Serial.print("当前亮度:0");
}
}
// 转动旋钮时的中断函数,只能在灯亮起时才执行
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if ( (dtValue == HIGH) && (led_state == HIGH) ) {// 顺时针旋转,变亮
led_light=led_light+10;
}
if ( (dtValue == LOW) && (led_state == HIGH) ) {// 逆时针旋转,变暗
led_light=led_light-10;
}
}