物联网

Arduino 泵控制+ STONE HMI 显示

叶片智能调节系统是一项专利技术,应用于各种大、中、小型水电站、泵站的主流控制系统。 本项目采用可靠的串行工业触摸屏作为人机界面,显示日常参数和实时叶片剂量、输出功率、瞬时流量等信息,作为运行效果显示。 此外,还规划了工况日志和故障报警表,预留了待机按钮。 该项目采用串行触摸屏进行数据显示和滑动指示显示。 配件如下:  

  1. STVI056WT-01 串口触摸屏和STONE转接板V1.2;  
  2. 配套Arduino控制板;  

智能调叶控制系统接口功能简述。  

主页上共有三个按钮,按下后可进入相应的水电站系统、泵站控制系统和用户指南界面(带备用按钮)。 用户指南界面展示了演示系统的框架,如下图所示:

(Enlegi Blade智能调节控制演示软件首页界面)

水电站控制系统界面有启停按钮,状态、额定值(包括额定电压、额定功率和额定转速)和控制值(包括桨叶桨距角和输出功率)的显示。 此外,还可以有其他页面跳转按钮(如首页、工作状态日志、故障报警等待机按钮)。 在工况日志和故障报警页面,可以有一个返回按钮返回到该页面。 下图:

           (水电站智能控制显示界面)

泵站控制系统界面功能说明。 下图:

                            (泵站控制系统功能界面)

在泵站的功能界面中,可以改变模式,开关整个系统的电源,显示实际模拟参数(如叶片剂量、即时流量、输出功率)等。接口可切换(如工作状态日志、故障报警报告)。 同时还可以显示系统数值(叶片总数、额定功率、设定流量)。 其他接口也可以有,如工作状态日志(内容可以是命令编号、发生时间、事件详情、备注)、故障报警(内容可以是命令编号、发生时间、报警详情、报警代码等)、两个界面可以有一个返回按钮,可以返回泵站功能界面。  

工作理念:  

串口屏作为人机界面,与Arduino开发板通讯。 板卡接受触摸屏的按键指令,将数据传输到串口触摸屏进行同步显示。 滑块刻度旨在动态显示功率变化。 电源开关、电源刀、模式开关和模式刀图标,用于生成ICON文件,动画电源和模式的动作效果。 另外,在Arduino演示程序中,使用可变内存读取指令获取电源状态和模式,从而控制输出数据的模拟,将实际数量窗口输出到串口屏。  

工作步骤:  

  1. 设置硬件;  
  2. A) 将Arduino开发板和USB连接到串口转换板;  
  3. B) 连接 石头触摸屏 带USB串口下载板和USB转串口转接板;  
  4. C) 连接串口屏和Arduino开发板电源;  

3、通过串口指令调试,然后编程实现泵站控制和水电站控制演示功能。  

 接下来,记录具体的开发过程。

首先,设置硬件连接。  

按工序做好各部分的连接工作:

接下来,制作ICON指示器图片。  

本项目使用的按钮和刀具图标制作如下:  

(泵站控制开关、刀动画ICON文件8.ICO列表浏览图)

在 STONE TOOL BOX(GUI 设计软件)的菜单栏中,单击工具(T)菜单下的图标生成工具,弹出图标工具对话框。 单击对话框底部的“选择图像路径”,选择图标图像路径。 点击“Generate ICON file”按钮,将路径中的BMP文件打包生成STONE TOOL BOX(GUI设计软件)平台识别的“.ico”文件。 点击“预览”按钮查看导入的“.ico”压缩文件中的ICON列表。  

按钮动画BMP Icon,像素如上(制作的Variable Icon控件,相同位置的大小应该是一样的),泵站控件8把图片剪切到同一个文件夹中。 然后,在 STONE TOOL BOX(GUI 设计软件)屏幕的左侧,选择 Icon 页卡并使用“图标列表”下的“添加图标”按钮将其添加到压缩的 7. ico 文件中。 将水电站控制开关状态的6张图片全部放到另一个文件夹中,按照1-6的顺序排列。 创建“6. ico”文件,然后在左侧 STONE TOOL BOX(图形用户界面设计软件) 屏幕,选择图标页卡并添加压缩的“6. Ico”文件,使用“图标列表”下的“添加图标”按钮。  

现在将图像Icon导入STONE TOOL BOX(GUI设计软件),制作功能按钮。  

本项目仍然采用9-variable-animation icon.wmv的方法来实现动画功能。 参数设置截图如下:  

            (水电站变量ICON属性图)

从左到右是水电站功能页面三个变量的ICON参数设置:启动、停止和状态。 它们的内存地址设置为相同(0x0039),并且它们的数据范围相同,因此它们的更改是同步的。 Icon文件为6.ico,对应的Icon序号分别为1与2、3与4、6与5,根据实际情况选择。  

按钮状态动画效果是通过增量按钮实现的。 下图显示了左边的增量按钮和右边的判别按钮的参数。 地址为0x0039,与Variable ICON的地址相同。

(相同内存地址的增量按钮属性图)

(泵站按钮刀状态变量ICON属性图)

从左到右分别是泵站功能页面四个变量的ICON参数设置:电源按钮、电源刀、模式刀和模式按钮。 这里,两个Icon文件都是8.​​ICO,它们的数据范围是一样的,其中的内存地址会同步变化。  

按钮状态动画也通过增量按钮实现。下图中,左边的供电减少按钮和右边的模式增量按钮是供电减少按钮的参数。地址与上面的变量ICON相同,分别为0x0009和0x000A。这已经超过了乒乓键的极限处理方式。

(泵站按钮状态变量ICON变量相同内存地址的增量按钮属性图)

另外,泵站的输出功率采用滑动图标显示,如下图:

其参数属性为:

(泵站输出功率滑动图标——滑块刻度属性框)

这个Slider scale控件的图标在官方DEMO 24.ico中被调用。 添加24.ico文件的方法同上。 这个Slider Scale控件的内存地址是0x0180,可以在单片机程序中用82指令(如上图,范围设置为0-100)来改变图标的​​位置。  

特别是本工程中电源和模式按钮的状态是通过0指令从串口屏的内存地址0009x0、000x0A、0039x83中读出的。 

使用的指令如下:  

A5 5A 04 83 00 09 02  

串口屏反馈如下:  

A5 5A 08 83 00 09 02 00 01 00 02  

下面的00 01是2x0的0009byte数据,00 02是2x0A的000byte数据。  

读取指令 0x0039 为:  

A5 5A 04 83 00 39 01  

串口屏反馈为:  

A5 5A 06 83 00 39 01 00 01 或  

A5 5A 06 83 00 39 01 00 02  

有五个数据地址可供写入:0x0020、0x0160、0x0180、0x0260、0x0280。  

其中,叶子剂量地址为0x0020,2字节的2位整数。可通过串口传输至触摸屏显示。  

将 11 传递给触摸屏数据变量显示, 使用以下命令:  

A5 5A 05 82 00 20 00 0B  

编程调试。  

代码如下:  

/*

  frank8

  STONE和arduino COMM,恩来机野片系统。

  重复点亮LED一秒钟,然后熄灭一秒钟。

  地址0x0020是野片的num地址;

  地址0x0160是现在刘良的地址;

  地址0x0180为崩展电源地址;

  地址0x0260是解聚角的地址;

  地址0x0280为出水地址;

  地址0x0009为崩展电源键;

  地址 0x000A 为崩占模式键;

  地址 0x0039 是水电键。

  此示例代码位于 frank 的文件中。 20210611

 */

//引脚13在大多数Arduino板上都连接有LED。

//为其命名:

国际领导= 13;

int iYePian = 0; //0x0020 为夜片号!

int iGongLu = 0; //0x0180 为公录!

int iLiuLiang = 0; //0x0160 为现在的刘良!

int iJiao = 0; // 0x0260 代表解居教!

int iGongLuWater = 0; //0x0280 为水公录! 值是 0-50000!

INT iLed = 1; //延迟时间

整数 iNum = 0 ; //读入字符号。

int iNum2 = 0; //为水电战读入字符num2!

整数 iPower = 2; //关键雕像0x0009

内部 iMode = 2; //关键雕像0x000A

内部 iPowerWater = 2; //关键雕像0x0039

//当您按reset时,设置例程运行一次:

无效设置(){                

  //将数字引脚初始化为输出。

  pinMode(led,输出);     

  Serial.begin(115200); //开启串口通讯功能,等待串口打开  

而(!串行){

    ; // 等待串口连接。 仅列奥纳多需要

  }  

}

//循环例程永远反复运行:

无效循环(){

  整数 inChar;

    如果(iLed == 900){     

//——- 读取0x0009和0x000A值——- 

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x04); //长度

            串行写入(0x83); // 读!

            串行写入(0x00); // 崩战电源键地址!

            串行写入(0x09); // 崩战电源键地址!

            串行写入(0x02); // 0x0009(电源)和 0x000A(模式)

//——STONE 返回值将是“A5 5A 08 83 00 09 02 00 01 00 02”——

     }

/*————————————————————————————————-*/     

    如果(iLed == 800){     

//——- 读取0x0039值——- 

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x04); //长度

            串行写入(0x83); // 读!

            串行写入(0x00); // 水电站电源键地址!

            串行写入(0x39); // 水电战电源键地址!

            串行写入(0x01); // 0x0039(电源键) 

//——STONE 返回值将是“A5 5A 06 83 00 39 01 00 01”——

     }

  //读取串口发送的消息:

  if (Serial.available() > 0) { inChar = Serial.read(); }

  if (inChar == 0x09) { iNum = 1 ; }

  if ((inChar == 0x02)&&(iNum == 1)) { iNum = 2 ; }

  if ((inChar == 0x00)&&(iNum == 2)) { iNum = 3 ; }

  if ((inChar == 0x01)&&(iNum == 3)) {  

      数字 = 4 ;

      如果(iPower != 1){

          iPower = 1 ; //打开!

          i刘量 = 10 ;

          i工路 = 50 ;

          叶片 = 10 ;         

      }

   }

   if ((inChar == 0x02)&&(iNum == 3)) {  

      数字 = 4 ;

      iPower = 2 ; //断电!

      i刘量 = 0 ;

      i工路 = 0 ;

      叶片 = 0 ;

   }

   if ((inChar == 0x00)&&(iNum == 4)) { iNum = 5 ; }

   if ((inChar == 0x01)&&(iNum == 5)) {  

      数字 = 0 ;

      iMode = 1 ; //模式很好!

   }

   if ((inChar == 0x02)&&(iNum == 5)) {  

      数字 = 0 ;

      iMode = 2 ; //模式关闭!

      if(iPower == 1)iGongLu = 60 ; //红路设置60%!

   }

  //——————0x0009 和 0x000A 密钥读取正常! iPower\iMode ok!—————————-

   if (inChar == 0x39) { iNum2 = 1 ; }

  if ((inChar == 0x01)&&(iNum2 == 1)) { iNum2 = 2 ; }

  if ((inChar == 0x00)&&(iNum2 == 2)) { iNum2 = 3 ; }

  if ((inChar == 0x01)&&(iNum2 == 3)) {  

      iNum2 = 0 ;

      如果(iPowerWater != 1){

          iPowerWater = 1 ; //打开!       

          i焦 = 0 ;

          i工路水 = 0 ;

      }

   }

   if ((inChar == 0x02)&&(iNum2 == 3)) {  

      iNum2 = 0 ;

      iPowerWater = 2 ; //断电!

   }

  //——————0x0039 密钥读取正常! iPowerWater 好的!—————————-

  延迟(1); 

  发光二极管 += 1;   

  如果(iLed == 500){  

      数字写入(LED,高); // 打开 LED (HIGH 是电压电平)

                  //延迟(500); // 稍等,范围:200-2000

           如果(iPower == 1){ 

               夜片 += 1; //范围:1-20

               iLiuLiang += 1; //范围:1-20

               if(iMode == 1) iGongLu += 5; //范围:1-20

           }   

           if(iYePian >= 14 ) { iYePian = 10; }   

           if(iGongLu >= 70) { iGongLu = 50; }   

           if(iLiuLiang >= 14) { iLiuLiang = 10; }   

           如果(iPowerWater == 2){ 

               爱娇 += 1; //范围:1-20

               iGongLuWater += 2; //范围:1-20

           }   

           if(iJiao >= 60 ) { 

               i焦=0; 

               i红绿水=0; 

           }   

  }    

  如果 (iLed >= 1000) {    

      数字写入(LED,低); // 通过降低电压来关闭 LED

                  //延迟(500); // 等待一秒钟,范围:200-2000

      发光二极管 = 1;

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x05);

            串行写入(0x82);

            串行写入(0x00); // 野片地址

            串行写入(0x20); // 野片地址

            串行写入(0x00);

            Serial.write(iYePian);

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x05);

            串行写入(0x82);

            串行写入(0x01); // 工路地址

            串行写入(0x80); // 工路地址

            串行写入(0x00);

            Serial.write(iGongLu);

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x05);

            串行写入(0x82);

            串行写入(0x01); // 刘良地址

            串行写入(0x60); // 刘良地址

            Serial.write(iLiuLiang); //刘良是2800-3200

            串行写入(0x80);            

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x05);

            串行写入(0x82);

            串行写入(0x02); // 水电站街机角地址

            串行写入(0x60); // 水电站街机角地址

            串行写入(0x00);

            串口.write(iJiao);

            串行写入(0xA5); //“A5”是165

            串行写入(0x5A); //“5A”是90

            串行写入(0x05);

            串行写入(0x82);

            串行写入(0x02); // 水电站出电源地址

            串行写入(0x80); // 水电站out Power地址;

            Serial.write(iGongLuWater); //水电站输出功率为0-32000

            串行写入(0x00);            

  }    

最后,在线录制视频。 

接上电源和通讯,将Arduino开发板连接到串口通讯,观察串口屏上水电站和泵站的功能界面,轻触开关查看效果,滑动图标和数据正常.  

资料来源:柏拉图数据智能