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: Как подключить встроенный Bluetooth ESP32 к смартфону 2024, Srpanj
Anonim
Image
Image

Ovaj vodič prikazuje kako izraditi pametni budilnik pomoću OLED zaslona na Magicbit dev ploči bez korištenja RTC modula.

Pribor

  • Magicbit
  • USB-A do 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: POSTAVLJANJE HARDVERA

Priključite svoj Magicbit na računalo pomoću USB kabela.

Korak 3: POSTAVLJANJE SOFTVERA

Otvorite svoj Arduino IDE i postavite ploču s Arduino IDE. Sljedeći link opisuje kako to učiniti. Stoga vam preporučujemo da prvo odete na vezu i upoznate se s 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. Knjižnice su već instalirane kada su u knjižnicama Magicbit.

Korak 4: Teorija i metodologija

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

  • zaslon sata koji prikazuje detalje vremena
  • zaslon alarma koji prikazuje pojedinosti o alarmu

Za prebacivanje između ova dva zaslona koristili smo bilo koji od dva gumba u Magicbitu. Ovi su gumbi povezani s 35 (lijeva tipka) i 34 (desna tipka) pinova ESP32 u Magicbitu. Za prikaz vremena i drugih detalja koristili smo ugrađeni OLED zaslon u magicbitu.

Razgovarajmo o tome kako ti grafički zasloni rade.

Zaslon sa satom ima analogni sat, digitalni sat, datum, mjesec i godinu.

Za izradu analognog sata koristimo se neke grafičke funkcije dostupne u grafičkoj biblioteci pod nazivom Adafriut GFX. Koristeći kružnu funkciju i linijsku funkciju izrađujemo 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.

  • kut minute kazaljke = minute*(360/60)
  • kut sata kazaljka = 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 koordinate x i y krajeva linija sata i minuta. Donja slika opisuje kako to radi.

Prema koordinatama ispisujemo sate i minute po liniji za crtanje. U biblioteci Adafruit GFX postoji i funkcija ispisa teksta. Pomaže ispisati druge detalje (datum, mjesec i vrijeme prikazani znamenkama) na zaslonu. Položaj analognog sata i položaj teksta možete promijeniti promjenom parametara u kodu.

Kao zaslon sata, koristili smo funkciju ispisa teksta u biblioteci Adafruit GFX za ispis brojeva na OLED zaslonu na odgovarajućim mjestima.

Korak 5: Dobivanje lokalnog vremena

Najvažniji dio sata je kako točno 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žni protokol) 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 svjetlosni pomak 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 knjižnice time.h. Postoji jednostavan primjer u Arduinu (Arduino> Primjeri> ESP32> Vrijeme> simpletime) da biste saznali kako to dalje funkcionira. Također ove veze možete koristiti za daljnje znanje 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 kuta prema podacima o vremenu u svakoj petlji.

Korak 6: Postavljanje alarma

Klikom na lijevi i desni gumb možete promijeniti datum i vrijeme alarma. Isključite alarm kad 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 trenutačnom 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 tijekom 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 gumba

Za promjenu svih stanja koristili smo dva ugrađena gumba u Magicbitu. Glavna petlja uvijek provjerava stanje dva gumba. 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 zaslon prikazuje sučelje sata. U to vrijeme, kada se pritisne bilo koji od dva gumba, zaslon se mijenja u zaslon alarma. Također računamo vrijeme u sekundama od posljednjeg pritiska na tipku. Ako je taj broj veći od nekog unaprijed definiranog trajanja, na zaslonu će se prikazati zaslon sata.

Kôd je napisan pomoću 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 poslužitelj (možete pronaći mnoge poslužitelje s interneta koji se odnose na vašu regiju).
  • Mijenja internetsku vezu. (Moguća je i mobilna hotspot).

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

Korak 10: Arduino kod

// knjižnice za OLED zaslon

#uključi

#include #include #define OLED_RESET 4 #include // wifi biblioteka za povezivanje #include "time.h" // knjižnica za korištenje RC sata // definiranje unosa i izlaza pin naziva #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Zujalica 25 int preTime = 0; int broji = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "VAŠ SSID"; // pojedinosti o wifi const char* lozinka = "VAŠA LOZINKA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // varijable alarma 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"; // poslužitelj detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display (128, 64); // OLED veličina definira byte clockCenterY = (display.height () + 16)/2; // pojedinosti o analognom satu sata byte clockCenterX = (display.height () - 16)/2; bajtni satRadius = 23; bool stanje = 0; // zaslon uključen ili isključen boolean Alarm = 0; // trenutno stanje alarma String alarmState = "Alarm UKLJUČEN"; // alarm uključen ili isključen // promjenjuje pohranjene podatke o vremenu char dayName [10]; char daynumber [3]; mjesec char [10]; char godina [5]; char sati [3]; char minute [3]; char mjesecbroj [3]; char sekundi [3]; // varijable gumba bool RightState = 1; bool Lijevo stanje = 1; // zvučne varijable int channel = 0; int Frekvencija = 2000; int PWM = 200; int rezolucija = 8; void setup () {// postavlja ulaz i izlaze pinMode (RightButton, INPUT); pinMode (lijevi gumb, 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); // konfigurirati parametre pwm ledcAttachPin (Zujalica, 0); Serial.begin (115200); // uspostaviti serijsku komunikaciju // spojiti se na WiFi Serial.printf ("Povezivanje na %s", ssid); WiFi.započni (ssid, lozinka); while (WiFi.status ()! = WL_CONNECTED) {odgoda (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 (); // dobivanje trenutnog vremena // pohranjivanje stanja desne i lijeve tipke RightState = digitalRead (RightButton); LeftState = digitalRead (Lijevi gumb); // provjerite gumbe pritisnute ako (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kada je gumb pritisnut zujalica emitira zvučni signal (100); if (stanje == 0) {// promijenite u okvir okvira 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 zaslonu alarma i nema vremenskog ograničenja stanje ekrana = 0; display.clearDisplay (); clockFace (); // analogno lice sata printLocalTime (); // ispis vremena na licu sata i ispis ostalih pojedinosti} onAlarm (); // usporedimo vrijeme alarma s lokalnim vremenom i uključimo 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 znamenka = 0; znamenka = 5) {// ima samo 5 selctions.pa resetirajte 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 odabir}} 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 () {// ispis detalja alarma String alarmDateTime0 = String (alarmDateTime [0]); // pretvoriti 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, dodaj im "0". if (alarmDateTime [0]

Preporučeni: