想法

Arduino中 如何实现

  • 情况一: LED常灭时, 按钮按下并松开之后保持LED灯常亮?
  • 情况二:LED常亮时, 按钮按下并松开之后保持LED灯常灭?

想法实现过程

版本1 亮个灯

Arduino上有一个LED灯,上面的字母为L

当然我们也可以自己再额外加一个LED灯, 长脚接PIN13, 短脚接GND
不推荐以上做法: 外接的LED灯容易烧掉, 最好将LED插在面包板上, 串联加一个电阻
不要问我为什么? 因为我无意中烧掉了好几个了, 还好这玩意多!

#define LED 13void setup() {// initialize digital pin LED_BUILTIN as an output.pinMode(LED , OUTPUT);
}void loop() {digitalWrite(LED, HIGH);   // turn the LED on (HIGH is the voltage level)delay(1000);                       // wait for a seconddigitalWrite(LED, LOW);    // turn the LED off by making the voltage LOWdelay(1000);                       // wait for a second
}

结果: LED灯每隔1S闪烁一次

版本2 加个按钮

#define LED 13
#define BUTTON 7int val = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);  // 获取按钮是否被按下的状态if (val == HIGH){digitalWrite(LED, HIGH);}else{digitalWrite(LED, LOW);}
}

新的问题: 必须用手指一直按着不能松手, 不然灯就会灭, 如何按一下亮, 再按一下灭呢?

版本3 让按钮按下放开后能开启及关闭LED

#define LED 13
#define BUTTON 7int val = 0;
int state = 0;  // 新添加一个变量记录LED状态void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH){  // 每当按钮按下时 切换state状态state = 1 - state;}if (state == 1){ // 根据 state状态 来点亮或熄灭LEDdigitalWrite(LED, HIGH);} else{digitalWrite(LED, LOW);}
}

新的问题: LED灯的显示很不稳定, 有时会明明是亮的,再按下并松开按钮, 灯还是亮的, 反之, 也是

原因: Arduino 芯片会以每秒16 000 000次的速度执行程序指令. 所以 当我们按下并在松开按钮之间, 其实状态值已经被反复读取并取反赋值数千次了, 导致它的值的不确定.

所以我们如何解决这个不确定呢?
只要让我们的state值每次按一次按钮只被修改其值一次, 即取反一次即可!

版本4 解决 state值 被多次修改的问题

#define LED 13
#define BUTTON 7int val = 0;
int old_val = 0;
int state = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH && old_val == LOW) {  // 注释2state = 1 - state;}old_val = val;  //  注释1if (state == 1) {digitalWrite(LED, HIGH);} else {digitalWrite(LED, LOW);}
}

首先 我们先看注释1处的代码
它的作用是 在按钮按下并未松开时, old_val 永远会是 HIGH, 只有当按钮松开释放后, old_val 才会是 LOW
然后 我们再看注释2处的代码
它的作用是 为了让了按钮被按下之后, 代码只运行一次, 不能循环回来之后还能进入这个 if条件

版本5 克服按键抖动

在按钮尚未按到底的瞬间和按钮弹回的时候, 会产生杂波, 这时 Arduino会收到一连串开关交错的信号.
我们在程序中 加入 10~50 ms 的延迟批令可以克服这个杂波.

#define LED 13
#define BUTTON 7int val = 0;
int old_val = 0;
int state = 0;void setup() {// put your setup code here, to run once:pinMode(LED, OUTPUT);pinMode(BUTTON, INPUT);
}void loop() {// put your main code here, to run repeatedly:val = digitalRead(BUTTON);if (val == HIGH && old_val == LOW) { state = 1 - state;delay(10); // 加入延迟以克服杂波}old_val = val;if (state == 1) {digitalWrite(LED, HIGH);} else {digitalWrite(LED, LOW);}
}

参考书籍: <<爱上Arduino>>

