(1)功能模块
本次设计是使用光线强度的变化来控制灯亮灭。
材料部分:wemos D1 R1、光线传感器、继电器、杜邦线、数据线、阿里云物联网平台、Arduino软件。
WeMos D1介绍:基于ESP-8266EX、Arduino兼容,使用Arduino IDE来编程、11 x I/O 引脚、1 x ADC 引脚(输入范围0-3.3V)、板载5V 1A开关电源(高输入电压24V)
在工作中:和stm32模块开发类似,集成度高、STM32方案也更经济便宜
wemos D1 R1的信号端是与与光线传感器、继电器相连接,通过连接 wemos D1 R1模块的WIFI信号实现将信息实时经模块传送到互联网上。
模块如下图
光线传感器是由两个组件即投光器及受光器所组成,利用投光器将光线由透镜将之聚焦,经传输而至受光器之透镜,再至接收感应器,接收感应器将收到之光线讯号转变成电信号,此电信讯号更可进一步作各种不同的开关及控制动作,其基本原理即对投光器受光器间之光线做遮蔽之动作所获得的信号加以运用以完成各种自动化控制。如下图
总体方案设计
(2)架构设计图
(3)设计过程和性能要求
本设计使用的软件Arduino需要安装crypto、PubSubClient等库。
电脑最好是window10,硬盘,内存大的,否则上传超级慢的。Arduino和库更新到最高版本。
接线表如下:
阿里云配置,登陆阿里云选择物联网平台,创建产品,下图是我创建的wendu产品。
在产品里创建设备,将设备证书信息放入代码里。
选择功能定义,编辑草稿,添加自定义功能建立模块继电器、灯、光照设备,下图已经创建好的了。
配置好后将代码上传,接好线好用USB线连接电脑,选择上传。打开串口可以查看上传的进度,数据是否上传成功。
等待激活刚才创建的wendu产品,激活成功后平台那边会显示设备在线,然后将创建的模块继电器、灯、光照发布上线。发布上线后在物模型数据可以实时看到数据。下图是运行状态,可以实时监控到灯和光线值。
最后需要在IoT Studio创建网页,将所需要的元素拉到框里,选择交互添加产品。下面是我所建的网页页面,添加指定设备后可以在网页上实时看到数据和控制开关。
绘出总体程序框图
程序流程图分为两部分,将数据传到wemos板子、数据如何上云。
由光照传感器采集的光照数据,通过数据处理后通过串口通信发送给wemos 模块,串口打印光照数据输出。图wemos板程序运行图1
图2是数据上云程序流程图,串口wifi初始化,检查MQTT是否正常,数据上云,串口打印当前数据信息。
3、系统硬件平台及接口设计;
系统硬件平台:Arduino是便捷灵活,方便上手的开源电子原型平台,包括硬件各种型号的arduino和软件Arduino IDE。WeMos D1开发板全称是WeMos D1 WiFI UNO R3开发板,基于ESP-12E,而且兼容Arduion,有了这款物联网开发板,我们就可以愉快的使用arduino方式开发ESP8266,玩转物联网项目。
接口设计:
Arduino使用的java接口返回给客户端的数据类型是JSON格式,所以再返回数据这里可以使用JSON格式返回,可以单独定义返回数据的方法统一调用。阿里云Iot的设备传输数据格式也是json格式,采用post方式提交数据,具体格式如下:设备属性上报,通过该Topic获取设备上报的属性信息。
发送方式如下: MQTT采用topic形式发送数据,生产者产生数据,通过topic进行发送,消费者订阅。
而使用到的WiFiEsp库是一个Arduino的封装好AT指令的WiFi操作库,可以使用Arduino的软串口操作。PubSubClient是一个用于Esp8266发布/订阅MQTT消息的库。
光线传感器传送数据到阿里云Iot。光线传感器采用GPRS传输数据,采用微消息队列MQTT,微消息队列 MQTT主要承担移动端连接接入、连接管理、数据转发等工作,相当于一个无限扩展能力的连接网关。方法是以"分组"的形式传送资料到用户手上采集到的数据发送给wemos板,对数据进行处理之后,板子连接手机热点连接网络。wemos板通过MQTT-TCP连接通信接入阿里云物联网平台的设备,通过报文发送数据到设备,在物联网平台实时监测数据的变化。
4、系统软件功能设计,程序流程图及代码实现,包括必要的注释;
#include <ESP8266WiFi.h>//安装ESP8266_Arduino开发环境
static WiFiClient espClient;
#include <AliyunIoTSDK.h>//引入阿里云 IoT SDK
//需要安装crypto库、PubSubClient库
//设置产品和设备的信息,从阿里云设备信息里查看
#define PRODUCT_KEY "a1Rhuvq34Qz" //替换自己的PRODUCT_KEY
#define DEVICE_NAME "wendu" //替换自己的DEVICE_NAME
#define DEVICE_SECRET "mgPuFun2XDEyBlrc" //替换自己的DEVICE_SECRET
#define REGION_ID "cn-shanghai" //默认cn-shanghai
#define WIFI_SSID "602iot" //WiFi名称
#define WIFI_PASSWD "18wulian" //WiFi密码
unsigned long lastMsMain = 0;
//光照传感器检测(数字量)
#define Light_Pin D6 //光敏传感器所接引脚为D6
#define Light_intensity digitalRead(Light_Pin) //定义函数功能,简化代码
//温湿度传感器(DHT11)
#include <dht.h> //导入dht.h库文件
dht DHT11; //创建一个变量类型DHT11
#define DHT11_Pin D0 //DHT11所接引脚为D7
float Temp_Value, Humi_Value; //定义两个变量分别存储温度与湿度值
void setup()
{
Serial.begin(9600);
pinMode(Light_Pin, INPUT);
//连接到wifi
wifiInit(WIFI_SSID, WIFI_PASSWD);
//初始化 iot,需传入 wifi 的 client,和设备产品信息
AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
}
void loop()
{
AliyunIoTSDK::loop();//必要函数
if (millis() - lastMsMain >= 2000)//每2秒发送一次
{
lastMsMain = millis(); //重新计时
Light_detection(); //光敏传感器检测
DHT11_detection(); //DHT11温湿度传感器检测
//发送数据至阿里云,双引号中为标识符,对应产品相应功能,第二个参数为变量/数值
AliyunIoTSDK::send("Light_intensity", Light_intensity);
AliyunIoTSDK::send("Temp_Value", Temp_Value);
AliyunIoTSDK::send("Humi_Value", Humi_Value);
}
}
/**********连接WiFi**********/
void wifiInit(const char *ssid, const char *passphrase)
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passphrase);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("WiFi not Connect");
}
Serial.println("Connected to AP");
}
/**********光敏传感器检测**********/
void Light_detection(void){
//光敏传感器(数字量)光强充足,值为0,反之为1
//Ps:模拟量的用法中,光强越强,值越小,读取的值范围为0-1023
Serial.print("Light_Value: "); //在串口输出光照强度读取的值
Serial.println(Light_intensity);
if(Light_intensity == 0){
//光照充足
Serial.println("Now the light is strong enough!");
}
else{
//光照不足
Serial.println("There is not enough light now!");
}
}
/**********DHT11温湿度传感器检测**********/
void DHT11_detection(void){
//DHT11检测
Serial.print("DHT11: ");
D: int chk = DHT11.read11(DHT11_Pin);//read the value returned from sensor
switch (chk)
{
case DHTLIB_OK:
Serial.println("OK!");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
Temp_Value = DHT11.temperature; //将读取到的温度数值存放到Temp_Value变量中
Humi_Value = DHT11.humidity; //将读取到的湿度数值存放到Humi_Value变量中
Serial.print("Temperature: "); //在串口输出温度数值
Serial.print(Temp_Value);
Serial.println("C");
Serial.print("Humidity: "); //在串口输出湿度数值
Serial.print(Humi_Value);
Serial.println("%");
}
4实验效果
Web端实时显示数据和调试设备、控制数据,当光照暗到一定值时候灯亮,光照亮到一定值时候灯有继电器控制灯灭。
图下为网页端控制页面
图为设备运行状态,
图为调试截图。