本次項目采用騰訊物聯網平臺+微信小程序騰訊連連實現遠程控制。本地采集溫度數據和濕度數據,設置溫濕度報警閾值,超過設定值即可通過蜂鳴器報警。微信小程序可遠程控制開發板的硬件設備。

??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??
1、項目功能
本次項目采用騰訊物聯網平臺+微信小程序騰訊連連實現遠程控制。本地采集溫度數據和濕度數據,設置溫濕度報警閾值,超過設定值即可通過蜂鳴器報警。微信小程序可遠程控制開發板的硬件設備。OLED屏幕實時顯示采集到的數據顯示,采用兩頁顯示方式,第一頁顯示實時時間,第二頁顯示環境溫濕度數據,可通過按鍵切換。板子上電即可自動完成WIFI連接,在WIFI密碼修改的情況下課實現手機一鍵配網,從而實現騰訊云平臺接入。連接成功后屏幕界面默認顯示當前實時時間。時間校準可現在網絡校時或串口校時。
(1)硬件模塊
- 溫濕度模塊DHT11完成環境溫濕度采集。
- ESP8266 WIFI模塊完成騰訊云平臺接口。
- 0.96寸OLED屏幕顯示實時數據信息。
- 按鍵實現界面切換(溫濕度界面和時間顯示界面切換)。
- LED燈配合微信小程序實現遠程控制。
- 蜂鳴器報警提示。
(2)效果展示



2、物聯聯網平臺
物聯網平臺也被稱為應用支撐平臺或者智能管理平臺。它是一個中間層,主要位于物聯網設備層和物聯網網關(和數據)層之間。采用的通訊協議為MQTT。
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基于發布/訂閱(Publish/Subscribe)模式的輕量級通訊協議,該協議構建于TCP/IP協議上,由IBM在1999年發布。MQTT最大的優點在于可以以極少的代碼和有限的帶寬,為遠程設備提供實時可靠的消息服務。做為一種低開銷、低帶寬占用的即時通訊協議,MQTT在物聯網、小型設備、移動應用等方面有廣泛的應用。MQTT屬于應用層協議。最新版本為MQTT v5.0標準。本次連接騰訊云物聯網平臺主要以MQTT標準協議3.1版本為主。
MQTT(消息隊列遙測傳輸)是ISO 標準(ISO/IEC PRF 20922)下基于發布/訂閱范式的消息協議。它工作在 TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議,為此,它需要一個消息中間件。
(1)騰訊云平臺配置
注冊騰訊云賬號,登陸云平臺

搜索物聯網平臺,登錄物聯網平臺。
創建項目
進入物聯網控制臺。

創建項目:

創建產品:


創建產品功能






連接物理網平臺的三個參數:設備名字、產品ID、設備秘鑰。
//設備名,產品ID,設備秘鑰修改為自己所創建產品參數
#define DeviceName "Smart_123"//設備名
#define ProductID "LA57WL612"//產品ID
#define DeviceSceret "9JHiCQ5668uZlVDuQ2ZnQ=="//設備秘鑰
創建工程,連接騰訊物聯網平臺

用戶名和密鑰生成:

//服務器IP:{PRODUCT_ID}.iotcloud.tencentdevices.com ---PRODUCT_ID對應產品ID
#define SERVER_IP "LA57WL612.iotcloud.tencentdevices.com"//服務器IP
#define SERVER_PORT 1883 //端口號
//客戶端ID:{產品ID}{設備名}
#define ClientID "LA57WL612Smart_123"
//用戶名和秘鑰可使用秘鑰生成工具完成
#define Username "LA57WL612Smart_123;12010126;R05S3;1621619622"
#define Password "9ebe0d0069ac4dd1e9e98664abc9f726c13b5a150190afdfa7b3c12240ff1e73;hmacsha256"//密文
//訂閱主題:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}產品ID,{DeviceName}設備名
#define SET_TOPIC "$thing/down/property/LA57WL612/Smart_123"//訂閱
主題訂閱


//訂閱主題:$thing/down/property/{ProductID}/{DeviceName} ---{ProductID}產品ID,{DeviceName}設備名
#define SET_TOPIC "$thing/down/property/LA57WL612/Smart_123"//訂閱
//發布主題:$thing/up/property/{ProductID}/{DeviceName}
#define POST_TOPIC "$thing/up/property/LA57WL612/Smart_123"//發布
(2)配置ESP8266WIFI
ESP8266是一款高性能的WIFI串口模塊,內部集成MCU能實現單片機之間串口通信,是目前使用最廣泛的一種WIFI模塊之一。可以簡單理解為一個WIFI轉串口的設備,不用知道太多WIFI相關知識,只需要知道串口怎么使用就可以。
ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三種。利用 ESP8266 可以實現十分靈活的組網方式和網絡拓撲。(SoftAP:即無線接入點,是一個無線網絡的中心節點。通常使用的無線路由器就是一個無線接入點。Station:即無線終端,是一個無線網絡的終端端。)。
本次采用模式為TCP+STA方式:
#define WIFI_NAME "wbyq"//WIFI名
#define WIFI_PASSWORD "asdfghjkl23"//wifi密碼
char mqtt_message[200];//上報數據緩存區
int main()
{
int i=0;
u8 stat=0;
u32 time=0;
u16 cnt=0;
float temp;
Beep_Init();//蜂鳴器初始化
Led_Init();//LED初始化
Key_Init();//按鍵初始化
Usartx_Init(USART1,115200,72);
Usartx_Init(USART3,115200,36);
TIMx_Init(TIM2,72,20000);//通過定時器2輔助串口接收數據,20ms
TIMx_Init(TIM4,72,20000);//通過定時器2輔助串口接收數據,20ms
DS18B20_Init();
// RTC_Init();//RTC初始化
printf("初始化完成\r\n");
while(1)
{
stat=Esp8266_STA_TCPclinet_Init((u8 *)WIFI_NAME,(u8 *)WIFI_PASSWORD,(u8 *)SERVER_IP,SERVER_PORT);
if(stat==0)break;
Delay_Ms(500);
printf("stat=%d\r\n",stat);
}
printf("服務器連接成功\r\n");
while(1)
{
MQTT_Init();
stat=MQTT_Connect(ClientID,Username,Password);
if(stat==0)break;
Delay_Ms(500);
printf("正在連接....\r\n");
}
printf("連接成功\r\n");
stat=MQTT_SubscribeTopic(SET_TOPIC,0,1);
if(stat)printf("訂閱失敗\r\n");
else printf("訂閱成功\r\n");
while(1)
{
if(usart3_flag)
{
for(i=0;i<usart3_cnt;i++)
{
printf("%c",usart3_rx_buff[i]);
}
usart3_cnt=0;
usart3_flag=0;
}
Delay_Ms(1);
time++;
cnt++;
if(time>=5000)
{
time=0;
MQTT_SentHeart();//發送心跳包
}
if(cnt>=1000)
{
cnt=0;
temp=DS18B20_GetTemp()*0.0625;
sprintf(mqtt_message,"{\"method\":\"report\",\"clientToken\":\"123\",\"params\":{\"LED1\":1,\"temp\":%.2f,\"L\":356}}",temp);//溫度
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
}
}
}
(3)設備上報數據格式

{
"method":"report",//上報設備屬性
"clientToken":"123",//消息配對標識
"timestamp":1212121221, //可不填,默認為系統時間
"params":{
"power_switch":1, //設備屬性power_switch
"color":1, //設備屬性color
"brightness":32 //設備屬性brightness
}
}
至此,云服務器創建成功,WIFI模式配置完成,云端接入成功。
3、無源蜂鳴器控制
無源蜂鳴器利用電磁感應現象,為音圈接入交變電流后形成的電磁鐵與永磁鐵相吸或相斥而推動振膜發聲,接入直流電只能持續推動振膜而無法產生聲音,只能在接通或斷開時產生聲音。通過2K~5k的方波信號實現驅動。

本次采用定時器3通道1實現無源蜂蜜器驅動。
/***********************************
**
**函數功能:定時器器PWM輸出
**TIM3通道引腳:
** 沒有重映射 部分重映射 完全重映射
** TIM3_CH1 PA6 PB4 PC6
** TIM3_CH2 PA7 PB5 PC7
**形參:
** chx --要開啟的通道(1 --通道1,2--通道2, 3 --表示開啟通道1和通道2)
** psc --預分頻系數
** ar --重裝載值(即周期時間)
** ccr --占空比
** 注意:本示例采用部分重映射功能
**作者:IT_阿水
************************************/
void TIM3_PWM_Out(u8 chx,u16 psc,u16 ar,u16 ccr)
{
/*1.開時鐘*/
RCC->APB2PCLKEN|=1<<4;//PB
RCC->APB2PCLKEN|=1<<0;//AFIO
AFIO->RMP_CFG&=~(0x3<<10);
AFIO->RMP_CFG|=0X3<<10;//完全重映像
/*2.配置GPIO*/
GPIOC->PL_CFG&=0xF0FFFFFF;
GPIOC->PL_CFG |=0x0B000000;//通用復用推挽輸出模式
/*3.定時器配置*/
RCC->APB1PCLKEN|=1<<1;//TIM3
RCC->APB1PRST|=1<<1;//開啟復位時鐘
RCC->APB1PRST&=~(1<<1);//取消復位
TIM3->CTRL1|=1<<7;
TIM3->PSC=psc-1;//預分頻
TIM3->AR=ar;//重裝載值
/*輸出PWM配置*/
if(chx&0x1)
{
TIM3->CCMOD1&=~(0x3<<0);//輸出
TIM3->CCMOD1|=1<<2;//快速使能
TIM3->CCMOD1|=1<<3;//預加載
TIM3->CCMOD1|=0x6<<4;//PWM0
TIM3->CCDAT1=ccr;//占空比,有效電平時間
TIM3->CCEN|=1<<0;//開啟CH1
}
if(chx&1<<1)//CH2
{
TIM3->CCMOD1&=~(0x3<<8);//輸出
TIM3->CCMOD1|=1<<10;//快速使能
TIM3->CCMOD1|=1<<11;//預加載
TIM3->CCMOD1|=0x6<<12;//PWM0
TIM3->CCDAT2=ccr;//占空比,有效電平時間
TIM3->CCEN|=1<<4;//開啟CH2
}
TIM3->CTRL1|=1<<0;//開啟定時器
}
4、DTH11溫濕度傳感器
DHT11 數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有枀高的可靠性與卓越的長期穩定性。傳感器包括一個電容式感濕元件和一個 NTC 測溫元件,并與一個高性能 8 位單片機相連接。

//從DHT11讀取一次數據
//temp:溫度值-20~60℃
//humi:濕度值5~95%RH
//返回值:0,正常;1,讀取失敗
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
u8 buf[5]={0};
u8 i;
DHT11_Rst();//起始信號
if(DHT11_Check()==0)//應答信號
{
for(i=0;i<5;i++)//讀取40位數據
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi++=buf[0];
*humi=buf[1];
*temp++=buf[2];
*temp=buf[3];
}
}else return 1;
return 0;
}
5、RTC電子鐘
RTC,英文全稱:Real-time clock,中文名稱:實時時鐘,是指可以像時鐘一様輸出實際時間的電子設備,一般會是集成電路,因此也稱為時鐘芯片。實時時鐘芯片是日常生活中應用最為廣泛的消費類電子產品之一。它為人們提供精確的實時時間,或者為電子系統提供精確的時間基準,目前實時時鐘芯片大多采用精度較高的晶體振蕩器作為時鐘源。
本次采用的是芯片自帶電子鐘,配置好后直接即可讀取時間信息,非常方便。
/*讀取RTC時間和日期*/
void RTC_GetDate(RTC_TIME *RTC_Time)
{
u32 date=RTC->DATE;
u32 tsh=RTC->TSH;
RTC_Time->year=((date>>20)&0xf)*10+ ((date>>16)&0xf);
RTC_Time->mon=((date>>12)&0x1)*10+ ((date>>8)&0xf);
RTC_Time->day=((date>>4)&0x3)*10+(date&0xf);
RTC_Time->week=((date>>13)&0x7);
//時間,注意,+-優先級 高于 &的優先級
RTC_Time->hour=((tsh>>20)&0x3)*10+((tsh>>16)&0xf);
RTC_Time->min=((tsh>>12)&0x7)*10+((tsh>>8)&0xf);
RTC_Time->sec=((tsh>>4)&0x7)*10+(tsh&0xf);
// printf("%d/%d/%d -- %d:%d:%d \r\n",RTC_Time->year,RTC_Time->mon,RTC_Time->day, \
RTC_Time->hour,RTC_Time->min,RTC_Time->sec);
}
文章相關附件可以點擊下面的原文鏈接前往下載:
https://ost.51cto.com/resource/2567。
??想了解更多關于開源的內容,請訪問:??
??51CTO 開源基礎軟件社區??
??https://ost.51cto.com??