[ Edison教程系列]Edison教程系列04 触摸台灯

2014-10-30 16:46:11 [显示全部楼层]
6749浏览
查看: 6749|回复: 0

[ Edison教程系列] Edison教程系列04 触摸台灯

[复制链接]
不再单调的通过按钮来控制台灯的开关,改造个可触摸开关控制的台灯。在本节中,我们选用简单的LED来作为例子,原理明白之后,改造其他电器也不再遥不可及。

所需元件
Edison教程系列04 触摸台灯图1  Edison教程系列04 触摸台灯图2  Edison教程系列04 触摸台灯图3
Edison教程系列04 触摸台灯图4Edison教程系列04 触摸台灯图5

  •   1×  数字触摸开关
  •   1×   数字继电器模块
  •   1×   IO 传感器扩展板 V7.1
  •   1×   英特尔® Edison for Arduino开发板
  •   自行选择不同电压值LED(或其他输出设备)及相应电源设备



硬件连接

数字触摸开关 → 数字2
数字继电器模块 → 数字12

Edison教程系列04 触摸台灯图6

特别说明下,继电器部分的连接,继电器可以理解为是个开关,只是这个开关的特别之处在于可以控制大电流,我们可以用来控制一些大电流的交流设备。我们这里以3V的LED来作为例子,便于理解继电器原理。为了安全起见,不建议第一次直接改造交流设备。在弄清原理之后,可以在具有一定电路知识的朋友帮助下改造!

继电器如何使用?

大致看下继电器如何使用,继电器模块是通过数字引脚控制开关的,可以把它理解为LED,控制器控制它开与关。
继电器输出部分有四个引脚,如下图所示,COM(公共脚),NO(常闭端),NC(常开端),N/A(空脚)。

Edison教程系列04 触摸台灯图7

解释下常开和常闭的区别。NO引脚(常开端)常态下和COM(公共端)断开,只有继电器至高之后,才导通。而NC引脚(常闭端)刚好相反,常态下是断开的,只有继电器至高之后,才断开。

输入代码

打开样例代码TouchControlRelay,可见

[mw_shl_code=cpp,false]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;
}[/mw_shl_code]
   
下载完代码,碰下触摸开关,灯点亮。再碰下,灯熄灭


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

很明显,触摸开关是输入设备,继电器是输出设备。继电器再相应的控制其他设备。
Edison教程系列04 触摸台灯图8
代码回顾
由硬件分析可以看出,触摸是输入设备,继电器是输出设备。
pinMode(touchPin, INPUT);
pinMode(relayPin, OUTPUT);
      通过digitalWrite()读取按键的状态:
int reading = digitalRead(touchPin);
按下在由低变高或者由高变低时,都会有个抖动的过程,时间非常的短,如下图所示:


Edison教程系列04 触摸台灯图9

为了避免由于抖动产生的错误信号,所以我们代码中有个去抖的过程。去抖的方法很简单,就是等到数据发生变化时,隔一段时间再检测一次。
一旦检测到读取的数据发生变化,通过millis()函数记下时间:
[mw_shl_code=cpp,false]if (reading !=lastTouchState) {
      lastDebounceTime = millis();
}[/mw_shl_code]
millis()是一个函数,该函数是Arduino语言自有的函数,它返回值是一个时间,Arduino开始运行到执行到当前的时间,也称之为机器时间,就像一个隐形时钟,从控制器开始运行的那一刻起开始计时,以毫秒为单位。
再等待50ms,再进行一次判断,是否和当前触摸开关状态相同。如果和当前状态不相同,改变触摸开关状态。同时,如果触摸开关状态为高(也就是被按下),那么就改变继电器的状态。
[mw_shl_code=cpp,false]if ((millis() - lastDebounceTime) > debounceDelay) {
  if (reading != touchState) {
      touchState =reading;
    if (touchState ==HIGH) {
          relayState= !relayState;
      }
    }
  }
   [/mw_shl_code]

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

本版积分规则

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

硬件清单

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

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

mail