Mündəricat:

Magicbit (Arduino) istifadə edərək ağıllı zəngli saat: 10 addım
Magicbit (Arduino) istifadə edərək ağıllı zəngli saat: 10 addım

Video: Magicbit (Arduino) istifadə edərək ağıllı zəngli saat: 10 addım

Video: Magicbit (Arduino) istifadə edərək ağıllı zəngli saat: 10 addım
Video: Connecting with Arduino IDE 2024, Iyul
Anonim
Image
Image

Bu dərslik, heç bir RTC modulu istifadə etmədən Magicbit dev board -da OLED displeydən istifadə edərək ağıllı zəngli saatın necə hazırlanacağını göstərir.

Təchizat

  • Magicbit
  • USB-A-dan Mikro-USB Kabelinə

Addım 1: Hekayə

Bu təlimatda Magicbit istifadə edərək ağıllı bir zəngli saatın necə hazırlanacağını öyrənəcəyik.

Addım 2: DONANIM AYARLARI

USB kabelindən istifadə edərək Magicbit -i kompüterə qoşun.

Addım 3: YAZILIM AYARLARI

Arduino IDE -ni açın və Arduino IDE ilə lövhəni qurun. Aşağıdakı link bunu necə edəcəyinizi göstərir. Beləliklə, əvvəlcə keçid etməyi və Magic bit ilə tanış olmağı məsləhət görürük.

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

İndi düzgün lövhə növünü və portu seçin. Bu vəziyyətdə lövhənin növü Magicbit -dir. Kitabxanalar Magicbit kitabxanalarında olduqda artıq quraşdırılmışdır.

Addım 4: nəzəriyyə və metodologiya

İlk videoya baxsanız, ekranın 2 ekranı olduğunu görə bilərsiniz.

  • saat detallarını göstərən saat ekranı
  • həyəcan detallarını göstərən həyəcan ekranı

Bu iki ekran arasında keçid etmək üçün Magicbit -də hər hansı iki düyməni basdıq. Bu düymələr Magicbit -də ESP32 -nin 35 (sol düymə) və 34 (sağ düymə) pininə bağlıdır. Vaxt və digər detalları göstərmək üçün magicbit -də quraşdırılmış OLED displeydən istifadə etdik.

Bu qrafik ekranların necə işlədiyindən danışaq.

Saat ekranında analog saat, rəqəmsal saat, tarix, ay və il mətnləri var.

Analog saat yaratmaq üçün Adafriut GFX adlı qrafik kitabxanasında mövcud olan bəzi qrafik funksiyalardan istifadə edirik. Dairə funksiyasından və xətt funksiyasından istifadə edərək analog saat üzü yaradırıq. Sin və cos adlanan sadə həndəsi funksiyalar saat əqrəblərinin mövqeyində istifadə olunur. Beləliklə, yalnız əllərin fırlanma vaxtına uyğun olan bucağı daxil edirik. Bunun üçün əvvəlcə vaxtı bucağa aşağıdakı kimi çeviririk.

  • dəqiqə əli = dəqiqə*(360/60)
  • saat açısı = saat*(360/12)

Saat üzünün mərkəzi ilə saat üzündəki 12 sayı arasındakı xəttə görə ölçülmüş bucaq. Sin və cos funksiyalarından istifadə edərək saat və dəqiqə xətlərinin uclarının x və y koordinatlarını hesablaya bilərik. Aşağıdakı şəkil bunun necə olduğunu izah edir.

Koordinatlara görə, çəkmə xətləri ilə saat və dəqiqə əlləri ilə çap edirik. Adafruit GFX kitabxanasında mətn çap funksiyası da var. Ekranda digər detalları (tarix, ay və vaxt rəqəmlə göstərin) çap etməyə kömək edir. Koddakı parametrləri dəyişdirərək analog saat mövqeyini və mətn mövqelərini dəyişə bilərsiniz.

Saat ekranı kimi, Adafruit GFX kitabxanasındakı mətn çap funksiyasından OLED displeydə uyğun yerlərdə çap etmək üçün istifadə etdik.

Addım 5: Yerli vaxt əldə edin

Saatın ən vacib hissəsi, yerli saatı necə dəqiq əldə etməyimizdir. Bunun üçün Magicbit -də ESP32 -də xarici RTC saat modulundan və ya daxili RC saatından istifadə edə bilərsiniz. Bu layihədə ikinci üsuldan istifadə etdik. Bu üsulda NTP (şəbəkə vaxtı protokolu) müştəri istifadə edərək, yerli vaxtı internetdən alırıq. İnternetə daxil olmaq üçün ESP32 -də quraşdırılmış WIFI qurğusundan istifadə etdik. Buna görə ilk mərhələdə SSID və parol təmin etməklə İnternetə daxil olmaq üçün WIFI -dən istifadə edirik. Sonra gmtOffset və daylightOffset -i saniyələr ərzində dəyişənlərdə konfiqurasiya etməliyik. Bu dəyişənlərin dəyərləri dünyada bölgədən bölgəyə fərqlidir. gmtOffset, GMT -dən fərqləndiyiniz saniyə sayı deməkdir.. Əksər hallarda gündüz işığı 3600 -dir. İnternetdə tapa bilərsiniz. Cari yerli vaxtı əldə etdikdən sonra artıq WIFI istifadə etmirik. Çünki ESP32 -də quraşdırılmış RC saatından yerli vaxtı hesablayırıq. Bu time.h kitabxanasından istifadə etməklə edilir. Bunun necə işlədiyini öyrənmək üçün Arduinoda sadə bir nümunə var (Arduino> Nümunələr> ESP32> Zaman> sadə vaxt). NTP müştəri haqqında daha çox məlumat əldə etmək üçün bu bağlantılardan da istifadə edə bilərsiniz.

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

Yerli saatı düzgün əldə etdikdən sonra, hər döngədə o vaxta uyğun olaraq mətnləri və bucağı göstərən vaxtımızı dəyişirik.

Addım 6: Siqnalın qurulması

Sol və sağ düymələri basaraq həyəcan tarixini və vaxt seçimini dəyişə bilərsiniz. Siqnalın tarixini və vaxtını dəyişdirərkən siqnalı söndürdüyünüzdən əmin olun. Tarixi və saatı təyin etdikdən sonra həyəcanı yandırın. Çünki həyəcan açılırsa və onu qurarkən həyəcan vaxtı hazırkı vaxtınıza bərabərdirsə, siqnal zəngi çalacaq. Əsas döngədə həmişə cari yerli vaxtı yoxlayır və həyəcan məlumatları bərabərdir. Bunlar bərabərdirsə, Magicbit -də yaşıl LED -in səs siqnalı bir dəqiqə ərzində işləyəcək.

Addım 7: Buzzerin qurulması

Koddakı analogCwrite () funksiyasından istifadə edərək səs siqnalı yaratmaq üçün PWM nəbzindən istifadə edirik. ESP32 -də olan bütün kitabxana funksiyaları Magicbit üçün etibarlıdır. Koddakı siqnalın tezliyini və PWM dəyərini dəyişdirməklə siqnalın bip səsini dəyişə bilərsiniz.

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

Bu səhifə, buzzerin ESP32 ilə necə işlədiyini izah edir.

Addım 8: Düymələrin qurulması

Bütün vəziyyətləri dəyişdirmək üçün Magicbit -də iki quraşdırılmış düyməni istifadə etdik. Əsas döngə həmişə iki düymənin vəziyyətini yoxlayır. Daxili olaraq çəkdikləri üçün normal vəziyyət yüksək siqnaldır. Beləliklə, bu pinlərin rəqəmsal oxunuşunun 1 olduğunu görə bilərsiniz. Varsayılan mərhələdə ekranda saat interfeysi göstərilir. O vaxt iki düymədən hər hansı birinə basıldıqda ekranı həyəcan ekranına dəyişir. Ayrıca, düyməni basıldığı son vaxtdan saniyələri sayırıq. Bu say əvvəlcədən təyin edilmiş müddətdən daha böyükdürsə, ekranda saat ekranı görünəcək.

Kod yeni başlayanlar üçün əsas funksiyalardan istifadə etməklə yazılmışdır. Beləliklə, kodu başa düşmək asandır və kodu işarə edərək necə işlədiyini öyrənə bilərsiniz.

Addım 9: Problemlərin aradan qaldırılması

Bəzən saat biraz sonra başlayır və ya qrafik düzgün göstərilmir. Aşağıdakı tövsiyələr vəziyyəti həll etməyə kömək edir.

  • Doğru SSID və şifrəni verdiyinizə əmin olun
  • NTP serverini dəyişdirin (bölgənizlə əlaqəli bir çox server tapa bilərsiniz).
  • İnternet bağlantısını dəyişir. (Mobil giriş nöqtəsi də mümkündür).

Serial monitordan istifadə edərək hər şeyi həll edə bilərsiniz. OLED ekrana əlavə olaraq serial monitor vaxt məlumatlarını göstərir.

Addım 10: Arduino Kodu

// OLED ekran üçün kitabxanalar

#daxil edin

#include #include #define OLED_RESET 4 #include // wifi kitabxanasına qoşulun #"time.h" daxil edin // istifadə üçün kitabxana RC saatı // giriş və çıxış pin adlarını təyin edin #sağ düyməni təyin edin 34 #define sol düyməni 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int sayar = 0; int currentTime = 0; zaman məlumatı qurmaq; const char* ssid = "SİZİN SSİDİNİZ"; // wifi detalları const char* parol = "ŞİFRİNİZ"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // həyəcan 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}}; // seçim düzbucaqlı const char* ntpServer = "asia.pool.ntp.org"; // serverin uzun müddətli gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 ekran (128, 64); // OLED ölçüsü byte clockCenterY = (display.height () + 16)/2; // analog saat üz detalları byte clockCenterX = (display.height () - 16)/2; bayt saatıRadius = 23; bool vəziyyəti = 0; // ekran açıq və ya söndürüldü boolean Alarm = 0; // həyəcanın cari vəziyyəti String alarmState = "Alarm ON"; // həyəcan açıq və ya söndürülmüş // varibles saxlanılan vaxt məlumatları char dayName [10]; char daynumber [3]; char ayı [10]; char il [5]; char saat [3]; char dəqiqə [3]; char ay nömrəsi [3]; char saniyələri [3]; // düymə dəyişənləri bool RightState = 1; bool LeftState = 1; // buzzer dəyişənləri int channel = 0; int Frequency = 2000; int PWM = 200; int qətnamə = 8; void setup () {// giriş və çıxışları təyin pinMode (RightButton, INPUT); pinMode (Sol düymə, GİRİŞ); pinMode (GreenLED, ÇIXIŞ); pinMode (Buzzer, Çıxış); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); gecikmə (3000); display.clearDisplay (); ledcSetup (0, Tezlik, qətnamə); // pwm parametrlərini konfiqurasiya edin ledcAttachPin (Buzzer, 0); Serial.begin (115200); // serial ünsiyyət qurmaq // WiFi -yə qoşulmaq Serial.printf (" %s -ə qoşulur", ssid); WiFi.begin (ssid, parol); while (WiFi.status ()! = WL_CONNECTED) {gecikmə (500); Serial.print ("."); } Serial.println ("BAĞLI"); // init və configTime vaxtını əldə edin (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // WiFi lazım olmadığından WiFi -ni ayırın.disconnect (doğru); WiFi rejimi (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // cari vaxtı əldə edin // sağ və sol düymələri saxla RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // düyməsinə basıldıqda səs siqnalı bip səsi gecikdirir (100); if (vəziyyət == 0) {// həyəcan ekranı çərçivə vəziyyətinə dəyişmək = 1; // vəziyyəti həyəcan vəziyyətinə dəyişdirmək RightState = LeftState = 1; // yalnız dəyişikliyə ehtiyacımız var} sayar = 0; // sayğac sıfırla} (vəziyyət == 1 && (sayılır) <5) {// həyəcan ekranında olarsa və heç bir zaman aşımı yoxdursaAlarm (); // həyəcan məlumatlarının vaxt dəyərlərini hesablayın showAlarm (); // dəyərləri göstərin} başqa {// saatda olarsa ekran vəziyyəti = 0; display.clearDisplay (); clockFace (); // analog saat üzü printLocalTime (); // saat üzündə çap vaxtı və digər detalları yazmaq} onAlarm (); // yerli vaxtla həyəcan vaxtını müqayisə edin və həyəcan gecikməsini yandırın (100); // üçün gecikmə həyəcan açılır və söndürülür} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, BEYAZ); selctions.so -1 olaraq sıfırlayın (-1 = açılır və ya sönür) selectIndex = -1; } dateAndTimeSelection (selectIndex); // dəyişdirmə seçimi} etibarsız dateAndTimeSelection (int index) {if (index == -1) {// həyəcan açılırsa və ya söndürülürsə (RightState == 0) {// əgər (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } başqa {alarmState = "Alarm AÇIQ"; }}} başqa {if (RightState == 0) {// digər seçimlərdə alarmDateTime [index] = alarmDateTime [index] + 1; // indeks seçimdir}} int müqayisə [4] = {12, 2030, 23, 59}; // tarixlərin və illərin yuxarı hədləri int müqayisədə [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // ayların yuxarı limi int resetValue [4] = {1, 2020, 0, 0}; // üçün başlanğıc dəyərlər (int i = 1; müqayisə [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> müqayisə ayı [alarmDateTime [1] - 1]) {// aylar öz limitlərindən böyükdürsə vlaues sıfırlayın alarmDateTime [0] = 1; }} void showAlarm () {// siqnal detallarını yaz String alarmDateTime0 = String (alarmDateTime [0]); // sancaqları String göstərmək üçün çevirin alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // dəyərlərin bir 1 rəqəmi varsa, onlara "0" əlavə edin. əgər (alarmDateTime [0]

Tövsiyə: