版主: wanchong , wangyu , eepwwp , firedom |
颜珍
最后登陆时间:2015-01-14 10:52:47 |
很不错的经验贴。赞
|
xinlian1
最后登陆时间:2015-01-14 10:52:47 |
报道,佩服
|
哇额
最后登陆时间:2015-01-14 10:52:52 |
留名
|
pengrui
最后登陆时间:2015-10-30 14:51:20 |
pengrui的原帖
Edison教程系列01 按键控制
Edison教程系列04 触摸台灯 作者:Angelo 来自 DFRobot http://www.dfrobot.com.cn/commun ... thread&tid=3295
不再单调的通过按钮来控制台灯的开关,改造个可触摸开关控制的台灯。在本节中,我们选用简单的LED来作为例子,原理明白之后,改造其他电器也不再遥不可及。
所需元件
硬件连接
数字触摸开关 → 数字2
数字继电器模块 → 数字12
特别说明下,继电器部分的连接,继电器可以理解为是个开关,只是这个开关的特别之处在于可以控制大电流,我们可以用来控制一些大电流的交流设备。我们这里以3V的LED来作为例子,便于理解继电器原理。为了安全起见,不建议第一次直接改造交流设备。在弄清原理之后,可以在具有一定电路知识的朋友帮助下改造!
继电器如何使用?
大致看下继电器如何使用,继电器模块是通过数字引脚控制开关的,可以把它理解为LED,控制器控制它开与关。
继电器输出部分有四个引脚,如下图所示,COM(公共脚),NO(常闭端),NC(常开端),N/A(空脚)。
解释下常开和常闭的区别。NO引脚(常开端)常态下和COM(公共端)断开,只有继电器至高之后,才导通。而NC引脚(常闭端)刚好相反,常态下是断开的,只有继电器至高之后,才断开。
输入代码
打开样例代码TouchControlRelay,可见
int touchPin = 2; //触摸开关连接到数字2
int relayPin =12; //继电器连接到数字12
int relayState =HIGH; // relayState记录继电器状态
int touchState; //touchState记录触摸开关状态
int lastTouchState =LOW; // lastTouchState记录触摸开关前一个状态
long lastDebounceTime= 0;
long debounceDelay =50; //去除抖动时间
void setup() {
pinMode(touchPin, INPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, relayState);
}
void loop() {
//reading用来存储touchPin的数据
int reading = digitalRead(touchPin);
// 一旦检测到数据发生变化,记录当前时间
if (reading != lastTouchState) {
lastDebounceTime= millis();
}
// 等待50ms,再进行一次判断,是否和当前触摸开关状态相同
// 如果和当前状态不相同,改变触摸开关的状态
// 同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态
if ((millis() - lastDebounceTime) >debounceDelay) {
if (reading != touchState) {
touchState = reading;
if (touchState == HIGH) {
relayState = !relayState;
}
}
}
digitalWrite(relayPin, relayState);
// 改变触摸开关前一个状态值
lastTouchState = reading;
}
下载完代码,碰下触摸开关,灯点亮。再碰下,灯熄灭
硬件分析(数字输入—数字输出)
很明显,触摸开关是输入设备,继电器是输出设备。继电器再相应的控制其他设备。
代码回顾
由硬件分析可以看出,触摸是输入设备,继电器是输出设备。
pinMode(touchPin, INPUT);
pinMode(relayPin, OUTPUT);
通过digitalWrite()读取按键的状态:
int reading = digitalRead(touchPin);
按下在由低变高或者由高变低时,都会有个抖动的过程,时间非常的短,如下图所示:
为了避免由于抖动产生的错误信号,所以我们代码中有个去抖的过程。去抖的方法很简单,就是等到数据发生变化时,隔一段时间再检测一次。
一旦检测到读取的数据发生变化,通过millis()函数记下时间:
if (reading !=lastTouchState) {
lastDebounceTime = millis();
}
millis()是一个函数,该函数是Arduino语言自有的函数,它返回值是一个时间,Arduino开始运行到执行到当前的时间,也称之为机器时间,就像一个隐形时钟,从控制器开始运行的那一刻起开始计时,以毫秒为单位。
再等待50ms,再进行一次判断,是否和当前触摸开关状态相同。如果和当前状态不相同,改变触摸开关状态。同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态。
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != touchState) {
touchState =reading;
if (touchState ==HIGH) {
relayState= !relayState;
}
}
}
|
|
pengrui
最后登陆时间:2015-10-30 14:51:20 |
Edison教程系列05 声控灯
作者:Angelo 来自 DFRobot http://www.dfrobot.com.cn/commun ... thread&tid=3305
小时候有没有对走廊的声控灯很感兴趣呢?会不会拼命的跺脚只为让那盏灯点亮。这节我们就做个这样的声控灯。只有你轻轻拍下手, 灯就自动亮起来了,没了声音,灯就又自动关了。这里用到的是个声音传感器,我们可以利用这个传感器做出更多互动作品,通过声音触发来控制更多好玩儿的东西,比如说做个发光鼓等等。
【所需元件】
1× 数字食人鱼红色LED发光模块
1× 模拟声音传感器
1× IO 传感器扩展板 V7.1
1× 英特尔® Edison for Arduino开发板
【硬件连接】
【输入代码】
对着话筒拍下手,或者说句话,试试灯能不能点亮?
【硬件分析】(模拟输入—数字输出)
前面几次我们接触的都是数字传感器,这次我们要尝试使用模拟传感器了,还记得在一开始说的数字与模拟的区别吗?(串口中认识“数字”与“模拟”一节)。数字,只有两个值(0/1)。模拟,是线性的,理论上的无限值(0~1023)。
所以这里是个,模拟输入,数字输出的模式。
【代码回顾】
在setup()中只设置了LED为输出,为什么没有设置声音传感器输入模式?这是因为模拟口都是输入设置,所以不需要设置了。
声音传感器是输入设备,所以需要读取对应模拟口0的值。与读取数字口函数digitalRead(pin)类似,所以模拟口读取函数是:
analogRead(pin)
这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位A/D转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。比如512 = 2.5V。
最后是一个if判断,判断是否到达你预设的值。
if (soundState > 10) {
...
}else{
...
}
需要修改预设值的话,可以打开串口监视器,看看你需要的声音强度的值在什么范围,然后做相应调整就可以了。
|
此帖由pengrui于2015-01-14 10:58:42最后编辑
|
|
pengrui
最后登陆时间:2015-10-30 14:51:20 |
|
||||||||
此帖由pengrui于2015-01-14 10:59:35最后编辑
|
|||||||||
pengrui
最后登陆时间:2015-10-30 14:51:20 |
颜珍的原帖 很不错的经验贴。赞
|
|
pengrui
最后登陆时间:2015-10-30 14:51:20 |
Intel Edison官方样例中文版 简易Web服务器Wifi
|
||||||||||
此帖由pengrui于2015-01-14 11:00:08最后编辑
|
|||||||||||
JERRY11
最后登陆时间:2015-01-14 10:54:46 |
高中,自学,没有任何基础,只有一腔热血。
|
daijun72
最后登陆时间:2015-01-14 10:54:51 |
好……
|