Arduino 极速入门系列 - 光控灯(2) - 关于开关,上拉、下拉电阻那些事
接上篇,这次继续讲解光控灯的另外两个组成部分 - 开关和光敏电阻,光控灯里面将会有自锁开关按钮和光敏电阻。这此主要给新玩电子的朋友解释一下开关按钮的做法。
开关按钮的引脚电平读取问题 - 新手专用

我们搭一个超简单的电路,如上图。Arduino Mini Pro 的 9 号引脚,接到一个按钮,但注意看,这按钮后面没有接任何东西。我们运行一下以下代码:
void setup() {
Serial.begin(9600);
pinMode(9, INPUT);
}
void loop() {
delay(500);
int val = digitalRead(9);
if(val != 0){
Serial.println("LOW");
} else {
Serial.println("HIGH");
}
}
代码很简单,每 500ms (半秒)读取一次 9 引脚的电平,输出到串口。上传让它运行,在不碰任何东西情况下,你觉得有什么输出到串口窗口 ?
结果如下图:

你会看到一些类似随机的值,高高低低的变化着。这是完全悬空的状态,按钮也没有被按下(按下也没区别,因为按钮另一端没有接任何东西),也是这样的结果。
引脚作为输入用,处于「高阻抗」(High-impedance )状态,对电压变化极度敏感。外界的干扰比如旁边引脚的电平变化,或者其他干扰来源,都有可能影响到从引脚读取的电平值。作为一个按钮使用,我们不希望它在没有按下的情况下发生变化的。这时候我们会使用芯片功能或者电路,是它在没有按下的情况下,牢牢地固定在一个值(高,或者低),而不是随着干扰噪音而浮动。
首先我们看看搭电路能怎样做,然后再看看芯片的功能怎样用。
下拉电阻原理 - 新手专用

假设另一端就是接 Arduino 引脚来读取电平,我们已经知道这是不行的,按钮没按下时候虽然开路,但因各种电子噪音干扰,读出来是浮动的电平。
我们想个办法,把按钮在没按下时候,所有丁点的电都全流向地,比如这样?


这样就不再浮动了吧,有多少噪音全都流向地,引脚电平牢牢地是 0V,好像行啊?但你按下按钮的话……. Oh my lady Gaga !

记得上一篇我们说的短路的话,这就是了。短路是因为没有负载,那我们加个电阻作为负载:

这个电阻,就叫做下拉电阻。它的作用是在按钮开路时候,引脚以及相连导线等等全部有丁点的电压都拉到地端去。按钮按下时候也不会造成短路。下拉电阻,其实事情就这么简单。
上拉电阻
反过来,上拉电阻,这样:

用上拉电阻,按钮开路时候,电流流向引脚产生高电平信号。按钮按下,全部电流流向地,引脚将会读到低电平。
到底用上拉还是下拉,那看你希望按钮开路时候读到的是高电平,还是低电平了。
Arduino 内置的上拉电阻
很多的单片机,包括一般 Arduino 所用的芯片,都有内置上拉电阻功能,内置的不用大家像上面原理图等等自己搭。启用的做法就是在 pinMode 那里设置。
这样启用:
pinMode(9, INPUT_PULLUP)
然后实物就这样接就好了:

就是上拉电阻的电路,已经在芯片里面,你接个按钮再接地端,就妥妥的。
然后你或许会问,哎,我想默认低电平那怎么办?这样:
int raw = digitalRead(9);
int result = !(raw); // 用这个值做你需要做的判断
欢迎加入我们的大家庭
点击加入 Arduino 硬创联盟,群号 8580606
Arduino 极速入门系列 - 光控灯(2) - 关于开关,上拉、下拉电阻那些事的更多相关文章
- Arduino 极速入门系列 - 光控灯(3) - 光敏电阻、与电阻分压那些事
继续是讲解基础原理,新手专用部分.这次讲光敏电阻,和用电阻分压.光电元器件有好几种,其中测光相关的元器件,常见的有光敏三极管和光敏电阻,我们这次光控灯用光敏电阻.在我们光控灯里面,将会使用它搭建出分压 ...
- Arduino 极速入门系列 - 光控灯(1)- 关于理论和 LED 那些事
点个 LED 闪亮好像太单调,这次来个光控 LED 灯.这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法.PWM 原理后面会解释.这次用充电宝提供 ...
- Arduino 极速入门系列–1 点亮 LED
本篇内容为,使用 Arduino 点亮 LED 的做法示范.很简单的一个入门示范.我们让 LED 闪. 本篇使用到的工具和材料 Arduino Mini Pro 1 PCS Mini USB 数据线 ...
- Bootstrap入门(十)组件4:按钮组与下拉菜单结合
Bootstrap入门(十)组件4:按钮组与下拉菜单结合 先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) < ...
- 下拉刷新控件(3)系统自带的下拉刷新控件SwipeRefreshLayout(推荐*)
1,简介 The SwipeRefreshLayout should be used whenever the user can refresh the contents of a view via ...
- Android 使用动画效果后的控件位置处理 类似系统通知栏下拉动画
Android的动画的使用,请参考.Android的动画,在设计方面,我有点不太理解,觉得这样搞很怪,因为在控件动画后,即使设置了停留在动画结束时的位置,我们也确实看到了控件停在那个位置,但其实该控件 ...
- 浅谈对MJRefresh(上)下拉刷新控件的理解
MJRefresh GitHub地址:https://github.com/CoderMJLee/MJRefresh 利用业余时间研究了一下iOS的开发,发现OC特定的语法方式吸引了我,而且iOS开发 ...
- 自定义SWT控件二之自定义多选下拉框
2.自定义下拉多选框 package com.view.control.select; import java.util.ArrayList; import java.util.HashMap; im ...
- Android_(控件)动态添加或删除Spinner下拉菜单
使用ArrayList动态数组的依赖性实现动态增减Spinner下拉菜单选项功能. 设置一个EditText输入框,当用户输入了文字并单击[添加]按钮的同时,就会将输入的值添加Spinner至下拉菜单 ...
随机推荐
- 手机QQ内置网页,微信内置网页中进行分享到QQ和微信的操作
微信内的网页分享: API内容详见微信开发文档 https://mp.weixin.qq.com/wiki 这里需要注意的是:调用微信API的时候修改的是微信内网页右上角三个点那里打开后,选择分享之 ...
- cocos2d学习记录
视频 - http://www.manew.com/forum-105-3.html一个论坛帖 - http://www.zhihu.com/question/21114802官网 - http:// ...
- Python之路-(Django进阶二)
model: 双下划线: # 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # # models.Tb1.objec ...
- !+"\v1" 能判断浏览器类型吗?
我在 http://www.iefans.net/ie-setattribute-bug/ 中看到如此判断是否是IE,if(!+"\v1"){IE代码}else{其他浏览器代码}, ...
- pip安装
首先安装 python 和python-devel 然后 https://pypi.python.org/pypi/pip/ 下载 tar.gz 解压,安装 tar zxvf pip-8.1.1.ta ...
- 基于jquery封装通用的控制显示隐藏的方法
应用场景 在项目中会存在大量这样的需求: 1.选择不同的radio单选框,页面上的部分内容随之显示隐藏 2.选择不同的option下拉框内容,页面上的部分内容随之显示隐藏 如果每次遇到这类需求都单独写 ...
- mac上启动Java项目失败
解决办法参考地址:http://bbs.csdn.net/topics/390813742,感谢csdn账号为iwordword的大神
- Dll的生成,转化为OMF格式的DLL
extern "C" { __declspec(dllexport) int psq_add(int a, int b); } C:\Users\pansq>mkexp my ...
- echarts 用marlkline画线 同时配置中含有datazoom,怎么设置markline
由于项目需要设置边界值即用markline 画标线,通过echarts文档可以查看到(如下) 1.通过坐标点(xAxis和yAxis的设置) 通过网上搜索许多markline的配置都是通过下面来设置的 ...
- python学习笔记系列----(七)类
7.1 python类和相关术语的简介 Python 通过最小的新语法和语义在语言中实现了类. 它是 C++ 或者 Modula-3 语言中类机制的混合.类的大多数重要特性都被完整的保留下来:类继承机 ...