Агуулгын хүснэгт:

Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг: 6 алхам
Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг: 6 алхам

Видео: Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг: 6 алхам

Видео: Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг: 6 алхам
Видео: 50 САМЫХ ИННОВАЦИОННЫХ ЛИЧНЫХ ТРАНСПОРТНЫХ СРЕДСТВ 2021–2022 гг. 2024, Арваннэгдүгээр
Anonim
Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг
Эцсийн төлөвт машиныг ашиглан Arduino дээрх дижитал цаг

Сайн байна уу, би танд YAKINDU Statechart Tools ашиглан дижитал цаг бүтээж, LCD товчлуурын бамбай ашигладаг Arduino дээр хэрхэн ажиллахыг харуулах болно.

Дижитал цагны анхны загварыг Дэвид Харелээс авсан болно. Тэрээр энэ тухай нийтлэл нийтэлжээ

"[…] төлөв байдлын машин ба төлөв байдлын уламжлалт формализмыг өргөтгөх."

Энэхүү нийтлэлдээ тэрээр судалгаандаа дижитал цагны жишээг ашигласан болно. Би үүнийг урам зориг болгон ашиглаж, цагийг YAKINDU Statechart Tools (төрийн машинуудын график загварыг бүтээх, түүнтэй хамт C/C ++ код үүсгэх хэрэгсэл) ашиглан дахин бүтээж, Arduino дээр дахин амьдруулсан.

Хангамж

Техник хангамж:

  • Arduino Uno эсвэл Mega
  • LCD товчлуурын бамбай

Програм хангамж:

  • YAKINDU Statechart хэрэгсэл
  • Arduino -д зориулсан Eclipse C ++ IDE

Алхам 1: Дижитал цаг хэрхэн ажилладаг талаар

Image
Image

Дижитал цаг хэрхэн ажиллах ёстойг тодорхойлж эхэлье. 90 -ээд оны үед хүн бүхэнд байсан "хэт дажгүй" дижитал цагийг та санаж байна уу? Нэгдсэн секундомер, өөр өөр дохиолол, бүтэн цаг тутамд залхаах дохио. Хэрэв үгүй бол 90 -ээд оны дижитал цагийг үзээрэй.

Үндсэндээ энэ бол янз бүрийн горимтой, тохируулж болох цаг юм. Үндсэндээ одоогийн цагийг харуулах боловч бусад онцлог шинж чанарууд байдаг. Оролтын хувьд танд асаах/унтраах, горим, тохируулах товчлуур байна. Үүнээс гадна та гэрлийг асааж, унтрааж болно. Горимын товчлуурын тусламжтайгаар та горимыг ялгаж, цагийн онцлогийг идэвхжүүлэх/идэвхгүй болгох боломжтой.

  • Цагийг харуулах (Цаг)
  • Огноог харуулах (Огноо)
  • Сэрүүлгийг тохируулах (Сэрүүлэг 1, Сэрүүлэг 2)
  • Хонхыг идэвхжүүлэх/идэвхгүй болгох (Хонхыг тохируулах)
  • Секундомер ашиглах (Stop Watch)

Цэс дотор та горимыг тохируулахын тулд асаах/унтраах товчийг ашиглаж болно. Set товчлуур нь танд цагийг тохируулах боломжийг олгодог. цаг эсвэл сэрүүлгийн хувьд. Секундомерыг асаах, унтраах товчлуурыг ашиглан асааж, зогсоож болно. Та мөн нэгдсэн тойрог ашиглаж болно

Цаашилбал, бүтэн цаг тутамд хонх дардаг, хянаж болдог арын гэрэлтүүлэг байдаг. Эхний алхам дээр би тэднийг Arduino руу холбосонгүй.

Алхам 2: Төрийн машин

LCD товчлуурын бамбай
LCD товчлуурын бамбай

Энэ жишээг тайлбарлахын тулд би нарийвчлан судлахыг хүсэхгүй байна. Энэ нь хэтэрхий төвөгтэй учраас биш, жаахан хэтэрхий том юм. Энэ нь хэрхэн ажилладаг талаархи үндсэн санааг тайлбарлахыг хичээх болно. Гүйцэтгэл нь загварыг үзэх, татаж авах, загварчлах замаар өөрийгөө тайлбарлах ёстой. Төрийн машины зарим хэсгийг тогтоосон цагийн бүс шиг дэд бүсэд нэгтгэн харуулав. Үүний тусламжтайгаар төрийн машины унших чадварыг хангах ёстой.

Энэхүү загварыг график болон текст гэсэн хоёр хэсэгт хуваажээ. Текст хэсэгт үйл явдал, хувьсагч гэх мэтийг тодорхойлох болно. График хэсэгт - төлөв байдлын диаграм - загварын логик гүйцэтгэлийг зааж өгсөн болно. Тодорхойлсон зан төлөвт нийцсэн төлөв байдлын машиныг бий болгохын тулд загварыг ашиглах боломжтой оролтын зарим үйл явдал шаардлагатай: унтраах, тохируулах, горим, гэрэл, гэрэл_r. Тодорхойлолт хэсэгт 100 ms тутамд цаг хугацааны утгыг нэмэгдүүлдэг дотоод үйл явдлыг ашигладаг.

100 мс / цаг тутамд += 1

100 ms алхам дээр үндэслэн одоогийн цагийг HH: MM: SS форматаар тооцоолно.

display.first = (цаг / 36000) % 24;

display.second = (цаг / 600) % 60; display.third = (цаг / 10) % 60;

Төлөвлөсөн машиныг дуудах бүртээ updateLCD үйлдлийг ашиглан утгыг LCD дэлгэц рүү холбоно.

display.updateLCD (дэлгэц, эхний, дэлгэц, секунд, дэлгэц, гурав дахь, дэлгэцийн текст)

Төрийн машины үндсэн гүйцэтгэлийг дижитал цаг хэрхэн ажилладаг хэсэгт аль хэдийн тодорхойлсон болно. Энэ хэрэгсэлд би CompositeState, History, Sub-Diagrams, ExitNodes гэх мэт зарим "тусгай" загварчлалын элементүүдийг ашигласан болно. Нарийвчилсан тайлбарыг Хэрэглэгчийн гарын авлагаас олж болно.

Алхам 3: LCD товчлуурын бамбай

LCD товчлуур бамбай нь энгийн төслүүдийн хувьд нэлээд дажгүй бөгөөд дүрслэлийг харуулах дэлгэц, зарим товчлуурыг оруулах шаардлагатай байдаг - энгийн, энгийн HMI (Хүний машины интерфейс). LCD товчлуурын бамбай нь таван хэрэглэгчийн товчлууртай бөгөөд дахин тохируулах өөр нэг товчлууртай. Таван товчлуур нь бүгд Arduino -ийн A0 зүүтэй холбогдсон байна. Тэд тус бүр нь хүчдэл хуваагчтай холбогдсон бөгөөд энэ нь товчлууруудыг хооронд нь ялгах боломжийг олгодог.

Та analogRead (0) ашиглан тодорхой утгыг олох боломжтой бөгөөд энэ нь мэдээж үйлдвэрлэгчээс ялгаатай байж болно. Энэхүү энгийн төсөл нь LCD дээрх одоогийн утгыг харуулна.

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

Эдгээр босгуудын тусламжтайгаар товчлууруудыг унших боломжтой:

#define NONE 0 #тодорхойлох SELECT 1 #define LEFT 2 #DOWNE3 тодорхойлох #UP 4 тодорхойлох #ЗӨВ 5 static int readButton () {int result = 0; үр дүн = analogRead (0); if (үр дүн <50) {ЗӨВ буцах; } if (үр дүн <150) {буцах UP; } if (үр дүн <300) {буцах DOWN; } if (үр дүн <550) {LEFT буцах; } if (үр дүн <850) {буцах SELECT; } буцах NONE; }

Алхам 4: Төрийн машинтай харилцах

Төрийн машинтай харилцах
Төрийн машинтай харилцах

Мужийн машины үүсгэсэн C ++ код нь интерфейсийг хангадаг бөгөөд үүнийг төрийн машиныг хянахын тулд хэрэгжүүлэх ёстой. Эхний алхам бол үйл явдлыг Keypad Shield товчлууруудтай холбох явдал юм. Би товчлууруудыг хэрхэн уншихыг аль хэдийн харуулсан, гэхдээ тэдгээрийг төрийн машинд холбохын тулд товчлууруудыг тайлах шаардлагатай байдаг, эс тэгвээс үйл явдлуудыг олон удаа давтаж, урьдчилан таамаглах аргагүй байдалд хүргэдэг. Програм хангамжийн дебютингийн тухай ойлголт шинэ зүйл биш юм. Та Arduino -ийн баримт бичгийг үзэх боломжтой.

Хэрэгжүүлэх явцад би унаж буй ирмэгийг олж мэдэв (товчлуурыг суллах). Би товчлуурын утгыг уншиж, 80 ms -ийг хүлээ (50 -ийн оронд 80 -аар илүү сайн үр дүнд хүрсэн), үр дүнг хадгалаад шинэ утгыг уншина уу. Хэрэв oldResult нь NONE биш (дарагдаагүй) биш бөгөөд шинэ үр дүн нь NONE бол товчлуурыг өмнө нь дарж байсан бөгөөд одоо суллагдсан гэдгийг би мэднэ. Дараа нь би төрийн машины оролтын үйл явдлыг нэмэгдүүлдэг.

int oldState = NONE; static void boostEvents () {int buttonPressed = readButton (); саатал (80); oldState = товчлуур дарагдсан; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> boost_mode (); завсарлага; } тохиолдолд Зүүн: {stateMachine-> getSCI_Button ()-> boost_set (); завсарлага; } тохиолдолд ДОО: {stateMachine-> getSCI_Button ()-> boost_light (); завсарлага; } тохиолдолд UP: {stateMachine-> getSCI_Button ()-> boost_light_r (); завсарлага; } тохиолдолд ЗӨВ: {stateMachine-> getSCI_Button ()-> boost_onoff (); завсарлага; } анхдагч: {завсарлага; }}}}

Алхам 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 = одоогийн_ цаг; current_time = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

Алхам 6: Жишээ авах

Ингээд л боллоо. Магадгүй би хэрэгжилтийн бүх нарийн ширийн зүйлийг дурдаагүй байж магадгүй, гэхдээ та жишээг үзэж эсвэл сэтгэгдлээ үлдээж болно.

Жишээг ажиллаж буй IDE дээр нэмнэ үү: Файл -> Шинэ -> Жишээ -> YAKINDU Statechart -ийн жишээ -> Дараагийн -> Arduino -Дижитал цаг (C ++)

> Та IDE -г эндээс татаж авах боломжтой <<

Та 30 хоногийн туршилтаар эхлүүлж болно. Үүний дараа та арилжааны бус зорилгоор ашиглах үнэгүй лиценз авах ёстой.

Зөвлөмж болгож буй: