05-ESP8266 A0引脚控制LED亮度

Author:teacherXue

一、使用模拟旋钮控制LED亮度

在很多场合中,我需要读取连续变化的模拟数值,例如阻值变化,以及转化为阻值的温度、湿度变化等。ESP8266只有一个模拟输入接口A0,如果需要更多的模拟量输入,需要使用单片机进行扩展,在这里我们使用A0接口来读取旋转电阻的阻值进行控制。

  1. 准备LED

准备一颗绿色LED,参考白色LED进行引脚弯折,插入D6引脚的位置,如下图所示。
  1. 准备旋钮开关

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

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

3)安装旋钮开关

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

4)旋钮开关接入供电

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

  1. 创建项目

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)烧录代码成功后,打开串口监视器,改变旋钮值后观察输出
  1. 将旋钮值映射为灯光亮度

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

烧录代码并运行

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盐池虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值