Cuprins:

Ceas cu alarmă inteligentă folosind Magicbit (Arduino): 10 pași
Ceas cu alarmă inteligentă folosind Magicbit (Arduino): 10 pași

Video: Ceas cu alarmă inteligentă folosind Magicbit (Arduino): 10 pași

Video: Ceas cu alarmă inteligentă folosind Magicbit (Arduino): 10 pași
Video: Ceas alarma Smartie 2024, Noiembrie
Anonim
Image
Image

Acest tutorial arată cum să creați un ceas deșteptător inteligent utilizând afișajul OLED pe placa de dev Magicbit fără a utiliza niciun modul RTC.

Provizii

  • Magicbit
  • Cablu USB-A la Micro-USB

Pasul 1: Poveste

În acest tutorial vom afla despre cum să faci un ceas cu alarmă inteligent folosind Magicbit.

Pasul 2: SETARE HARDWARE

Conectați-vă Magicbit la computer utilizând un cablu USB.

Pasul 3: SETARE SOFTWARE

Deschideți Arduino IDE și configurați placa cu Arduino IDE. Următorul link se referă la modul de a face acest lucru. Așadar, vă recomandăm să mergeți mai întâi la link și să vă familiarizați cu Magic bit.

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

Acum selectați tipul de placă și portul corect. În acest caz, tipul de placă este Magicbit. Bibliotecile sunt deja instalate când bibliotecile din Magicbit.

Pasul 4: Teorie și metodologie

Dacă te uiți la primul videoclip, poți vedea că afișajul are 2 ecrane.

  • ecran de ceas care arată detaliile orei
  • ecran de alarmă care afișează detalii despre alarmă

Pentru a comuta între aceste două ecrane, am folosit orice buton de două în Magicbit. Aceste butoane sunt conectate la 35 (butonul stânga) și 34 (butonul drept) pin al ESP32 în Magicbit. Pentru a arăta ora și alte detalii am folosit un ecran OLED încorporat în magicbit.

Să vorbim despre cum funcționează aceste ecrane grafice.

Ecranul ceasului are ceas analogic, ceas digital, date, luni și ani.

Pentru crearea ceasului analogic folosim câteva funcții grafice disponibile în biblioteca grafică numită Adafriut GFX. Folosind funcția de cerc și funcția de linie creăm fața ceasului analogică. Funcțiile geometrice simple numite sin și cos sunt utilizate pentru poziția acelor de ceas. Deci introducem doar unghiul care corespunde timpului pentru mâinile rotite. pentru aceasta, mai întâi convertim timpul în unghi, după cum urmează.

  • unghiul minutului = minute * (360/60)
  • unghiul orelor mâinii = ore * (360/12)

Unghiul măsurat în raport cu linia dintre centrul feței ceasului și numărul 12 în fața ceasului. Folosind funcțiile sin și cos putem calcula coordonatele x și y ale capetelor liniilor de oră și minute. Imaginea de mai jos descrie cum merge.

În conformitate cu coordonatele, imprimăm orele și minutele prin trasarea liniilor. Există, de asemenea, funcția de imprimare a textului în biblioteca Adafruit GFX. Ajută la imprimarea altor detalii (data, luna și ora afișate în cifre) pe afișaj. Puteți schimba poziția ceasului analogic și pozițiile textului modificând parametrii din cod.

La fel ca ecranul cu ceas, am folosit funcția de imprimare text în biblioteca Adafruit GFX pentru numerele de imprimare pe afișajul OLED în locurile corespunzătoare.

Pasul 5: Obținerea orei locale

