Mundarija:

Magicbit (Arduino) yordamida aqlli budilnik: 10 qadam
Magicbit (Arduino) yordamida aqlli budilnik: 10 qadam

Video: Magicbit (Arduino) yordamida aqlli budilnik: 10 qadam

Video: Magicbit (Arduino) yordamida aqlli budilnik: 10 qadam
Video: Connecting with Arduino IDE 2024, Noyabr
Anonim
Image
Image

Bu qo'llanmada RTC modulini ishlatmasdan Magicbit dev platasidagi OLED displey yordamida aqlli budilnikni qanday yasash ko'rsatilgan.

Ta'minotlar

  • Magicbit
  • USB-A-Micro-USB kabeli

1 -qadam: hikoya

Ushbu qo'llanmada biz Magicbit yordamida aqlli budilnikni qanday yasashni bilib olamiz.

2 -qadam: QURILMALARNI O'RNATISH

USB kabel yordamida Magicbit -ni kompyuterga ulang.

3 -qadam: dasturiy ta'minotni o'rnatish

Arduino IDE -ni oching va taxtani Arduino IDE bilan o'rnating. Quyidagi havola buni qanday qilish kerakligini ko'rsatadi. Shuning uchun biz sizga avval Magic bit bilan bog'lanishni va tanishishni tavsiya qilamiz.

magicbit-arduino.readthedocs.io/en/latest/…

Endi to'g'ri taxta turi va portini tanlang. Bunday holda, taxtaning turi Magicbit. Kutubxonalar Magicbit kutubxonalarida bo'lganda allaqachon o'rnatilgan.

4 -qadam: nazariya va metodologiya

Agar siz birinchi videoni ko'rsangiz, displeyda 2 ta ekran borligini ko'rishingiz mumkin.

  • soat tafsilotlarini ko'rsatadigan soat ekrani
  • signal detallari ko'rsatiladigan signalli ekran

Bu ikkita ekranni almashtirish uchun biz Magicbit -dagi ikkita tugmachani ishlatardik. Ushbu tugmalar Magicbit -dagi ESP32 -ning 35 (chap tugma) va 34 (o'ng tugma) pinlariga ulangan. Vaqt va boshqa ma'lumotlarni ko'rsatish uchun biz sehrli bitda o'rnatilgan OLED -displeydan foydalanganmiz.

Keling, bu grafik ekranlar qanday ishlashi haqida gapiraylik.

Soat ekranida analog soat, raqamli soat, sana, oy va yil matnlari mavjud.

Analog soatni yaratish uchun biz grafik kutubxonasida mavjud bo'lgan Adafriut GFX grafik funktsiyalaridan foydalanamiz. Doira funktsiyasi va chiziq funktsiyasidan foydalanib, biz analog soat yuzini yaratamiz. Sin va cos deb nomlangan oddiy geometrik funktsiyalar soat qo'llari holatida ishlatiladi. Shunday qilib, biz faqat qo'llarni aylantirish vaqtiga mos keladigan burchakni kiritamiz. buning uchun biz birinchi navbatda vaqtni burchakka aylantiramiz.

  • qo'lning burchagi = daqiqa*(360/60)
  • soat burchagi = soat*(360/12)

Soat yuzining markazi va soat sonining 12 raqami orasidagi chiziq bo'yicha o'lchangan burchak. Sin va cos funktsiyalari yordamida biz soat va daqiqa chiziqlarining uchlari x va y koordinatalarini hisoblashimiz mumkin. Quyidagi rasmda uning holati tasvirlangan.

Koordinatalarga ko'ra, biz chizilgan chiziqlar yordamida soat va daqiqalarni qo'l bilan bosib chiqaramiz. Adafruit GFX kutubxonasida matnni bosib chiqarish funktsiyasi ham mavjud. Bu boshqa ma'lumotlarni (sana, oy va vaqtni raqam bilan ko'rsatish) displeyda chop etishga yordam beradi. Koddagi parametrlarni o'zgartirish orqali siz analog soat holatini va matn o'rnini o'zgartirishingiz mumkin.

Adafruit GFX kutubxonasida soat ekranida bo'lgani kabi, biz kerakli joylarda OLED -displeyda raqamlarni chop etish uchun matnni bosib chiqarish funktsiyasidan foydalanganmiz.

5 -qadam: Mahalliy vaqtni olish

Soatning eng muhim qismi - bu mahalliy vaqtni qanday aniq olishimiz. Buning uchun siz Magicbit -dagi ESP32 -da tashqi RTC -soat moduli yoki o'rnatilgan RC -soatidan foydalanishingiz mumkin. Ushbu loyihada biz ikkinchi usulni qo'lladik. Ushbu usulda biz Internetdan mahalliy vaqtni olish uchun NTP (tarmoq vaqti protokoli) mijozidan foydalanamiz. Internetga kirish uchun biz ESP32 -da o'rnatilgan WIFI -dan foydalanganmiz. Birinchi bosqichda biz SSID va parolni taqdim etish orqali Internetga kirish uchun WIFIdan foydalanamiz. Keyin gmtOffset va daylightOffset -ni soniyalarda o'zgaruvchilarda sozlashimiz kerak. Bu o'zgaruvchilarning qiymatlari dunyoning mintaqalaridan farq qiladi. gmtOffset - bu siz GMTdan farq qiladigan soniyalar sonini bildiradi … Ko'p hollarda daylightOffset - 3600. Siz uni Internetda topishingiz mumkin. Joriy mahalliy vaqtni olganimizdan so'ng, biz endi WIFIdan foydalanmaymiz. Chunki biz ESP32 -dagi o'rnatilgan RC -soatdan mahalliy vaqtni hisoblaymiz. Bu time.h kutubxonasi yordamida amalga oshiriladi. Arduino -da oddiy misol bor (Arduino> Misollar> ESP32> Vaqt> oddiy vaqt), bu sizga bundan keyin qanday ishlashini bilib olishga yordam beradi. Bundan tashqari, ushbu havolalardan siz NTP mijozi haqida qo'shimcha ma'lumot olishingiz mumkin.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

Mahalliy vaqtni to'g'ri qabul qilgandan so'ng, biz har bir tsiklda o'sha vaqtga qarab matn va burchakni ko'rsatish vaqtini o'zgartiramiz.

6 -qadam: signalni o'rnatish

Chap va o'ng tugmachalarni bosish orqali siz signal sanasi va vaqtini o'zgartirishingiz mumkin. Budilnik sanasi va vaqtini o'zgartirganda, signalni o'chirib qo'yganingizga ishonch hosil qiling. Sana va vaqtni o'rnatgandan so'ng, signalni yoqing. Chunki, agar signal yoqilgan bo'lsa va siz uni o'rnatayotganda signal vaqti sizning hozirgi vaqtingizga teng bo'lsa, signal qo'ng'irog'i jiringlaydi. Asosiy tsiklda har doim joriy mahalliy vaqt tekshiriladi va signal ma'lumotlari teng bo'ladi. Agar ular teng bo'lsa, Magicbit -dagi yashil LED -signalli signal bir daqiqada ishlaydi.

7 -qadam: Buzzerni sozlash

Biz kodda analogCwrite () funktsiyasidan foydalanib, signal signalini yaratish uchun PWM pulsidan foydalanamiz. Kutubxonaning barcha funktsiyalari ESP32 da bo'lgani uchun Magicbit uchun amal qiladi. Siz signal signalining tovushini kodning chastotasi va PWM qiymatidan o'zgartirishingiz mumkin.

techtutorialsx.com/2017/06/15/esp32-arduin…

Bu sahifada buzzerning ESP32 bilan qanday ishlashi haqida yozilgan.

8 -qadam: tugmachalarni o'rnatish

Barcha holatlarni o'zgartirish uchun biz Magicbit -da ikkita o'rnatilgan tugmachadan foydalanganmiz. Asosiy pastadir har doim ikkita tugma holatini tekshiradi. Chunki ular ichkariga ko'tarilishgan, normal holat - bu yuqori signal. Shunday qilib, siz bu pinlarning raqamli o'qilishini ko'rishingiz mumkin. 1. Standart bosqichda displey soat interfeysini ko'rsatadi. O'sha paytda, ikkita tugmachadan birortasi bosilsa, u ekranni signal ekraniga o'zgartiradi. Shuningdek, biz oxirgi marta tugma bosilgan vaqtni soniyalarda hisoblaymiz. Agar bu raqam oldindan belgilangan vaqtdan katta bo'lsa, displeyda soat ekrani ko'rsatiladi.

Kod yangi boshlanuvchilar uchun asosiy funktsiyalar yordamida yozilgan. Shunday qilib, kodni tushunish oson va siz uning qanday ishlashini kodga murojaat qilib bilib olishingiz mumkin.

9 -qadam: Muammolarni bartaraf etish

Ba'zida soat biroz keyinroq boshlanadi yoki grafik to'g'ri ko'rsatilmaydi. Quyidagi maslahatlar vaziyatni hal qilishga yordam beradi.

  • To'g'ri SSID va parolni berganingizga ishonch hosil qiling
  • NTP serverini o'zgartiring (siz o'zingizning mintaqangizga tegishli bo'lgan ko'plab serverlarni topishingiz mumkin).
  • Internet aloqasini o'zgartiradi. (Mobil ulanish nuqtasi ham mumkin).

Bundan tashqari, ketma -ket monitor yordamida hamma narsani hal qilishingiz mumkin. OLED displeyidan tashqari ketma -ket monitor vaqt ma'lumotlarini ko'rsatadi.

10 -qadam: Arduino kodi

// OLED displey uchun kutubxonalar

#qo'shing

#include #include #delein OLED_RESET 4 #include // ulanish uchun wifi kutubxonasi #include "time.h" // kutubxonadan foydalanish uchun RC soati // kirish va chiqish pin nomlarini belgilash #o'ng tugmachasini belgilash 34 #chap tugmachasini 35 belgilash #Greenfilmni belgilash. #define Buzzer 25 int preTime = 0; int soni = 0; int currentTime = 0; tm timeinfo tuzilishi; const char* ssid = "SIZNING SSID"; // wifi tafsilotlari const char* password = "PAROLINGIZ"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // signal varibles int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; int rekt [6] [4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}}; // tanlash to'rtburchaklar const char* ntpServer = "asia.pool.ntp.org"; // server uzoq muddatli gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 displeyi (128, 64); // OLED o'lchami bayt soatini belgilaydiCenterY = (display.height () + 16)/2; bayt soatRadius = 23; bool holati = 0; // ekran yoqilgan yoki o'chirilgan boolean Signal = 0; // signalning joriy holati String alarmState = "Signal ON"; // signal yoqilgan yoki o'chirilgan // varibles saqlangan vaqt ma'lumotlari char dayName [10]; char kunduzi [3]; char oy [10]; chor yil [5]; char soat [3]; char daqiqalari [3]; char oy raqami [3]; char soniyalar [3]; // tugma o'zgaruvchilari bool RightState = 1; bool LeftState = 1; // buzzer o'zgaruvchilari int channel = 0; int chastotasi = 2000; int PWM = 200; int o'lchamlari = 8; void setup () {// pinMode (RightButton, INPUT) kirish va chiqishlarini sozlash; pinMode (Chap tugma, Kirish); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); kechikish (3000); display.clearDisplay (); ledcSetup (0, chastota, piksellar sonini); // pwm parametrlarini sozlash ledcAttachPin (Buzzer, 0); Serial.begin (115200); // ketma -ket aloqani uzish // WiFi -ga ulanish Serial.printf (" %s ga ulanish", ssid); WiFi.begin (ssid, parol); while (WiFi.status ()! = WL_CONNECTED) {kechiktirish (500); Serial.print ("."); } Serial.println ("ULANGAN"); // init va configTime vaqtini oling (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // WiFi -ni uzing, chunki u endi kerak emas WiFi.disconnect (rost); WiFi rejimi (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // joriy vaqtni olish // o'ng va chap tugmachalarini saqlang RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // chaeck tugunlari bosiladi, agar (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // tugma bosilganda ovozli signal kechiktiruvchi signal chiqaradi (100); if (holat == 0) {// signal ekranining ramka holatiga o'zgartirish = 1; // holatni signal holatiga o'zgartirish RightState = LeftState = 1; // bizga faqat sceern} count = 0; // hisoblagichni tiklash} (holat == 1 && (hisoblar) <5) {// agar signal ekranida bo'lsa va vaqt tugashi hisoblanmasa, Signal (); // signal signalining vaqt qiymatlarini hisoblash showAlarm (); // qiymatlarni ko'rsatish} boshqa {// agar soat bo'lsa ekran holati = 0; display.clearDisplay (); clockFace (); // analog soat yuzi printLocalTime (); // soat yuzida chop etish vaqti va boshqa tafsilotlarni chop etish} onAlarm (); // signal vaqtini mahalliy vaqt bilan solishtiring va signal kechikishini yoqing (100); // uchun kechikish signalni yoqish va o'chirish} void clockFace () {// soatning yuzini ko'rsatuvchi katalog.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); selctions.sozini -1 ga qaytarish (-1 = o'chirish yoki o'chirish) selectIndex = -1; } dateAndTimeSelection (selectIndex); // tanlashni o'zgartirish} void dateAndTimeSelection (int index) {if (index == -1) {// signal yoqilgan yoki o'chirilgan bo'lsa (RightState == 0) {// agar bo'lsa signalni yoqish va o'chirish (alarmState == "Signal yoqilgan") {alarmState = "Signal o'chirilgan"; } else {alarmState = "Signal yoqilgan"; }}} else {if (RightState == 0) {// boshqa tanlovlarda alarmDateTime [index] = alarmDateTime [index] + 1 qatoridagi sana yoki vaqtni belgilaydi. // indeks - bu tanlov}} int solish [4] = {12, 2030, 23, 59}; // sana va yillarning yuqori chegaralari int comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // oylarning yuqori limiti int resetValue [4] = {1, 2020, 0, 0}; // boshlang'ich qiymatlari (int i = 1; i [i - 1] ni taqqoslayman) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> taqqoslash [alarmDateTime [1] - 1]) {// oylar chegaralaridan kattaroq bo'lsa, vlaues -ni tiklash alarmDateTime [0] = 1; }} void showAlarm () {// signal detallarini chop etish String alarmDateTime0 = String (alarmDateTime [0]); // stinglarni ko'rsatish String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // agar qiymatlar bitta 1 raqamli bo'lsa, ularga "0" qo'shing. agar (alarmDateTime [0]

Tavsiya: