微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于Atom的智能家居控制系统(2)光敏电阻控制继电器

基于Atom的智能家居控制系统(2)光敏电阻控制继电器

时间:10-02 整理:3721RD 点击:

上一篇使用Atom设计了基于Atom的智能家居控制系统,即智能灯的控制和温湿度的采集以及一个设备对多个传感器的控制。但他们的功能都是独立的,今天将使用光敏电阻和继电器来进行功能的扩展,即通过采集光敏电阻的数据,来控制继电器的开关状态,进而实现对开关量设备的控制,如灯泡等。

       在开始正题前,不得不说,深圳的温度今天真是冷,经历4次入冬的失败,这次冬天真是有点太突然,怎一个冷字了得!

光敏电阻是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器,一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化),一般情况下,阻值随光照强度的增加而变小,但也有例外。

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

--------------------------------------------------------------------------------------------

1 编辑设备

在上一节的基础上,增加控制控件,即编辑设备,添加光控灯。



2 编写代码

(1) 为了实现光控灯,参考沅控灯代码,却发现官方的光控灯是使用基于SPI接口的GY-30 数字光强度光照传感器,但此次要实现的是基于光敏电阻的光控灯,故此代码没有参考价值。



(2)学习过单片机的都知道,对光敏电阻数据的采集,是使用模拟转数字量的原理,故在Atom上,应使用模拟接口进行功能实现,具体参考官方光控灯代码有两处可参考,一个官方的wiki,另一个地方就是在官方的Smoothing示例中。

3 参考Smoothing示例实现光敏电阻数据的采集

在这个示例中,首先要定义Ax(0-22)的模拟引脚,再通过analogRead接口进行数据的读取,此例子使用了读取多次数据求平均值的方法,来提高数据的可靠性。但在读取串口数据时,却读不出数据,不知为什么。



4 使用光控灯示例实现对继电器的控制

由于在IntoRobot的Web平台上,对topic的定义都官方都是写死的,用户现阶段还没有权力修改,故本次就是使用其对光敏电阻和继电器的topic的定义进行控制。



5 整体代码实现

  1. ///////////////////////////////////////
  2. /*
  3. ************************************************************************
  4. * 作者:  口袋物联  
  5. * 版本:  V1.0.1
  6. * 日期:  2016-01-17
  7. * 微信公众号 :koudaiwulian
  8. ************************************************************************
  9. 功能描述:
  10. 智能家居环境检测与控制:
  11. 智能灯控制
  12. 温湿度检测
  13. 后续功能完善中。

  14. 所需器件:
  15. 0.IntoRobot Atom
  16. 1.Led发光二级管
  17. 2.DHT11传感器模块
  18. 3.连接线若干


  19. 接线说明:
  20. 一 设备1
  21. Smart LED
  22. GND                           
  23. I/O      
  24. 二 设备2                    D0
  25. DHT11传感器模块
  26. GND
  27. VCC                          V3.3
  28. S                            D1

  29. 三 设备3
  30. 1光照强度传感器
  31. GND                           
  32. I/O                          A0
  33. 2 Relay
  34. GND
  35. VCC                          V3.3
  36. S                            D2
  37. */

  38. #include <DHT11/dht11.h>
  39. //控件topic定义
  40. //Led
  41. #define LED_CMD_SWITCH    "channel/smartLight_0/cmd/switch"   //开关命令
  42. #define LED_DATA_STATUS   "channel/smartLight_0/data/status"  //开关状态

  43. //温湿度计
  44. #define HUMITURE_DATA_TEMPERATURE    "channel/humiture_0/data/temperature"   //空气温度
  45. #define HUMITURE_DATA_HUMIDITY       "channel/humiture_0/data/humidity"      //空气湿度

  46. //智能光控灯开关
  47. #define OPTCTRLLAMP_CMD_SWITCH              "channel/optCtrlLamp_0/cmd/switch"        //开关命令  
  48. #define OPTCTRLLAMP_DATA_STATUS             "channel/optCtrlLamp_0/data/status"       //开关状态

  49. //光照强度
  50. #define OPTCTRLLAMP_DATA_ILLUMINATION       "channel/optCtrlLamp_0/data/illumination" //光照强度

  51. #define LEDPIN    D0    //定义灯泡控制引脚
  52. #define DHT11PIN  D1
  53. #define LAMP_SWITCH_PIN    D2    //定义灯泡控制引脚
  54. #define IlluminationPIN   A0
  55. #define IlluminationThreshold 3000// 定义光强临界值
  56. #define IlluminationAverageNum 10
  57. //定义传感器模块
  58. DHT11 dht11 = DHT11(DHT11PIN);
  59. //定义全局变量
  60. int readings[IlluminationAverageNum];      // the readings from the analog input
  61. int IlluminationValue=0;
  62. int IlluControlFlag = 0;
  63. int ReadPhotoResistance()
  64. {
  65.         int average = 0;
  66.         int total=0;
  67.         for (int thisReading = 0; thisReading < IlluminationAverageNum; thisReading++)
  68.         {
  69.                 // read from the sensor:
  70.                 readings[thisReading] = analogRead(IlluminationPIN);
  71.                 // add the reading to the total:
  72.                 total = total + readings[thisReading];
  73.                
  74.         }
  75.         // calculate the average:
  76.         average = total / IlluminationAverageNum;
  77.        
  78.         return average;
  79.        
  80. }

  81. void LEDSwitchCb(uint8_t *payload, uint32_t len)//Smart Device
  82. {
  83.     if(payload[0] == '1')
  84.    {
  85.                 digitalWrite(LEDPIN, HIGH);   // 打开灯泡
  86.                 IntoRobot.publish(LED_DATA_STATUS,"1");
  87.     }
  88.     else
  89.     {
  90.                 digitalWrite(LEDPIN, LOW);    //关闭灯泡
  91.                 IntoRobot.publish(LED_DATA_STATUS,"0");
  92.     }
  93. }

  94. void LampSwitchCb(uint8_t *payload, uint32_t len)//Light Control Lamp
  95. {
  96.         if(payload[0] == '1')
  97.         {
  98.                 digitalWrite(LAMP_SWITCH_PIN, HIGH);                //打开灯泡
  99.                 IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"1");
  100.                 IlluControlFlag = 1;
  101.         }
  102.         else
  103.         {
  104.                 digitalWrite(LAMP_SWITCH_PIN, LOW);                //关闭灯泡
  105.                 IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"0");
  106.                 IlluControlFlag = 0;
  107.         }
  108. }

  109. void setup() {
  110.   // put your setup code here, to run once:
  111.     //初始化
  112.     pinMode(LEDPIN, OUTPUT);
  113.         dht11.begin();
  114.     //接收智能灯开关命令
  115.     IntoRobot.subscribe(LED_CMD_SWITCH, NULL, LEDSwitchCb);
  116.        
  117.         //
  118.           pinMode(IlluminationPIN,AN_INPUT);
  119.     // initialize all the readings to 0:
  120.     for (int thisReading = 0; thisReading < IlluminationAverageNum; thisReading++)
  121.                 readings[thisReading] = 0;
  122.         pinMode(LAMP_SWITCH_PIN, OUTPUT);
  123.         //接收灯开关控制
  124.         IntoRobot.subscribe(OPTCTRLLAMP_CMD_SWITCH, NULL, LampSwitchCb);
  125. }

  126. void loop() {
  127.   // put your main code here, to run repeatedly:
  128.         IntoRobot.publish(HUMITURE_DATA_TEMPERATURE, dht11.ReadTemperature(0)); //上送温度值
  129.         IntoRobot.publish(HUMITURE_DATA_HUMIDITY, dht11.ReadHumidity());        //上送湿度值
  130.        
  131.         IlluminationValue=ReadPhotoResistance();
  132.         if(!IlluControlFlag)
  133.         {
  134.                 if(IlluminationValue <= IlluminationThreshold)
  135.                 {
  136.                         digitalWrite(LAMP_SWITCH_PIN, HIGH);                        // 打开灯泡
  137.                         IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"1");
  138.                 }
  139.                 else
  140.                 {
  141.                         digitalWrite(LAMP_SWITCH_PIN, LOW);                        //关闭灯泡
  142.                         IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"0");
  143.                 }
  144.         }

  145.         IntoRobot.publish(OPTCTRLLAMP_DATA_ILLUMINATION, IlluminationValue);        //上送光照强度值
  146.        
  147.         delay(1000);

  148. }

复制代码



6 绑定设备

这里要提的是,现在绑定设备已经非常可靠,即只要操作正确,可非常容易地绑定。具体方法可参见:(1)快速入门或(2)手机绑定。

7 测试效果

(1)光线强的时候




(2)光线弱的时候





附硬件连接



看起来,整个项目进展的还是很顺利的。 赞一个。

很积极啊你。

可以通过光线强弱来控制灯的开关,很不错哦,我也在玩IntoRobot     向你学习

太棒了,谢谢分享

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top