Cea mai importantă parte a ceasului este modul în care obținem ora locală cu precizie. În acest scop, puteți utiliza modulul de ceas RTC extern sau ceasul RC încorporat în ESP32 în Magicbit. În acest proiect am folosit a doua metodă. În această metodă, utilizăm clientul NTP (network time protocall) pentru obține ora locală de pe internet. Pentru accesul la internet am folosit facilitatea WIFI încorporată în ESP32. Prin urmare, în prima etapă folosim WIFI pentru accesul la internet oferind SSID și parolă. Apoi ar trebui să configurăm gmtOffset și daylightOffset în variabile în câteva secunde. Valorile acestor variabile diferă de la o regiune la alta din lume. gmtOffset înseamnă numărul de secunde în care diferiți de GMT.. Pentru majoritatea ariei lumina zilei Offset este 3600. Puteți găsi acest lucru pe internet. După ce am obținut ora locală curentă, nu am mai folosit WIFI. Pentru că atunci calculăm ora locală din ceasul RC încorporat în ESP32. Acest lucru se face folosind biblioteca time.h. Există un exemplu simplu în Arduino (Arduino> Exemple> ESP32> Ora> simpletime) pentru a afla cum funcționează în continuare. De asemenea, aceste linkuri le puteți utiliza pentru cunoștințe suplimentare despre clientul NTP.

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

După obținerea corectă a orei locale, ne schimbăm timpul afișând textele și unghiul în funcție de informațiile despre timp în fiecare buclă.

Pasul 6: Configurarea alarmei

Făcând clic pe butoanele din stânga și din dreapta puteți schimba data și ora de alarmă. Asigurați-vă că opriți alarma atunci când schimbați data și ora alarmei. După configurarea datei și orei, porniți alarma. Deoarece dacă alarma este activată și când ora alarmei este egală cu ora curentă în timp ce o configurați, alarma sonoră va suna. În bucla principală verifică întotdeauna ora locală curentă și informațiile de alarmă sunt egale. Dacă acestea sunt egale, atunci buzzer-ul și LED-ul verde încorporat în Magicbit vor funcționa timp de un minut.

Pasul 7: Configurarea soneriei

Folosim impulsul PWM pentru a crea sunetul sonor prin utilizarea funcției analogCwrite () în cod. Din cauza tuturor funcțiilor bibliotecii sunt în ESP32 este valabil pentru Magicbit. Puteți modifica sunetul sonor al soneriei din schimbarea frecvenței și a valorii PWM din cod.

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

Această pagină descrie cum funcționează buzzer-ul cu ESP32.

Pasul 8: Configurarea butoanelor

Pentru schimbarea tuturor stărilor, am folosit două butoane încorporate în Magicbit. Bucla principală verifică întotdeauna starea a două butoane. Deoarece au tras în interior, starea normală este semnal ridicat. Deci, puteți vedea citirea digitală a acelor pini sunt 1. În stadiul implicit, afișajul arată interfața ceasului. În acel moment, când oricare dintre cele două butoane este apăsat, atunci acesta schimbă ecranul în ecranul de alarmă. De asemenea, numărăm timpul în secunde de la ultima dată când butonul este apăsat. Dacă acest număr este mai mare decât o anumită durată predefinită, atunci afișajul va afișa ecranul ceasului.

Codul este scris folosind funcții de bază pentru începători. Deci, codul este ușor de înțeles și puteți învăța metoda cum funcționează, referindu-l la cod.

Pasul 9: Depanare

Uneori ceasul pornește mai târziu sau nu afișează graficele în mod corespunzător. Următoarele sfaturi vă ajută să rezolvați situația.

  • Asigurați-vă că ați dat SSID-ul și parola potrivite
  • Schimbați serverul NTP (puteți găsi multe servere de pe internet care se referă la regiunea dvs.).
  • Schimbă conexiunea la internet (poate fi posibil și hotspotul mobil).

De asemenea, puteți rezolva toate problemele utilizând monitorul serial. Pe lângă afișajul OLED, monitorul serial afișează informații despre timp.

Pasul 10: Cod Arduino

// biblioteci pentru afișaj OLED

#include

#include #include #define OLED_RESET 4 #include // bibliotecă wifi pentru conectare #include "time.h" // biblioteca pentru utilizare ceas RC // definiți numele pinului de intrare și de ieșire #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int contează = 0; int currentTime = 0; struct tm timeinfo; const char * ssid = "SSID-ul TĂU"; // detalii wifi const char * password = "PAROLA TA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // variabile alarmă int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 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}}; // dreptunghi de selecție 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 define byte clockCenterY = (display.height () + 16) / 2; // analog clock clock details byte clockCenterX = (display.height () - 16) / 2; byte clockRadius = 23; starea bool = 0; // ecranul activat sau oprit boolean Alarmă = 0; // starea curentă a alarmei String alarmState = "Alarmă ACTIVATĂ"; // alarmă activată sau dezactivată // variabile stocate date date char dayName [10]; număr de zi char [3]; luna char [10]; anul char [5]; ore char [3]; minute char [3]; număr lunar char [3]; secunde char [3]; // variabile buton bool RightState = 1; bool LeftState = 1; // variabile buzzer int canal = 0; int Frecvență = 2000; int PWM = 200; rezoluție int = 8; void setup () {// set input and output pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); întârziere (3000); display.clearDisplay (); ledcSetup (0, Frecvență, rezoluție); // configurați parametrii pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // integrarea comunicării seriale // conectarea la WiFi Serial.printf („Conectarea la% s”, ssid); WiFi.begin (ssid, parolă); while (WiFi.status ()! = WL_CONNECTED) {întârziere (500); Serial.print ("."); } Serial.println ("CONECTAT"); // init și obțineți ora configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); Fă-ți timp(); // deconectați WiFi deoarece nu mai este necesar WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // obține ora curentă // stochează stânga și stânga butonul RightState = DigitalRead (RightButton); LeftState = DigitalRead (LeftButton); // verificați dacă butoanele sunt apăsate dacă (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // când butonul este apăsat, buzzerul emite un sunet de întârziere (100); if (state == 0) {// treceți la starea cadrului ecranului de alarmă = 1; // schimbați starea la starea de alarmă RightState = LeftState = 1; // avem nevoie doar de schimbare sceern} counts = 0; // reset counter} dacă (state == 1 && (contează) <5) {// dacă în ecranul de alarmă și fără timeout calculateAlarm (); // calculați valorile timpului informației de alarmă showAlarm (); // arată valorile} else {// if in clock starea ecranului = 0; display.clearDisplay (); clockFace (); // față de ceas analogică printLocalTime (); // tipăriți ora în fața ceasului și imprimați alte detalii} onAlarm (); // comparați alarma cu ora locală și activați întârzierea alarmei (100); // întârziere pentru alarmă activată și oprită} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // tipăriți cercul de ceas pentru (cifra int = 0; cifra = 5) {// au doar 5 selections.so reset la -1 (-1 = este activat sau dezactivat) selectIndex = -1; } dateAndTimeSelection (selectIndex); // change selection} void dateAndTimeSelection (int index) {if (index == -1) {// alarm on or off if (RightState == 0) {// togle between on and off alarm if (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Alarm ON"; }}} else {if (RightState == 0) {// în alte selecții icrement relatează data sau ora în matrice alarmDateTime [index] = alarmDateTime [index] + 1; // index este selecția}} int compare [4] = {12, 2030, 23, 59}; // limite superioare ale datelor și anilor în comparație [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // limita superioară a lunilor int resetValue [4] = {1, 2020, 0, 0}; // valori inițiale pentru (int i = 1; compar [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// resetează vlaues dacă lunile sunt mai mari decât limitele lor alarmDateTime [0] = 1; }} void showAlarm () {// tipăriți detaliile alarmelor String alarmDateTime0 = String (alarmDateTime [0]); // converti stingurile pentru a arata String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // dacă valorile au o singură digită, adăugați „0” la ele. if (alarmDateTime [0]

Recomandat: