Мазмұны:

Ақырлы күй машинасын қолданатын Arduino сандық сағаты: 6 қадам
Ақырлы күй машинасын қолданатын Arduino сандық сағаты: 6 қадам

Бейне: Ақырлы күй машинасын қолданатын Arduino сандық сағаты: 6 қадам

Бейне: Ақырлы күй машинасын қолданатын Arduino сандық сағаты: 6 қадам
Бейне: Балаларымыз не оқып жүр қараңыздар. 2024, Қараша
Anonim
Ақырлы күй машинасының көмегімен Arduino -дағы сандық сағат
Ақырлы күй машинасының көмегімен Arduino -дағы сандық сағат

Сәлеметсіз бе, мен сізге YAKINDU Statechart Tools көмегімен сандық сағатты қалай құруға болатынын және LCD пернетақтасы қалқанын қолданатын Arduino -да жұмыс істеуге болатынын көрсетемін.

Сандық сағаттардың түпнұсқалық үлгісі Дэвид Харелден алынды. Ол туралы мақала жариялады

«[…] Мемлекеттік машиналар мен күй диаграммаларының әдеттегі формализмінің кеңеюі.»

Бұл жұмыста ол өзінің зерттеулері үшін цифрлық сағат үлгісін қолданды. Мен оны шабыт ретінде қолдандым және сағатты YAKINDU Statechart Tools көмегімен қалпына келтірдім (мемлекеттік машиналардың графикалық модельдерін құруға және C/C ++ кодын құруға арналған құрал) және оны Arduino -да өмірге келтірдім.

Жабдықтар

Жабдық:

  • Arduino Uno немесе Mega
  • СКД пернетақтасы

Бағдарламалық қамтамасыз ету:

  • YAKINDU Statechart құралдары
  • Arduino үшін Eclipse C ++ IDE

1 -қадам: Сандық сағат қалай жұмыс істейді

Image
Image

Сандық сағаттардың қалай жұмыс істейтінін анықтаудан бастайық. Сіз есіңізде ме, айталық … 90 -шы жылдары барлығында болған «өте керемет» цифрлық сағаттар? Біріктірілген секундомер, әр түрлі дабылдар және оның тітіркендіргіш дыбысы әр сағат сайын. Егер жоқ болса, қараңыз: 90 -шы жылдардағы цифрлық сағат.

Негізінде бұл әр түрлі режимдегі конфигурацияланатын сағат. Негізінен, ағымдағы уақыт көрсетіледі, бірақ басқа да мүмкіндіктер бар. Енгізу ретінде сізде қосу/өшіру, режим және орнату түймесі бар. Сонымен қатар, сіз шамды қосуға және өшіруге болады. Режим түймесінің көмегімен сіз режимдерді ажырата аласыз және сағат мүмкіндіктерін қосуға/өшіруге болады:

  • Уақытты көрсету (Сағат)
  • Күнді көрсету (Күн)
  • Дабылды орнатыңыз (Дабыл 1, Дабыл 2)
  • Шыңдауды қосу/өшіру (Шыңдауды орнату)
  • Секундомерді қолданыңыз (Stop Watch)

Мәзірлерде режимді конфигурациялау үшін қосу/өшіру түймесін пайдалануға болады. Орнату түймесі уақытты орнатуға мүмкіндік береді - мысалы. сағат немесе дабылдар үшін. Секундомерді жарықты қосу және өшіру түймесінің көмегімен басқаруға болады - қосылады және тоқтатылады. Сіз сондай -ақ кіріктірілген есептегішті пайдалана аласыз

Сонымен қатар, әр сағат сайын қоңырау шалатын қоңырау және басқарылатын артқы жарық бар. Бірінші қадамда мен оларды Arduino -ға қосқан жоқпын.

2 -қадам: Мемлекеттік машина

СКД пернетақтасы
СКД пернетақтасы

