산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

유한 상태 기계를 사용하는 Arduino의 디지털 시계

구성품 및 소모품

Arduino UNO
LCD Shield와 호환되는 모든 Arduino를 사용할 수 있습니다. 아두이노 메가를 사용했습니다.
× 1
LCD 키패드 실드
× 1

앱 및 온라인 서비스

YAKINDU Statechart 도구
비상업적 용도는 무료입니다.
Arduino용 Eclipse C++ IDE

이 프로젝트 정보

안녕하세요,

YAKINDU Statechart Tools로 디지털 시계를 만들고 LCD 키패드 실드를 사용하는 Arduino에서 실행하는 방법을 보여 드리겠습니다.

디지털 시계의 원래 모델은 David Harel에게서 가져왔습니다. 그는 "상태 기계 및 상태 다이어그램의 기존 형식주의의 광범위한 확장"에 대한 논문을 발표했습니다.

이 논문에서 그는 연구를 위해 디지털 시계의 예를 사용했습니다. 나는 그것을 영감으로 사용했고 YAKINDU Statechart Tools(상태 머신의 그래픽 모델을 생성하고 이를 사용하여 C/C++ 코드를 생성하는 도구)로 시계를 다시 제작하고 Arduino에서 다시 살아나게 했습니다.

디지털 시계 작동 방식

디지털 시계의 작동 방식을 정의하는 것부터 시작하겠습니다. 90년대에 모두가 가지고 있었던 "매우 멋진" 디지털 시계를 기억하십니까? 통합 스톱워치, 다양한 알람 및 매시간 짜증나는 경고음. 그렇지 않다면 90년대 디지털 시계를 보십시오.

기본적으로 다양한 모드로 구성 가능한 시계입니다. 주로 현재 시간이 표시되지만 몇 가지 다른 기능이 있습니다. 입력으로 켜기/끄기가 있습니다. , 모드세트 단추. 또한 조명을 켜고 끌 수 있습니다.

모드 사용 버튼을 사용하여 모드를 구분하고 시계 기능을 활성화/비활성화할 수 있습니다.

<울>
  • 시간 표시(시계)
  • 날짜 표시(날짜)
  • 알람 설정(알람 1, 알람 2)
  • 차임 활성화/비활성화(차임 설정)
  • 스톱워치(스톱워치) 사용
  • 메뉴 내에서 켜기/끄기를 사용할 수 있습니다. 버튼을 눌러 모드를 구성합니다. 세트 버튼을 사용하여 시간을 설정할 수 있습니다. 시계 또는 알람. 조명 켜기 및 끄기 버튼을 사용하여 스톱워치를 제어(시작 및 중지)할 수 있습니다. 통합 랩 카운터를 사용할 수도 있습니다.

    또한 모든 것을 울리는 차임벨과 제어 가능한 백라이트가 통합되어 있습니다. 첫 번째 단계에서는 Arduino에 연결하지 않았습니다.

    상태 머신

    이 예에 대한 설명을 자세히 설명하고 싶지 않습니다. 너무 복잡해서가 아니라 약간 너무 큽니다. 나는 그것이 어떻게 작동하는지에 대한 기본 아이디어를 설명하려고 노력할 것입니다. 실행은 모델을 보거나 다운로드하여 시뮬레이션함으로써 자체적으로 설명되어야 합니다. 상태 시스템의 일부는 설정된 시간과 같은 하위 지역으로 요약됩니다. 지역. 이를 통해 상태 머신의 가독성이 보장되어야 합니다.

    모델은 그래픽과 텍스트의 두 부분으로 나뉩니다. 텍스트 부분에서 이벤트, 변수 등이 정의됩니다. 그래픽 부분 - 상태 다이어그램 - 모델의 논리적 실행이 지정됩니다. 지정된 동작을 수행하는 상태 머신을 생성하려면 모델에서 사용할 수 있는 일부 입력 이벤트가 필요합니다. onoff , 설정 , 모드 , , 및 light_r. 정의 섹션 내에서 100ms마다 시간 값을 증가시키는 내부 이벤트가 사용됩니다.

    매 100ms/시간 +=1 

    100ms 단계를 기반으로 현재 시간이 HH:MM:SS로 계산됩니다. 형식:

    display.first =(시간 / 36000) % 24;
    display.second =(시간 / 600) % 60;
    display.third =(시간 / 10) % 60;

    값은 updateLCD 작업을 사용하여 LCD 디스플레이에 연결됩니다. 상태 머신이 호출될 때마다:

    display.updateLCD(display.first, display.second, display.third, display.text) 

    상태 머신의 기본 실행은 이미 디지털 시계 작동 방식 섹션에 정의되어 있습니다. . 도구 내에서 CompositeState와 같은 "특수" 모델링 요소를 사용했습니다. , 기록 , 하위 다이어그램 , ExitNodes, 등. 자세한 설명은 사용자 가이드에서 확인할 수 있습니다.

    LCD 키패드 실드

    LCD 키패드 실드는 시각화를 위한 화면과 입력으로 일부 버튼이 필요한 간단한 프로젝트에 매우 적합합니다. LCD 키패드 실드는 5개의 사용자 버튼과 재설정을 위한 또 다른 버튼을 포함합니다. 5개의 버튼은 모두 함께 Arduino의 A0 핀에 연결됩니다. 각각은 버튼을 구분할 수 있는 전압 분배기에 연결되어 있습니다.

    analogRead(0)를 사용하여 특정 값을 찾을 수 있습니다. 물론 제조업체에 따라 다를 수 있습니다. 이 간단한 프로젝트는 LCD에 현재 값을 표시합니다.

    #include 
    #include

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    무효 설정() {
    lcd.begin(16, 2);
    lcd.setCursor(0,0);
    lcd.write("측정값");
    }

    무효 루프() {
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd. setCursor(0,1);
    lcd.print(analogRead(0));
    지연(200);
    }

    다음은 제가 측정한 결과입니다:

    <울>
  • 없음:1023
  • 선택:640
  • 왼쪽:411
  • 아래로:257
  • 최대:100
  • 오른쪽:0
  • 이 임계값을 사용하면 버튼을 읽을 수 있습니다.

    #define NONE 0
    #define SELECT 1
    #define LEFT 2
    #define DOWN 3
    #define UP 4
    #define RIGHT 5

    정적 int readButton() {
    int 결과 =0;
    결과 =analogRead(0);
    if (결과 <50) {
    반환 오른쪽;
    }
    if (결과 <150) {
    return UP;
    }
    if (결과 <300) {
    return DOWN;
    }
    if (result <550) {
    return LEFT;
    }
    if (result <850) {
    return SELECT;
    }
    없음 반환;
    }

    상태 머신 인터페이스

    상태 머신의 생성된 C++ 코드는 상태 머신을 제어하기 위해 구현되어야 하는 인터페이스를 제공합니다. 첫 번째 단계는 입력 이벤트를 키패드 실드의 키와 연결하는 것입니다. 나는 이미 버튼을 읽는 방법을 보여 주었지만 상태 머신에 버튼을 인터페이스하려면 버튼을 디바운싱해야 합니다. 그렇지 않으면 이벤트가 여러 번 발생하여 예측할 수 없는 동작이 발생합니다. 소프트웨어 디바운싱의 개념은 새로운 것이 아닙니다. Arduino 문서를 볼 수 있습니다.

    내 구현에서는 하강 가장자리(버튼 해제)를 감지합니다. 버튼의 값을 읽고 80ms 동안 기다렸다가(50 대신 80으로 더 나은 결과를 얻었음) 결과를 저장하고 새 값을 읽습니다. oldResult 없음이 아닙니다. (누르지 않음) 새 결과는 NONE입니다. , 나는 그 버튼이 전에도 눌렸고 지금은 손을 뗀 것도 압니다. 그런 다음 상태 머신의 해당 입력 이벤트를 발생시킵니다.

    int oldState =NONE;
    정적 무효 raiseEvents() {
    int buttonPressed =readButton();
    delay(80);
    oldState =buttonPressed;
    if (oldState !=NONE &&readButton() ==NONE) {
    switch (oldState) {
    case SELECT:{
    stateMachine->getSCI_Button()->raise_mode();
    break;
    }
    case LEFT:{
    stateMachine->getSCI_Button()->raise_set();
    break;
    }
    케이스 DOWN:{
    stateMachine->getSCI_Button()->raise_light();
    break;
    }
    케이스 UP:{
    stateMachine->getSCI_Button() ->raise_light_r();
    break;
    }
    경우 오른쪽:{
    stateMachine->getSCI_Button()->raise_onoff();
    break;
    }
    기본값:{
    break;
    }
    }
    }
    }

    함께 연결하기

    메인 프로그램은 세 부분으로 사용됩니다:

    <울>
  • 상태 머신
  • 타이머
  • 디스플레이 핸들러(일반적인 lcd.print(...))
  • DigitalWatch* stateMachine =new DigitalWatch();
    CPPTimerInterface* timer_sct =new CPPTimerInterface();
    DisplayHandler* displayHandler =new DisplayHandler();

    상태 머신은 디스플레이 핸들러를 사용하고 타이머를 얻었습니다. 타이머는 시간 제한 이벤트를 제어하기 위해 업데이트됩니다. 이후 상태 머신이 초기화되어 진입합니다.

    무효 설정() {
    stateMachine->setSCI_Display_OCB(displayHandler);
    stateMachine->setTimer(timer_sct);
    stateMachine->init();
    stateMachine->enter();
    }

    루프는 다음 세 가지 작업을 수행합니다.

    <울>
  • 입력 이벤트 발생
  • 경과 시간 계산 및 타이머 업데이트
  • 상태 시스템 호출
  • long current_time =0;
    long last_cycle_time =0;
    void loop() {
    raiseEvents();
    last_cycle_time =current_time;
    current_time =millis();
    timer_sct->updateActiveTimer(stateMachine,
    current_time - last_cycle_time);
    stateMachine->runCycle();
    }

    예제 가져오기

    그게 다야 구현의 모든 세부 사항을 언급하지는 않았지만 예제를 보거나 의견을 남겨주세요.

    다음을 사용하여 실행 중인 IDE에 예제를 추가합니다.

    파일 -> 새로 만들기 -> 예제 -> YAKIDU Statechart 예제 -> 다음 -> Arduino - 디지털 시계(C++)

    >> 여기에서 IDE를 다운로드할 수 있습니다. <<

    30일 평가판으로 시작할 수 있습니다. 그 후 비상업적 용도로 무료인 라이선스를 받아야 합니다. !


    제조공정

    1. 유한 상태 기계
    2. Arduino를 사용하여 모니터 Ambilight 만들기
    3. Arduino 디지털 주사위
    4. ARDUINO를 사용하는 초음파 부상 기계
    5. Arduino와 스마트폰을 사용한 DIY 전압계
    6. IoT를 사용한 심박수 모니터
    7. Arduino Uno WiFi를 사용하는 WebServerBlink
    8. Arduino Tamagotchi 클론 - 디지털 애완동물
    9. Arduino Apple Watch
    10. arduino를 사용한 자동화된 Dino 게임