用鴻蒙開發板制作一個空壓機儲氣罐自動排水裝置
潤和的Neptune開發板,是一塊具有較高性價比的鴻蒙開發板,也可以應用于工業控制領域。
夏季到了,很多地方的空氣比冬季潮濕了許多,于是壓縮空氣的含水量也大了起來,即使有冷干機,儲氣罐也常常會在罐底積留一部分水分,不及時排出,會影響工廠氣路和氣動元件的正常運行。更不用說沒有冷干機的供氣系統。儲氣罐在很多工廠還是人工排水,存在排水不及時和費時費工的弊端。這個夏季,我們就用鴻蒙開發板來完成儲氣罐的自動排水。
說干就干,先做準備:
1. 潤和海王星 Neptune HH-SLNPT102 開發板一塊。
2. 潤和HiSpark_WIFI_IoT_OLED_VER.A顯示板一塊。
3. 潤和HiSpark_WIFI_IoT_EXB_VER.A底板一塊。
4. 電磁水閥一個,尺寸和儲氣罐下部的排水口匹配,管道根據儲氣罐現場配套。
5. 3.3v繼電器一個,按鈕兩個,杜邦線若干,電源線。
6. 編輯,編譯環境,Ubuntu20.04.2 LTS, 燒錄 Windows環境SecureCRT
7. 程序框架,hihope/neptune_iot,1.0.1版(2021.04.29)
如圖做好連接:
1. Neptune HH-SLNPT102 開發板和HiSpark_WIFI_IoT_OLED_VER.A顯示板直接插在底板上。
2. 繼電器線圈受PB_10控制,連接底板的D10, 3V3及GND.繼電器的輸出端控制電磁水閥的通斷從而實現自動排水功能。
3. 藍色按鈕接底板的D1和GND,對應開發板的PB_06,每按下一次,電磁水閥關閉時間增加10分鐘,最長間隔24小時。
4. 紅色按鈕接底板的D0和GND,對應開發板的PB_07,每按下一次,電磁水閥開啟時間增加1秒鐘,單次排水最長時間3分鐘。
5. 開發板板載按鈕PB_09按下一次,轉換一種工作模式,分別是:常開,常閉,間歇排水模式。
主程序代碼如下:
- #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; //電磁水閥工作狀態 0/開 1/關
- int m = 60; //間歇工作電磁水閥關閉時間初始值1分鐘
- int n = 5; //間歇工作電磁水閥開啟時間初始值5秒
- int times = 0; //計時,秒為單位
- 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); //開機顯示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) //排水定時控制
- {
- snprintf(line, sizeof(line), "* ON Remaining");
- snprintf(line1, sizeof(line1), "* %d sec", n - times); //秒顯示,倒計時
- if (times<n)
- {
- GpioSetOutputVal(WIFI_IOT_GPIO_PB_10, WIFI_IOT_GPIO_VALUE0);
- }
- if (times>=n)
- {
- working = 1;
- times = 0;
- }
- }
- else //電磁水閥關閉定時控制
- {
- snprintf(line, sizeof(line), "*OFF Remaining");
- snprintf(line1, sizeof(line1), "* %d min", (m - times)/60); //分鐘顯示,倒計時
- 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動態顯示
- OledShowString(0, 6, line1, 2); //OLED動態顯示
- 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按鈕中斷方式調整閥關閉時間,最長24小時,步長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按鈕中斷方式調整開啟時間,最長3分鐘,步長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); //開發版板載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);
編譯,下載,重啟開發板后,顯示和控制正常。按下板載PB_09按鍵,切換到常開模式,再按一次,切換到常閉模式,相應OLED屏做顯示。
再按一次PB_09按鍵,進入間歇工作模式,每次電磁水閥開啟一段時間進行排水(開啟時間長短由紅色按鈕F2調整),關閉一段時間(時間長短由藍色按鈕F1調整),周而復始,實現空壓機儲氣罐的自動排除底部積水。每次開啟和關閉時間長短,可以根據各自壓縮空氣系統實際情況來調整。
Neptune開發板由于較高的性價比,在工業領域有廣闊的應用空間。比如,本文的儲氣罐排水控制器還可以與空壓機聯動,也可以發揮網絡功能實現遠程監控等,期待廣大鴻蒙開發者發掘更多的應用領域。