Table des matières:

Réveil intelligent utilisant Magicbit (Arduino): 10 étapes
Réveil intelligent utilisant Magicbit (Arduino): 10 étapes

Vidéo: Réveil intelligent utilisant Magicbit (Arduino): 10 étapes

Vidéo: Réveil intelligent utilisant Magicbit (Arduino): 10 étapes
Vidéo: RADIO-REVEIL LUMINEUX WAKE-UP BLUETOOTH - le réveil lumière du jour - [PEARLTV.FR] 2024, Novembre
Anonim
Image
Image

Ce didacticiel montre comment créer un réveil intelligent à l'aide d'un écran OLED dans la carte de développement Magicbit sans utiliser de module RTC.

Fournitures

  • Bit magique
  • Câble USB-A vers Micro-USB

Étape 1: Histoire

Dans ce tutoriel, nous allons apprendre à créer un réveil intelligent à l'aide de Magicbit.

Étape 2: CONFIGURATION DU MATÉRIEL

Branchez votre Magicbit à l'ordinateur à l'aide d'un câble USB.

Étape 3: CONFIGURATION DU LOGICIEL

Ouvrez votre Arduino IDE et configurez la carte avec Arduino IDE. Le lien suivant indique comment procéder. Nous vous recommandons donc d'aller d'abord sur le lien et de vous familiariser avec Magic Bit.

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

Sélectionnez maintenant le type de carte et le port corrects. Dans ce cas, le type de carte est Magicbit. Les bibliothèques sont déjà installées dans les bibliothèques Magicbit.

Étape 4: Théorie et méthodologie

Si vous regardez la première vidéo, vous pouvez voir que l'affichage a 2 écrans.

  • écran d'horloge affichant les détails de l'heure
  • écran d'alarme qui affiche les détails de l'alarme

Pour basculer entre ces deux écrans, nous avons utilisé n'importe quel bouton-poussoir de deux dans Magicbit. Ces boutons sont connectés aux broches 35 (bouton gauche) et 34 (bouton droit) de l'ESP32 dans Magicbit. Pour afficher l'heure et d'autres détails, nous avons utilisé un écran OLED intégré dans magicbit.

Parlons du fonctionnement de ces écrans graphiques.

L'écran de l'horloge a des textes d'horloge analogique, d'horloge numérique, de date, de mois et d'année.

Pour créer une horloge analogique, nous utilisons certaines fonctions graphiques disponibles dans la bibliothèque graphique appelée Adafriut GFX. En utilisant la fonction de cercle et la fonction de ligne, nous créons un cadran d'horloge analogique. Des fonctions géométriques simples appelées sin et cos sont utilisées pour la position des aiguilles de l'horloge. Nous ne saisissons donc que l'angle qui correspond au temps de rotation des mains. pour cela, nous convertissons d'abord le temps en angle comme suit.

  • angle de l'aiguille des minutes=minutes*(360/60)
  • angle de l'aiguille des heures=heures*(360/12)

L'angle mesuré par rapport à la ligne entre le centre du cadran de l'horloge et le numéro 12 du cadran de l'horloge. À l'aide des fonctions sin et cos, nous pouvons calculer les coordonnées x et y des extrémités des lignes des heures et des minutes. L'image ci-dessous décrit comment cela se passe.

Selon les coordonnées, nous imprimons l'aiguille des heures et des minutes en traçant des lignes. Il existe également une fonction d'impression de texte dans la bibliothèque Adafruit GFX. Il permet d'imprimer d'autres détails (date, mois et heure en chiffres) à l'écran. Vous pouvez modifier la position de l'horloge analogique et les positions du texte en modifiant les paramètres dans le code.

Tout comme l'écran de l'horloge, nous avons utilisé la fonction d'impression de texte dans la bibliothèque Adafruit GFX pour imprimer les numéros sur l'écran OLED aux endroits appropriés.

Étape 5: Obtenir l'heure locale

La partie la plus importante de l'horloge est de savoir comment nous obtenons l'heure locale avec précision. À cette fin, vous pouvez utiliser un module d'horloge RTC externe ou une horloge RC intégrée dans ESP32 dans Magicbit. Dans ce projet, nous avons utilisé la deuxième méthode. Dans cette méthode, nous utilisons le client NTP (network time protocall) pour obtenir l'heure locale à partir d'Internet. Pour accéder à Internet, nous avons utilisé une installation WIFI intégrée dans l'ESP32. Par conséquent, dans un premier temps, nous utilisons le WIFI pour accéder à Internet en fournissant un SSID et un mot de passe. Ensuite, nous devons configurer le gmtOffset et le daylightOffset en variables en quelques secondes. Les valeurs de ces variables sont différentes d'une région à l'autre dans le monde. gmtOffset signifie le nombre de secondes pendant lesquelles vous diffèrez de l'heure GMT. Pour la plupart des ares, le décalage de la lumière du jour est de 3600. Vous pouvez le trouver sur Internet. Après avoir obtenu l'heure locale actuelle, nous n'avons plus utilisé le WIFI. Parce qu'alors, nous calculons l'heure locale à partir de l'horloge RC intégrée dans ESP32. Ceci est fait en utilisant la bibliothèque time.h. Il existe un exemple simple dans Arduino (Arduino>Examples> ESP32> Time>simpletime) pour que vous en appreniez davantage sur la façon dont cela fonctionne. Vous pouvez également utiliser ces liens pour approfondir vos connaissances sur le client NTP.

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

Après avoir obtenu correctement l'heure locale, nous modifions notre heure d'affichage des textes et de l'angle en fonction de cette information horaire dans chaque boucle.

Étape 6: Configuration de l'alarme

En cliquant sur les boutons gauche et droit, vous pouvez modifier la sélection de la date et de l'heure de l'alarme. Assurez-vous de désactiver l'alarme lorsque vous modifiez la date et l'heure de l'alarme. Après avoir réglé la date et l'heure, activez l'alarme. Parce que si l'alarme est activée et lorsque l'heure de l'alarme est égale à votre heure actuelle pendant que vous la configurez, la sonnerie de l'alarme sonnera. Dans la boucle principale, vérifie toujours que l'heure locale actuelle et les informations d'alarme sont identiques. Si ceux-ci sont égaux, le buzzer et la LED verte intégrée dans Magicbit fonctionneront pendant une minute.

Étape 7: Configuration du buzzer

Nous utilisons l'impulsion PWM pour créer le son du buzzer en utilisant la fonction analogCwrite() dans le code. En raison de toutes les fonctions de la bibliothèque dans ESP32, c'est valable pour Magicbit. Vous pouvez modifier le bip du buzzer en changeant sa fréquence et sa valeur PWM dans le code.

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

Cette page décrit le fonctionnement du buzzer avec ESP32.

Étape 8: Configuration des boutons

Pour changer tous les états, nous avons utilisé deux boutons-poussoirs intégrés dans Magicbit. La boucle principale vérifie toujours l'état de deux boutons. Parce qu'ils ont tiré vers le haut en interne, l'état normal est un signal élevé. Ainsi, vous pouvez voir que la lecture numérique de ces broches est 1. Au stade par défaut, l'écran affiche l'interface d'horloge. À ce moment-là, lorsque l'un des deux boutons est enfoncé, l'écran passe à l'écran d'alarme. Nous comptons également le temps en secondes depuis la dernière fois que le bouton est enfoncé. Si ce nombre est supérieur à une durée prédéfinie, l'écran affichera l'écran de l'horloge.

Le code est écrit en utilisant des fonctions de base pour les débutants. Le code est donc simple à comprendre et vous pouvez apprendre la méthode comment cela fonctionne en vous référant au code.

Étape 9: Dépannage

Parfois, l'horloge démarre un peu plus tard ou n'affiche pas correctement les graphiques. Les conseils suivants aident à résoudre la situation.

  • Assurez-vous d'avoir donné le bon SSID et le bon mot de passe
  • Changez le serveur NTP (vous pouvez trouver de nombreux serveurs sur Internet qui se rapportent à votre région).
  • Modifie la connexion Internet. (un hotspot mobile peut également être possible).

Vous pouvez également tout dépanner en utilisant le moniteur série. En plus de l'écran OLED, le moniteur série affiche des informations sur l'heure.

Étape 10: Code Arduino

//bibliothèques pour écran OLED

#comprendre

#include #include #define OLED_RESET 4 #include //bibliothèque wifi pour la connexion #include "time.h"//library for use RC clock //définit les noms des broches d'entrée et de sortie #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; nombres entiers = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "VOTRE SSID";//détails wifi const char* mot de passe = "VOTRE MOT DE PASSE"; int alarmDateTime[5] = {1, 1, 2020, 0, 0};//variables d'alarme int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; rect int[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);//la taille OLED définit l'octet clockCenterY = (display.height() + 16) / 2;//les détails du cadran de l'horloge analogique octet clockCenterX = (display.height() - 16) / 2; octet clockRadius = 23; bool state = 0;//screen on ou off boolean Alarm = 0;//alarm current state String alarmState = "Alarm ON";//alarm on ou off //variables stockées données de temps char dayName[10]; car numéro de jour[3]; char mois[10]; char année[5]; heures de caractère[3]; car minutes[3]; char numéro de mois[3]; secondes de char[3]; //variables de bouton bool RightState = 1; bool LeftState = 1; //variables du buzzer int channel = 0; int Fréquence = 2000; entier PWM = 200; résolution entière = 8; void setup() { //définir l'entrée et les sorties pinMode(RightButton, INPUT); pinMode(LeftButton, INPUT); pinMode (GreenLED, SORTIE); pinMode (Buzzer, SORTIE); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//initialisation de l'affichage display.display(); retard(3000); display.clearDisplay(); ledcSetup(0, Fréquence, résolution);//configurer les paramètres pwm ledcAttachPin(Buzzer, 0); Serial.begin(115200);//intiliser la communication série // se connecter au WiFi Serial.printf("Connexion à %s ", ssid); WiFi.begin(ssid, mot de passe); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" CONNECTÉ "); //init et récupère l'heure configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); obtenir du temps(); //déconnecte le WiFi car il n'est plus nécessaire WiFi.disconnect(true); WiFi.mode (WIFI_OFF); display.clearDisplay(); } boucle vide () { getTime (); // obtenir l'heure actuelle // stocker les états des boutons-poussoirs droit et gauche RightState = digitalRead (RightButton); LeftState = digitalRead(LeftButton); //chaeck les boutons sont pressés if (RightState == 0 || LeftState == 0) { ledcWrite(0, 200);//quand le bouton est pressé le buzzer émet un bip sonore retard (100); if (état == 0) {//changer à l'état du cadre de l'écran d'alarme = 1;//changer l'état à l'état d'alarme RightState = LeftState = 1;//nous avons seulement besoin de changer l'écran } compte = 0;//réinitialiser le compteur } si (état == 1 && (comptes) < 5) {//si dans l'écran d'alarme et pas de délai d'attente calculateAlarm();//calculer les valeurs temporelles des informations d'alarme showAlarm();//afficher les valeurs } else {//si dans l'horloge état de l'écran = 0; display.clearDisplay(); clockFace (); // horloge analogique printLocalTime (); // imprimer l'heure dans l'horloge et imprimer d'autres détails } onAlarm (); // comparer l'heure de l'alarme avec l'heure locale et activer le délai d'alarme (100); // délai pour alarme allumée et éteinte } void clockFace() { //caalog clock face display.drawCircle(clockCenterX, clockCenterY, clockRadius, WHITE);//print watch circle for (int digit = 0; digit = 5) { // n'ont que 5 selctions.so remis à -1 (-1= est l'alarme activée ou désactivée) selectIndex = -1; } dateAndTimeSelection(selectIndex);//changer la sélection } void dateAndTimeSelection(int index) { if (index == -1) { //alarm on ou off if (RightState == 0) { //bascule entre on et off alarme if (alarmState == "Alarm ON") { alarmState = "Alarm OFF"; } else { alarmState = "Alarme ON"; } } } else { if (RightState == 0) { //dans d'autres sélections icrement la date ou l'heure associée dans le tableau alarmDateTime[index] = alarmDateTime[index] + 1; //index est la sélection } } int compare[4] = {12, 2030, 23, 59}; //limites supérieures des dates et des années int comparemonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //limite supérieure des mois int resetValue[4] = {1, 2020, 0, 0}; //valeurs de départ pour (int i = 1; i compare[i - 1]) { alarmDateTime = resetValue[i - 1]; } } if (alarmDateTime[0] > comparemonth[alarmDateTime[1] - 1]) { //réinitialiser les valeurs si les mois sont supérieurs à leurs limites alarmDateTime[0] = 1; } } void showAlarm() { //imprimer les détails de l'alarme String alarmDateTime0 = String(alarmDateTime[0]); //convertir les piqûres pour afficher String alarmDateTime1 = String(alarmDateTime[1]); Chaîne alarmDateTime2 = String(alarmDateTime[2]); Chaîne alarmDateTime3 = String(alarmDateTime[3]); Chaîne alarmDateTime4 = Chaîne(alarmDateTime[4]); //si les valeurs ont un chiffre à 1 chiffre, ajoutez-leur "0". si (alarmeDateHeure[0]

Conseillé: