#define LED_PIN 19 //单色LED连接的digital I/O口为15
#define BUTTON_PIN 13 //按钮电源开关连接的digital I/O口为12
#define SLIDE_PIN 35 //控制单色LED亮度的滑动变阻器连接的digital I/O口为34
void LED_On(uint8_t brightness) //点亮LED并关联滑动变阻器的光照强度
{
analogWrite(LED_PIN, 255 - brightness); //analogWrite()写入值为 0的时候LED最亮,255的时候最暗
}
void LED_Off() //熄灭LED
{
digitalWrite(LED_PIN, HIGH);
}
int ReadSlideValue() //读取滑动变阻器数值;ESP32下,滑动变阻器的值为0~4095
{
int value;
value = analogRead(SLIDE_PIN);
value >>= 4; //二进制形式经过右移位运算(除以2的4次方)后,0~4095即可变为0~255的范围,与analogWrite()写入区间0~255一一对应
if (value < 8) //设置最小返回值为8,可以控制滑动变阻器数值最小时LED亮度也不降为0
value = 8;
return value;
}
bool button_up = true; //记录按钮按下的状态,true代表按钮松开
bool led_stat = false; //记录LED当前的点亮状态,false代表未点亮
void setup() {
Serial.begin(115200); //设置串口波特率为115200;在两个设备进行串口通信的时候,两头的串口波特率需要统一,
//例如,设备1的串口波特率为9600,设备2的串口波特率也必须为9600,这才能保证数据的正确收发,否则可能出现接收到乱码的情况。
pinMode(BUTTON_PIN, INPUT_PULLUP); //定义按钮的pin为输入类型,且初始化状态下应该是一端拉高一端接地-即断开的状态
pinMode(SLIDE_PIN, INPUT); //定义滑动变阻器的pin为输入类型
pinMode(LED_PIN, OUTPUT); //定义LED的pin为输出类型
LED_Off(); //初始化状态下,灯是关闭的
}
void loop() {
uint8_t brightness_set;
if (digitalRead(BUTTON_PIN) == LOW) // 判断按钮IO值为按下状态
{
if (button_up) // button_up曾标记为true(曾抬起)
{
button_up = false; // 判断此按下操作有效,button_up标记为false已按下
led_stat = !led_stat; // 反转LED的状态(之前亮起,此次按下后熄灭/之前熄灭,此次按下后亮起)
}
}
else // 判断按钮IO值为抬起状态
{
button_up = true; // 在按钮松开的时候,标记button_up为true
}
if (led_stat) //控制LED亮起/熄灭
{
brightness_set = ReadSlideValue(); // 读取滑动变阻器决定的LED亮度值
LED_On(brightness_set); // 点亮LED
}
else
{
LED_Off(); // 熄灭LED
}
Serial.println(ReadSlideValue());
delay(10); // this speeds up the simulation
}