用鸿蒙开发板制作一个空压机储气罐自动排水装置
头像 宋你一朵小红花 2021-06-01 10:05:03    发布
3289 浏览 16 点赞 16 收藏

润和的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开发板由于较高的性价比,在工业领域有广阔的应用空间。比如,本文的储气罐排水控制器还可以与空压机联动,也可以发挥网络功能实现远程监控等,期待广大鸿蒙开发者发掘更多的应用领域。


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
其它
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255