Mundarija:

Arduino -dagi cheklangan holat mashinasi yordamida raqamli soat: 6 qadam
Arduino -dagi cheklangan holat mashinasi yordamida raqamli soat: 6 qadam

Video: Arduino -dagi cheklangan holat mashinasi yordamida raqamli soat: 6 qadam

Video: Arduino -dagi cheklangan holat mashinasi yordamida raqamli soat: 6 qadam
Video: Самодельные OLED часы на Arduino 2024, Noyabr
Anonim
Arduino -da cheklangan holat mashinasi yordamida raqamli soat
Arduino -da cheklangan holat mashinasi yordamida raqamli soat

Salom, men sizga raqamli soatni YAKINDU Statechart Tools yordamida yaratish va LCD klaviatura qalqoni yordamida Arduino -da ishlashni ko'rsataman.

Raqamli soatlarning asl modeli Devid Xareldan olingan. U haqida maqola chop etdi

"[…] davlat mashinalari va holat diagrammalarining an'anaviy rasmiyatchiligini kengaytirish."

Ushbu maqolada u o'z tadqiqotlari uchun raqamli soatlardan foydalangan. Men uni ilhom sifatida ishlatdim va soatni YAKINDU Statechart Tools (davlat mashinalarining grafik modellarini yaratish va C/C ++ kodini yaratish vositasi) yordamida qayta qurdim va uni Arduino -da hayotga qaytardim.

Ta'minotlar

Uskuna:

  • Arduino Uno yoki Mega
  • LCD klaviatura qalqoni

Dasturiy ta'minot:

  • YAKINDU Statechart asboblari
  • Arduino uchun Eclipse C ++ IDE

1 -qadam: Raqamli soat qanday ishlaydi

Image
Image

Raqamli soat qanday ishlashi kerakligini aniqlashdan boshlaylik. Siz eslayapsizmi … aytaylik … 90 -yillarda hamma qo'lga kiritgan "juda ajoyib" raqamli soatlar? Integratsiyalangan sekundomer, turli signallar va uning zerikarli ovozli signallari har soatda. Agar yo'q bo'lsa, qarang: 90 -yillarning raqamli soatlari.

Shunday qilib, bu turli xil rejimlarga ega sozlanadigan soat. Asosan, joriy vaqt ko'rsatiladi, lekin boshqa xususiyatlar ham bor. Kirish sifatida sizda yoqish/o'chirish, rejim va sozlash tugmasi mavjud. Bundan tashqari, siz chiroqni yoqishingiz va o'chirishingiz mumkin. Rejim tugmasi yordamida siz rejimlarni ajrata olasiz va soat xususiyatlarini yoqishingiz/o'chirishingiz mumkin:

  • Vaqtni ko'rsatish (soat)
  • Sanani ko'rsatish (sana)
  • Signalni o'rnatish (signal 1, signal 2)
  • Qo'ng'iroqni yoqish/o'chirish (qo'ng'iroqni o'rnatish)
  • Sekundomerdan foydalaning (Stop Watch)

Menyularda rejimni sozlash uchun yoqish/o'chirish tugmasidan foydalanishingiz mumkin. O'rnatish tugmasi vaqtni belgilash imkonini beradi - masalan. soat yoki budilnik uchun. Chiroqni yoqish va o'chirish tugmasi yordamida sekundomerni boshqarish - ishga tushirish va to'xtatish mumkin. Bundan tashqari, o'rnatilgan taymerdan foydalanishingiz mumkin

Bundan tashqari, har bir soatda qo'ng'iroq qiladigan qo'ng'iroq va boshqariladigan orqa yorug'lik o'rnatilgan. Birinchi qadamda men ularni Arduino -ga ulamadim.

2 -qadam: Davlat mashinasi

LCD klaviatura qalqoni
LCD klaviatura qalqoni

Men bu misolni tushuntirish uchun batafsil ma'lumotga ega bo'lishni xohlamayman. Bu juda murakkab bo'lgani uchun emas, balki biroz kattaroq. Men bu qanday ishlashini tushuntirishga harakat qilaman. Modelni ko'rib chiqish yoki uni yuklab olish va taqlid qilish orqali ijro o'z-o'zidan tushuntirilishi kerak. Davlat mashinasining ba'zi qismlari, belgilangan vaqt mintaqasi kabi, kichik mintaqalarda yig'iladi. Bu bilan davlat mashinasining o'qilishi ta'minlanishi kerak.

Model ikki qismga bo'lingan - grafik va matnli. Matn qismida voqealar, o'zgaruvchilar va boshqalar aniqlanadi. Grafik qismda - holat diagrammasi - modelning mantiqiy bajarilishi ko'rsatilgan. Belgilangan xatti -harakatlarga javob beradigan davlat mashinasini yaratish uchun modelda ishlatilishi mumkin bo'lgan ba'zi kirish hodisalari talab qilinadi: o'chirish, sozlash, rejim, yorug'lik va nur_r. Ta'rif bo'limida har 100 msda vaqt qiymatini oshiruvchi ichki hodisa ishlatiladi:

har 100 ms / marta += 1

100 ms qadamlarga asoslanib, joriy vaqt HH: MM: SS formatida hisoblanadi:

display.first = (vaqt / 36000) % 24;

display.second = (vaqt / 600) % 60; display.third = (vaqt / 10) % 60;

Qiymatlar LCD displeyiga har safar davlat mashinasi chaqirilganda, updateLCD operatsiyasidan foydalanib ulanadi.

display.updateLCD (display.birinchisi, display.sekund, display.third, display.text)

Davlat mashinasining asosiy bajarilishi "Raqamli soat qanday ishlaydi" bo'limida allaqachon aniqlangan. Asbob ichida men CompositeState, History, Sub-Diagrams, ExitNodes va boshqalar kabi "maxsus" modellashtirish elementlaridan foydalanardim. Batafsil tavsifni Foydalanuvchi qo'llanmasida topish mumkin.

3 -qadam: LCD klaviatura qalqoni

LCD klaviatura qalqoni oddiy loyihalar uchun juda zo'r, ular vizualizatsiya uchun ekranni va kirish uchun ba'zi tugmalarni talab qiladi - odatiy, oddiy HMI (inson mashinasi interfeysi). LCD klaviatura qalqoni beshta foydalanuvchi tugmachasini o'z ichiga oladi, ikkinchisi esa asl holatini tiklash uchun. Beshta tugma birgalikda Arduino A0 piniga ulangan. Ularning har biri tugmachalarni ajratish imkonini beradigan kuchlanish taqsimlagichga ulangan.

Aniq qiymatlarni topish uchun analogRead (0) dan foydalanishingiz mumkin, bu albatta ishlab chiqaruvchidan farq qilishi mumkin. Ushbu oddiy loyiha joriy qiymatni LCD displeyda aks ettiradi:

#"Arduino.h" ni qo'shing

#clude "LiquidCrystal.h" LiquidCrystal lcd (8, 9, 4, 5, 6, 7); void setup () {lcd.begin (16, 2); lcd.setCursor (0, 0); lcd.write ("O'lchangan qiymat"); } void loop () {lcd.setCursor (0, 1); lcd.print (""); lcd.setCursor (0, 1); lcd.print (analogRead (0)); kechikish (200); }

Bu mening o'lchagan natijalarim:

  • Yo'q: 1023
  • Tanlang: 640
  • Chapda: 411
  • Pastga: 257
  • Yuqoriga: 100
  • O'ng: 0

Ushbu chegaralar bilan tugmalarni o'qish mumkin:

#define NONE 0 #define SELECT 1 #define LEFT 2 #dewne DOWN 3 #define UP 4 #deftine RIGHT 5 static int readButton () {int result = 0; natija = analogRead (0); if (natija <50) {O'ngga qaytish; } if (natija <150) {qaytish UP; } if (natija <300) {qaytish DOWN; } if (natija <550) {LEFT qaytish; } if (natija <850) {qaytish SELECT; } NONE qaytarish; }

4 -qadam: Davlat mashinasini o'zaro bog'lash

Davlat mashinasini o'zaro bog'lash
Davlat mashinasini o'zaro bog'lash

Shtat mashinasining yaratilgan C ++ kodi interfeyslarni ta'minlaydi, ular shtat mashinasini boshqarish uchun bajarilishi kerak. Birinchi qadam - voqealarni klaviatura qalqoni bilan ulash. Men tugmalarni qanday o'qishni ko'rsatdim, lekin ularni davlat mashinasiga ulash uchun tugmalarni o'chirish kerak - aks holda, voqealar bir necha bor ko'tariladi, bu esa oldindan aytib bo'lmaydigan xatti -harakatlarga olib keladi. Dasturiy ta'minotni o'chirish tushunchasi yangi emas. Siz Arduino hujjatlariga qarashingiz mumkin.

Amalga oshirishda men tushayotgan chekkani aniqlayman (tugmani qo'yib yuborish). Men tugma qiymatini o'qidim, 80 ms kuting (50 o'rniga 80 bilan yaxshi natijalarga erishdim), natijani saqlang va yangi qiymatni o'qing. Agar oldResult NONE (bosilmagan) bo'lmasa va yangi natija NONE bo'lsa, bilaman, tugma oldin bosilgan va hozir qo'yib yuborilgan. Keyin, men davlat mashinasining kirish hodisasini ko'taraman.

int oldState = NONE; statik void elevEvents () {int tugmasi Pressed = readButton (); kechikish (80); oldState = tugmasi bosildi; if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> boost_mode (); tanaffus; } QOLG'I holat: {stateMachine-> getSCI_Button ()-> ko'tarish_set (); tanaffus; } holat DOWN: {stateMachine-> getSCI_Button ()-> ko'tarish_light (); tanaffus; } holat UP: {stateMachine-> getSCI_Button ()-> ko'tarish_light_r (); tanaffus; } holat HAQIQI: {stateMachine-> getSCI_Button ()-> oshirish_onoff (); tanaffus; } standart: {break; }}}}

5 -qadam: narsalarni birgalikda ulash

Asosiy dastur uchta qismdan iborat:

  • Davlat mashinasi
  • Taymer
  • Displeyni boshqaruvchi (odatda lcd.print (…))

DigitalWatch* stateMachine = yangi DigitalWatch (); CPPTimerInterface* timer_sct = yangi CPPTimerInterface (); DisplayHandler* displayHandler = yangi DisplayHandler ();

Shtat mashinasi displey boshqaruvchisidan foydalanadi va taymerga ega bo'ladi, u vaqtli voqealarni boshqarish uchun yangilanadi. Shundan so'ng, davlat mashinasi ishga tushiriladi va kiritiladi.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler); stateMachine-> setTimer (timer_sct); stateMachine-> init (); stateMachine-> kiriting (); }Loop uchta narsani bajaradi:

  • Kirish hodisalarini ko'taring
  • O'tgan vaqtni hisoblang va taymerni yangilang
  • Davlat mashinasini chaqiring

long current_time = 0; long last_cycle_time = 0; void loop () {boostEvents (); last_cycle_time = joriy_ vaqt; joriy_vaqt = millis (); timer_sct-> updateActiveTimer (stateMachine, current_time - last_cycle_time); stateMachine-> runCycle (); }

6 -qadam: misolni oling

Bo'ldi shu. Ehtimol, men amalga oshirishning barcha tafsilotlarini aytmaganman, lekin siz misolni ko'rib chiqishingiz yoki sharh qoldirishingiz mumkin.

Misolni ishlaydigan IDE -ga quyidagilar bilan qo'shing: Fayl -> Yangi -> Misol -> YAKINDU Statechart misollari -> Keyingi -> Arduino -Raqamli soat (C ++)

> IDE -ni bu yerdan yuklab olishingiz mumkin <<

Siz 30 kunlik sinovdan boshlashingiz mumkin. Shundan so'ng, siz notijorat maqsadlarda foydalanish uchun bepul bo'lgan litsenziyani olishingiz kerak!

Tavsiya: