用鴻蒙開發(fā)板制作一個(gè)空壓機(jī)儲(chǔ)氣罐自動(dòng)排水裝置
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
潤(rùn)和的Neptune開發(fā)板,是一塊具有較高性價(jià)比的鴻蒙開發(fā)板,也可以應(yīng)用于工業(yè)控制領(lǐng)域。
夏季到了,很多地方的空氣比冬季潮濕了許多,于是壓縮空氣的含水量也大了起來(lái),即使有冷干機(jī),儲(chǔ)氣罐也常常會(huì)在罐底積留一部分水分,不及時(shí)排出,會(huì)影響工廠氣路和氣動(dòng)元件的正常運(yùn)行。更不用說沒有冷干機(jī)的供氣系統(tǒng)。儲(chǔ)氣罐在很多工廠還是人工排水,存在排水不及時(shí)和費(fèi)時(shí)費(fèi)工的弊端。這個(gè)夏季,我們就用鴻蒙開發(fā)板來(lái)完成儲(chǔ)氣罐的自動(dòng)排水。
說干就干,先做準(zhǔn)備:
1. 潤(rùn)和海王星 Neptune HH-SLNPT102 開發(fā)板一塊。
2. 潤(rùn)和HiSpark_WIFI_IoT_OLED_VER.A顯示板一塊。
3. 潤(rùn)和HiSpark_WIFI_IoT_EXB_VER.A底板一塊。
4. 電磁水閥一個(gè),尺寸和儲(chǔ)氣罐下部的排水口匹配,管道根據(jù)儲(chǔ)氣罐現(xiàn)場(chǎng)配套。
5. 3.3v繼電器一個(gè),按鈕兩個(gè),杜邦線若干,電源線。
6. 編輯,編譯環(huán)境,Ubuntu20.04.2 LTS, 燒錄 Windows環(huán)境SecureCRT
7. 程序框架,hihope/neptune_iot,1.0.1版(2021.04.29)
如圖做好連接:
1. Neptune HH-SLNPT102 開發(fā)板和HiSpark_WIFI_IoT_OLED_VER.A顯示板直接插在底板上。
2. 繼電器線圈受PB_10控制,連接底板的D10, 3V3及GND.繼電器的輸出端控制電磁水閥的通斷從而實(shí)現(xiàn)自動(dòng)排水功能。
3. 藍(lán)色按鈕接底板的D1和GND,對(duì)應(yīng)開發(fā)板的PB_06,每按下一次,電磁水閥關(guān)閉時(shí)間增加10分鐘,最長(zhǎng)間隔24小時(shí)。
4. 紅色按鈕接底板的D0和GND,對(duì)應(yīng)開發(fā)板的PB_07,每按下一次,電磁水閥開啟時(shí)間增加1秒鐘,單次排水最長(zhǎng)時(shí)間3分鐘。
5. 開發(fā)板板載按鈕PB_09按下一次,轉(zhuǎn)換一種工作模式,分別是:常開,常閉,間歇排水模式。
主程序代碼如下:
- #include <stdio.h>
- #include <unistd.h>
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "oled_ssd1306.h"
- #include "wifiiot_gpio_w800.h"
- int working = 0; //電磁水閥工作狀態(tài) 0/開 1/關(guān)
- int m = 60; //間歇工作電磁水閥關(guān)閉時(shí)間初始值1分鐘
- int n = 5; //間歇工作電磁水閥開啟時(shí)間初始值5秒
- int times = 0; //計(jì)時(shí),秒為單位
- enum State
- {
- ON = 0,
- OFF,
- SPARK,
- };
- enum State g_State = SPARK;
- static void DrainageTask(void *arg)
- {
- (void)arg;
- OledInit();
- OledFillScreen(0x00);
- OledShowString(0, 1, "Air Comprwssor", 2); //開機(jī)顯示2秒
- OledShowString(0, 5, "Auto Drainage", 2);
- osDelay(2000);
- OledFillScreen(0x00);
- while (1)
- {
- OledShowString(0, 0, "****************", 2);
- OledShowString(0, 2, "* Auto Drainage*", 2); //OLED固定顯示
- OledShowString(0, 4, "* *", 2);
- OledShowString(0, 6, "* *", 2);
- osDelay(500);
- static char line[32] = {0};
- static char line1[32] = {0};
- switch (g_State)
- {
- case ON: //電磁水閥常開工作模式
- GpioSetOutputVal(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_VALUE0);
- snprintf(line, sizeof(line), "* *");
- snprintf(line1, sizeof(line1), "* ON ");
- break;
- case OFF: //電磁水閥常閉工作模式
- GpioSetOutputVal(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_VALUE1);
- snprintf(line, sizeof(line), "* *");
- snprintf(line1, sizeof(line1), "* OFF");
- break;
- case SPARK: //電磁水閥間歇工作模式
- times++;
- if (working == 0) //排水定時(shí)控制
- {
- snprintf(line, sizeof(line), "* ON Remaining");
- snprintf(line1, sizeof(line1), "* %d sec", n - times); //秒顯示,倒計(jì)時(shí)
- if (times<n)
- {
- GpioSetOutputVal(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_VALUE0);
- }
- if (times>=n)
- {
- working = 1;
- times = 0;
- }
- }
- else //電磁水閥關(guān)閉定時(shí)控制
- {
- snprintf(line, sizeof(line), "*OFF Remaining");
- snprintf(line1, sizeof(line1), "* %d min", (m - times)/60); //分鐘顯示,倒計(jì)時(shí)
- if (times<m)
- {
- GpioSetOutputVal(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_VALUE1);
- }
- if (times>=m)
- {
- working = 0;
- times= 0;
- }
- };
- break;
- default:
- break;
- }
- OledShowString(0, 4, line, 2); //OLED動(dòng)態(tài)顯示
- OledShowString(0, 6, line1, 2); //OLED動(dòng)態(tài)顯示
- osDelay(500);
- }
- }
- static void GpioIsr(char *arg) //板載按鈕中斷方式切換工作模式
- {
- (void)arg;
- enum State nextState = SPARK;
- printf(" P9 Press! \n");
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_09, 1);
- switch (g_State)
- {
- case ON:
- nextState = OFF;
- break;
- case OFF:
- nextState = SPARK;
- break;
- case SPARK:
- nextState = ON;
- break;
- default:
- break;
- }
- g_State = nextState;
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_09, 0);
- }
- static void F1(char *arg) //外置F1按鈕中斷方式調(diào)整閥關(guān)閉時(shí)間,最長(zhǎng)24小時(shí),步長(zhǎng)10分鐘
- {
- (void)arg;
- printf(" P6 Press! \n");
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_06, 1);
- if (m>86400)
- {
- m = 0 ;
- }
- m = m + 600 ;
- times = 0;
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_06, 0);
- }
- static void F2(char *arg) //外置F2按鈕中斷方式調(diào)整開啟時(shí)間,最長(zhǎng)3分鐘,步長(zhǎng)1秒
- {
- (void)arg;
- printf(" P7 Press! \n");
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_07, 1);
- if (n>180)
- {
- n = 0 ;
- }
- n = n + 1 ;
- times = 0;
- GpioSetIsrMask(WIFI_IOT_GPIO_PB_07, 0);
- }
- static void DrainageDemo(void)
- {
- osThreadAttr_t attr;
- GpioInit();
- GpioSetDir(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_DIR_OUTPUT); //通過繼電器控制電磁水閥。 底板的D10
- GpioSetDir(WIFI_IOT_GPIO_PB_09, WIFI_IOT_GPIO_DIR_INPUT); //開發(fā)版板載P9按鈕,中斷輸入。
- IoSetPull(WIFI_IOT_GPIO_PB_09, WIFI_IOT_GPIO_ATTR_PULLHIGH);
- GpioRegisterIsrFunc(WIFI_IOT_GPIO_PB_09, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, GpioIsr, NULL);
- GpioSetDir(WIFI_IOT_GPIO_PB_06, WIFI_IOT_GPIO_DIR_INPUT); //外置P6按鈕,中斷輸入。 底板的D1
- IoSetPull(WIFI_IOT_GPIO_PB_06, WIFI_IOT_GPIO_ATTR_PULLHIGH);
- GpioRegisterIsrFunc(WIFI_IOT_GPIO_PB_06, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, F1, NULL);
- GpioSetDir(WIFI_IOT_GPIO_PB_07, WIFI_IOT_GPIO_DIR_INPUT); //外置P7按鈕,中斷輸入。 底板的D0
- IoSetPull(WIFI_IOT_GPIO_PB_07, WIFI_IOT_GPIO_ATTR_PULLHIGH);
- GpioRegisterIsrFunc(WIFI_IOT_GPIO_PB_07, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, F2, NULL);
- attr.name = "DrainageTask";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 4096;
- attr.priority = osPriorityNormal;
- if (osThreadNew(DrainageTask, NULL, &attr) == NULL)
- {
- printf("[DrainageDemo] Falied to create DrainageTask!\n");
- }
- }
- APP_FEATURE_INIT(DrainageDemo);
編譯,下載,重啟開發(fā)板后,顯示和控制正常。按下板載PB_09按鍵,切換到常開模式,再按一次,切換到常閉模式,相應(yīng)OLED屏做顯示。
再按一次PB_09按鍵,進(jìn)入間歇工作模式,每次電磁水閥開啟一段時(shí)間進(jìn)行排水(開啟時(shí)間長(zhǎng)短由紅色按鈕F2調(diào)整),關(guān)閉一段時(shí)間(時(shí)間長(zhǎng)短由藍(lán)色按鈕F1調(diào)整),周而復(fù)始,實(shí)現(xiàn)空壓機(jī)儲(chǔ)氣罐的自動(dòng)排除底部積水。每次開啟和關(guān)閉時(shí)間長(zhǎng)短,可以根據(jù)各自壓縮空氣系統(tǒng)實(shí)際情況來(lái)調(diào)整。
Neptune開發(fā)板由于較高的性價(jià)比,在工業(yè)領(lǐng)域有廣闊的應(yīng)用空間。比如,本文的儲(chǔ)氣罐排水控制器還可以與空壓機(jī)聯(lián)動(dòng),也可以發(fā)揮網(wǎng)絡(luò)功能實(shí)現(xiàn)遠(yuǎn)程監(jiān)控等,期待廣大鴻蒙開發(fā)者發(fā)掘更多的應(yīng)用領(lǐng)域。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)