Obsah:

Inteligentný budík využívajúci Magicbit (Arduino): 10 krokov
Inteligentný budík využívajúci Magicbit (Arduino): 10 krokov
Anonim
Image
Image

Tento tutoriál ukazuje, ako vytvoriť inteligentný budík pomocou displeja OLED na doske vývojára Magicbit bez použitia akéhokoľvek modulu RTC.

Zásoby

  • Magicbit
  • Kábel USB-A na Micro-USB

Krok 1: Príbeh

V tomto návode sa naučíme, ako vytvoriť inteligentný budík pomocou Magicbit.

Krok 2: NASTAVENIE HARDWARU

Pripojte svoj Magicbit k počítaču pomocou kábla USB.

Krok 3: NASTAVENIE SOFTVÉRU

Otvorte svoje Arduino IDE a nastavte dosku pomocou Arduino IDE. Nasledujúci odkaz popisuje, ako to urobiť. Odporúčame vám teda najskôr prejsť na odkaz a zoznámiť sa s programom Magic bit.

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

Teraz vyberte správny typ dosky a port. V tomto prípade je typ dosky Magicbit. Knižnice sú už nainštalované, keď sú v knižniciach Magicbit.

Krok 4: Teória a metodika

Keď sa pozriete na prvé video, môžete vidieť, že displej má 2 obrazovky.

  • obrazovka s hodinami, ktorá zobrazuje detaily času
  • obrazovka alarmu, ktorá zobrazuje podrobnosti o alarme

Na prepínanie medzi týmito dvoma obrazovkami sme použili akékoľvek tlačidlo dvoch v Magicbit. Tieto tlačidlá sú spojené s 35 (ľavým tlačidlom) a 34 (pravým tlačidlom) kolíkom ESP32 v Magicbite. Na zobrazenie času a ďalších podrobností sme použili vstavaný OLED displej v Magicbit.

Porozprávajme sa o tom, ako tieto grafické obrazovky fungujú.

Obrazovka hodín má analógové hodiny, digitálne hodiny, text s dátumom, mesiacom a rokom.

Na vytváranie analógových hodín používame niektoré grafické funkcie, ktoré sú k dispozícii v grafickej knižnici s názvom Adafriut GFX. Použitím kruhovej funkcie a čiarovej funkcie vytvoríme analógový ciferník. Na polohu ručičiek hodín sa používajú jednoduché geometrické funkcie nazývané hriech a cos. Preto zadávame iba uhol, ktorý zodpovedá času otáčania rúk. na to najskôr prevedieme čas na uhol nasledovne.

  • uhol minútovej ruky = minúty*(360/60)
  • uhol hodín ručičky = hodiny*(360/12)

Uhol meraný vzhľadom na čiaru medzi stredom hodinového ciferníka a číslom 12 v ciferníku. Pomocou funkcií sin a cos môžeme vypočítať súradnice x a y na konci hodinových a minútových čiar. Nasledujúci obrázok popisuje, ako sa mu darí.

Podľa súradníc vytlačíme hodinovú a minútovú ručičku nakreslením čiar. V knižnici Adafruit GFX je k dispozícii aj funkcia tlače textu. Pomáha vytlačiť na displej ďalšie detaily (dátum, mesiac a čas v číslach). Pozíciu analógových hodín a polohu textu môžete zmeniť zmenou parametrov v kóde.

Rovnako ako na hodinách sme použili funkciu tlače textu v knižnici Adafruit GFX na tlač čísel na OLED displeji na príslušných miestach.

Krok 5: Získanie miestneho času

Najdôležitejšou časťou hodín je, ako presne dostaneme miestny čas. Na tento účel môžete použiť externý hodinový modul RTC alebo vstavané RC hodiny v ESP32 v Magicbit. V tomto projekte sme použili druhú metódu. V tejto metóde používame klienta NTP (protokol sieťového času) na získanie miestneho času z internetu. Na prístup na internet sme použili vstavané zariadenie WIFI v ESP32. Preto v prvej fáze používame WIFI na prístup na internet poskytnutím SSID a hesla. Potom by sme mali nakonfigurovať gmtOffset a daylightOffset v premenných v sekundách. Hodnoty týchto premenných sa líšia v závislosti od regiónu na svete. gmtOffset znamená počet sekúnd, v ktorých sa líšite od GMT.. Pre väčšinu ares je denné osvetlenie 3600. Nájdete ho na internete. Potom, čo sme dostali aktuálny miestny čas, sme už WIFI nepoužívali. Pretože potom vypočítame miestny čas z vstavaných RC hodín v ESP32. To sa vykonáva pomocou knižnice time.h. V Arduino je jednoduchý príklad (Arduino> Príklady> ESP32> Čas> simpletime), aby ste sa dozvedeli, ako to funguje ďalej. Tieto odkazy môžete tiež použiť na ďalšie znalosti o klientovi NTP.

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

Po správnom získaní miestneho času zmeníme čas tak, že v každej slučke zobrazíme texty a uhol podľa časových informácií.

Krok 6: Nastavenie alarmu

Kliknutím na ľavé a pravé tlačidlo môžete zmeniť výber dátumu a času budíka. Pri zmene dátumu a času budíka určite vypnite budík. Po nastavení dátumu a času zapnite budík. Pretože ak je budík zapnutý a keď sa čas budíka rovná vášmu aktuálnemu času pri jeho nastavovaní, zaznie bzučiak budíka. V hlavnej slučke sa vždy kontroluje aktuálny miestny čas a informácie o poplachoch sú rovnaké. Ak sú rovnaké, potom bzučiak a vstavaná zelená LED v Magicbite budú fungovať počas jednej minúty.

Krok 7: Nastavenie bzučiaka

Pulz PWM používame na vytvorenie bzučiaka pomocou funkcie analogCwrite () v kóde. Pretože všetky funkcie knižnice sú v ESP32, je platný pre Magicbit. Pípnutie bzučiaka môžete zmeniť v závislosti od frekvencie a hodnoty PWM v kóde.

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

Táto stránka popisuje, ako funguje bzučiak s ESP32.

Krok 8: Nastavenie tlačidiel

Na zmenu všetkých stavov sme použili dve vstavané tlačidlá v Magicbit. Hlavná slučka vždy kontroluje stav dvoch tlačidiel. Pretože sa vnútorne zastavili, je v normálnom stave vysoký signál. Môžete teda vidieť digitálne čítanie týchto pinov sú 1. V predvolenom stave displej zobrazuje rozhranie hodín. V tom čase, keď je stlačené ktorékoľvek z dvoch tlačidiel, zmení sa obrazovka na obrazovku alarmu. Tiež počítame čas v sekundách od posledného stlačenia tlačidla. Ak je tento počet väčší ako nejaké preddefinované trvanie, potom sa na displeji zobrazí obrazovka s hodinami.

Kód je napísaný pomocou základných funkcií pre začiatočníkov. Kód je teda ľahko zrozumiteľný a metódu, ako funguje, sa môžete naučiť odkazovaním na kód.

Krok 9: Riešenie problémov

Niekedy sa hodiny začnú o niečo neskôr alebo nezobrazujú grafiku správne. Nasledujúce rady pomôžu situáciu vyriešiť.

  • Uistite sa, že ste zadali správny SSID a heslo
  • Zmeňte server NTP (môžete nájsť veľa serverov z internetu, ktoré sa týkajú vašej oblasti).
  • Mení internetové pripojenie. (Možný je aj mobilný hotspot).

Všetko môžete tiež vyriešiť pomocou sériového monitora. Okrem OLED displeja zobrazuje sériový monitor aj časové informácie.

Krok 10: Kód Arduino

// knižnice pre OLED displej

#zahrnúť

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library for use RC clock // define input and output pin names #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int count = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "VAŠE SSID"; // podrobnosti o wifi const char* heslo = "VAŠE HESLO"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // variabilné alarmy int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bzučiak zapnutý = 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}}; // výberový obdĺžnik const char* ntpServer = "asia.pool.ntp.org"; // oddelenie servera const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Displej Adafruit_SSD1306 (128, 64); // Veľkosť OLED definuje bajt clockCenterY = (display.height () + 16)/2; // analógový detail hodinového bytu byte clockCenterX = (display.height () - 16)/2; byte clockRadius = 23; bool state = 0; // zapnutie alebo vypnutie obrazovky boolean Alarm = 0; // aktuálny stav alarmu String alarmState = "Alarm ON"; // alarm zapnutý alebo vypnutý // premenlivé uložené časové údaje char dayName [10]; char daynumber [3]; char mesiac [10]; char rok [5]; char hodiny [3]; znakové minúty [3]; char monthnumber [3]; znakové sekundy [3]; // premenné tlačidla bool RightState = 1; bool LeftState = 1; // premenné bzučiaka int channel = 0; int Frekvencia = 2000; int PWM = 200; int rozlíšenie = 8; void setup () {// nastavenie vstupu a výstupu pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (bzučiak, VÝSTUP); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // zintenzívnenie displeja display.display (); oneskorenie (3000); display.clearDisplay (); ledcSetup (0, Frequency, resolution); // konfigurácia parametrov pwm ledcAttachPin (bzučiak, 0); Serial.begin (115200); // zintenzívnenie sériovej komunikácie // pripojenie k WiFi Serial.printf ("Pripojenie k %s", ssid); WiFi.begin (ssid, heslo); while (WiFi.status ()! = WL_CONNECTED) {oneskorenie (500); Serial.print ("."); } Serial.println („PRIPOJENÉ“); // inicializácia a získanie času configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // odpojte WiFi, pretože už nie je potrebný WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // získanie aktuálneho času // uloženie stavov pravého a ľavého tlačidla RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // skontrolujte, či sú tlačidlá stlačené, ak (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // po stlačení tlačidla bzučiak vydá oneskorenie pípnutia (100); if (state == 0) {// zmena stavu rámca obrazovky alarmu = 1; // zmena stavu na stav alarmu RightState = LeftState = 1; // potrebujeme len zmeniť sceern} počet = 0; // reset počítadla} ak (stav == 1 && (počíta) <5) {// ak je na obrazovke alarmu a nie je časový limit stav obrazovky = 0; display.clearDisplay (); clockFace (); // analógový ciferník printLocalTime (); // vytlačenie času na ciferníku a vytlačenie ďalších podrobností} onAlarm (); // porovnanie času budíka s miestnym časom a zapnutie oneskorenia budíka (100); // oneskorenie pre zapnutie a vypnutie budíka} neplatné hodinyFace () {// caalogový ciferník ciferníka.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // tlač hodinkového kruhu pre (int digit = 0; digit = 5) {// má iba 5 selctions.so reset na -1 (-1 = je alarm zapnutý alebo vypnutý) selectIndex = -1; } dateAndTimeSelection (selectIndex); // zmena sekcie} neplatný dateAndTimeSelection (int index) {if (index == -1) {// alarm zapnutý alebo vypnutý, ak (RightState == 0) {// prepína medzi zapnutým a vypnutým alarmom, ak (alarmState == "Alarm ZAPNUTÝ") {alarmState = "Alarm VYPNUTÝ"; } else {alarmState = "Alarm ZAPNUTÝ"; }}} else {if (RightState == 0) {// v iných sekciách icrementujte dátum alebo čas v poli alarmDateTime [index] = alarmDateTime [index] + 1; // index je výber}} int porovnať [4] = {12, 2030, 23, 59}; // horné limity dátumov a rokov v porovnaní [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // horná lišta mesiacov int resetValue [4] = {1, 2020, 0, 0}; // počiatočné hodnoty pre (int i = 1; porovnávam [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> porovnať [alarmDateTime [1] - 1]) {// reset vlaues, ak sú mesiace väčšie ako ich limity alarmDateTime [0] = 1; }} void showAlarm () {// tlač podrobností alarmu String alarmDateTime0 = String (alarmDateTime [0]); // prevod stingov na zobrazenie String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // ak majú hodnoty jednu číslicu 1, pridajte k nim „0“. ak (alarmDateTime [0]

Odporúča: