2015-9-18 14:16:51 [显示全部楼层]
28337浏览
查看: 28337|回复: 7

[中级教程] Arduino教程中级 项目三 Mini台灯

[复制链接]

本系列教程配套硬件套件:新版Arduino中级套件

台灯,是我们再常见不过的东西。“啪”一下开,“啪”一下关。Mini台灯的功能就和台灯类似,按钮就像是LED的开关,每按一下,就会切换LED的状态。做完之后再给小灯来个壳儿,一定很Q。

所需元件

1×  数字食人鱼红色LED发光模块
1×   数字大按钮模块
Arduino教程中级 项目三 Mini台灯图1

硬件连接

数字大按钮
连接数字引脚 2
数字食人鱼红色 LED发光模块连接
数字引脚13
Arduino教程中级 项目三 Mini台灯图2

硬件分析(数字输入—数字输出)

很明显,大按钮是输入设备, LED是输出设备。和前面感应灯类似,也是一个数字输入控制一个数字输出。只是形式与代码有所不同。
Arduino教程中级 项目三 Mini台灯图3

输入代码

样例代码3-1:

//项目三 —— 小台灯
int buttonPin = 2;               //按钮连接到数字2
int ledPin = 13;                 //LED连接到数字13
int ledState = HIGH;            // ledState记录LED状态
int buttonState;                 // buttonState记录按键状态
int lastButtonState = LOW;     // lastbuttonState记录按键前一个状态
long lastDebounceTime = 0;
long debounceDelay = 50;        //去除抖动时间
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
}
void loop() {
    //reading用来存储buttonPin的数据
  int reading = digitalRead(buttonPin);

  // 一旦检测到数据发生变化,记录当前时间
  if (reading != lastButtonState) {
      lastDebounceTime= millis();
  }

  // 等待50ms,再进行一次判断,是否和当前button状态相同
// 如果和当前状态不相同,改变button状态
// 同时,如果button状态为高(也就是被按下),那么就改变led的状态
  if ((millis() - lastDebounceTime) >debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
          ledState= !ledState;
      }
    }
  }

  digitalWrite(ledPin, ledState);

  // 改变button前一个状态值
  lastButtonState = reading;
}

下载完代码,按下按钮,灯点亮。再按下按钮,灯熄灭。是不是很像个小台灯?

代码回顾

由硬件分析可以看出,按键是输入设备,LED是输出设备。

pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

通过digitalWrite()读取按键的状态:

int reading = digitalRead(buttonPin);

按键在由低变高或者由高变低时,都会有个抖动的过程,时间非常的短,如下图所示:
Arduino教程中级 项目三 Mini台灯图4

为了避免由于抖动产生的错误信号,所以我们代码中有
个去抖的过程。去抖的方法很简单,就是等到数据发生
变化时,隔一段时间再检测一次。
一旦检测到读取的数据发生变化,通过millis()函数记下
时间:

if (reading != lastButtonState) {
   lastDebounceTime =millis();
}  

millis()是一个函数,该函数是Arduino语言自有的函数,它返回值是一个时间,Arduino开始运行到执行到当前的时间,也称之为机器时间,就像一个隐形时钟,从控制器开始运行的那一刻起开始计时,以毫秒为单位。

等待50ms,再进行一次判断,是否和当前button状态相同。如果和当前状态不相同,改变button状态。同时,如果button状态为高(也就是被按下),那么就改变LED的状态。

if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading !=buttonState) {
      buttonState =reading;
      if (buttonState== HIGH) {
          ledState = !ledState;
      }
    }
}

趣味练习

灯光门铃
现在越来越多年轻人回家就塞上耳机,即使在家都听不见门铃声,那就自制一个灯光门铃,有人来了,灯就开始狂闪,提醒里面的人,门口有人在按门铃了。这样的门铃也同样适用于那些耳朵不好的老人,又或者是那些聋哑人士。

※ 在之后的Arduino学习之旅中,不管你遇到奇奇怪怪的问题,都希望你与我们交流,欢迎登陆我们的DFRobot创客社区!mc.dfrobot.com.cn

Lesson3_1.ino

1.29 KB, 阅读权限: 10, 下载次数: 91

liaowei  学徒

发表于 2018-2-22 16:54:15

本帖最后由 liaowei 于 2018-2-22 23:45 编辑

成功了,谢谢!
回复

使用道具 举报

jiashe2011  见习技师

发表于 2017-2-22 00:51:04

学习3!!!
回复

使用道具 举报

XXD  见习技师

发表于 2017-7-21 10:43:21

求问本贴的趣味联系的代码- -感觉总是少了点什么写不出来
回复

使用道具 举报

杨明  学徒

发表于 2018-6-21 23:39:35

有笔误,“通过digitalWrite()读取按键的状态:
int reading = digitalRead(buttonPin);”
应该是"通过digitalRead()读取按键的状态:
int reading = digitalRead(buttonPin);"
回复

使用道具 举报

杨明  学徒

发表于 2018-6-21 23:47:46

成功了,因为板子上有接在13号引脚的LED,所以点亮mini台灯时,这个LED也会亮
回复

使用道具 举报

zhouyu77642017  学徒

发表于 2018-8-9 09:05:40

GOOD GOOD
回复

使用道具 举报

小飞侠_  见习技师

发表于 2019-7-9 00:07:59


GOOD GOOD
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail