流程圖:
基礎(chǔ)邏輯功能的實(shí)現(xiàn)
Aht10測(cè)溫模塊:
采用例程中的aht10模塊代碼(aht10軟件包已配置好無(wú)需再配),并以此為“根據(jù)地”,將后續(xù)其他功能加入到此main.c的工程文件中。
調(diào)用函數(shù)讀取當(dāng)前的溫度值,并根據(jù)溫度區(qū)間(<30,30-32,>32)給控制參數(shù)crl賦值(0,1,2),以備后續(xù)使用。
Led_matrix矩陣燈模塊
枚舉每個(gè)燈的名稱,并對(duì)應(yīng)地將Setcolor的函數(shù)加入不同溫度區(qū)間的情況中去,即對(duì)crl使用switch語(yǔ)句,case0給矩陣燈賦綠色,1賦藍(lán)色,2賦紅色。
過(guò)程中要注意矩陣燈的驅(qū)動(dòng)文件夾是否使能且參與編譯。
蜂鳴器模塊
將蜂鳴器的端口設(shè)置為輸出模式后,對(duì)應(yīng)地加入switch語(yǔ)句中,即0、1時(shí)beep_off,
2時(shí)調(diào)用beep_on。
Lcd顯示屏模塊
對(duì)lcd初始化后,對(duì)應(yīng)不同的情況調(diào)用顯示函數(shù),分別顯示rt-thread的logo,調(diào)用字符串顯示函數(shù)顯示實(shí)時(shí)溫度和對(duì)應(yīng)的工作狀態(tài)(0,1為SAFE,2顯示TEMPERATURE IS TOO HIGH!!!)。
過(guò)程中要注意lcd驅(qū)動(dòng)文件夾是否使能且參與編譯。
且要主要lcd的配置與led矩陣燈是否有沖突。
舵機(jī)
為了更加形象的模擬系統(tǒng)溫度過(guò)高后的冷卻功能,我們?cè)诎遄由显黾右粋€(gè)舵機(jī)外設(shè),通過(guò)定時(shí)器輸出pw波,控制舵機(jī)在aht10檢測(cè)到溫度過(guò)高時(shí)轉(zhuǎn)動(dòng)吹風(fēng)來(lái)降溫。為了不影響板載外設(shè)的正常功能,我們打開(kāi)Stm32CubeMX,尋找空閑引腳PE5,配置成Tim9——CH1輸出。
接著,對(duì)Timer進(jìn)行相關(guān)配置。
配置完成后生成代碼,刪除掉不需要的文件夾。
點(diǎn)擊rt setting,打開(kāi)時(shí)鐘和PWM驅(qū)動(dòng)程序
系統(tǒng)設(shè)置完成后,開(kāi)始編寫代碼。
窗體底端
為了觀察PE5輸出的PWM波形,使用邏輯分析儀連接相關(guān)引腳后,打開(kāi)Pulse view軟件,觀測(cè)到波形如下
與代碼設(shè)置的理想波形幾乎一致,因此可以確定,PWM波設(shè)置完成。
接著查閱資料,了解到給360度舵機(jī)一個(gè)PWM信號(hào),舵機(jī)會(huì)以一個(gè)特定的速度轉(zhuǎn)動(dòng),類似與電機(jī)。但與電機(jī)不同的是,360舵機(jī)是閉環(huán)控制,速度控制穩(wěn)定。設(shè)置PWM周期為20ms,高電平為0.5ms時(shí),占空比符合正向最大速度轉(zhuǎn)動(dòng)的要求。對(duì)代碼重新進(jìn)行設(shè)置后,連接舵機(jī),發(fā)現(xiàn)舵機(jī)正轉(zhuǎn),符合要求。至此舵機(jī)模塊配置完成。
按鍵控制舵機(jī)功能
本次實(shí)訓(xùn)中,為了完善功能,使我們的儀器更為可靠,我們創(chuàng)新性地加入了當(dāng)溫度未達(dá)到警戒值(32℃)時(shí),也能通過(guò)手動(dòng)調(diào)節(jié)的方式使舵機(jī)轉(zhuǎn)動(dòng)強(qiáng)制降溫的功能。
對(duì)key1鍵進(jìn)行分配(四個(gè)按鍵中最上方的按鍵),當(dāng)此按鍵未pin_up狀態(tài)時(shí),強(qiáng)行調(diào)用mg90main函數(shù)(舵機(jī)啟動(dòng)函數(shù)),對(duì)一些溫度傳感器檢測(cè)不到的故障進(jìn)行強(qiáng)制降溫,確保器件不被燒壞。
void irq_callback(void *args)
{
rt_uint32_t sign = (rt_uint32_t) args;
switch (sign)
{
case PIN_WK_UP :
flag=1;
break;
case PIN_KEY1 :
flag=0;
break;
default:
LOG_E("error sign= %d !", sign);
break;
}
}
void self_sg90()
{
switch (flag)
{
case 1 :
mg90main1();
break;
case 0 :
if(temperature<30)
{
mg90mainstop();
}
break;
default:
LOG_E("error flag= %d !", flag);
break;
}}
Onenet物聯(lián)網(wǎng)傳輸數(shù)據(jù)
Abstract:該開(kāi)發(fā)板基于RW007 WiFi模塊的在RT-Thread studio進(jìn)行開(kāi)發(fā),在聯(lián)網(wǎng)之后,再連接到ONENet,即可將本地傳感器信息上傳至云端
一、代碼軟件包的設(shè)計(jì)與使用
(1)WiFi聯(lián)網(wǎng)(下載rw007安裝包),
該軟件包使用rw007是通過(guò)SPI協(xié)議進(jìn)行傳輸,所以在配置項(xiàng)中要使能SPI,并在SPI項(xiàng)目下配置引腳
(2)通過(guò)MQTT協(xié)議連接onenet(下載onenet軟件包)
基于Mqtt協(xié)議,軟件包中通過(guò)板載publish topic,代碼如下:
該函數(shù)在我們串口中初始化onenet時(shí)即調(diào)用
(3)數(shù)據(jù)上傳
使用板載示例程序中的函數(shù)將注冊(cè)周期上傳任務(wù)到 MSH,并通過(guò)終端指令調(diào)用該函數(shù),將數(shù)據(jù)publish到物聯(lián)網(wǎng)中對(duì)應(yīng)話題當(dāng)中
static void onenet_upload_entry(void *parameter)
{
int value = 0;
while (1)
{
value = rand() % 100;
if (onenet_mqtt_upload_digit("temperature", value) < 0)
{
LOG_E("upload has an error, stop uploading");
break;
}
else
{
LOG_D("buffer : {"temperature":%d}", value);
}
rt_thread_delay(rt_tick_from_millisecond(5 * 1000));
}
}
int onenet_upload_cycle(void)
{
rt_thread_t tid;
tid = rt_thread_create("onenet_send",onenet_upload_entry,RT_NULL,2 * 1024,
RT_THREAD_PRIORITY_MAX / 3 - 1,5);
if (tid)
{
rt_thread_startup(tid);
}
return 0;
}
MSH_CMD_EXPORT(onenet_upload_cycle, send data to OneNET cloud cycle);
二、指令調(diào)用
通過(guò)板載的rw7000連接到局域網(wǎng)WiFi,再通過(guò)Mqtt協(xié)議將板載傳感器測(cè)量得到的數(shù)據(jù)傳輸?shù)轿锫?lián)網(wǎng),從onenet官網(wǎng)注冊(cè)設(shè)備并接收數(shù)據(jù)
三、物聯(lián)網(wǎng)可視化顯示
在onenet官網(wǎng)注冊(cè)并創(chuàng)建一個(gè)設(shè)備和項(xiàng)目,并將設(shè)備ID與API key綁定到軟件包的配置項(xiàng)中
我們?cè)诳梢暬?xiàng)目中創(chuàng)建新項(xiàng)目,規(guī)劃文本和圖表顯示,并通過(guò)API綁定數(shù)據(jù)流進(jìn)行顯示。
最終效果圖
溫度低于30度led矩陣為綠色
溫度介于30度與32度之間led矩陣為藍(lán)色
溫度高于32度led矩陣為紅色
物聯(lián)網(wǎng)溫度數(shù)據(jù)上傳效果圖
評(píng)論
查看更多