Author:teacherXue
一、使用模拟旋钮控制LED亮度
在很多场合中,我需要读取连续变化的模拟数值,例如阻值变化,以及转化为阻值的温度、湿度变化等。ESP8266只有一个模拟输入接口A0,如果需要更多的模拟量输入,需要使用单片机进行扩展,在这里我们使用A0接口来读取旋转电阻的阻值进行控制。
准备LED
准备一颗绿色LED,参考白色LED进行引脚弯折,插入D6引脚的位置,如下图所示。

准备旋钮开关
1)我们将使用旋钮开关进行控制输入,其阻值变化转换成0~1V模拟电压的变化,最终被映射为0~1024的数值结果。

2)引出A0引脚
在面包上将开发板的A0引脚引出到旋钮的中间引脚,你可以使用简单的面包板插线,我这里使用了黄色的硬质导线,从15排i列引出到20排i列,如下图:

3)安装旋钮开关
将旋钮开关的中间引脚定位在20排g列的孔上,并插回开发板,如下图:

4)旋钮开关接入供电
从面包板的5V端(其实最好应该从3.3V端),分别引入到旋钮开关的另两个引脚,正负方向只会影响读取值的正负。

创建项目
1)在 VS Code 上,单击 PlartfomIO主页图标。点击+ New Project创建Lamp_ analog_v1.0项目并确定。
2) 修改platformio.ini配置文件增加串口通讯波特率monitor_speed = 115200
3) 编辑main.cpp主文件,这里我们采取D6接口方式来声明,删除或者注释掉前面呼吸灯的代码,再没有启用模拟多线程情况下,功能会有干扰。后面我再去看怎么让两个灯独立运行。
4) 在loop方法中通过analogRead方法不断读取模拟接口的数值,并通过串口通信出来,需要注意,模拟读数不是一个精确值,会有变动或误差,这是正常现象。
#include <Arduino.h>
#define analogInPin A0 // 模拟输入引脚A0
#define LED_1 D5 // D5白色LED引脚,本例中先不使用
#define LED_2 D6 // D6绿色LED引脚
int knobValue = 0;
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); // 设置串口通信波特率
pinMode(LED_2, OUTPUT);
}
void loop()
{
// 读取模拟数值
knobValue = analogRead(analogInPin);
// 打印串行监视器中的读数
Serial.print("sensor = ");
Serial.print(knobValue);
delay(30;
}
5)烧录代码成功后,打开串口监视器,改变旋钮值后观察输出

将旋钮值映射为灯光亮度
接下来,我们将读取到的旋钮值和LED的PWM占空比关联起来就可以实现控制灯光亮度了。增加如下analogWrite(LED_2,map(knobValue, 15, 1008, 0, 255));这里比较有趣和需要注意的是map函数,它将变量值从指定范围的变化,映射成另一个范围的变化。在这里是将旋钮读数0~1024的变化映射为PWM占空比的0~255,有同学可能奇怪,并没看到到1024,这里采用的是15到1008,因为模拟读数不准确,因此在两侧各留取了15个单位的死区(不读取的范围),以避免误差干扰,这是在行业中常见的操作。

烧录代码并运行
