Sadržaj:

Pametni budilnik pomoću Magicbita (Arduino): 10 koraka
Pametni budilnik pomoću Magicbita (Arduino): 10 koraka

Video: Pametni budilnik pomoću Magicbita (Arduino): 10 koraka

Video: Pametni budilnik pomoću Magicbita (Arduino): 10 koraka
Video: Программирование модуля датчика температуры и влажности ESP8266 ESP01 DHT11 | удаленныйXY | ФЛПрог 2024, Juli
Anonim
Image
Image

Ovaj vodič prikazuje kako napraviti pametni budilnik pomoću OLED ekrana na Magicbit dev ploči bez upotrebe bilo kojeg RTC modula.

Supplies

  • Magicbit
  • USB-A na mikro-USB kabel

Korak 1: Priča

U ovom ćemo vodiču naučiti o tome kako napraviti pametni budilnik pomoću Magicbita.

Korak 2: PODEŠAVANJE HARDVERA

Priključite svoj Magicbit na računar pomoću USB kabla.

Korak 3: PODEŠAVANJE SOFTVERA

Otvorite svoj Arduino IDE i postavite ploču s Arduino IDE. Sljedeći link opisuje kako to učiniti. Zato vam preporučujemo da prvo odete na vezu i upoznate se sa Magic bitom.

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

Sada odaberite ispravnu vrstu ploče i priključak. U ovom slučaju tip ploče je Magicbit. Biblioteke su već instalirane u bibliotekama Magicbit.

Korak 4: Teorija i metodologija

Ako pogledate prvi video, možete vidjeti da zaslon ima 2 ekrana.

  • ekran sata koji prikazuje detalje vremena
  • alarmni ekran koji prikazuje detalje alarma

Za prebacivanje između ova dva ekrana koristili smo bilo koje dva tastera u Magicbit -u. Ovi tasteri su povezani sa 35 (levo dugme) i 34 (desno dugme) pinova ESP32 u Magicbit -u. Za prikaz vremena i drugih detalja koristili smo ugrađeni OLED ekran u magicbitu.

Hajde da razgovaramo o tome kako ovi grafički ekrani rade.

Ekran sata ima analogni sat, digitalni sat, datum, mjesec i godinu.

Za kreiranje analognog sata koristimo neke grafičke funkcije koje su dostupne u grafičkoj biblioteci pod nazivom Adafriut GFX. Korištenjem kružne funkcije i funkcije linije stvaramo analogni brojčanik sata. Jednostavne geometrijske funkcije koje se nazivaju sin i cos koriste se za položaj kazaljki na satu. Dakle, unosimo samo kut koji odgovara vremenu za rotirajuće ruke. za to prvo pretvaramo vrijeme u kut na sljedeći način.

  • ugao minute kazaljke = minute*(360/60)
  • kazaljka na satu = sati*(360/12)

Kut izmjeren u odnosu na liniju između središta sata i broja 12 na licu sata. Pomoću sin i cos funkcija možemo izračunati x i y koordinate krajeva linija sata i minuta. Donja slika opisuje kako to radi.

Prema koordinatama ispisujemo kazaljke na satu i minute po linijama. U biblioteci Adafruit GFX postoji i funkcija ispisa teksta. Pomaže pri ispisivanju drugih detalja (datum, mjesec i vrijeme prikazani znamenkama) na ekranu. Položaj analognog sata i položaj teksta možete promijeniti promjenom parametara u kodu.

Kao i na ekranu sata, koristili smo funkciju štampanja teksta u biblioteci Adafruit GFX za ispis brojeva na OLED ekranu na odgovarajućim mjestima.

Korak 5: Dobijanje lokalnog vremena

Najvažniji dio sata je kako precizno dobivamo lokalno vrijeme. U tu svrhu možete koristiti vanjski RTC modul sata ili ugrađeni RC sat u ESP32 u Magicbitu. U ovom projektu koristili smo drugu metodu. U ovoj metodi koristimo NTP (protokol za mrežno vrijeme) za dobivanje lokalnog vremena s interneta. Za pristup internetu koristili smo ugrađeni WIFI uređaj u ESP32. Stoga u prvoj fazi koristimo WIFI za pristup internetu pružanjem SSID -a i lozinke. Zatim bismo trebali konfigurirati gmtOffset i daylightOffset u varijablama u sekundama. Vrijednosti ovih varijabli razlikuju se od regije do regije u svijetu. gmtOffset znači broj sekundi koje se razlikujete od GMT -a.. Za većinu područja dnevna svjetlostOffset je 3600. Možete ga pronaći na internetu. Nakon što smo dobili trenutno lokalno vrijeme, više nismo koristili WIFI. Zato što tada računamo lokalno vrijeme iz ugrađenog RC sata u ESP32. To se radi pomoću biblioteke time.h. Postoji jednostavan primjer u Arduinu (Arduino> Primjeri> ESP32> Vrijeme> simpletime) da biste saznali kako ovo dalje funkcionira. Također ove veze možete koristiti za daljnja saznanja o NTP klijentu.

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

Nakon što ispravno odredimo lokalno vrijeme, mijenjamo vrijeme prikazivanja tekstova i ugla prema informacijama o vremenu u svakoj petlji.

Korak 6: Postavljanje alarma

Klikom na lijevo i desno dugme možete promijeniti datum i vrijeme alarma. Uvijek isključite alarm kada mijenjate datum i vrijeme alarma. Nakon postavljanja datuma i vremena uključite alarm. Jer ako je alarm uključen i kada je vrijeme alarma jednako vašem trenutnom vremenu dok ga postavljate, oglasit će se zvučni signal alarma. U glavnoj petlji uvijek provjerava da li su trenutno lokalno vrijeme i informacije o alarmu jednake. Ako su jednaki, zujalica i ugrađena zelena LED dioda u Magicbitu će raditi tokom jedne minute.

Korak 7: Postavljanje zujalice

Koristimo PWM impuls za stvaranje zvučnog signala pomoću funkcije analogCwrite () u kodu. Zbog svih funkcija knjižnice u ESP32 vrijedi za Magicbit. Zvučni signal zujalice možete promijeniti ako promijenite njegovu frekvenciju i vrijednost PWM -a u kodu.

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

Ova stranica opisuje kako zujalica radi s ESP32.

Korak 8: Postavljanje dugmadi

Za promjenu svih stanja koristili smo dva ugrađena gumba u Magicbitu. Glavna petlja uvijek provjerava stanje dva dugmeta. Budući da su se povukli iznutra, normalno stanje je visoki signal. Dakle, možete vidjeti digitalno očitavanje tih pinova 1. U zadanoj fazi na ekranu se prikazuje sučelje sata. U to vrijeme, kada se pritisne bilo koje od dva gumba, zaslon se mijenja u zaslon alarma. Takođe računamo vreme u sekundama od poslednjeg puta kada je dugme pritisnuto. Ako je taj broj veći od nekog unaprijed definiranog trajanja, na ekranu će se prikazati ekran sata.

Kôd je napisan korištenjem osnovnih funkcija za početnike. Dakle, kôd je jednostavan za razumijevanje, a metodu možete naučiti pozivom na kôd.

Korak 9: Rješavanje problema

Nekad se sat pokrene nešto kasnije ili ne prikazuje grafiku ispravno. Sljedeći savjeti pomažu u rješavanju situacije.

  • Provjerite jeste li dali pravi SSID i lozinku
  • Promijenite NTP server (možete pronaći mnoge servere s interneta koji se odnose na vašu regiju).
  • Mijenja internetsku vezu. (Moguća je i mobilna pristupna tačka).

Također možete riješiti sve probleme pomoću serijskog monitora. Osim OLED ekrana, serijski monitor prikazuje i informacije o vremenu.

Korak 10: Arduino kod

// biblioteke za OLED ekran

#include

#include #include #define OLED_RESET 4 #include // wifi biblioteka za povezivanje #include "time.h" // biblioteka za upotrebu RC sata // definiranje ulaznih i izlaznih naziva pinova #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Zujalica 25 int preTime = 0; int brojevi = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "VAŠ SSID"; // detalji o wifi const char* lozinka = "VAŠA LOZINKA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // alarmne varijable int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool zujalicaOn = 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}}; // pravokutnik odabira const char* ntpServer = "asia.pool.ntp.org"; // detalje o poslužitelju const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display (128, 64); // OLED veličina definira bajt clockCenterY = (display.height () + 16)/2; // detalji analognog sata sa bajtom clockCenterX = (display.height () - 16)/2; bajt clockRadius = 23; bool stanje = 0; // uključen ili isključen ekran boolean Alarm = 0; // trenutni status alarma String alarmState = "Alarm UKLJUČEN"; // alarm uključen ili isključen // mijenja podatke o pohranjenom vremenu char dayName [10]; char daynumber [3]; mjesec mjeseca [10]; char godina [5]; char sati [3]; minute minuta [3]; char mjesecbroj [3]; char sekundi [3]; // varijable dugmeta bool RightState = 1; bool LeftState = 1; // zvučne varijable int channel = 0; int Frekvencija = 2000; int PWM = 200; int rezolucija = 8; void setup () {// postavlja ulaz i izlaz pinMode (desno dugme, ulaz); pinMode (lijevo dugme, ULAZ); pinMode (GreenLED, OUTPUT); pinMode (zujalica, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // incijalizirati display display.display (); kašnjenje (3000); display.clearDisplay (); ledcSetup (0, Frekvencija, razlučivost); // konfiguriramo pwm parametre ledcAttachPin (Zujalica, 0); Serial.begin (115200); // uspostaviti serijsku komunikaciju // povezati se na WiFi Serial.printf ("Povezivanje na %s", ssid); WiFi.begin (ssid, lozinka); while (WiFi.status ()! = WL_CONNECTED) {kašnjenje (500); Serial.print ("."); } Serial.println ("CONNECTED"); // init i dobijemo vrijeme configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // isključite WiFi jer više nije potreban WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // dobijanje trenutnog vremena // pohranjivanje stanja desne i lijeve tipke RightState = digitalRead (RightButton); LeftState = digitalRead (Lijevo dugme); // potvrdite pritisnute dugmad ako (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kada je dugme pritisnuto, zujalica emituje zvučni signal (100); if (state == 0) {// promijenite stanje okvira ekrana alarma = 1; // promijenite stanje u stanje alarma RightState = LeftState = 1; // samo nam je potrebno promijeniti sceern} count = 0; // resetirati brojač} if (stanje == 1 && (broji) <5) {// ako je na ekranu alarma i nema vremenskog ograničenja stanje ekrana = 0; display.clearDisplay (); clockFace (); // analogni brojčanik sata printLocalTime (); // ispisuje vrijeme na licu sata i ispisuje druge detalje} onAlarm (); // uporedite vrijeme alarma s lokalnim vremenom i uključite kašnjenje alarma (100); // kašnjenje za uključivanje i isključivanje alarma} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, BIJELO); // ispisuje krug sata za (int cifra = 0; znamenka = 5) {// samo 5 selctions.so resetirano na -1 (-1 = alarm je uključen ili isključen) selectIndex = -1; } dateAndTimeSelection (selectIndex); // promijeni selction} void dateAndTimeSelection (int index) {if (index == -1) {// alarm uključen ili isključen ako (RightState == 0) {// prebacivanje između uključenog i isključenog alarma ako (alarmState == "Alarm UKLJUČEN") {alarmState = "Alarm isključen"; } else {alarmState = "Alarm UKLJUČEN"; }}} else {if (RightState == 0) {// u drugim odjeljcima potvrđuje odgovarajući datum ili vrijeme u nizu alarmDateTime [index] = alarmDateTime [index] + 1; // indeks je izbor}} int usporedi [4] = {12, 2030, 23, 59}; // gornje granice datuma i godina int comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // gornji limit mjeseci int resetValue [4] = {1, 2020, 0, 0}; // početne vrijednosti za (int i = 1; uspoređujem [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// resetiranje vlaues ako su mjeseci veći od njihovih ograničenja alarmDateTime [0] = 1; }} void showAlarm () {// ispisuje detalje alarma String alarmDateTime0 = String (alarmDateTime [0]); // pretvara ubode u prikaz String alarmDateTime1 = String (alarmDateTime [1]); Niz alarmDateTime2 = Niz (alarmDateTime [2]); Niz alarmDateTime3 = Niz (alarmDateTime [3]); Niz alarmDateTime4 = Niz (alarmDateTime [4]); // ako vrijednosti imaju jednu 1 znamenku, dodajte im "0". if (alarmDateTime [0]

Preporučuje se: