@
第一 、先上效果圖
c51程序在第四步,app程序在第六步
第二、原理講解
原理簡述:利用發布訂閱模式。第一步,先STC89c51獲取各種傳感器數值,第二步,新建主題,然后c51往這個主題發送消息,第三步。app inventor 訂閱這個主題,因為app inventor 制作的app 訂閱了這個主題,就可以收到來自這個主題的消息,也就是可以收到各種傳感器數值。
關於發布訂閱:
訂閱(訂閱):訂閱給定的一個主題。
發布(發布)將信息發送到指定的主題。
只有訂閱該主題的設備才可以收到發往該主題的消息。
通俗的來講:就是像博客訂閱的場景,什么意思呢,也就是說100個人訂閱了你的博客,如果博主發表了文章,那么100個人就會同時收到通知郵件,訂閱/發布模式就是這樣的原理。
如果還不理解的話再通俗講一下,就像生活中聽收音機,要想聽收音機,肯定就是調頻啦,只有在正確的頻道上面,我們才能聽得到好聽的節目,所以說訂閱首先要訂閱一個頻道/主題,只有訂閱了該主題,我們才能收到發往該頻道/主題的消息。
在本例程中,c51借助ESP8266推送消息,app訂閱主題,就可以實時接收c51發來的消息了。
第三、c51讀取各種傳感器數值
由於大家的傳感器不一樣,這里就不統一做例程了,在程序里直接使用了虛擬數值,大家知道就好。
char data1[] = "32"; ////為了演示定義的模擬數據,可根據自己傳感器自行采集數據
char data2[] = "27.8"; //
char data3[] = "45";
char data4[] = "26";
char data5[] = "99.12";
char data6[] = "ON";
這里只定義了6個數值,當然可以根據自己需要,隨意增加或者減少傳感器數值個數,數據類型可自行隨意修改。
第四、傳感器數據推送到雲端
c51示例程序下載:點擊下載
程序說明,波特率9600,晶振11.0592
由於ESP8266-01默認波特率是115200,需要先手動調節esp8266-01的波特率。
調整方法:ESP8266-01連接到usb轉ttl
五根線
esp8266---------UsbTTL
tx----------rx
rx----------tx
vcc-------3.3v
gnd--------gnd
en----------3.3v
串口調試助手: 點擊下載
打開串口調試助手,設置波特率115200,找到esp8266的com口並打開,發送
AT+UART=9600,8,1,0,0
末尾應該加上回車換行,串口會回復ok
如果不回復ok,可能固件不支持修改波特率,需要刷官方AT固件,可見我發的另一篇 刷官方固件
如果上一步傳感器數據可以成功讀取,那么就可以在上版的基礎上,把數據上傳到雲端。
用keil 打開程序,需要修改WIFI等信息
#define Ssid "newhtc" //WIFI名稱,,修改為自己路由器的WIFI名稱,好像不支持中文
#define PassWord "qq123456" //WIFI密碼,修改為自己路由器的
#define Uid "4d9ec352e0376f2110a0c601a2857225" //巴法雲UID密鑰,控制台獲取
#define Topic "mytemp" //巴法雲控制台創建,名稱自定義,app訂閱主題要和這個推送主題一致
在巴法創客雲控制台 新建一個主題,主題名字隨意,例如mytemp,本實例用用mytemp,使用示例代碼時應修改為自己的主題名字,字母或數字或字母加數字組合。UID為用戶私鑰,在 巴法創客雲控制台 注冊登陸后可獲得。
登陸完成后,可在控制台看到自己的私鑰UID,如圖所示:
創建主題,在控制台,可創建主題。
- 第一輸入主題,字母或數字或字母+數字組合。
- 點擊創建主題。
WIFI名稱為自己的路由器WIFI名稱,區分大小寫,寫錯會導致連接不上網絡的。
void POST(void)//POST數據函數
{
int dataLen;
uchar postData[150];
char strLen[3];
char data1[] = "32"; ////為了演示定義的模擬數據,可根據自己傳感器自行采集數據
char data2[] = "27.8"; //
char data3[] = "45";
char data4[] = "26";
char data5[] = "99.12";
char data6[] = "ON";
//通過&符號整合需要post的數據。傳感器數據用#分開,以便app進行數據分割
//自己要知道每個數據代表的意思,一會app端會按排列分割提取數值
sprintf(postData,"uid=%s&topic=%s&msg=#%s#%s#%s#%s#%s#%s#\r\n",Uid,Topic,data1,data2,data3,data4,data5,data6);
dataLen = strlen(postData); //計算數據長度
sprintf(strLen,"%d",dataLen); //int類型轉char
ESP8266_Set("AT+CIPMODE=1"); //開啟透明傳輸模式
ms_delay(1000);
ESP8266_Set("AT+CIPSTART=\"TCP\",\"api.bemfa.com\",80"); // 連接服務器和端口
ms_delay(1000);
ESP8266_Set("AT+CIPSEND"); //進入透傳模式,下面發的都會無條件傳輸
ms_delay(1000);
ESP8266_Set_Only("POST /api/device/v1/data/1/ HTTP/1.1\r\nHost: api.bemfa.com\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection:close\r\nContent-Length:");//ţքdeviceۅ ţքsensorۅ
ESP8266_Set(strLen);//數據長度(postData數據長度),一定要准確
ESP8266_Set("");//回車(發完數據長度后,有回車,不懂的百度http post 格式)
ESP8266_Set(postData);//發送數據
ms_delay(2000);
ESP8266_Set("+++"); //
memset(strLen,'\0',3); //重置數組
memset(strLen,'\0',sizeof postData);//重置數組
}
通過&符號整合需要post的數據。傳感器數據用#分開,以便app進行數據分割
自己要知道每個數據代表的意思,一會app端會按排列分割提取數值
利用HTTP POST形式,往服務器進行消息推送,具體接口可參考:巴法雲官方文檔
第五 下載程序到STC89c51即可
下載工具STC-ISP:下載:https://www.lanzous.com/iaxa4fc 密碼:1234
STC89c51/52和ESP8266接線問題
c51 ----------8266
P30----------TX
P31----------RX
3.3v-----------3.3v
Gnd---------Gnd
3.3v-----------EN
試了8266直接接5v也工作,不過不建議使用
如果路由器有網絡的話,數據會自動上傳,可在巴法創客雲控制台 刷新網頁,即可看到上傳的數據。如下圖所示:
第六、app inventor 制作app 接收實時數據
安裝appInventor 點擊安裝
本操作只提供一個app的demo,界面過於丑陋,大家可自由發揮更改界面。
app inventor 程序下載:點擊下載
頂部導航欄,依次點擊(項目-->導入項目aia),選擇上一步驟下載的aia文件導入即可。點擊導入的項目,即可看到控制面板,面板主要分為在組建設計和邏輯設計,用戶可在右上角進行模式切換。
(組建設計)面板可以向屏幕添加組建以進行二次開發。(邏輯面板)則進行相關邏輯編寫。
導入aia文件后,如果只是簡單使用,只需要修改兩個地方,一個是主題名字,一個是UID,均需開發者置換成自己的topic(主題名字)和UID(用戶私鑰),均可在創客雲控制台獲取點擊跳轉。
此處的主題topic應該和ESP8266程序里面設定的主題修改為一樣,不然會收不到消息。UID修改為自己的私鑰。
界面還有功能之類的自己可以隨意加,更改好,下載apk文件即可。
關鍵程序講解
程序下載,修改關鍵參數后就可直接使用的,以下是關鍵程序講解:
接收到帶傳感器的數據后,依照#號對字符串進行分割,有幾個數值,就分割幾次,自己要記住第幾個數值代表哪種傳感器就行了,比如要記住data1是溫度,data2是濕度等等,這里的分割次數需要和上傳的數據個數相等,有6個數值,就分割6次,7個數值就分割7次,就是依次增加或者減少就行。
當屏幕初始化時,會先訂閱主題,只有訂閱了這個主題,就可以實時收到發到該主題的消息,cmd=1是訂閱指令,就是訂閱主題的意思;cmd=9是遺囑指令,就是獲取服務器保存的數值,關於具體指令格式,可以在接入文檔了解:接入文檔
第七、效果展示
app可實時展示當前各種傳感器信息,可做遠程監控,手機只要有網絡就可以收到數據信息。不管是2G 3G 4G WIFI都行
第八 可能遇到的一些小問題