功能介绍:
使用4G模块EC600S和32单片机实现接入阿里云服务器,上传光照数据和下发命令控制LED灯(PC13),同时可以打电话、发短信。
前期准备:
1、首先你得有一个阿里云的账号,没有的话就注册一个
2、在物联网平台创建产品和设备
附上参考文章:AT指令接入阿里云
主要硬件准备:
1、STM32F103C8T6最小系统板
2、4G模块,我使用的是EC600S(适用于移动、联通、电信卡)
3、光照强度传感器BH1750
模块接线:
4G模块EC600S:
VCC–5V GND–GND TX–PA3 RX–PA2
光照强度传感器BH1750:
VCC–3.3V GND–GNG SCL–PB6 SDA–PB7 ADDR–不接
演示阶段:
实物图
串口助手输出信息
成功接入阿里云,设备显示在线
成功上传光照数据和LED灯状态
在线调试里可以下发控制命令
查看自己是否订阅成功
开发Web应用和移动应用,可以上物联网应用开发控制台 应用开发链接
简单开发的手机应用
代码需要修改的地方
1、三元组和手机号码
阿里云三元组获取方式:
2、数据流名(标识符)修改
将Light、LED修改为你的标识符
标识符查看方式:
部分代码实现:
数据上传部分代码
每隔3S上传一次光照数据
命令的下发部分代码
在串口2中断服务函数中,通过“version”字符串判断有没有接收到下发的命令,如果是下发,串口2就会接收到这样一长串的字符串:
+QMTRECV: 0,0,"/sys/a1VPyJEJRjJ/test01/thing/service/property/set",92,"{"method":"thing.service.property.set","id":"44777986","params":{"LED":1},"version":"1.0.0"}"
收到下发的命令后,将U2_RX_Cmd置1在main()中指向命令和上传LED灯状态。
有时发布消息时会出错,出错时串口2会接收到字符串“EEOR”。发生错误时,我们可以试着重连阿里云。
发短信和打电话可以直接调用这两个函数即可
EC600S_SendMsg(Phone,Message); //发短信
EC600S_CallPhone(Phone); //打电话
main.c文件
/*
4G模块EC600S接入阿里云--实现数据上传和命令下发
模块接线:
4G模块EC600S:
VCC--5V GND--GND TX--PA3 RX--PA2
光照强度传感器BH1750:
VCC--3.3V GND--GNG SCL--PB6 SDA--PB7 ADDR--不接
*/
#include
#include
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "bh1750.h"
#include "EC600S.h"
//三元组
#define PRODUCTKEY "a1VPyJEJRjJ"
#define DEVICENAME "test01"
#define DEVICESECRET "e7da0d4274b9da4ded7b7e90ad4178be"
//手机号码和短信内容
#define Phone "10086"
#define Message "Thank"
int main(void)
{
float light; //光照值
char dataBuf[36]; //存储数据
unsigned short timeCount = 300; //发送间隔变量
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组
SysTick_Init(72); //初始化延时函数
LED_init(); //初始化LED PC13
BH1750_Init();//初始化光照传感器
USART1_Init(115200); //初始化串口1--调试用
USART2_Init(115200); //初始化串口1--EC600S使用
EC600S_Init(); //初始化EC600S模块
EC600S_CONNECT_MQTT_SERVER(PRODUCTKEY,DEVICENAME,DEVICESECRET); //连接阿里云服务器
// EC600S_SendMsg(Phone,Message); //发短信
// EC600S_CallPhone(Phone); //打电话
while(1)
{
delay_ms(10);
if(timeCount++ >= 300) //发送间隔3s
{
timeCount = 0;
light = LIght_Intensity(); //读取光照强度的值
memset(dataBuf,0,36);
sprintf(dataBuf,"{params:{Light:%.1f}}",light); //将数据打包json格式
EC600S_MQTT_SEND_DATA(PRODUCTKEY,DEVICENAME,dataBuf); //发布主题消息
}
if(U2_RX_Cmd==1) //接收到数据
{
U2_RX_Cmd = 0; //重新置为0
printf("串口2:收到服务器下发数据:\r\n");
if(strstr((const char*)U2_RX_BUF,(const char*)"{\"LED\":1}"))
{
LED0 = 0; //低电平开灯
printf("LED灯已打开\r\n");
}
else if(strstr((const char*)U2_RX_BUF,(const char*)"{\"LED\":0}"))
{
LED0 = 1; //高电平关灯
printf("LED灯已关闭\r\n");
}
memset(U2_RX_BUF, 0, sizeof(U2_RX_BUF)); //清空串口2缓冲区
//上传LED灯的状态
memset(dataBuf,0,36);
sprintf(dataBuf,"{params:{LED:%d}}",!LED0_STA); //将数据打包json格式
EC600S_MQTT_SEND_DATA(PRODUCTKEY,DEVICENAME,dataBuf);//发布主题消息
}
//接收到错误,重连阿里云
if(U2_RX_Error==1)
{
U2_RX_Error = 0; //重新置为0
printf("接收到错误,重连阿里云....\r\n");
EC600S_CONNECT_MQTT_SERVER(PRODUCTKEY,DEVICENAME,DEVICESECRET);//连接阿里云服务器
}
}
}