Ardunio实现按钮控制LED常亮或常灭相关推荐

  1. Arduino从零开始(1)——按钮控制LED

    0.前言 本文主要介绍Arduino对于开关和条件判断函数的使用. 目录 0.前言 1.介绍 2.按钮控制LED 2.1下拉模式: 2.2上拉模式 3.扩展实验: 1.介绍 前篇介绍了点亮LED,这次 ...

  2. 89C51单片机——按钮控制LED

    89C51单片机--按钮控制LED 1.实现流程图 2.proteus仿真图 3.keli代码 #include <reg51.h>sbit led1=P0^0; sbit key1=P0 ...

  3. 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...

  4. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  5. HC-05蓝牙模块与STM32控制led灯亮详解

    HC-05蓝牙模块与STM32控制led灯亮 一.HC-05蓝牙模块解析 1.简介 2.HC-05原理 3.HC-05实物图 二.使用AT指令进行配置 1.进入命令响应工作模式 2.配置串口 3.进行 ...

  6. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  7. STM32F072 Nucleo笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭

    STM32F072 Nucleo学习笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭 本文例子用到: 1.  STM32F072 Nucleo开发板 2.  STM32CubeMX软 ...

  8. Arduino 入门教程(八)旋转按钮控制LED亮度

    代码如下: // 定义旋转电位计模拟信号输入针脚号 const int analogInPin = A0; // 定义LED神灯数字信号针脚号 const int analogOutPin = 9; ...

  9. c51按键控制灯亮汇编语言,用一个按键控制LED灯亮/暗的汇编程序

    今天又搞了一个小汇编,是用一个按键控制LED灯亮/暗的汇编程序.程序编好后,开始编译,发现又是通不过,找了好几遍也没找到原因,后来找枫雪大哥看了,才找出原因,原来编写程序时不能在中文环境下编写,不然就 ...

最新文章

  1. R语言ggplot2可视化散点图(scatter plot)、并在可视化图像的顶部和右边添加边缘直方图(Marginal Histogram)、使用geom_smooth函数基于lm方法拟合数据点之间
  2. python官方网站地址-哪里能找到 Python 视频教程地址?
  3. 在Qt调用OpenCV库编写GUI程序
  4. mysql server 5.6root_root密码mysqlMySQL-5.6.24免安装版配置方法
  5. 分布式架构的分布式文件系统
  6. WIN7 运行“计算机管理”出现c:\windows\system32\compmgmt.msc没有被指定在...”错误 解决办法...
  7. 《linux系统及其编程》实验课记录(六)
  8. [c# 20问] 4.Console应用获取执行路径
  9. Fix: Send-Mail: Warning: Inet_protocols: IPv6 Support Is Disabled
  10. 下载我的CSDN资源
  11. batchplot放到哪个文件夹_AutoCAD批量打印软件BatchPlot安装方法及使用教程
  12. 联想笔记本无法识别USB(通用串行总线(USB)的控制器问题)
  13. DIY回收,UCONN的开放源化学书以及更多新闻
  14. 黑马Java常见面试题基础(一)
  15. OpenSSL生成根证书CA及签发子证书
  16. Beosin EOS-IDE 升级用户体验及常见问题答疑
  17. 云大计算机初试最高分,2019年云南大学考研初试成绩及总分排名查询通知
  18. python pyserial 使用大全
  19. java对字符串编码转换_处理字符串编码转换java类详解
  20. 如何做医美直播?从直播的这三个阶段出发

热门文章

  1. 销售到底在销售什么?
  2. 基于北斗短报文+APRS的物资定位搜索对讲系统
  3. CASS成图软件应用有哪些技巧?
  4. fixed定位弹窗 ios手机兼容性 滚动穿透问题
  5. 使用360的安全工具检测linux,360 安全卫士 for Linux 使用结果
  6. 计算机图形学头歌实训平台作业OpenGL立方体三维观察
  7. shell批量当前文件夹压缩脚本
  8. 新手应知应会的Linux命令
  9. 汇编中addr和offset的异同点
  10. 信息收集之cms指纹识别