0 简介
Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目
基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人
大家可用于 课程设计 或 毕业设计
print("Q 2027578070")
1 项目介绍
利用物联网技术和微信公众平台进行环境监测,能够实时获取监测地点的温度和湿度,实现远程数据采集与显示的功能。该系统不受时间和地域限制,用户可以在任何具备网络覆盖的地方从关注的微信公众号中获取并浏览采集到的信息,且具有支持多手机用户客户端可以共享一台服务器的优势,用户可以完全掌握检测地点温湿度的变化情况并做出恰当的反应。同时该系统将微信公众平台与图灵机器人进行结合,在联网的情况下可做到和人自如的对话。
2 系统硬件
本系统主要分为感知与控制层、网络层和用户应用层三部分。感知与控制层的主要功能是通过STM32 ARM控制板和DHT11温湿度传感器节点等感知设备,获取环境监测的相应参数信息,如温度、湿度、光照度等。然后通过无线WIFI传感器网络技术组成一个自治网络,采用协同工作的方式,提取有用的信息,并通过接入设备与互联网中的其他设备实现资源共享和交流互通。
网络层的主要功能是将来自感知与控制层的信息传送到互联网中,通过学习以IPV6/IPV4为核心建立的互联网平台,将网络内的信息资源整合成一个可互联互通的大型智能网络,为上层服务管理和大规模环境监测应用建立一个高效、可靠、可信的基础设施平台。通过大型的中心计算机平台,对网络内获取的大量环境检测信息进行实时的管理和控制,并为上层应用提供一个良好的用户接口,本系统采用阿里云服务器和MYSQL数据库作为智能网络平台。该平台能够将WIFI模块发送来的数据利用PHP语言不断存储在数据库中,以便供微信公众平台进行数据的调用。
用户应用层的主要功能是集成系统底层的功能,构建起面向环境监测行业的实际应用,这里利用手机微信公众平台 。用户在微信公众平台发送采集数据的请求指令后,服务器迅速将数据库中当前数据发送给微信公众号,从而保证用户获取最新的温湿度数据,更好的实现了远程实时监测、预警等功能。整个系统的具体构架图如图所示。
2.1 数据采集与控制模块
控制模块(MCU)采用一款常用的ARM芯片-STM32F103,它拥有丰富的外设资源且易扩展,与其他芯片相比,该款芯片性价比极高。该模块主要实现对采集的温湿度信息进行控制,并将数据一路通过WIFI模块传送到服务器,另一路通过串口在LCD屏上进行显示。
本系统通过温湿度传感器DHT11采集环境参数,包括温度和湿度。DHT11是一款复合传感器,厂家在生产过程中已对数字信号输出进行校准;同时为了提高该款传感器的可靠性以及稳定性,采用特定的数字模块采集技术和温湿度传感技术进行加工。该传感器的核心器件是电阻式感湿元件以及NTC测温元件。所有的DHT11传感器都通过特定的湿度环境进行校准,然后以程序的形式将获取的校准系数储存在OTP内存中,传感器在进行检测信号的过程中需要对这些校准系数进行调用[10]。接口采用单线制串行进行通信,在集成系统过程中方便且快捷。此外DHT11具有体积小、功耗低、信息传输距离能够大于20米等优点,使其获得广泛的应用。该DHT11与MCU的具体连接如图所示
2.2 WIFI模块
WIFI模块采用的是有人物联网科技公司的USR–WIFI232-D2模块,用于实现WIFI与串口的转换,将不具备网络连接功能的单片机接入互联网,使其配置为STA模式连接到路由器上,组成一个无线网络,从而能向服务器发送数据。其原理图如图所示。WIFI模块的TXD,RXD分别接到ARM的PA10(U1_RXD)与PA10(U1_TXD)上,完成ARM端与WIFI模块的串口。
2.3 液晶显示模块
液晶显示模块原理图如图所示,在硬件设计上同时支持LCD彩屏与OLED。16万色的LCD彩屏作为显示元件,其相对普通的数码管显示元件具有更丰富的显示色彩,且可触屏操作,嵌入方便,以实现强大的用户交互系统的设计;同时,OLED具有功耗小、成本低等优势。该系统采用两种显示方式,以适应不同用户与不同场合。
3 软件设计
3.1 控制部分算法
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。
为了能够准确获取所关注地点的温湿度值,本系统采用两个温湿度传感器DHT11,采集的温湿度值分别记为W1、S1以及W2、S2 ,设定温度阈值Wth,湿度阈值为Sth,当|W1-W2|
3.2 服务器与数据库
本系统采集的温湿度数据通过服务器储存在数据库中,因此服务器与数据库的稳定性、方便性和广泛实用性显得尤为重要。通过多方论证,本系统选用MySQL数据库和阿里云服务器进行数据传送存储和管理的系统。硬件WIFI模块发送的数据以GET方法发送到阿里云服务器中,阿里云服务器通过PHP脚本语言与SQL语句进行连接来实现数据的存储与管理,如图所示。
为了提高该系统的可操作性,用户可以通过手动设置通信地址、端口以及添加信息到数据库中,且一次设置永久保存。在每次通信时系统会自动搜索数据库,取出温湿度数据和远程服务器进行通信;若服务器地址发生变化,只需修改客户端通信数据库中的通信参数即可。数据存取模块实现对远程服务器传送来的温湿度数据进行数据存储、更新以及实时的查询记录功能。
服务器与数据库是通过HTTP协议的GET请求方式将传感器发送来的数据进行传输,采用目前较为常用的php脚本语言进行编写代码,部分核心代码如下图所示。
3.3 服务器与微信公众平台
基于微信公众平台的智能型环境监测系统的终端是手机客户端中的微信软件。要使得手机微信公众号发送的请求命令能够被响应,需要将手机微信公众号与服务器绑定。
将微信公众号与服务器绑定之后,微信公众号发送请求指令到服务器,服务器读取数据库中的数据发送回微信公众号。该指令和返回消息的具体文字信息是由服务器端用PHP语言作为交互的脚本语言,对客户端发送的指令进行解析与判断,预先建立一个知识库系统,用于实现对特定语句的回应,比如本系统中公众微信号发送请求指令“温度”,会得到回复信息当前时间的硬件设备所在地的温度数据;公众微信号发送请求指令“湿度”,会得到回复信息当前时间的硬件设备所在地的湿度数据。具体的阿里云服务器、微信服务器和客户端的消息收发原理如下图所示。
3.4 微信与图灵机器人
图灵机器人是中文语境下智能度较高的中文语义与认知计算平台。其以人工神经网络为基础,运用机器学习、知识图谱、模式识别等技术,其拥有强大的中文语义分析及上下文解读能力,可加速实现嵌入式系统的智能化,提高及交互体验。
本系统通过图灵机器人公司提供的API接口,将客户发送的非指令性语句以HTTP协议发送的其平台,再对其回复的信息加以筛选与处理回发给用户端,实现语言交互功能。
4 项目演示
4.1 硬件效果
4.2 基本信息收发
微信公众号管理员在系统中绑定好通信接口后,才能进行基本的信息收发功能。用户可以向应用服务发送消息或者事件,同时应用服务也可以响应该事件并返回信息给用户。本测试模块设计了温度和湿度两个指标进行测试,如图所示。图9和图10分别表示了当前时间的数据库和LCD显示屏所对应的温湿度指标。
查看数据库记录
4.3 高级消息推送
高级信息推送是指公众号管理员通过公众号和图灵机器人结合管理后台,实现多样化的功能,比如查询某个城市天气、查询飞机票、查询快递等功能。下图为高级消息的推送测试结果。
经以上测试结果可知,系统运行正常,能完成公众号的基本信息收发和高级消息推送的功能。由于WIFI无线网络传送数据时会有延迟,从而在微信端请求指令的过程中,检测的数据为数据库前8-9s的数据,使得获取的的当前信息可能与LCD显示屏的信息会出现不同步的现象。
5 关键代码
Stm32 使用HTTP链接远程服务器
#include
#include
#include
#include
#include
// Http请求内容
static const char send_data[] =
"GET /v1.0/device/1949/sensor/2511/datapoints HTTP/1.1\r\n"
"U-ApiKey:[your apikey]\r\n"
"Host: api.yeelink.net\r\n\r\n";
void tcpclient(const char* host_name, int port)
{
(void)port;
char *recv_data;
int sock, bytes_received;
struct hostent *yeelink_host;
struct in_addr yeelink_ipaddr;
struct sockaddr_in yeelink_sockaddr;
recv_data = rt_malloc(1024);
if (recv_data == RT_NULL)
{
rt_kprintf("No memory\r\n");
return;
}
// 第一步 DNS地址解析
rt_kprintf("calling gethostbyname with: %s\r\n", host_name);
yeelink_host = gethostbyname(host_name);
yeelink_ipaddr.s_addr = *(unsigned long *) yeelink_host->h_addr_list[0];
rt_kprintf("Yeelink IP Address:%s\r\n" , inet_ntoa(yeelink_ipaddr));
yeelink_sockaddr.sin_family = AF_INET;
yeelink_sockaddr.sin_port = htons(80);
yeelink_sockaddr.sin_addr = yeelink_ipaddr;
rt_memset(&(yeelink_sockaddr.sin_zero), 0, sizeof(yeelink_sockaddr.sin_zero));
while(1)
{
// 第二步 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
rt_kprintf("Socket error\n");
rt_free(recv_data);
return;
}
// 第三步 连接yeelink
if (connect(sock, (struct sockaddr *)&yeelink_sockaddr, sizeof(struct sockaddr)) == -1)
{
rt_kprintf("Connect fail!\n");
lwip_close(sock);
rt_free(recv_data);
return;
}
// 第4步 发送Http请求
send(sock,send_data,strlen(send_data), 0);
// 第5步 获得Http响应
bytes_received = recv(sock, recv_data, 1024 - 1, 0);
recv_data[bytes_received] = '\0';
// 响应内容为 {"timestamp":"2013-11-19T08:50:11","value":1}
// 截取“value”之后的内容
char* actuator_info = rt_strstr( recv_data , "\"value\"");
int offset = rt_strlen("\"value\":");
actuator_status = *(actuator_info + offset);
rt_kprintf("actuator status :%c\r\n",actuator_status);
// 获得开关状态,并设置LED指示灯
char actuator_status;
(actuator_status == '1')?rt_hw_led_on(0):rt_hw_led_off(0);
rt_memset(recv_data , 0 , sizeof(recv_data));
// 关闭套接字
closesocket(sock);
// 延时5S之后重新连接
rt_thread_delay( RT_TICK_PER_SECOND * 5 );
}
}
6 最后
print("Q 2027578070")