` 本帖最后由 gjianw217 于 2016-1-24 20:37 编辑
上一篇使用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 整体代码实现
- ///////////////////////////////////////
- /*
- ************************************************************************
- * 作者: 口袋物联
- * 版本: V1.0.1
- * 日期: 2016-01-17
- * 微信公众号 :koudaiwulian
- ************************************************************************
- 功能描述:
- 智能家居环境检测与控制:
- 智能灯控制
- 温湿度检测
- 后续功能完善中。。。
- 所需器件:
- 0.IntoRobot Atom
- 1.Led发光二级管
- 2.DHT11传感器模块
- 3.连接线若干
- 接线说明:
- 一 设备1
- Smart LED
- GND
- I/O
- 二 设备2 D0
- DHT11传感器模块
- GND
- VCC V3.3
- S D1
- 三 设备3
- 1光照强度传感器
- GND
- I/O A0
- 2 Relay
- GND
- VCC V3.3
- S D2
- */
- #include
- //控件topic定义
- //Led
- #define LED_CMD_SWITCH "channel/smartLight_0/cmd/switch" //开关命令
- #define LED_DATA_STATUS "channel/smartLight_0/data/status" //开关状态
- //温湿度计
- #define HUMITURE_DATA_TEMPERATURE "channel/humiture_0/data/temperature" //空气温度
- #define HUMITURE_DATA_HUMIDITY "channel/humiture_0/data/humidity" //空气湿度
- //智能光控灯开关
- #define OPTCTRLLAMP_CMD_SWITCH "channel/optCtrlLamp_0/cmd/switch" //开关命令
- #define OPTCTRLLAMP_DATA_STATUS "channel/optCtrlLamp_0/data/status" //开关状态
- //光照强度
- #define OPTCTRLLAMP_DATA_ILLUMINAtiON "channel/optCtrlLamp_0/data/illumination" //光照强度
- #define LEDPIN D0 //定义灯泡控制引脚
- #define DHT11PIN D1
- #define LAMP_SWITCH_PIN D2 //定义灯泡控制引脚
- #define IlluminationPIN A0
- #define IlluminationThreshold 3000// 定义光强临界值
- #define IlluminationAverageNum 10
- //定义传感器模块
- DHT11 dht11 = DHT11(DHT11PIN);
- //定义全局变量
- int readings[IlluminationAverageNum]; // the readings from the analog input
- int IlluminationValue=0;
- int IlluControlFlag = 0;
- int ReadPhotoResistance()
- {
- int average = 0;
- int total=0;
- for (int thisReading = 0; thisReading < IlluminationAverageNum; thisReading++)
- {
- // read from the sensor:
- readings[thisReading] = analogRead(IlluminationPIN);
- // add the reading to the total:
- total = total + readings[thisReading];
-
- }
- // calculate the average:
- average = total / IlluminationAverageNum;
-
- return average;
-
- }
- void LEDSwitchCb(uint8_t *payload, uint32_t len)//Smart Device
- {
- if(payload[0] == '1')
- {
- digitalWrite(LEDPIN, HIGH); // 打开灯泡
- IntoRobot.publish(LED_DATA_STATUS,"1");
- }
- else
- {
- digitalWrite(LEDPIN, LOW); //关闭灯泡
- IntoRobot.publish(LED_DATA_STATUS,"0");
- }
- }
- void LampSwitchCb(uint8_t *payload, uint32_t len)//Light Control Lamp
- {
- if(payload[0] == '1')
- {
- digitalWrite(LAMP_SWITCH_PIN, HIGH); //打开灯泡
- IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"1");
- IlluControlFlag = 1;
- }
- else
- {
- digitalWrite(LAMP_SWITCH_PIN, LOW); //关闭灯泡
- IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"0");
- IlluControlFlag = 0;
- }
- }
- void setup() {
- // put your setup code here, to run once:
- //初始化
- pinMode(LEDPIN, OUTPUT);
- dht11.begin();
- //接收智能灯开关命令
- IntoRobot.subscribe(LED_CMD_SWITCH, NULL, LEDSwitchCb);
-
- //
- pinMode(IlluminationPIN,AN_INPUT);
- // initialize all the readings to 0:
- for (int thisReading = 0; thisReading < IlluminationAverageNum; thisReading++)
- readings[thisReading] = 0;
- pinMode(LAMP_SWITCH_PIN, OUTPUT);
- //接收灯开关控制
- IntoRobot.subscribe(OPTCTRLLAMP_CMD_SWITCH, NULL, LampSwitchCb);
- }
- void loop() {
- // put your main code here, to run repeatedly:
- IntoRobot.publish(HUMITURE_DATA_TEMPERATURE, dht11.ReadTemperature(0)); //上送温度值
- IntoRobot.publish(HUMITURE_DATA_HUMIDITY, dht11.ReadHumidity()); //上送湿度值
-
- IlluminationValue=ReadPhotoResistance();
- if(!IlluControlFlag)
- {
- if(IlluminationValue <= IlluminationThreshold)
- {
- digitalWrite(LAMP_SWITCH_PIN, HIGH); // 打开灯泡
- IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"1");
- }
- else
- {
- digitalWrite(LAMP_SWITCH_PIN, LOW); //关闭灯泡
- IntoRobot.publish(OPTCTRLLAMP_DATA_STATUS,"0");
- }
- }
- IntoRobot.publish(OPTCTRLLAMP_DATA_ILLUMINATION, IlluminationValue); //上送光照强度值
-
- delay(1000);
- }
复制代码
6 绑定设备 这里要提的是,现在绑定设备已经非常可靠,即只要操作正确,可非常容易地绑定。具体方法可参见:(1 )快速入门或(2 )手机绑定。 7 测试效果 (1)光线强的时候 |
|
|
|