Мен бұл мысалды түсіндіру үшін егжей -тегжейлі барғым келмейді. Бұл тым күрделі болғандықтан емес, сәл үлкен. Мен оның қалай жұмыс істейтіні туралы негізгі идеяны түсіндіруге тырысамын. Модельді қарап шығу немесе оны жүктеу мен модельдеу арқылы орындау өзін-өзі түсіндіруі керек. Мемлекеттік машинаның кейбір бөліктері белгіленген уақыт аймағы сияқты қосалқы аймақтарда жинақталған. Бұл жағдайда мемлекеттік машинаның оқылуын қамтамасыз ету керек.

Модель екіге бөлінеді - графикалық және мәтіндік. Мәтіндік бөлімде оқиғалар, айнымалылар және т.б. анықталатын болады. Графикалық бөлімде - күй диаграммасы - модельдің логикалық орындалуы көрсетілген. Белгіленген әрекетті орындайтын күй машинасын құру үшін модельде қолдануға болатын кейбір енгізу оқиғалары қажет: қосу, орнату, режим, жарық және жарық_r. Анықтау бөлімінде әрбір 100 мс уақытты арттыратын ішкі оқиға қолданылады:

әр 100 мс / уақыт += 1

100 мс қадамға сүйене отырып, ағымдағы уақыт HH: MM: SS форматында есептеледі:

display.first = (уақыт / 36000) % 24;

display.second = (уақыт / 600) % 60; display.third = (уақыт / 10) % 60;

Мәндер СКД дисплейіне қосылу арқылы updateLCD операциялық режимін қолданады.

display.updateLCD (көрсету: бірінші, көрсету.екінші, көрсету.үшінші, көрсету.текст)

Мемлекеттік машинаның негізгі орындалуы Digital Watch қалай жұмыс істейді бөлімінде анықталған. Құралда мен CompositeState, History, Sub-Diagrams, ExitNodes және т.б сияқты кейбір «арнайы» модельдеу элементтерін қолдандым. Толық сипаттаманы Қолданушы нұсқаулығынан табуға болады.

3 -қадам: СКД пернетақтасы

СКД пернетақтасы экраны қарапайым жобалар үшін өте керемет, ол үшін визуалды экран мен кейбір түймелер енгізу қажет - әдеттегі, қарапайым HMI (адамдық машина интерфейсі). СКД пернетақтасы қалқанында бес пайдаланушы түймесі және қалпына келтіруге арналған тағы бір түйме бар. Бес түйме бірге Arduino A0 түйреуішіне қосылған. Олардың әрқайсысы түймелерді ажыратуға мүмкіндік беретін кернеу бөлгішке қосылған.

Нақты мәндерді табу үшін analogRead (0) көмегімен, әрине, өндірушіге қарай әр түрлі болуы мүмкін. Бұл қарапайым жоба СКД -да ағымдағы мәнді көрсетеді:

#«Arduino.h» қосыңыз

#«LiquidCrystal.h» қосу LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write («Өлшенген мән»); } void loop () {lcd.setCursor (0, 1); lcd.print («»); lcd.setCursor (0, 1); lcd.print (analogRead (0)); кешіктіру (200); }

Бұл менің өлшенген нәтижелерім:

  • Жоқ: 1023
  • Таңдаңыз: 640
  • Сол жақ: 411
  • Төмен: 257
  • Жоғары: 100
  • Оң жақта: 0

Осы шектерде түймелерді оқу мүмкін:

#анықтау NONE 0 #анықтау SELECT 1 #анықтау SOL 2 нәтиже = analogRead (0); if (нәтиже <50) {ОҢҒА қайту; } if (нәтиже <150) {қайтару UP; } if (нәтиже <300) {DOWN қайтару; } if (нәтиже <550) {LEFT қайтару; } if (нәтиже <850) {SELECT қайтару; } қайтару NONE; }

4 -қадам: Мемлекеттік машинаның интерфейсі

Мемлекеттік машинаның интерфейсі
Мемлекеттік машинаның интерфейсі

Мемлекеттік машинаның құрылған C ++ коды интерфейстерді қамтамасыз етеді, оларды мемлекеттік машинаны басқару үшін енгізу қажет. Бірінші қадам - оқиғаларды пернетақта экраны пернелерімен қосу. Мен батырмаларды қалай оқу керектігін көрсеткенмін, бірақ оларды мемлекеттік машинамен байланыстыру үшін түймелерді ажырату қажет - әйтпесе оқиғалар бірнеше рет көтеріледі, бұл күтпеген әрекетке әкеледі. Бағдарламалық жасақтаманың дебунгі туралы түсінік жаңа емес. Сіз Arduino құжаттамасын қарай аласыз.

Іске асыруда мен құлаған жиекті анықтаймын (түймені босату). Мен түйменің мәнін оқыдым, 80 мс күтемін (50 орнына 80мен жақсы нәтиже алдым), нәтижені сақтап, жаңа мәнді оқыдым. Егер oldResult NONE (қысылмаған) болмаса және жаңа нәтиже NONE болса, мен білемін, түйме бұрын басылған және қазір босатылған. Содан кейін мен мемлекеттік машинаның кіріс оқиғасын көтеремін.

int oldState = NONE; static void elevEvents () {int buttonPressed = readButton (); кешіктіру (80); oldState = түйме басылды; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> lift_mode (); үзіліс; } СОЛ ҚАЛДЫ: {stateMachine-> getSCI_Button ()-> boost_set (); үзіліс; } жағдай ТӨМЕН: {stateMachine-> getSCI_Button ()-> жоғарылату_лайт (); үзіліс; } жағдай ЖОҒАРЫ: {stateMachine-> getSCI_Button ()-> lift_light_r (); үзіліс; } жағдай ДҰРЫС: {stateMachine-> getSCI_Button ()-> жоғарылату_қайырылуы (); үзіліс; } әдепкі: {break; }}}}

5 -қадам: заттарды бірге жалғау

Негізгі бағдарлама үш бөліктен тұрады:

  • Мемлекеттік машина
  • Таймер
  • Дисплей өңдегіші (әдеттегі lcd.print (…))

DigitalWatch* stateMachine = жаңа DigitalWatch (); CPPTimerInterface* timer_sct = жаңа CPPTimerInterface (); DisplayHandler* displayHandler = жаңа DisplayHandler ();

Мемлекеттік машина дисплей өңдегішін қолданады және уақытты оқиғаларды бақылау үшін жаңартылатын таймер алды. Содан кейін мемлекеттік машина инициализацияланады және енгізіледі.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> enter (); }Цикл үш нәрсені жасайды:

  • Кіріс оқиғаларын көтеріңіз
  • Өткен уақытты есептеп, таймерді жаңартыңыз
  • Мемлекеттік машинаны шақырыңыз

ұзақ ағымдағы_уақыт = 0; ұзын соңғы_циклдік_сағат = 0; void loop () {boostEvents (); last_cycle_time = ағымдағы_уақыт; ағымдағы_уақыт = миллис (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

6 -қадам: Мысалды алыңыз

Міне бітті. Мүмкін, мен іске асырудың барлық егжей -тегжейін айтпадым, бірақ сіз мысалға қарап немесе пікір қалдыра аласыз.

Мысалды жұмыс істейтін IDE -ге қосыңыз: Файл -> Жаңа -> Мысал -> YAKINDU Statechart Мысалдары -> Келесі -> Arduino -Сандық сағат (C ++)

> Сіз IDE -ны мына жерден жүктей аласыз <<

Сіз 30 күндік сынақтан бастай аласыз. Осыдан кейін сіз лицензияны алуыңыз керек, ол коммерциялық емес мақсатта пайдалануға ақысыз!

Ұсынылған: