Spisu treści:

Inteligentny budzik za pomocą Magicbit (Arduino): 10 kroków
Inteligentny budzik za pomocą Magicbit (Arduino): 10 kroków

Wideo: Inteligentny budzik za pomocą Magicbit (Arduino): 10 kroków

Wideo: Inteligentny budzik za pomocą Magicbit (Arduino): 10 kroków
Wideo: Arduino 7: BUDZIK 2024, Listopad
Anonim
Image
Image

Ten samouczek pokazuje, jak zrobić inteligentny budzik za pomocą wyświetlacza OLED na płycie deweloperskiej Magicbit bez użycia modułu RTC.

Kieszonkowe dzieci

  • Magicbit
  • Kabel USB-A do Micro-USB

Krok 1: Historia

W tym samouczku dowiemy się, jak zrobić inteligentny budzik za pomocą Magicbit.

Krok 2: KONFIGURACJA SPRZĘTU

Podłącz Magicbit do komputera za pomocą kabla USB.

Krok 3: KONFIGURACJA OPROGRAMOWANIA

Otwórz swoje Arduino IDE i skonfiguruj płytkę za pomocą Arduino IDE. Poniższy link wskazuje, jak to zrobić. Dlatego zalecamy, aby najpierw przejść do linku i zapoznać się z bitem Magic.

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

Teraz wybierz właściwy typ płyty i port. W tym przypadku typem płytki jest Magicbit. Biblioteki są już zainstalowane w bibliotekach Magicbit.

Krok 4: Teoria i metodologia

Jeśli spojrzysz na pierwszy film, zobaczysz, że wyświetlacz ma 2 ekrany.

  • ekran zegara, który pokazuje szczegóły czasu
  • ekran alarmu pokazujący szczegóły alarmu

Do przełączania między tymi dwoma ekranami użyliśmy dowolnego przycisku dwóch w Magicbit. Przyciski te są podłączone do 35 (lewy przycisk) i 34 (prawy przycisk) pinów ESP32 w Magicbit. Do pokazania czasu i innych szczegółów wykorzystaliśmy wbudowany w magicbit wyświetlacz OLED.

Porozmawiajmy o tym, jak działają te ekrany graficzne.

Ekran zegara zawiera zegar analogowy, zegar cyfrowy, datę, miesiąc i rok.

Do tworzenia zegara analogowego wykorzystujemy kilka funkcji graficznych, które są dostępne w bibliotece graficznej Adafriut GFX. Wykorzystując funkcję okręgu i funkcję linii tworzymy analogową tarczę zegara. Proste funkcje geometryczne zwane sin i cos służą do określania położenia wskazówek zegara. Więc wprowadzamy tylko kąt, który odpowiada czasowi dla obrócenia rąk. w tym celu najpierw konwertujemy czas na kąt w następujący sposób.

  • kąt wskazówki minutowej=minuty*(360/60)
  • kąt godzin wskazówka=godziny*(360/12)

Kąt mierzony względem linii pomiędzy środkiem tarczy a liczbą 12 na tarczy zegara. Za pomocą funkcji sin i cos możemy obliczyć współrzędne x i y końców linii godzin i minut. Poniższy obrazek opisuje, jak to robi.

Zgodnie ze współrzędnymi wypisujemy wskazówkę godzinową i minutową za pomocą linii. W bibliotece Adafruit GFX istnieje również funkcja drukowania tekstu. Pomaga wydrukować inne szczegóły (data, miesiąc i godzina w postaci cyfr) na wyświetlaczu. Możesz zmienić pozycję zegara analogowego i pozycje tekstu, zmieniając parametry w kodzie.

Podobnie jak w przypadku ekranu zegara wykorzystaliśmy funkcję drukowania tekstu w bibliotece Adafruit GFX do drukowania liczb na wyświetlaczu OLED w odpowiednich miejscach.

Krok 5: Uzyskiwanie czasu lokalnego

Najważniejszą częścią zegara jest to, jak dokładnie odczytujemy czas lokalny. W tym celu można użyć zewnętrznego modułu zegara RTC lub wbudowanego zegara RC w ESP32 w Magicbit. W tym projekcie zastosowaliśmy drugą metodę. W tej metodzie używamy klienta NTP (network time protocall) do pobierania czasu lokalnego z Internetu. Do dostępu do internetu wykorzystaliśmy wbudowaną sieć WIFI w ESP32. Dlatego w pierwszym etapie korzystamy z sieci WIFI, aby uzyskać dostęp do Internetu, podając SSID i hasło. Następnie powinniśmy skonfigurować gmtOffset i daylightOffset w zmiennych w ciągu kilku sekund. Wartości tych zmiennych różnią się w zależności od regionu na świecie. gmtOffset oznacza liczbę sekund, o jaką różni się od GMT. Dla większości arów daylightOffset wynosi 3600. Można go znaleźć w internecie. Po otrzymaniu aktualnego czasu lokalnego nie korzystaliśmy już z WIFI. Bo wtedy czas lokalny obliczamy z wbudowanego zegara RC w ESP32. Odbywa się to za pomocą biblioteki time.h. Jest prosty przykład w Arduino (Arduino>Przykłady>ESP32>Czas>simpletime), aby dowiedzieć się, jak to działa dalej. Również te linki można wykorzystać do dalszej wiedzy na temat klienta NTP.

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

Po prawidłowym odczytaniu czasu lokalnego, zmieniamy nasz czas pokazując teksty i kąt zgodnie z tą informacją o czasie w każdej pętli.

Krok 6: Konfiguracja alarmu

Klikając lewy i prawy przycisk, możesz zmienić datę i godzinę alarmu. Pamiętaj, aby wyłączyć alarm podczas zmiany daty i godziny alarmu. Po ustawieniu daty i godziny włącz alarm. Ponieważ jeśli alarm jest włączony, a czas alarmu jest równy aktualnemu czasowi podczas jego konfigurowania, brzęczyk alarmu zadzwoni. W pętli głównej zawsze sprawdza, czy aktualny czas lokalny i informacje o alarmach są takie same. Jeśli są równe, to brzęczyk i wbudowana zielona dioda w Magicbit będą działać przez jedną minutę.

Krok 7: Konfiguracja brzęczyka

Używamy impulsu PWM do stworzenia dźwięku brzęczyka za pomocą funkcji analogCwrite() w kodzie. Ze względu na to, że wszystkie funkcje biblioteczne są w ESP32 obowiązuje dla Magicbit. Możesz zmienić dźwięk brzęczyka od zmiany jego częstotliwości i wartości PWM w kodzie.

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

Ta strona opisuje jak brzęczyk współpracuje z ESP32.

Krok 8: Konfiguracja przycisków

Do zmiany wszystkich stanów użyliśmy dwóch wbudowanych przycisków w Magicbit. Pętla główna zawsze sprawdza stan dwóch przycisków. Ponieważ podciągnęli się wewnętrznie, normalny stan to wysoki sygnał. Możesz więc zobaczyć, że cyfrowy odczyt tych pinów wynosi 1. Na domyślnym etapie wyświetlacz pokazuje interfejs zegara. W tym czasie, po naciśnięciu dowolnego z dwóch przycisków, zmienia się ekran na ekran alarmu. Ponadto liczymy czas w sekundach od ostatniego naciśnięcia przycisku. Jeśli ta liczba jest większa niż określony wcześniej czas, na wyświetlaczu pojawi się ekran zegara.

Kod jest pisany przy użyciu podstawowych funkcji dla początkujących. Tak więc kod jest łatwy do zrozumienia i możesz nauczyć się metody, jak to działa, odwołując się do kodu.

Krok 9: Rozwiązywanie problemów

Czasami zegar uruchamia się nieco później lub nie wyświetla poprawnie grafiki. Poniższe wskazówki pomogą rozwiązać sytuację.

  • Upewnij się, że podałeś właściwy identyfikator SSID i hasło
  • Zmień serwer NTP (możesz znaleźć wiele serwerów z Internetu, które odnoszą się do twojego regionu).
  • Zmienia połączenie internetowe.(Możliwy jest również mobilny hotspot).

Możesz również rozwiązać wszystko za pomocą monitora szeregowego. Oprócz wyświetlacza szeregowego OLED monitor wyświetla informacje o czasie.

Krok 10: Kod Arduino

//biblioteki dla wyświetlacza OLED

#włączać

#include #include #define OLED_RESET 4 #include //biblioteka wifi do podłączenia #include "time.h"//biblioteka do użytku zegar RC //definiuj nazwy pinów wejściowych i wyjściowych #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; liczba int = 0; int aktualnyCzas = 0; struct tm informacje o czasie; const char* ssid = "TWÓJ SSID";//wifi szczegóły const char* hasło = "TWOJE HASŁO"; int dataAlarmuCzas[5] = {1, 1, 2020, 0, 0};//zmienne alarmowe int dateIndex = 0; int indeks czasu = 0; int selectIndex = -1; bool brzęczyk włączony = 0; int rect[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}};//selection rectangle const char* ntpServer = "asia.pool.ntp.org";//server detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display(128, 64);//OLED size zdefiniuj byte clockCenterY = (display.height() + 16) / 2;//analogowe szczegóły tarczy zegara byte clockCenterX = (display.height() - 16) / 2; zegar bajtówPromień = 23; bool state = 0;//ekran włączony lub wyłączony boolean Alarm = 0;//alarm bieżący stan String alarmState = "Alarm ON";//alarm włączony lub wyłączony //zmienne przechowywane dane czasowe char dayName[10]; numer dnia znaku[3]; miesiąc znaków[10]; rok znakowania[5]; godziny znakowania[3]; minuty zwęglania [3]; numer miesiąca znaków[3]; znak sekund [3]; //zmienne przycisku bool RightState = 1; bool Lewy Stan = 1; //zmienne brzęczyka int channel = 0; int Częstotliwość = 2000; wewn PWM = 200; rozdzielczość wewnętrzna = 8; void setup() { //ustaw wejścia i wyjścia pinMode(RightButton, INPUT); pinMode(LewyPrzycisk, WEJŚCIE); pinMode (GreenLED, WYJŚCIE); pinMode (brzęczyk, wyjście); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//zainicjuj wyświetlanie display.display(); opóźnienie(3000); display.clearDisplay(); ledcSetup(0, Częstotliwość, rozdzielczość);//konfiguracja parametrów pwm ledcAttachPin(Buzzer, 0); Serial.begin(115200);//zainicjuj komunikację szeregową //połącz z Wi-Fi Serial.printf("Połączenie z %s", ssid); WiFi.begin(SSid, hasło); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("POŁĄCZONY"); //init i pobierz czas configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); uzyskać czas(); //odłącz WiFi, ponieważ nie jest już potrzebne WiFi.disconnect(true); tryb WiFi (WIFI_OFF); display.clearDisplay(); } void loop() { getTime();//pobierz aktualny czas //zapisz stany prawego i lewego przycisku RightState = digitalRead(RightButton); LeftState = digitalRead (LewyPrzycisk); //sprawdź, czy przyciski są wciśnięte if (RightState == 0 || LeftState == 0) { ledcWrite(0, 200);//po naciśnięciu przycisku brzęczyk emituje sygnał dźwiękowy opóźnienie (100); if (stan == 0) {//zmień na stan ramki ekranu alarmowego = 1;//zmień stan na stan alarmowy RightState = LeftState = 1;//potrzebujemy tylko zmiany ekranu } counts = 0;//reset counter } if (stan == 1 && (liczba) < 5) {//if na ekranie alarmu i bez limitu czasu obliczAlarm();//oblicz wartości czasu informacji o alarmie showAlarm();//pokaż wartości } else {//if w zegarze stan ekranu = 0; display.clearDisplay(); clockFace();//analogowa tarcza zegara printLocalTime();//wydrukuj czas na tarczy zegara i inne szczegóły } onAlarm();//porównaj czas alarmu z czasem lokalnym i włącz opóźnienie alarmu (100);//opóźnienie dla alarm on and off } void clockFace() { //caalog wyświetlacz tarczy zegara.drawCircle(clockCenterX, clockCenterY, clockRadius, WHITE);//drukuj okrąg zegarka for (int digit = 0; digit = 5) { //tylko 5 selctions.so zresetuj do -1 (-1= jest włączony lub wyłączony) selectIndex = -1; } dateAndTimeSelection(selectIndex);//zmień wybór } void dateAndTimeSelection(int index) { if (index == -1) { //alarm włączony lub wyłączony if (RightState == 0) { //przełączanie między włączaniem i wyłączaniem alarmu if (alarmState == "Alarm włączony") { alarmState = "Alarm wyłączony"; } else { alarmState = "Alarm włączony"; } } } else { if (RightState == 0) { //w innych opcjach zwiększ powiązaną datę lub czas w tablicy alarmDateTime[indeks] = alarmDateTime[indeks] + 1; //indeks to zaznaczenie } } int porównaj[4] = {12, 2030, 23, 59}; //górne granice dat i lat int porównajmiesiąc[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //górny limit miesięcy int resetValue[4] = {1, 2020, 0, 0}; //wartości początkowe dla (int i = 1; porównuję[i - 1]) { data_alarmu = wartość resetu[i - 1]; } } if (alarmDateTime[0] > Comparemonth[alarmDateTime[1] - 1]) { //resetuj wartości, jeśli miesiące są większe niż ich limity alarmDateTime[0] = 1; } } void showAlarm() { //wydrukuj szczegóły alarmu String alarmDateTime0 = String(alarmDateTime[0]); //przekonwertuj żądła na pokazywanie String alarmDateTime1 = String(alarmDateTime[1]); Ciąg alarmDateTime2 = Ciąg(alarmDateTime[2]); Ciąg alarmDateTime3 = Ciąg(alarmDateTime[3]); Ciąg alarmDateTime4 = Ciąg(alarmDateTime[4]); //jeśli wartości mają jedną cyfrę 1, dodaj do nich "0". if (alarmDateTime[0]

Zalecana: