Taula de continguts:

Rellotge despertador intel·ligent amb Magicbit (Arduino): 10 passos
Rellotge despertador intel·ligent amb Magicbit (Arduino): 10 passos

Vídeo: Rellotge despertador intel·ligent amb Magicbit (Arduino): 10 passos

Vídeo: Rellotge despertador intel·ligent amb Magicbit (Arduino): 10 passos
Vídeo: [21] В проливной день выйдите из города и идите в глухой лес/Сон в машине/Кемпинг 2024, De novembre
Anonim
Image
Image

Aquest tutorial mostra com fer un despertador intel·ligent amb pantalla OLED a la placa de desenvolupament Magicbit sense utilitzar cap mòdul RTC.

Subministraments

  • Magicbit
  • Cable USB-A a Micro-USB

Pas 1: història

En aquest tutorial aprendrem sobre com fer un despertador intel·ligent mitjançant Magicbit.

Pas 2: CONFIGURACIÓ DEL HARDWARE

Connecteu el Magicbit a l’ordinador mitjançant un cable USB.

Pas 3: CONFIGURACIÓ DEL PROGRAMARI

Obriu el vostre Arduino IDE i configureu la placa amb Arduino IDE. El següent enllaç fa referència a com fer-ho. Per tant, us recomanem que aneu primer per enllaçar i familiaritzar-vos amb Magic bit.

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

Ara seleccioneu el port i el tipus de placa correctes. En aquest cas, el tipus de tauler és Magicbit. Les biblioteques ja estan instal·lades quan es troben a les biblioteques Magicbit.

Pas 4: teoria i metodologia

Si mireu el primer vídeo, podeu veure que la pantalla té 2 pantalles.

  • pantalla del rellotge que mostra els detalls de l'hora
  • pantalla d'alarma que mostra els detalls de l'alarma

Per alternar entre aquestes dues pantalles hem utilitzat qualsevol botó de dos de Magicbit. Aquests botons estan connectats a 35 pins (botó esquerre) i 34 (botó dret) de l'ESP32 a Magicbit. Per mostrar l'hora i altres detalls, hem utilitzat la pantalla OLED integrada a magicbit.

Parlem de com funcionen aquestes pantalles gràfiques.

La pantalla del rellotge té textos de rellotge analògic, rellotge digital, data, mes i any.

Per crear un rellotge analògic utilitzem algunes funcions gràfiques disponibles a la biblioteca de gràfics anomenada Adafriut GFX. Mitjançant la funció de cercle i la funció de línia creem una cara de rellotge analògica. Les funcions geomètriques simples anomenades sin i cos s’utilitzen a la posició de les agulles del rellotge. Així doncs, només introduïm l’angle que correspon al temps de rotació de mans. per a això, primer convertim el temps en angle de la següent manera.

  • angle de la mà de minuts = minuts * (360/60)
  • angle de la mà de les hores = hores * (360/12)

L’angle mesurat respecte a la línia entre el centre de la cara del rellotge i el número 12 de la cara del rellotge. Mitjançant les funcions sin i cos podem calcular les coordenades x i y dels extrems de les línies d’hora i minuts. La imatge següent descriu com està anant.

Segons les coordenades, imprimim les agulles d'hores i minuts traçant línies. També hi ha una funció d'impressió de text a la biblioteca Adafruit GFX. Ajuda a imprimir altres detalls (data, mes i hora en dígits) a la pantalla. Podeu canviar la posició del rellotge analògic i les posicions del text canviant els paràmetres del codi.

Igual que la pantalla de rellotge, vam utilitzar la funció d’impressió de text a la biblioteca Adafruit GFX per imprimir números a la pantalla OLED als llocs adequats.

Pas 5: Obtenir l'hora local

La part més important del rellotge és com obtenim l’hora local amb precisió. Per a això, podeu utilitzar un mòdul de rellotge RTC extern o un rellotge RC incorporat a ESP32 a Magicbit. En aquest projecte hem utilitzat el segon mètode. En aquest mètode fem servir el client NTP (network time protocall) per obtenir l’hora local d’Internet. Per accedir a Internet, vam utilitzar la instal·lació WIFI integrada a l’ESP32. Per tant, en la primera fase utilitzem WIFI per accedir a Internet proporcionant SSID i contrasenya. Després hauríem de configurar gmtOffset i daylightOffset en variables en segons. Els valors d’aquestes variables difereixen d’una regió a una altra del món. gmtOffset significa que el nombre de segons que diferiu del GMT.. Per a la majoria de les hores, DaylightOffset és 3600. El podeu trobar a Internet. Després d’obtenir l’hora local actual, ja no hem utilitzat la WIFI. Perquè llavors calculem l’hora local a partir del rellotge RC incorporat a ESP32. Això es fa mitjançant la biblioteca time.h. Hi ha un exemple senzill a Arduino (Arduino> Exemples> ESP32> Hora> simpletime) perquè pugueu conèixer com funciona això. També podeu utilitzar aquests enllaços per obtenir més informació sobre el client NTP.

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

Després d’aconseguir l’hora local correctament, canviem el temps mostrant textos i angle segons la informació horària a cada bucle.

Pas 6: Configuració de l'alarma

Fent clic als botons esquerre i dret podeu canviar la data i l'hora de selecció de l'alarma. Assegureu-vos que desactiveu l'alarma quan canvieu la data i l'hora de l'alarma. Després de configurar la data i l'hora, activeu l'alarma. Perquè si l’alarma està activada i quan l’hora de l’alarma és igual a la vostra hora actual mentre la configureu, sonarà el timbre d’alarma. Al bucle principal sempre es comprova l'hora local actual i la informació d'alarma és igual. Si són iguals, el zumbador i el LED verd integrat a Magicbit funcionaran durant un minut.

Pas 7: Configuració del timbre

Utilitzem el pols PWM per crear el so del brunzidor mitjançant la funció analogCwrite () del codi. Atès que totes les funcions de la biblioteca estan en ESP32, és vàlid per a Magicbit. Podeu canviar el so sonor del timbre de canviar la freqüència i el valor PWM del codi.

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

Aquesta pàgina descriu com funciona el buzzer amb ESP32.

Pas 8: Configuració de botons

Per canviar tots els estats, hem utilitzat dos botons integrats a Magicbit. El bucle principal sempre comprova l'estat de dos botons. Com que es van retirar internament, hi ha un senyal elevat en l'estat normal. Així, podeu veure que la lectura digital d’aquests pins és 1. A la fase predeterminada, la pantalla mostra la interfície del rellotge. En aquest moment, quan es prem qualsevol dels dos botons, canvia de pantalla a pantalla d'alarma. També comptem el temps en segons des de la darrera vegada que es prem el botó. Si aquest recompte és superior a una durada predefinida, la pantalla mostrarà la pantalla del rellotge.

El codi s’escriu utilitzant funcions bàsiques per a principiants. Per tant, el codi és senzill d’entendre i podeu aprendre el mètode com funciona referint-lo.

Pas 9: resolució de problemes

Algunes vegades el rellotge s’inicia poc després o no mostra els gràfics correctament. Els consells següents ajuden a resoldre la situació.

  • Assegureu-vos que heu proporcionat el SSID i la contrasenya adequats
  • Canvieu el servidor NTP (podeu trobar molts servidors d’Internet relacionats amb la vostra regió).
  • Canvia la connexió a Internet (també es pot fer un punt d'accés mòbil).

També podeu solucionar-ho tot mitjançant el monitor sèrie. A més de la pantalla OLED, el monitor sèrie mostra informació horària.

Pas 10: Codi Arduino

// biblioteques per a pantalla OLED

#incloure

#include #include #define OLED_RESET 4 #include // biblioteca wifi per connectar #include "time.h" // biblioteca per utilitzar rellotge RC // defineix els noms dels pins d'entrada i sortida #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int compta = 0; int CurrentTime = 0; struct tm timeinfo; const char * ssid = "EL VOSTRE SSID"; // detalls del wifi const char * password = "LA VOSTRA CONTRASENYA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // alarm varibles 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}}; // 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); // Mida OLED defineix byte clockCenterY = (display.height () + 16) / 2; // detalls analògics de la cara del rellotge byte clockCenterX = (display.height () - 16) / 2; byte clockRadius = 23; estat bool = 0; // pantalla activada o desactivada booleana Alarma = 0; // estat actual d'alarma String alarmState = "Alarma activada"; // alarma activada o desactivada // dades de temps variats emmagatzemades dades del nom de dia [10]; nombre de dia char [3]; mes char [10]; any char [5]; hores char [3]; minuts char [3]; nombre de mes char [3]; segons char [3]; // variables de botó bool RightState = 1; bool LeftState = 1; // variables de brunzidor int canal = 0; int Freqüència = 2000; int PWM = 200; int resolució = 8; void setup () {// defineix l'entrada i la sortida pinMode (Botó dret, INPUT); pinMode (Botó esquerre, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); retard (3000); display.clearDisplay (); ledcSetup (0, Freqüència, resolució); // configurar els paràmetres pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // integrar la comunicació serial // connectar-se a WiFi Serial.printf ("Connexió a% s", ssid); WiFi.begin (ssid, contrasenya); while (WiFi.status ()! = WL_CONNECTED) {demora (500); Serial.print ("."); } Serial.println ("CONNECTAT"); // iniciar i obtenir l'hora configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // desconnecteu WiFi ja que ja no és necessari WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // obtenir l'hora actual // emmagatzemar els estats del botó dret i esquerre a RightState = digitalRead (RightButton); LeftState = DigitalRead (LeftButton); // comproveu que els botons es premen si (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // quan es prem el botó, el timbre emet un retard de so (100); if (estat == 0) {// canvia a estat de marc de pantalla d'alarma = 1; // canvia d'estat a estat d'alarma RightState = LeftState = 1; // només necessitem canviar sceern} recomptes = 0; // restablir comptador} si (estat == 1 && (recomptes) <5) {// si a la pantalla d'alarma i sense temps d'espera calculateAlarm (); // calcular els valors d'hora de la informació d'alarma showAlarm (); // mostrar valors} else {// si al rellotge estat de la pantalla = 0; display.clearDisplay (); clockFace (); // cara del rellotge analògic printLocalTime (); // imprimeix l’hora a la cara del rellotge i imprimeix altres detalls} onAlarm (); // compara l’hora de l’alarma amb l’hora local i activa el retard de l’alarma (100); // retarda per activar i desactivar l'alarma} void clockFace () {// caalog clock display display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // imprimir el cercle del rellotge per (int digit = 0; digit = 5) {// només en tenen 5 selections.so restableix a -1 (-1 = està activat o desactivat) selectIndex = -1; } dataAndTimeSelection (selectIndex); // canvia la selecció} void dateAndTimeSelection (int index) {if (index == -1) {// alarm on or off if (RightState == 0) {// togle between on and off alarm if (alarmState == "Alarma activada") {alarmState = "Alarma desactivada"; } else {alarmState = "Alarma activada"; }}} else {if (RightState == 0) {// en altres seleccions icrement la data o hora relacionades a la matriu alarmDateTime [index] = alarmDateTime [index] + 1; // index és la selecció}} int compare [4] = {12, 2030, 23, 59}; // límits superiors de les dates i anys int comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // límit superior dels mesos int resetValue [4] = {1, 2020, 0, 0}; // valors inicials de (int i = 1; comparo [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// restableix els vals si els mesos superen els seus límits alarmDateTime [0] = 1; }} void showAlarm () {// imprimeix detalls d'alarma String alarmDateTime0 = String (alarmDateTime [0]); // converteix les picades en mostrar String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = Cadena (alarmDateTime [2]); String alarmDateTime3 = Cadena (alarmDateTime [3]); String alarmDateTime4 = Cadena (alarmDateTime [4]); // si els valors tenen una 1 digita, afegiu-los "0". if (alarmDateTime [0]

Recomanat: