写点什么

和 12 岁小同志搞创客开发:手撕代码,做一款亮度可调节灯

  • 2021 年 11 月 20 日
  • 本文字数:1735 字

    阅读完需:约 6 分钟

和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯

机缘巧合在网上认识一位 12 岁小同志,从零开始系统辅导其创客开发思维和技巧。

项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html


本篇博文中的项目之前使用Mind+编程软件已经实现过,但是亮度可调节灯确实是非常有意思的项目,这次让我们手写代码实现这个功能吧。

亮度可调节灯项目实现原理之前已经讲解过,不再赘述了,可参见:

和12岁小同志搞创客开发:设计一款亮度可调节灯

1、PWM 呼吸灯

在实现亮度可调节灯之前,让我们先实现呼吸灯功能。所谓呼吸灯,就是让灯有一个由亮到暗,再到亮的逐渐变化的过程,感觉像是在均匀的呼吸。

设备连线如下所示:

实现代码如下所示:

int ledPin = 10; void setup() {      pinMode(ledPin,OUTPUT);} void loop(){  for (int value = 0 ; value < 255; value=value+1){      analogWrite(ledPin, value);     delay(5);  }  for (int value = 255; value >0; value=value-1){      analogWrite(ledPin, value);      delay(5);   }  }
复制代码

代码下载完成后,我们可以看到 LED 会有个逐渐由亮到灭的一个缓慢过程,而不是直接的亮灭,如同呼吸一般,均匀变化。

程序中用到一个新的语句结构,for 语句,当我们需要重复执行某句话时,我们可以使用 for 语句。

for 语句格式如下:

for 循环顺序如下:

第一轮:1 2 3 4

第二轮:2 3 4 ......

直到循环条件不成立,for 循环结束。

回到代码中,这两个 for 语句实现了变量 value 的值不断由 0 增加到 255,随之在从 255 减到 0,在增加到 255……,无限循环下去。

  for (int value = 0 ; value < 255; value=value+1){    }  for (int value = 255; value >0; value=value-1){    }  
复制代码

使用 analogWrite()函数用于给 PWM 口写入一个 0~255 的模拟值,函数说明如下所示:

analogWrite(pin,value) pin:IO引脚value:0~255之间的值
复制代码

特别注意的是,analogWrite()函数只能写入具有 PWM 功能的数字引脚,也就是我们使用这款 Arduino 中 3,5,6,9,10,11 引脚。

PWM 呼吸灯呼吸灯这个小案例,通过控制开与关所持续时间的比值就能模拟到一个 0 到 5V 之间变化的电压。

通过下图五个方波来更形象的了解一下 PWM,下图橘色竖线代表方波的一个周期。

每个 analogWrite(value)中写入的 value 都能对应一个百分比,这个百分比也称为占空比(Duty Cycle),指的是一个周期内高电平持续时间比上低电平持续时间得到的百分比。图中,从上往下,第一个方波,占空比为 0%,对应的 value 为 0,LED 亮度最低,也就是灭的状态。最后一个占空比为 100%的对应 value 是 255,高电平持续时间越长,LED 最亮。50%就是最亮的一半了,25%则相对更暗。

2、亮度可调节灯

亮度可调节灯之前已经做过,就是通过模拟角度传感器可以自由控制灯的亮度,随着旋转角度的变化,LED 亮度也发生相应改变。角度越大,LED 灯也就越亮,相反,角度越小,LED 灯也就越暗。

设备连线如下所示:


实现代码如下所示:

int potPin = 0;                   //电位器连接到模拟0int ledPin = 10;                  //LED连接到数字10 void setup() {   pinMode(ledPin, OUTPUT);} void loop() {  int sensorValue = analogRead(potPin);    //读取模拟口0的值         //通过map()把0~1023的值转换为0~255  int outputValue = map(sensorValue, 0, 1023, 0, 255);     analogWrite(ledPin, outputValue);   //给LED写入对应值          delay(2);                     }
复制代码

下载程序后,缓慢旋转电位器,仔细观察 LED 的亮度的变化。

这里需要主要讲一下:map()函数,它的作用是将一个数从一个范围映射到另外一个范围。函数说明如下所示:

map(value, fromLow, fromHigh, toLow, toHigh) value:需要映射的值fromLow:当前范围值的下限fromHigh:当前范围值的上限tolLow:目标范围值的下限toHigh:目标范围值的上限
复制代码

也就是说,会将 fromLow 到 fromHigh 之间的值映射到 toLow 在 toHigh 之间的值。

map 的神奇之处还在于,两个范围中的"下限"可以比"上限"更大或者更小,因此 map()函数可以用来翻转数值的范围,可以这么写:

 y = map(x,1,50,50,1);
复制代码

这个函数同样可以处理负数,请看下面这个例子:

 y =map(x,1,50,50,-100);
复制代码

代码中:int outputValue = map(sensorValue, 0, 1023, 0, 255); 就是将模拟口读到的 0~1023 的值,转换为 PWM 口的 0~255。

发布于: 4 小时前阅读数: 7
用户头像

【研究方向】物联网、嵌入式、AI、Python 2018.02.09 加入

【公众号】美男子玩编程,关注获取海量资源~

评论

发布
暂无评论
和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