目录

1、PWM呼吸灯

2、亮度可调节灯


机缘巧合在网上认识一位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;                   //电位器连接到模拟0
int ledPin = 10;                  //LED连接到数字10void setup() {pinMode(ledPin, OUTPUT);
}void loop() {int sensorValue = analogRead(potPin);    //读取模拟口0的值       //通过map()把0~1023的值转换为0~255int 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。

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

  1. 和12岁小同志搞创客开发:手撕代码,做一款遥控灯

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  2. 和12岁小同志搞创客开发:手撕代码,做一款数字骰子

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  3. 和12岁小同志搞创客开发:手撕代码,做一款密室自动门

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  4. 和12岁小同志搞创客开发:手撕代码,做一款声控灯

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  5. 和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

    目录 1.传感器原理 2.代码实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/categ ...

  6. 和12岁小同志搞创客开发:如何驱动红外遥控器?

    目录 1.红外遥控器通信原理 2.NEC协议 3.实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_3810 ...

  7. 和12岁小同志搞创客开发:手撕代码,做一款温湿度检测器

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  8. 和12岁小同志搞创客开发:手撕代码,做一款火焰报警器

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  9. 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

最新文章

  1. 模拟PLC 的圆弧插补方式在VC中绘制圆弧
  2. 一次非常有意思的 SQL 优化经历!
  3. 银行实时支付系统是怎么躲过双十一这一坎的呢?
  4. PHP实现四位数字+字母验证码
  5. P2P之UDP穿透NAT的原理与实现(转)
  6. atom feed_适用于Atom Feed的Spring MVC
  7. 求你了,听我一句劝吧,这几个玩意就别学了!
  8. 客户关系管理OACRM商品进销存销售管理合同订单库存财务管理跟单PHP源码
  9. 办公利器:IBM Lotus Symphony轻松之旅
  10. Python20行代码爬取搞笑图片—拯救你的不开心
  11. 刚从 Nova 生出来的 Placement 是什么东西?
  12. Vijos P1848 计数问题
  13. 英语标点中有没有分号?
  14. 【Django】uWSGI和Gunicorn【转】
  15. 武汉理工计算机网络教学平台,武汉理工大学 操作系统
  16. Centos 安装FTP配置目录权限,iptables设置ftp服务
  17. Linux 统计一段时间内的文件大小
  18. conda create出现连接问题_处理conda安装工具的动态库缺失问题
  19. 程序员,在北上广深杭赚够100万,就逃回二三四线城市生活,靠谱吗?
  20. 蓝桥杯单片机省赛题目《全集》之第十届省赛

热门文章

  1. 2021年大数据Flink(九):Flink原理初探
  2. 2021年大数据Spark(十五):Spark Core的RDD常用算子
  3. MinGW-w64 编译器下载,安装,以及环境变量配置
  4. android 快速点击开启某功能(不如快速点击打开开发者模式)
  5. 警告 '_'用作标识符, JavaSE8 之后的发行版中可能不支持使用'_'作为标识符
  6. windows10 计算器无法打开(转)
  7. 2022-2028年中国出版业投资分析及前景预测报告(全卷)
  8. Go 学习笔记(43)— Go 标准库之 os/exec(执行外部命令、非阻塞等待、阻塞等待、命令输出)
  9. URAL - 1902 Neo-Venice
  10. 知识点回顾-简单的TableView单组数据展示/多组数据展示