Мазмуну:

Ардуинодогу санариптик сааттын акыркы машинасын колдонуу: 6 кадам
Ардуинодогу санариптик сааттын акыркы машинасын колдонуу: 6 кадам

Video: Ардуинодогу санариптик сааттын акыркы машинасын колдонуу: 6 кадам

Video: Ардуинодогу санариптик сааттын акыркы машинасын колдонуу: 6 кадам
Video: 74HC595 Arduino үчүн ондук чекиттери бар жети сегментке 2 сан светодиод дисплейи 2024, Ноябрь
Anonim
Ардуинодогу санариптик сааттын акыркы машинасы
Ардуинодогу санариптик сааттын акыркы машинасы

Салам, мен сизге YAKINDU Statechart Tools менен санариптик сааттын түзүлүшүн жана LCD клавиатура калканчын колдонгон Arduino менен иштөөнү көрсөтөм.

Санарип сааттын оригиналдуу модели Дэвид Харелден алынган. Ал тууралуу макала жарыялады

"[…] Мамлекеттик машиналардын жана абал диаграммаларынын кадимки формализминин кеңири жайылышы."

Бул макалада ал өзүнүн изилдөөсү үчүн санарип сааттын мисалын колдонгон. Мен аны илхам катары колдонуп, саатты YAKINDU Statechart Tools (мамлекеттик машиналардын графикалык моделдерин түзүүчү жана C/C ++ кодун түзүүчү курал) менен кайра куруп, аны Arduinoдо кайра жашоого алып келдим.

Жабдуулар

Аппараттык:

  • Arduino Uno же Mega
  • LCD баскыч калкан

Программалык камсыздоо:

  • YAKINDU Statechart Tools
  • Arduino үчүн Eclipse C ++ IDE

1 -кадам: Санариптик саат кантип иштейт

Image
Image

Санарип саат кантип иштеши керек экенин аныктоодон баштайлы. Булар эсиңиздеби … айталычы … 90 -жылдары ар кимде болгон "өтө сонун" санариптик сааттар? Интеграцияланган секундомер, ар кандай ойготкучтар жана анын тажатма сигналдары ар бир саат сайын. Андай болбосо, карап көрүңүз: 90 -жылдардагы санариптик саат.

Ошентип, негизинен, бул ар кандай режимдеги конфигурацияланган саат. Негизинен, учурдагы убакыт көрсөтүлөт, бирок башка өзгөчөлүктөрү бар. Киргизүү катары сизде күйгүзүү/өчүрүү, режим жана орнотуу баскычы бар. Мындан тышкары, сиз жарыкты күйгүзүп жана өчүрө аласыз. Режим баскычы менен сиз режимдерди айырмалай аласыз жана саат өзгөчөлүктөрүн иштете/өчүрө аласыз:

  • Убакытты көрсөтүү (Саат)
  • Күндү көрсөтүү (Күн)
  • Ойготкучту коюу (Ойготкуч 1, Ойготкуч 2)
  • Звонокту иштетүү/өчүрүү (Звонокту коюу)
  • Секундомерди колдонуңуз (Stop Watch)

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

Мындан тышкары, ар бир толук саатта коңгуроо кагылган жана башкарылуучу арткы жарык кошулган. Биринчи кадамда мен аларды Arduino менен байланыштырган жокмун.

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

LCD баскыч калкан
LCD баскыч калкан

Мен бул мисалды түшүндүрүү үчүн деталдуу түрдө баргым келбейт. Бул өтө татаал болгондуктан эмес, кичине эле чоң. Мен анын кантип иштээринин негизги идеясын түшүндүрүүгө аракет кылам. Моделди карап же жүктөп алып, окшоштуруу менен аткаруу өзүн-өзү түшүндүрүшү керек. Мамлекеттик машинанын кээ бир бөлүктөрү белгиленген убакыт региону сыяктуу, кичи региондордо жыйынтыкталат. Муну менен мамлекеттик машинанын окумдуулугу камсыз кылынышы керек.

Модель эки бөлүккө бөлүнөт - графикалык жана тексттик. Тексттик бөлүктө окуялар, өзгөрмөлөр ж. Графикалык бөлүктө - абал диаграммасы - моделдин логикалык аткарылышы көрсөтүлөт. Белгиленген жүрүм -турумду аткарган мамлекеттик машинаны түзүү үчүн, моделде колдонула турган кээ бир киргизүү окуялары талап кылынат: өчүрүү, коюу, режим, жарык жана light_r. Аныктоо бөлүмүнүн ичинде ар бир 100 мс убакыттын маанисин көбөйткөн ички окуя колдонулат:

ар 100 мс / жолу += 1

100 мс кадамдын негизинде учурдагы убакыт HH: MM: SS форматында эсептелет:

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

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

Мамлекеттик машиналар чакырылган сайын баалуулуктар LCDL операциясын колдонуу менен өткөрүлүп берилет:

