版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于OpenHarmony的嵌入式開發(fā)
第八章輕量系統(tǒng)應(yīng)用開發(fā)[8.1.1]項(xiàng)目的硬件組成
Hi3861
SoC模塊:Hi-12F-Kit顯示屏幕:OLED
128×64(I2C接口)空氣質(zhì)量檢測傳感器
Hi3861內(nèi)部沒有包含溫濕度、PM2.5等傳感器,需要使用外部傳感器
PTQS1005多合一氣體傳感器模組,如下特性:
①激光散射原理測量顆粒物濃度;
②半導(dǎo)體原理測量TVOC(TotalVolatileOrganicCompounds,有機(jī)氣態(tài)物質(zhì));
③紅外非分光原理測量二氧化碳;
④內(nèi)部集成溫濕度一體檢測芯片;
⑤多種傳感器統(tǒng)一風(fēng)道,優(yōu)化空間和反應(yīng)速度。安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)2先看功能[8.1.1]項(xiàng)目的硬件組成空氣質(zhì)量檢測傳感器PTQS1005安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)3參數(shù)類別部分參數(shù)參數(shù)值或范圍顆粒物PM2.5標(biāo)準(zhǔn)值測量范圍0~500(μg/m3)分辨率1(μg/m3)工作電流45~75(mA)TVOCTVOC有效量程0~10(ppm)TVOC分辨率0.01(ppm)工作電流60(mA)HOCOHOCO有效量程0~1(mg/m3)HOCO分辨率0.01(mg/m3)CO2有效量程400~3000(ppm)分辨率1(ppm)工作電流30~150(mA)溫濕度溫度測量范圍-30~99(℃)溫度測量分辨率0.1(℃)濕度測量范圍0~99(%RH)濕度測量分辨率0.1(%RH)模塊本體直流供電電壓標(biāo)準(zhǔn)5.0V,4.5~5.5(V)平均工作電流≤200(mA)再看參數(shù)[8.1.1]項(xiàng)目的硬件組成空氣質(zhì)量檢測傳感器PTQS1005安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)4引腳序號(hào)功能標(biāo)號(hào)說明模塊連接PIN1VCC電源正(+5V)+5VPIN2GND電源負(fù)(0V/GND)GNDPIN3SET高電平或懸空為正常工作狀態(tài)懸空PIN4RXD/SCL串口接收/I2C時(shí)鐘(3.3V)TXD1PIN5TXD/SDA串口發(fā)送/I2C數(shù)據(jù)(3.3V)RXD1PIN6RESET低電平復(fù)位,不使用應(yīng)懸空懸空PIN7SEL高電平或懸空為UART,低電平為I2C懸空PIN8NC懸空懸空再看引腳和通信協(xié)議可以設(shè)置使用UART或I2C兩種接口常見傳感器通信接口:UART、I2C、CAN和SPI等[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
①創(chuàng)建項(xiàng)目,同7.1節(jié),略
②OLED的功能支持:7.4.1小節(jié)示例的功能過于簡單使用功能更豐富的第三方庫,擴(kuò)展OLED
128×64的顯示特性
U8g2:Libraryformonochromedisplays,version2,
U8g2isamonochromegraphicslibraryforembeddeddevices.U8g2supportsmonochromeOLEDsandLCDs,whichincludethefollowingcontrollers:SSD1305,SSD1306……
Includesallgraphicsprocedures(line/box/circledraw).
Supportsmanyfonts.(Almost)norestrictiononthefontheight.
Requiressomememoryinthemicrocontrollertorenderthedisplay.下載U8g2,解壓縮到項(xiàng)目目錄下,將文件夾名稱更改為u8g2即可
本示例實(shí)際使用的是純文本的U8x8庫(包含在U8g2中)安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)5[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
②OLED的功能支持:在BUILD.gn中增加U8g2支持安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)6sources=["u8g2/csrc/u8x8_setup.c","u8g2/csrc/u8x8_u8toa.c","u8g2/csrc/u8g2_d_memory.c","u8g2/csrc/u8g2_selection_list.c","u8g2/csrc/u8g2_hvline.c","u8g2/csrc/u8x8_message.c","u8g2/csrc/u8g2_kerning.c","u8g2/csrc/u8x8_input_value.c","u8g2/csrc/u8g2_polygon.c","u8g2/csrc/u8g2_input_value.c","u8g2/csrc/u8x8_8x8.c","u8g2/csrc/u8x8_debounce.c","u8g2/csrc/u8g2_setup.c",
"u8g2/csrc/u8x8_display.c","u8g2/csrc/u8g2_box.c","u8g2/csrc/u8x8_selection_list.c","u8g2/csrc/u8x8_byte.c",
"u8g2/csrc/u8log.c",
"u8g2/csrc/u8log.c","u8g2/csrc/u8log_u8x8.c","u8g2/csrc/u8g2_message.c","u8g2/csrc/u8g2_line.c","u8g2/csrc/u8g2_intersection.c","u8g2/csrc/u8g2_fonts.c","u8g2/csrc/u8g2_cleardisplay.c","u8g2/csrc/u8g2_font.c","u8g2/csrc/u8x8_cad.c","u8g2/csrc/u8x8_string.c","u8g2/csrc/u8g2_ll_hvline.c","u8g2/csrc/u8x8_fonts.c","u8g2/csrc/u8log_u8g2.c","u8g2/csrc/u8g2_circle.c","u8g2/csrc/u8g2_buffer.c","u8g2/csrc/u8g2_bitmap.c","u8g2/csrc/u8x8_gpio.c",
"u8g2/csrc/u8g2_d_setup.c",
"u8g2/csrc/u8x8_u16toa.c",
"u8g2/csrc/u8x8_capture.c","u8g2/csrc/u8g2_button.c","u8g2/csrc/u8x8_d_ssd1306_128x64_noname.c",...]include_dirs=["u8g2/csrc",...]要注意的文件[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
②OLED的功能支持:工程源碼文件內(nèi)容
U8g2重點(diǎn):實(shí)現(xiàn)U8g2(U8x8)中的相關(guān)功能函數(shù)(Setup)安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)7#include"iot_i2c.h"#include"u8g2.h"新增加的頭文件voidu8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2_t*u8g2,constu8g2_cb_t*rotation,
u8x8_msg_cbbyte_cb,u8x8_msg_cbgpio_and_delay_cb){uint8_ttile_buf_height;uint8_t*buf;u8g2_SetupDisplay(u8g2,u8x8_d_ssd1306_128x64_noname,u8x8_cad_ssd13xx_fast_i2c,byte_cb,gpio_and_delay_cb);buf=u8g2_m_16_8_f(&tile_buf_height);u8g2_SetupBuffer(u8g2,buf,tile_buf_height,u8g2_ll_hvline_vertical_top_lsb,rotation);}I2C,128×64,無名廠商,1KB緩存byte_cb:回調(diào)函數(shù),與OLED通信相關(guān)的功能的實(shí)現(xiàn),如I2C的通信過程、數(shù)據(jù)發(fā)送等gpio_and_delay_cb:回調(diào)函數(shù),主要與延時(shí)相關(guān)的功能的實(shí)現(xiàn)[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
②OLED的功能支持:工程源碼文件內(nèi)容
byte_cb:回調(diào)函數(shù)(u8x8_byte_hw_i2c):switch-case
U8X8_MSG_BYTE_INIT:用來初始化GPIOU8X8_MSG_BYTE_SEND:用來發(fā)送數(shù)據(jù)(復(fù)制數(shù)據(jù)到Buffer)
U8X8_MSG_BYTE_SET_DC:在I2C中不使用(SPI:Data/Cmd)U8X8_MSG_BYTE_START_TRANSFER:開始傳輸數(shù)據(jù)U8X8_MSG_BYTE_END_TRANSFER:結(jié)束傳輸數(shù)據(jù)
gpio_and_delay_cb:回調(diào)函數(shù)(u8x8_gpio_and_delay)
U8X8_MSG_GPIO_AND_DELAY_INIT:初始化IO,在BYTE_INIT已完成
U8X8_MSG_DELAY_NANO:在I2C中不使用,延時(shí)1納秒
U8X8_MSG_DELAY_MILLI:延時(shí)1微秒安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)8[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
②OLED的功能支持:工程源碼文件內(nèi)容:兩個(gè)回調(diào)函數(shù)(部分源碼)安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)9uint8_tu8x8_byte_hw_i2c(u8x8_t*u8x8,uint8_tmsg,uint8_targ_int,void*arg_ptr){
……
switch(msg){
caseU8X8_MSG_BYTE_SEND:data=(uint8_t*)arg_ptr;while(arg_int>0){buffer[buf_idx++]=*data;data++;arg_int--;}break;
caseU8X8_MSG_BYTE_INIT://GPIO0復(fù)用為I2C1SDAIoTGpioInit(0);IoTGpioSetFunc(0,IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);IoTGpioSetDir(0,IOT_GPIO_DIR_OUT);//GPIO1復(fù)用為I2C1SCLIoTGpioInit(1);IoTGpioSetFunc(1,IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);IoTGpioSetDir(1,IOT_GPIO_DIR_OUT);intret=IoTI2cInit(1,400000);//初始化I2C1速率400kbpsif(ret!=IOT_SUCCESS){
printf(“FailedtoinitI2C!Error=%d\n”,ret);
return0;
}break;
……[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
②OLED的功能支持:工程源碼文件內(nèi)容:兩個(gè)回調(diào)函數(shù)(部分源碼)安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)10uint8_tu8x8_gpio_and_delay(u8x8_t*u8x8,uint8_tmsg,uint8_targ_int,void*arg_ptr){uint8_ti;
switch(msg){
caseU8X8_MSG_GPIO_AND_DELAY_INIT:break;
caseU8X8_MSG_DELAY_NANO:usleep(1);break;
caseU8X8_MSG_DELAY_MILLI:usleep(arg_int*1000);break;default:return0;}return1;}或者留空不寫[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
③Hi3861與PTQS1005的通信,選擇使用UART:9600,8N1
PTQS1005有很多數(shù)據(jù),可以選擇性地讀取,指令與格式如下:例如:0x42,0x4D,0xAB,0x00,0x00,0x01,0x3A安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)11字節(jié)0123456含義0x420x4D指令數(shù)據(jù)H數(shù)據(jù)L校驗(yàn)H校驗(yàn)L指令碼數(shù)據(jù)H數(shù)據(jù)L說明0xABXX讀取一般數(shù)據(jù)0xACXX讀取顆粒物完整數(shù)據(jù)0xADXX讀取顆粒物TSI模式數(shù)據(jù)0xF4X00-待機(jī)模式01-正常模式待機(jī)模式控制0xAC和0xAD指令不能讀取溫濕度信息[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
③Hi3861與PTQS1005的通信,選擇使用UART:9600,8N1使用讀取一般數(shù)據(jù)方式讀取PTQS1005安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)12字節(jié)示例說明00x42特征字節(jié)110x4D特征字節(jié)220x00長度碼高8位30x14長度碼低8位,長度碼=數(shù)據(jù)段長度+校驗(yàn)字節(jié)(2字節(jié))4
PM2.5(標(biāo)準(zhǔn)顆粒物CF=1)數(shù)值高8位5
PM2.5(標(biāo)準(zhǔn)顆粒物CF=1)數(shù)值低8位,單位μg/m36
TVOC數(shù)值高8位7TVOC數(shù)值低8位,單位PPM
字節(jié)示例說明8
-9
HCHO數(shù)值高8位10
HCHO數(shù)值低8位,單位mg/m311
-12
CO2數(shù)值高8位13
CO2數(shù)值低8位,單位PPM14
溫度數(shù)值高8位15
溫度數(shù)值低8位。實(shí)際溫度值=16bit的溫度值/1016
濕度數(shù)值高8位字節(jié)示例說明17
濕度數(shù)值低8位。實(shí)際濕度值=16bit的濕度值/1018
-19
-20
-21
版本號(hào)22
校驗(yàn)字高8位23
校驗(yàn)字低8位,16bit校驗(yàn)字=除校驗(yàn)字本身前面所有字節(jié)累加和[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
③Hi3861與PTQS1005的通信,選擇使用UART:9600,8N1首先,配置Hi3861的UART1接口,9600,8N1模式,參考第七章其次,完成發(fā)送指令的函數(shù):讀取一般數(shù)據(jù)SendCommand()
安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)13intSendCommand(uint8_tcmd,uint16_tdata){uint8_tbuffer[7]={0x42,0x4D,cmd,(data&0xFF00)>>8,data&0xFF};uint16_tchecksum=0;
//計(jì)算校驗(yàn)和
for(inti=0;i<5;i++)checksum+=buffer[i];buffer[5]=(checksum&0xFF00)>>8;buffer[6]=checksum&0xFF;returnIoTUartWrite(IOT_UART,buffer,sizeof(buffer));
//通過串口1發(fā)送指令}[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
③Hi3861與PTQS1005的通信,選擇使用UART:9600,8N1再次,接收數(shù)據(jù)、解析數(shù)據(jù)安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)14//傳感器數(shù)據(jù)結(jié)構(gòu)體typedefstruct{intpm2_5;
//PM2.5,單位ug/m3intco2;
//CO2,單位PPMfloattemperature;
//溫度
floathumidity;
//濕度}SENSOR_DATA;intReceiveData(SENSOR_DATA*data){uint8_tbuffer[24]={0};intret=IoTUartRead(IOT_UART,buffer,sizeof(buffer));//通過串口1接收數(shù)據(jù)
if(buffer[0]!=0x42||buffer[1]!=0x4D)return-1;data->pm2_5=buffer[4]<<8|buffer[5];
//解析數(shù)據(jù)
data->co2=buffer[12]<<8|buffer[13];data->temperature=(buffer[14]<<8|buffer[15])/10.0f;data->humidity=(buffer[16]<<8|buffer[17])/10.0f;
……//后面還有校驗(yàn),不在此列出[8.1.2]項(xiàng)目實(shí)現(xiàn)過程
③Hi3861與PTQS1005的通信,選擇使用UART:9600,8N1最后,初始化OLED屏幕,將數(shù)據(jù)展示在OLED屏幕上安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)15//定義u8g2全局變量u8g2_tu8g2;...u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,U8G2_R0,u8x8_byte_hw_i2c,u8x8_gpio_and_delay);u8g2_InitDisplay(&u8g2);
//初始化屏幕u8g2_SetPowerSave(&u8g2,0);
//喚醒屏幕u8g2_SetFont(&u8g2,u8g2_font_6x12_mr);
//設(shè)置字體u8g2_ClearBuffer(&u8g2);
//清空緩沖區(qū)charstr[20];u8g2_DrawStr(&u8g2,0,12,“Airquality”);
//繪制文字snprintf(str,sizeof(str),"PM2.5:%dug/m3",data.pm2_5);u8g2_DrawStr(&u8g2,0,24,str);snprintf(str,sizeof(str),"CO2:%dPPM",data.co2);u8g2_DrawStr(&u8g2,0,36,str);……u8g2_SendBuffer(&u8g2);
//繪制緩沖區(qū)[8.1.2]項(xiàng)目實(shí)現(xiàn)展示電氣連接示意圖安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)16Hi3861模塊
PTQS1005傳感器GPIO0/I2C0_SDAGPIO1/I2C0_SCL3.3VGNDRXDTXD5VOLED屏幕SDASCL3.3VGNDTXDRXD5VGND[8.1.0]項(xiàng)目實(shí)現(xiàn)總結(jié)與展望接口方面:同時(shí)使用了Hi3861的UART和I2C通信方面:基于U8g2實(shí)現(xiàn)了與OLED屏幕的通信,自定義了顯示的內(nèi)容基于PTQS1005的協(xié)議要求實(shí)現(xiàn)了與PTQS1005的通信,獲取并解析了目標(biāo)數(shù)據(jù)工作總結(jié):實(shí)現(xiàn)了一個(gè)數(shù)據(jù)采集和數(shù)據(jù)展示的本地終端分析展望:可擴(kuò)展實(shí)現(xiàn):歷史數(shù)據(jù)的本地存儲(chǔ)、基于Wi-Fi的MQTT平臺(tái)接入*參考《Hi3861V100/Hi3861LV100MQTT開發(fā)指南》可擴(kuò)展實(shí)現(xiàn):多網(wǎng)絡(luò)終端(WEB、移動(dòng)端)的感知數(shù)據(jù)獲取安全邊距8.1空氣質(zhì)量監(jiān)測儀項(xiàng)目基于OpenHarmony的嵌入式開發(fā)17gitee:dawningw倉庫[8.2.0]項(xiàng)目硬件組成安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)18Hi3861模塊(AP主模塊)控制從模塊Hi3861模塊(STA從模塊2)Hi3861模塊(STA從模塊1)Hi3861模塊(STA從模塊3)模塊上的RGB
LED
R:紅色交通燈
G:綠色交通燈
B:黃色交通燈模塊上的Wi-Fi
AP:1個(gè)主節(jié)點(diǎn)
STA:3個(gè)從節(jié)點(diǎn)采用UDP通信[8.2.1]項(xiàng)目的LED控制
LED:Hi3861模塊板載:GPIO13紅、GPIO12藍(lán)、GPIO9綠安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)19//初始化GPIO13IoTGpioInit(13);IoTGpioSetFunc(13,IOT_GPIO_FUNC_GPIO_13_GPIO);
//GPIO模式IoTGpioSetDir(13,IOT_GPIO_DIR_OUT);
//輸出模式……//GPIO12和GPIO9略//type為0時(shí)紅燈亮,為1時(shí)黃燈亮/實(shí)際為藍(lán)燈,為2時(shí)綠燈亮voidSetLight(inttype){IoTGpioSetOutputVal(13,IOT_GPIO_VALUE0);
//先關(guān)閉所有LEDIoTGpioSetOutputVal(12,IOT_GPIO_VALUE0);IoTGpioSetOutputVal(9,IOT_GPIO_VALUE0);
switch(type){default:case0:IoTGpioSetOutputVal(13,IOT_GPIO_VALUE1);break;
//紅亮case1:IoTGpioSetOutputVal(9,IOT_GPIO_VALUE1);break;
//藍(lán)亮(替代黃色,不是紅綠混)case2:IoTGpioSetOutputVal(12,IOT_GPIO_VALUE1);break;
//綠亮}}[8.2.2]創(chuàng)建Wi-Fi通信網(wǎng)絡(luò)主節(jié)點(diǎn):開啟AP模式從節(jié)點(diǎn):STA模式,連接熱點(diǎn)安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)20HotspotConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“Hi3861”);
//熱點(diǎn):Hi3861strcpy_s(config.preSharedKey,sizeof(config.preSharedKey),“1234567890”);
//密碼:1234567890config.securityType=WIFI_SEC_TYPE_PSK;
//認(rèn)證:PSKconfig.band=HOTSPOT_BAND_TYPE_2G;
//頻段:2.4GHzconfig.channelNum=7;
//信道:7printf("Startinghotspot...\n");WifiErrorCodeerrCode=StartHotspot(&config);printf("StartHotspot:%d\n",errCode);sleep(5);WifiDeviceConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“Hi3861”);
//同上,才能連接!strcpy_s(config.preSharedKey,sizeof(config.preSharedKey),"1234567890");config.securityType=WIFI_SEC_TYPE_PSK;printf("Connectingwifi...\n");intnetId=ConnectToHotspot(&config);printf("ConnectToHotspot:%d\n",netId);sleep(5);[8.2.3]創(chuàng)建Wi-Fi通信網(wǎng)絡(luò)主節(jié)點(diǎn)AP:客戶端,發(fā)送廣播安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)21//創(chuàng)建Socketintfd=socket(PF_INET,SOCK_DGRAM,0);if(fd<0){printf("Socketallocatefailed,errno=%d\n",errno);return;}intopt=1;//設(shè)置該套接字為廣播類型if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt))<0){printf("Setsocketbroadcastfailed\n");lwip_close(fd);return;}structsockaddr_inaddr={0};addr.sin_family=AF_INET;
//IPv4addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
//廣播,55addr.sin_port=htons(3861);
//端口,3861[8.2.3]創(chuàng)建Wi-Fi通信網(wǎng)絡(luò)從節(jié)點(diǎn)Station:服務(wù)端,接收廣播安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)22//填充sockaddr_in結(jié)構(gòu)體structsockaddr_inserver_addr;bzero(&server_addr,sizeof(structsockaddr_in));server_addr.sin_family=AF_INET;
//IPv4server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
//任意地址,server_addr.sin_port=htons(3861);
//監(jiān)聽端口,3861//創(chuàng)建Socketintfd=socket(PF_INET,SOCK_DGRAM,0);if(fd<0){printf(“Socketallocatefailed,errno=%d\n”,errno);
return;
}intopt=1;//設(shè)置該套接字為廣播類型if(setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt))<0){printf("Setsocketbroadcastfailed\n");lwip_close(fd);return;
}//開始監(jiān)聽if(bind(fd,(structsockaddr*)&server_addr,sizeof(server_addr))!=0){printf("Socketbindfailed\n");lwip_close(fd);return;
}printf("Socketlistening\n");[8.2.4]信號(hào)燈狀態(tài)切換與同步主節(jié)點(diǎn):設(shè)定為紅30秒→黃3秒→綠30秒→黃3秒→紅30秒……安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)23while(1){charbuffer;SetLight(0);//變?yōu)榧t燈
buffer='R';//發(fā)送信號(hào)燈狀態(tài)
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){printf("Sendbroadcastfailed!\n");}sleep(30);
//等待30秒
SetLight(1);//變?yōu)辄S燈
buffer='Y';//發(fā)送信號(hào)燈狀態(tài)
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){printf("Sendbroadcastfailed!\n");}sleep(3);
//等待3秒
SetLight(2);//變?yōu)榫G燈
buffer='G';//發(fā)送信號(hào)燈狀態(tài)
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){
printf("Sendbroadcastfailed!\n");}sleep(30);
//等待30秒
SetLight(1);//變?yōu)辄S燈
buffer='Y';//發(fā)送信號(hào)燈狀態(tài)
if(sendto(fd,&buffer,sizeof(buffer),0,(structsockaddr*)&addr,sizeof(addr))<0){
printf("Sendbroadcastfailed!\n");}sleep(3);
//等待3秒}[8.2.4]信號(hào)燈狀態(tài)切換與同步從節(jié)點(diǎn):根據(jù)接收的信息,切換信號(hào)燈狀態(tài)(對(duì)向問題)安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)24#defineNODE_ID1
//節(jié)點(diǎn)編號(hào)(偶數(shù)亮的燈相同,奇數(shù)亮的燈相反)structsockaddr_inaddr;bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_addr.s_addr=htonl(INADDR_ANY);addr.sin_port=htons(3861);intaddr_len=sizeof(addr);while(1){charmessage;intret=recvfrom(fd,&message,sizeof(message),0,(structsockaddr*)&addr,(socklen_t*)&addr_len);if(ret<0){
printf("recvfromfailed,ret=%d!\n",ret);continue;}switch(message){default:case'R':SetLight(NODE_ID%2==0?0:2);break;case'Y':SetLight(1);break;case'G':SetLight(NODE_ID%2==0?2:0);break;}usleep(1000);}主從1從2從3R
GRGG
RGRYYYY[8.2.0]項(xiàng)目實(shí)現(xiàn)總結(jié)與展望外設(shè)方面:同時(shí)使用了Hi3861的Wi-Fi和GPIO通信方面:一主三從,一個(gè)客戶端發(fā)送三個(gè)服務(wù)端偵聽接收一主控制切換、發(fā)送UDP報(bào)文,三從根據(jù)自己的ID切換狀態(tài)工作總結(jié):實(shí)現(xiàn)了一個(gè)數(shù)據(jù)發(fā)送和接收的本地局域網(wǎng)分析展望:系統(tǒng)缺陷分析:切換完全依賴與主節(jié)點(diǎn)的通信,UDP不可靠,網(wǎng)絡(luò)可能斷開可擴(kuò)展實(shí)現(xiàn):改為時(shí)間同步方式,讓節(jié)點(diǎn)根據(jù)時(shí)間自主控制交通燈切換可擴(kuò)展實(shí)現(xiàn):*MESH組網(wǎng)《Hi3861V100/Hi3861LV100Mesh軟件開發(fā)指南》安全邊距8.2節(jié)點(diǎn)互聯(lián)的交通燈系統(tǒng)基于OpenHarmony的嵌入式開發(fā)25[8.3.0]項(xiàng)目功能簡介互聯(lián)網(wǎng)信息獲取與展示:http
+
json
+
OLED,流程如下:
Hi3861連接到有效的熱點(diǎn)(具備互聯(lián)網(wǎng)能力)注冊互聯(lián)網(wǎng)氣象數(shù)據(jù)網(wǎng)站(獲取私鑰以便獲取氣象數(shù)據(jù))通過LwIP的HTTP客戶端獲取氣象數(shù)據(jù)解析JSON數(shù)據(jù),獲得氣象數(shù)據(jù)的有效數(shù)值將數(shù)據(jù)顯示在OLED屏幕上安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)26[8.3.1]連接到Wi-Fi熱點(diǎn)
Hi3861工作在STA模式下,實(shí)驗(yàn)環(huán)境有Wi-Fi熱點(diǎn)
Wi-Fi網(wǎng)絡(luò)無二次認(rèn)證,網(wǎng)絡(luò)DHCP正常、DNS正常安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)27#include"wifi_connecter.h"http://所需頭文件...WifiDeviceConfigconfig={0};strcpy_s(config.ssid,sizeof(config.ssid),“SSID”);
//熱點(diǎn)SSIDstrcpy_s(config.preSharedKey,sizeof(config.preSharedKey),"PASSWORD");//熱點(diǎn)密碼config.securityType=WIFI_SEC_TYPE_PSK;intnetId=ConnectToHotspot(&config);[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:注冊數(shù)據(jù)來源網(wǎng)站數(shù)據(jù)來源:互聯(lián)網(wǎng)數(shù)據(jù)網(wǎng)站:注冊并獲取私鑰安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)28[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:HTTP客戶端獲取數(shù)據(jù)
LwIP內(nèi)置的HTTP客戶端登陸網(wǎng)站獲取數(shù)據(jù)(1)進(jìn)行DNS域名解析,獲取主機(jī)名對(duì)應(yīng)的IP地址;(2)創(chuàng)建sockaddr_in結(jié)構(gòu)體,填入IP地址和端口號(hào);(3)創(chuàng)建Socket;(4)設(shè)置接收超時(shí)時(shí)間以及其他參數(shù)(如果需要的話);(5)連接Socket;(6)創(chuàng)建HTTP請求頭并發(fā)送HTTP請求;(7)讀取HTTP響應(yīng)并返回。安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)29[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:HTTP獲取數(shù)據(jù)-DNS解析安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)30if(hostname[0]<'0'||hostname[0]>'9'){
g_got_ip=0;ip_addr_tipaddr;intret=dns_gethostbyname(hostname,&ipaddr,dns_found,NULL);if(ret!=ERR_OK&&ret!=ERR_INPROGRESS){printf("DNSfailed,errno=%d\n",ret);return-1;}while(g_got_ip==0)sleep(1);ip=ip_ntoa(&g_dns_addr);
printf("DNSgetip:%s\n",ip);}voiddns_found(constchar*name,ip_addr_t*ipaddr,void*callback_arg){if(ipaddr){g_got_ip=1;ip_addr_copy(g_dns_addr,*ipaddr);}}dns_gethostbyname(constchar*hostname,ip_addr_t*addr,
dns_found_callbackfound,void*found);hostname:待解析的域名addr:解析返回的IP地址指針found:回調(diào)函數(shù)[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:HTTP獲取數(shù)據(jù)-創(chuàng)建Socket連接安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)31structsockaddr_inaddr={0};
//填充sockaddr_in結(jié)構(gòu)體addr.sin_family=AF_INET;addr.sin_addr.s_addr=inet_addr(ip);addr.sin_port=PP_HTONS(port);intfd=socket(AF_INET,SOCK_STREAM,0);
//創(chuàng)建Socketif(fd<0){printf("Socketallocatefailed,errno=%d\n",errno);return-1;}structtimevalreceiving_timeout={0};receiving_timeout.tv_sec=TIMEOUT;
//設(shè)置接收超時(shí)時(shí)間if(setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&receiving_timeout,sizeof(receiving_timeout))<0){printf(“Setsocketreceivingtimeoutfailed\n”);
//設(shè)置套接字描述符的屬性lwip_close(fd);return-1;}printf("Socketallocated\n");[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:HTTP獲取數(shù)據(jù)-Socket連接+HTTP請求安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)32if(connect(fd,(structsockaddr*)&addr,sizeof(addr))!=0){
//連接Socketprintf("Socketconnectfailed,errno=%d\n",errno);lwip_close(fd);return-1;}printf("Socketconnected\n");charsend_buf[512];staticconstchar*g_request_header="GET%sHTTP/1.1\r\n"\"User-Agent:OpenHarmony/Hi3861\r\n"\"Accept:*/*\r\n"\"Host:%s\r\n"\"Connection:Close\r\n"\"\r\n";intlen=snprintf(send_buf,512,g_request_header,url,hostname);if(lwip_write(fd,send_buf,len)<0){
//發(fā)送HTTP請求
lwip_close(fd);return-1;}printf("Socketsendhttpheadersuccess\n");[8.3.2]獲取天氣預(yù)報(bào)數(shù)據(jù)互聯(lián)網(wǎng)信息獲取與展示:HTTP獲取數(shù)據(jù)-讀取響應(yīng)數(shù)據(jù)調(diào)用http_get,并過濾內(nèi)容安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)33memset_s(recv_buf,max_length,0,max_length);
//讀取HTTP響應(yīng)intlength=0,r=0;do{r=lwip_read(fd,recv_buf+length,max_length-length-1);if(r>0)length+=r;}while(r>0);printf("Receivedfromsocket,ret=%derrno=%d\n",r,errno);lwip_close(fd);returnstrlen(recv_buf);charresponse[4096];intlength=http_get("",80,"/v3/weather/daily.json?key={此處填寫私鑰}&location=beijing&language=en&days=1",response,sizeof(response));char*body=response+4;while(*body!=‘\0’&&strncmp(body-4,“\r\n\r\n”,4)!=0)
//過濾方法不做講述body++;參數(shù)名稱類型默認(rèn)值必填備注keyString無是用戶API密鑰locationLocation無是所查詢的位置languageLanguagezh-Hans否語言u(píng)nitUnitc否單位startStart0否起始時(shí)間daysInt權(quán)限允許天數(shù)否天數(shù)[8.3.3]
解析JSON獲得數(shù)據(jù)天氣數(shù)據(jù)的JSON的格式安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)34{"results":[{"location":{"id":”………………","name":"北京","country":"CN","path":"北京,北京,中國","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},“daily”:[{
//返回指定days天數(shù)的結(jié)果
“date”:“2023-09-20”,
//日期(該城市的本地時(shí)間)
“text_day”:“多云”,
//白天天氣現(xiàn)象文字
“code_day”:“4”,
//白天天氣現(xiàn)象代碼
“text_night”:“晴”,
//晚間天氣現(xiàn)象文字
“code_night”:“0”,
//晚間天氣現(xiàn)象代碼
“high”:“26”,
//當(dāng)天最高溫度
“l(fā)ow”:“17”,
//當(dāng)天最低溫度
“precip”:“0”,
//降水概率,范圍0~100,單位百分比
“wind_direction”:“”,
//風(fēng)向文字
“wind_direction_degree”:“255”,
//風(fēng)向角度,范圍0~360“wind_speed”:“9.66”,
//風(fēng)速,單位km/h(當(dāng)unit=c時(shí))、mph(當(dāng)unit=f時(shí))
“wind_scale”:“”,
//風(fēng)力等級(jí)
“rainfall”:“0.0”,
//降水量,單位mm“humidity”:“76”
//相對(duì)濕度,0~100,單位為百分比
},{...
//更多返回結(jié)果
}],“l(fā)ast_update”:“2015-09-20T18:00:00+08:00”
//數(shù)據(jù)更新時(shí)間(該城市的本地時(shí)間)
}]}[8.3.3]
解析JSON獲得數(shù)據(jù)利用cJSON庫來完成解析,在BUILD.gn中增加cJSON庫安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)35#include“cJSON.h”
//包含頭文件typedefstruct{
//天氣預(yù)報(bào)數(shù)據(jù)結(jié)構(gòu)體,
chardate[11];
//日期
charday[20];
//早間天氣
charnight[20];
//晚間天氣
int8_thigh;
//最高氣溫
int8_tlow;
//最低氣溫
int8_thumidity;
//濕度}WEATHER_DATA;...WEATHER_DATAdata;cJSON*root=cJSON_Parse(response);cJSON*result=cJSON_GetArrayItem(cJSON_GetObjectItem(root,"results"),0);cJSON*daily=cJSON_GetArrayItem(cJSON_GetObjectItem(result,"daily"),0);strcpy(data.date,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"date")));strcpy(data.day,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"text_day")));strcpy(data.night,cJSON_GetStringValue(cJSON_GetObjectItem(daily,"text_night")));data.high=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"high")));data.low=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"low")));data.humidity=atoi(cJSON_GetStringValue(cJSON_GetObjectItem(daily,"humidity")));cJSON_Delete(root);[8.3.0]項(xiàng)目實(shí)現(xiàn)總結(jié)與展望接口方面:使用了Hi3861的Wi-Fi通信方面:建立了互聯(lián)網(wǎng)連接,進(jìn)行了DNS解析,HTTP通信工作總結(jié):實(shí)現(xiàn)了基于HTTP的互聯(lián)網(wǎng)數(shù)據(jù)的獲取,基于cJSON的數(shù)據(jù)解析分析展望:可以嘗試與其他氣象數(shù)據(jù)網(wǎng)站之間的對(duì)接數(shù)據(jù)的友好顯示可以提升用戶體驗(yàn),可以嘗試改進(jìn)屏幕上的數(shù)據(jù)展示方式安全邊距8.3
基于互聯(lián)網(wǎng)信息的天氣預(yù)報(bào)項(xiàng)目基于OpenHarmony的嵌入式開發(fā)36[8.4.1]項(xiàng)目概述與硬件組成項(xiàng)目目的:小車(Hi3861和執(zhí)行結(jié)構(gòu)等)為執(zhí)行端、計(jì)算機(jī)為控制端項(xiàng)目硬件小車:基于潤和Pegasus小車套件控制核心:Hi3861顯示器件:OLED電機(jī)驅(qū)動(dòng)*:L9110S測距模塊*:HC-SR04系統(tǒng)供電:18650安全邊距8.4
無線遙控小車項(xiàng)目基于OpenHarmony的嵌入式開發(fā)37[8.4.1]項(xiàng)目概述與硬件組成-電機(jī)驅(qū)動(dòng)L9110S電機(jī)驅(qū)動(dòng)板板載兩片L9110S驅(qū)動(dòng)芯片,分別驅(qū)動(dòng)左右輪電機(jī)驅(qū)動(dòng)板四個(gè)輸入端:電機(jī)1的IA(GPIO0)和IB(GPIO1)電機(jī)2的IA(GPIO9)和IB(GPIO10)驅(qū)動(dòng)板四個(gè)輸出端:電機(jī)1的OA和OB、電機(jī)2的OA和OB安全邊距8.4
無線遙控小車項(xiàng)目基于OpenHarmony的嵌入式開發(fā)38IA電平IB電平電機(jī)旋轉(zhuǎn)方向HL正轉(zhuǎn)(假定)LH與正轉(zhuǎn)相反方向LL停止(剎車)HH停止(剎車)兩片L9110S[8.4.1]項(xiàng)目概述與硬件組成-電機(jī)驅(qū)動(dòng)L9110SHC-SR04超聲波傳感器:依靠電平直接控制的控制端口Trig(GPIO7)和Echo(GPIO8
),超聲波波束的寬度約為15度
Trig端口給傳感器一個(gè)超過10us的高電平觸發(fā)信號(hào)后,傳感器開始工作,通過T端向外發(fā)射8個(gè)40KHz的方波并不斷通過R端檢測是否有信號(hào)返回,若R端有信號(hào)返回則表示傳感器收到了被測物體的反射回波,并通過Echo端口輸出一段高電平信號(hào),高電平信號(hào)的持續(xù)時(shí)間就是超聲波脈沖從發(fā)射到返回的時(shí)間,則可計(jì)算出超聲波的傳輸距離,即傳感器到被測物體距離的二倍安全邊距8.4
無線遙控小車項(xiàng)目基于OpenHarmony的嵌入式開發(fā)39[8.4.2]小車的運(yùn)動(dòng)控制控制本質(zhì):GPIO的組合對(duì)電機(jī)正反轉(zhuǎn)的簡單控制對(duì)四個(gè)GPIO的初始化操作安全邊距8.4
無線遙控小車項(xiàng)目基于OpenHarmony的嵌入式開發(fā)40#defineGPIO0
0#defineGPIO1
1#defineGPIO9
9#defineGPIO10
10...IoTGpioInit(GPIO0);
//初始化電機(jī)1的IA,G
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 特檢人員持續(xù)培訓(xùn)制度
- 水電運(yùn)作班組培訓(xùn)制度
- 血站新進(jìn)人員培訓(xùn)制度
- 縣在職教師培訓(xùn)制度
- 售樓處培訓(xùn)制度
- 中醫(yī)藥人才崗位培訓(xùn)制度
- 邊坡土層相互作用分析
- 水果店員工培訓(xùn)管理制度
- 義務(wù)消防員培訓(xùn)制度
- 心血管科人員培訓(xùn)制度
- 《肺癌的診斷與治療》課件
- 人教版三年級(jí)上冊數(shù)學(xué)應(yīng)用題100題及答案
- 防污閃涂料施工技術(shù)措施
- 環(huán)衛(wèi)清掃保潔、垃圾清運(yùn)及綠化服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 房地產(chǎn)運(yùn)營-項(xiàng)目代建及管理實(shí)務(wù)
- 神經(jīng)病學(xué)教學(xué)課件:腦梗死
- GB/T 21393-2008公路運(yùn)輸能源消耗統(tǒng)計(jì)及分析方法
- GB/T 13803.2-1999木質(zhì)凈水用活性炭
- GB/T 12385-2008管法蘭用墊片密封性能試驗(yàn)方法
- 中國近代史期末復(fù)習(xí)(上)(第16-20課)【知識(shí)建構(gòu)+備課精研】 高一歷史上學(xué)期期末 復(fù)習(xí) (中外歷史綱要上)
- GB 11887-2008首飾貴金屬純度的規(guī)定及命名方法
評(píng)論
0/150
提交評(píng)論