많이

Arduino 펌프 제어 + STONE HMI 디스플레이

블레이드 지능형 규제 시스템은 다양한 대형, 중소형 수력 발전소 및 펌핑 스테이션의 주류 제어 시스템에 사용되는 특허 기술입니다. 이 프로젝트는 신뢰할 수 있는 직렬 산업용 터치 스크린을 인간-기계 인터페이스로 사용하여 일일 매개변수 및 실시간 블레이드 투여량, 출력 전력, 순간 흐름 및 기타 정보를 작동 효과 표시로 표시합니다. 또한 작업 조건 로그 및 오류 경보 양식도 계획되어 있으며 대기 버튼은 예약되어 있습니다. 프로젝트는 데이터 표시 및 슬라이드 표시 표시를 위해 직렬 터치 스크린을 사용합니다. 액세서리는 다음과 같습니다.  

  1. STVI056WT-01 직렬 터치 스크린 및 STONE 어댑터 보드 V1.2;  
  2. 일치하는 Arduino 제어 보드;  

지능형 블레이드 조절 제어 시스템의 인터페이스 기능에 대한 간략한 설명.  

홈 페이지에는 해당 수력 발전소 시스템, 펌프장 제어 시스템 및 사용자 가이드 인터페이스(예비 버튼 포함)로 들어가기 위해 누를 수 있는 XNUMX개의 버튼이 있습니다. 사용자 가이드 인터페이스는 다음 그림과 같이 데모 시스템의 프레임워크를 보여줍니다.

(Enlegi Blade 지능형 조정 제어 데모 소프트웨어의 홈 인터페이스)

수력 발전소의 제어 시스템 인터페이스에는 시작 및 중지 버튼과 상태, 정격(정격 전압, 정격 전력 및 정격 속도 포함) 및 제어 값(프로펠러 블레이드의 피치 각도 및 출력 전력 포함)이 표시됩니다. 또한 다른 페이지 점프 버튼(예: 홈 페이지, 작업 조건 로그, 오류 경보 및 기타 대기 버튼)도 있을 수 있습니다. 작업 조건 로그 및 오류 경보 페이지에서 이 페이지로 돌아가기 위한 뒤로 버튼이 있을 수 있습니다. 아래 다이어그램:

           (수력발전소의 지능형 제어 디스플레이 인터페이스)

펌프 스테이션 제어 시스템 인터페이스 기능 설명. 아래 다이어그램:

                            (펌프 스테이션 제어 시스템의 기능 인터페이스)

펌프 스테이션의 기능 인터페이스에서 모드를 변경할 수 있고 전체 시스템의 전원 공급 장치를 켜고 끌 수 있어 실제 시뮬레이션된 매개변수(예: 블레이드 투여량, 즉시 유량, 출력 전력) 및 기타 인터페이스를 전환할 수 있습니다(예: 작업 조건 로그, 오류 경보 보고서). 동시에 시스템 값(총 블레이드 수, 정격 출력, 설정 유량)도 표시할 수 있습니다. 작업 조건 로그(내용은 주문 번호, 발생 시간, 이벤트 세부 정보, 메모일 수 있음), 오류 경보(내용은 주문 번호, 발생 시간, 경보 세부 정보, 경보 코드 등일 수 있음)와 같은 다른 인터페이스도 가질 수 있습니다. 두 개의 인터페이스는 리턴 버튼을 가질 수 있으며 펌프 스테이션 기능 인터페이스로 돌아갈 수 있습니다.  

작업 아이디어 :  

시리얼 포트 화면은 man-machine 인터페이스 역할을 하며 Arduino 개발 보드와 통신합니다. 보드는 터치 스크린의 버튼 명령을 받아들이고 동기 디스플레이를 위해 직렬 포트 터치 스크린에 데이터를 전송합니다. 슬라이더 스케일은 전력 변화를 동적으로 표시하도록 설계되었습니다. 전원 스위치, 전원 칼, 모드 스위치 및 모드 칼의 아이콘은 ICON 파일을 생성하고 전원 공급 장치 및 모드의 동작 효과를 애니메이션하도록 설계되었습니다. 또한 Arduino 데모 프로그램에서 가변 메모리를 사용하여 전원 공급 및 모드의 상태를 얻기 위한 명령을 읽고 출력 데이터의 시뮬레이션을 제어하고 실제 수량 창을 직렬 포트 화면에 출력합니다.  

작업 단계:  

  1. 하드웨어 설정;  
  2. A) Arduino 개발 보드와 USB를 직렬 포트 변환 보드에 연결합니다.  
  3. B) 연결 STONE 터치 스크린 USB 직렬 포트 다운로드 보드 및 USB-직렬 포트 어댑터 보드 사용;  
  4. C) 직렬 포트 화면과 Arduino 개발 보드 전원 공급 장치를 연결합니다.  

3, 직렬 명령 디버깅을 통해 펌프 스테이션 제어 및 수력 발전소 제어 데모 기능을 달성하기 위해 프로그래밍합니다.  

 다음으로 특정 개발 프로세스를 문서화합니다.

먼저 하드웨어 연결을 설정합니다.  

작업 절차에 따라 모든 부품을 잘 연결하십시오.

다음으로 ICON 표시기 그림을 만듭니다.  

이 프로젝트에 사용된 버튼과 칼 아이콘은 다음과 같이 만들어집니다.  

(펌프 스테이션 제어 스위치, 나이프 애니메이션 ICON 파일 8. ICO 목록 찾아보기 다이어그램)

STONE TOOL BOX(GUI Design 소프트웨어) 메뉴바에서 도구(T) 메뉴의 아이콘 생성 도구를 클릭하면 아이콘 도구 대화상자가 팝업됩니다. 대화 상자 하단의 "이미지 경로 선택"을 클릭하여 아이콘 이미지 경로를 선택합니다. "ICON 파일 생성" 버튼을 클릭하면 STONE TOOL BOX(GUI 디자인 소프트웨어) 플랫폼에서 인식하는 ".ico" 파일을 생성할 경로에 BMP 파일을 패키징합니다. "미리보기" 버튼을 클릭하여 가져온".ico "압축 파일의 아이콘 목록을 봅니다.  

BMP 아이콘 애니메이션을 위한 버튼, 위와 같은 픽셀(생성된 가변 아이콘 제어, 동일한 위치의 크기는 동일해야 함), 펌프 스테이션 제어 8 사진을 동일한 폴더로 자릅니다. 그런 다음 STONE TOOL BOX(GUI 디자인 소프트웨어) 화면 왼쪽에서 아이콘 페이지 카드를 선택하고 "아이콘 목록" 아래의 "아이콘 추가" 버튼을 사용하여 압축된 7. Ico 파일에 추가합니다. 수력발전소의 제어스위치 상태 사진 6장을 모두 다른 폴더에 넣고 1-6의 순서로 배열한다. "6.을 만듭니다. Ico" 파일을 선택한 다음 왼쪽에 STONE TOOL BOX(GUI 디자인 소프트웨어) 화면에서 아이콘 페이지 카드를 선택하고 압축된 “6. "아이콘 목록" 아래의 "아이콘 추가" 버튼을 사용하여 Ico" 파일을 만듭니다.  

이제 이미지 아이콘을 STONE TOOL BOX(GUI 디자인 소프트웨어)로 가져와서 기능 버튼을 만듭니다.  

9-variable-animation icon.wmv 방법은 애니메이션 기능을 구현하기 위해 이 프로젝트에서 여전히 채택됩니다. 파라미터 설정 스크린샷은 다음과 같습니다.  

            (수력발전소 Variable ICON의 속성도)

왼쪽에서 오른쪽으로 수력발전소 기능 페이지의 세 가지 변수(시작, 정지 및 상태)의 ICON 매개변수 설정입니다. 메모리 주소는 동일(0x0039)로 설정되고 데이터 범위는 동일하므로 변경 사항이 동기화됩니다. 아이콘 파일은 6. Ico이며 해당 Icon 일련번호는 각각 1과 2, 3과 4, 6과 5로 실제 상태에 따라 선택됩니다.  

버튼 상태 애니메이션 효과는 증분 버튼을 통해 달성됩니다. 다음 그림은 왼쪽의 증가 버튼과 오른쪽의 판별 버튼의 매개변수를 보여줍니다. 주소는 0x0039로 둘 다 Variable ICON의 주소와 동일합니다.

(동일한 메모리 주소를 가진 증분 버튼의 속성 다이어그램)

(펌프 스테이션의 버튼 나이프 상태의 가변 ICON 속성 다이어그램)

왼쪽에서 오른쪽으로 ICON 매개변수 설정은 펌프 스테이션 기능 페이지의 8가지 변수인 전원 버튼, 전원 나이프, 모드 나이프 및 모드 버튼입니다. 여기서 두 아이콘 파일은 모두 XNUMX.ICO이며 데이터 범위는 동일하며 동일한 메모리 주소가 동기식으로 변경됩니다.  

버튼 상태 애니메이션은 증분 버튼으로도 구현됩니다. 다음 그림에서 전원 감소 버튼의 왼쪽과 모드 증가 버튼의 오른쪽은 전원 감소 버튼의 매개변수입니다. 주소는 각각 0x0009, 0x000A 위의 Variable ICON과 동일합니다. 이것은 탁구 버튼의 제한 처리 모드 이상입니다.

(펌프 스테이션 버튼 상태의 증분 버튼 속성 다이어그램 동일한 메모리 주소를 가진 Variable ICON Variable)

또한 펌프 스테이션의 출력 전력은 아래 그림과 같이 슬라이딩 아이콘을 사용하여 표시됩니다.

매개변수 속성은 다음과 같습니다.

(펌프 스테이션 출력의 슬라이딩 아이콘 — 슬라이더 스케일의 속성 상자)

이 슬라이더 스케일 컨트롤의 아이콘은 공식 DEMO 24.ico에서 호출됩니다. 24.ico 파일을 추가하는 방법은 위와 같습니다. 이 Slider Scale 컨트롤의 메모리 주소는 0x0180이며, 아이콘의 위치를 ​​변경하기 위해 82 명령(위 그림과 같이 범위는 0-100으로 설정됨)으로 MCU 프로그램에 쓸 수 있습니다.  

특히, 이 프로젝트의 전원 및 모드 버튼의 상태는 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의 XNUMX개입니다.  

여기서, 리프 도즈먼트 주소는 0바이트의 0020비트 정수인 2x2이다. 직렬 포트를 통해 터치 스크린 디스플레이로 전송할 수 있습니다.  

터치스크린 데이터 변수 디스플레이에 11을 전달하려면, 다음 명령을 사용하십시오.  

A5 5A 05 82 00 20 00 0B  

프로그래밍 디버깅.  

코드는 다음과 같습니다.  

/*

  frank8

  STONE 및 arduino COMM, enlaiji yepian 시스템.

  LED를 XNUMX초 동안 켜고 XNUMX초 동안 반복적으로 끕니다.

  주소 0x0020은 YePian 번호의 주소입니다.

  주소 0x0160은 현재 LiuLiang의 주소입니다.

  주소 0x0180은 Bengzhan outpower의 주소입니다.

  주소 0x0260은 Jiejujiao의 주소입니다.

  주소 0x0280은 물 출력 주소입니다.

  주소 0x0009는 bengzhan 전원 키입니다.

  주소 0x000A는 bengzhan 모드 키입니다.

  주소 0x0039는 수력 키입니다.

  이 예제 코드는 frank의 파일에 있습니다. 20210611

 */

// 핀 13에는 대부분의 Arduino 보드에 연결된 LED가 있습니다.

// 이름을 지정합니다.

정수 주도 = 13;

정수 iYePian = 0; //YePian의 숫자는 0x0020!

int iGongLu = 0; //0x0180 for GongLu!

정수 iLiuLiang = 0; //0x0160 현재 LiuLiang!

int iJiao = 0; // 0x0260 for The JieJuJiao!

int iGongLuWater = 0; //0x0280 워터 공루! 값은 0-50000입니다!

int iLed = 1; //지연 시간 번호.

정수 iNum = 0 ; // 문자 번호를 읽습니다.

정수 iNum2 = 0; // ShuiDianZhan의 경우 char num2에서 읽습니다!

정수 iPower = 2; //키 조각상 0x0009

정수 iMode = 2; //키 조각상 0x000A

정수 iPowerWater = 2; //키 조각상 0x0039

// 재설정을 누를 때 설정 루틴이 한 번 실행됩니다.

void setup () {                

  // 디지털 핀을 출력으로 초기화합니다.

  핀모드(LED, 출력);     

  Serial.begin(115200); // 직렬 통신 기능을 열고 직렬 포트가 열릴 때까지 기다립니다.  

동안 (! 직렬) {

    ; // 직렬 포트가 연결될 때까지 기다립니다. 레오나르도에게만 필요

  }  

}

// 루프 루틴은 영원히 계속 반복됩니다.

무효 루프 () {

  정수 inChar;

    if (iLed == 900) {     

//——- 0x0009 및 0x000A 값 읽기———- 

            직렬.쓰기(0xA5); //"A5"는 165입니다.

            직렬.쓰기(0x5A); //"5A"는 90입니다.

            직렬.쓰기(0x04); //길이

            직렬.쓰기(0x83); // 읽다!

            직렬.쓰기(0x00); // bengzhan 전원 키의 주소!

            직렬.쓰기(0x09); // bengzhan 전원 키의 주소!

            직렬.쓰기(0x02); // 0x0009(전원) 및 0x000A(모드)

//———STONE 반환 값은 "A5 5A 08 83 00 09 02 00 01 00 02"가 됩니다.——

     }

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

    if (iLed == 800) {     

//——- 0x0039 값 읽기———- 

            직렬.쓰기(0xA5); //"A5"는 165입니다.

            직렬.쓰기(0x5A); //"5A"는 90입니다.

            직렬.쓰기(0x04); //길이

            직렬.쓰기(0x83); // 읽다!

            직렬.쓰기(0x00); // ShuiDianZhan 전원 키의 주소!

            직렬.쓰기(0x39); // ShuiDianZhan 전원 키의 주소!

            직렬.쓰기(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)) {  

      iNum = 4 ;

      if(iPower != 1){

          아이파워 = 1 ; //전원 켜짐!

          일류량 = 10 ;

          이공루 = 50 ;

          아이피안 = 10 ;         

      }

   }

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

      iNum = 4 ;

      아이파워 = 2 ; //전원 OFF!

      일류량 = 0 ;

      이공루 = 0 ;

      아이피안 = 0 ;

   }

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

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

      iNum = 0 ;

      아이모드 = 1 ; //모드 좋다!

   }

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

      iNum = 0 ;

      아이모드 = 2 ; //모드가 꺼져 있습니다!

      if(iPower == 1)iGongLu = 60 ; //GongLu가 60%로 설정되었습니다!

   }

  //——————0x0009 및 0x000A 키 읽기 OK! 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 ;

      if(아이파워워터!= 1){

          아이파워워터 = 1 ; //전원 켜짐!       

          아이자오 = 0 ;

          아이공루워터 = 0 ;

      }

   }

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

      iNum2 = 0 ;

      아이파워워터 = 2 ; //전원 OFF!

   }

  //——————0x0039 키 읽기 확인! 아이파워워터 ok!——————————

  지연 (1); 

  iLED += 1;   

  if (iLed == 500) {  

      digitalWrite(led, HIGH); // LED 켜기(HIGH는 전압 레벨)

                  //지연(500); // 잠시 기다림, Range:200-2000

           if(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; }   

           if(iPowerWater == 2) { 

               아이자오 += 1; //범위:1-20

               아이공루워터 += 2; //범위:1-20

           }   

           if(iJiao >= 60 ) { 

               아이자오 = 0; 

               아이공루워터 = 0; 

           }   

  }    

  if (iLed >= 1000) {    

      디지털 쓰기(LED, LOW); // 전압을 LOW로 만들어 LED를 끕니다.

                  //지연(500); // 200초 동안 기다림, 범위:2000-XNUMX

      iLed = 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); //LiuLiang은 2800–3200입니다.

            직렬.쓰기(0x80);            

            직렬.쓰기(0xA5); //"A5"는 165입니다.

            직렬.쓰기(0x5A); //"5A"는 90입니다.

            직렬.쓰기(0x05);

            직렬.쓰기(0x82);

            직렬.쓰기(0x02); // ShuiDianZhan JieJuJiao의 주소

            직렬.쓰기(0x60); // ShuiDianZhan JieJuJiao의 주소

            직렬.쓰기(0x00);

            Serial.write(iJiao);

            직렬.쓰기(0xA5); //"A5"는 165입니다.

            직렬.쓰기(0x5A); //"5A"는 90입니다.

            직렬.쓰기(0x05);

            직렬.쓰기(0x82);

            직렬.쓰기(0x02); // ShuiDianZhan 출력 주소

            직렬.쓰기(0x80); // ShuiDianZhan out Power의 주소;

            Serial.write(iGongLuWater); //ShuiDianZhan 출력 Powe는 0–32000입니다.

            직렬.쓰기(0x00);            

  }    

마지막으로 온라인으로 비디오를 녹화합니다. 

전원 공급 장치와 통신을 연결하고 Arduino 개발 보드를 직렬 포트 통신에 연결하고 직렬 포트 화면에서 수력 발전소와 펌핑 스테이션의 기능 인터페이스를 관찰하고 스위치를 터치하여 효과를 확인하고 아이콘과 데이터를 슬라이드하면 정상입니다. .  

출처 : Plato Data Intelligence