display.updateLCD (display.биринчиден, display.second, display.third, display.text)

Мамлекеттик машинанын негизги аткарылышы буга чейин Digital Watch кантип иштээри бөлүмүндө аныкталган. Куралдын ичинде мен CompositeState, History, Sub-Diagrams, ExitNodes, ж.б. сыяктуу кээ бир "өзгөчө" моделдөө элементтерин колдондум. Толук сүрөттөмөнү Колдонуучу Колдонмосунан тапса болот.

3 -кадам: LCD клавиатура калканы

LCD клавиатурасы Shield жөнөкөй долбоорлор үчүн абдан сонун, алар визуалдаштыруу үчүн экранды жана кээ бир баскычтарды киргизүү катары талап кылат - типтүү, жөнөкөй HMI (Human Machine Interface). LCD клавиатура калканы беш колдонуучу баскычын жана башкасын калыбына келтирүү үчүн камтыйт. Беш баскыч бардыгы Arduino A0 пинине туташкан. Алардын ар бири баскычтарды айырмалоого мүмкүнчүлүк берген чыңалуу бөлүштүргүчкө туташкан.

Албетте, өндүрүүчү тарабынан айырмаланышы мүмкүн болгон конкреттүү баалуулуктарды табуу үчүн analogRead (0) колдоно аласыз. Бул жөнөкөй долбоор ЖКда учурдагы маанини көрсөтөт:

#"Arduino.h" кошуу

#include "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

Бул босоголор менен баскычтарды окуу мүмкүн:

#define NONE 0 #define SELECT 1 #define LEFT 2 #dewne DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0; натыйжа = analogRead (0); if (result <50) {return Right; } if (result <150) {return UP; } if (result <300) {return DOWN; } if (result <550) {return LEFT; } if (result <850) {return SELECT; } return NONE; }

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

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

Мамлекеттик машинанын C ++ коду мамлекеттик машинаны көзөмөлдөө үчүн ишке ашырылышы керек болгон интерфейстерди камсыздайт. Биринчи кадам окуяларды Keypad Shield баскычтары менен туташтыруу. Мен буга чейин баскычтарды кантип окуу керектигин көрсөткөнмүн, бирок аларды мамлекеттик машинага аралаштыруу үчүн, баскычтарды ажыратуу талап кылынат - антпесе, окуялар бир нече жолу көтөрүлүп, натыйжада күтүүсүз жүрүм -турумга алып келет. Программалык камсыздандыруунун концепциясы жаңы эмес. Сиз Arduino документтерин карай аласыз.

Ишке ашырууда мен кулап жаткан четин аныктайм (баскычты кое берүү). Мен баскычтын маанисин окуп, 80 мс күтөбүз (50 ордуна 80 менен жакшы жыйынтыктарды алдым), натыйжаны сактап, жаңы маанини окуңуз. Эгерде oldResult NONE эмес (басылбаган) жана жаңы натыйжа NONE болсо, мен билем, баскыч мурда басылган жана азыр бошотулган. Андан кийин, мен мамлекеттик машинанын киргизүү окуясын көтөрөм.

int oldState = NONE; static void liftEvents () {int buttonPressed = readButton (); кечиктирүү (80); oldState = buttonPressed; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> boost_mode (); тыныгуу; } ЧЕП СОЛ: {stateMachine-> getSCI_Button ()-> ko'tarүү_сет (); тыныгуу; } учурда ТӨМӨН: {stateMachine-> getSCI_Button ()-> lift_light (); тыныгуу; } UP UP: {stateMachine-> getSCI_Button ()-> lift_light_r (); тыныгуу; } иштин УКУГУ: {stateMachine-> getSCI_Button ()-> жогорулатуу_onoff (); тыныгуу; } демейки: {break; }}}}

5 -кадам: нерселерди чогуу зымдоо

Негизги программа үч бөлүктөн турат:

  • Мамлекеттик машина
  • Таймер
  • Дисплей иштетүүчү (типтүү lcd.print […])

DigitalWatch* stateMachine = жаңы DigitalWatch (); CPPTimerInterface* timer_sct = жаңы CPPTimerInterface (); DisplayHandler* displayHandler = жаңы 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 () {boostEvents (); last_cycle_time = учурдагы_ убакыт; current_time = миллис (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

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

Дал ушул. Балким, мен ишке ашыруунун бардык деталдарын айткан жокмун, бирок сиз мисалды карап же комментарий калтырсаңыз болот.

Мисалды иштеп жаткан IDEге кошуңуз: File -> New -> Example -> YAKINDU Statechart Examples -> Next -> Arduino -Digital Watch (C ++)

> Сиз IDEди бул жерден жүктөп алсаңыз болот <<

Сиз 30 күндүк сыноо менен баштасаңыз болот. Андан кийин, сиз коммерциялык эмес колдонуу үчүн бекер болгон лицензияны алышыңыз керек!

Сунушталууда: