Sisukord:

Nutikas äratuskell Magicbit (Arduino) abil: 10 sammu
Nutikas äratuskell Magicbit (Arduino) abil: 10 sammu

Video: Nutikas äratuskell Magicbit (Arduino) abil: 10 sammu

Video: Nutikas äratuskell Magicbit (Arduino) abil: 10 sammu
Video: ЧТО КРУЧЕ: Samsung Gear Fit 2 Pro или Xiaomi Mi Band 4. Обзор лучших фитнес - трекеров. 2024, November
Anonim
Image
Image

See õpetus näitab, kuidas teha nutikat äratuskella, kasutades OLED -ekraani Magicbit dev tahvlis ilma RTC moodulit kasutamata.

Tarvikud

  • Magicbit
  • USB-A-mikro-USB-kaabel

1. samm: lugu

Selles õpetuses õpime, kuidas Magicbiti abil nutikat äratuskella teha.

Samm 2: RIISTVARA SEADISTAMINE

Ühendage Magicbit USB -kaabli abil arvutiga.

3. samm: TARKVARA SEADISTAMINE

Avage oma Arduino IDE ja seadistage plaat Arduino IDE abil. Järgmine link näitab, kuidas seda teha. Seetõttu soovitame teil kõigepealt minna linki ja tutvuda Magic Bitiga.

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

Nüüd valige õige plaadi tüüp ja port. Sel juhul on plaadi tüüp Magicbit. Teegid on juba installitud Magicbiti raamatukogudes.

4. samm: teooria ja metoodika

Kui vaatate esimest videot, näete, et ekraanil on 2 ekraani.

  • kella ekraan, mis näitab aja üksikasju
  • häirekraan, mis näitab häire üksikasju

Nende kahe ekraani vahel vahetamiseks kasutasime Magicbitis mis tahes kahe nupuvajutust. Need nupud on Magicbitis ühendatud ESP32 35 (vasak nupp) ja 34 (parem nupp) kontaktiga. Aja ja muude üksikasjade kuvamiseks kasutasime magicbitis sisseehitatud OLED -ekraani.

Räägime sellest, kuidas need graafilised ekraanid töötavad.

Kellaekraanil on analoogkell, digitaalkell, kuupäeva, kuu ja aasta tekstid.

Analoogkella loomiseks kasutame mõningaid graafikafunktsioone, mis on saadaval graafikakogus nimega Adafriut GFX. Ring- ja joonefunktsiooni kasutades loome analoogkella. Kellaosutite asendis kasutatakse lihtsaid geomeetrilisi funktsioone, mida nimetatakse patuks ja cos. Seega sisestame ainult nurga, mis vastab pöörlevate käte ajale. selleks teisendame kõigepealt aja nurga all järgmiselt.

  • minutikäe nurk = minut*(360/60)
  • tundide nurk = tund*(360/12)

Nurk, mida mõõdetakse kella näo keskpunkti ja kella näo numbri 12 vahelise joone suhtes. Kasutades sin ja cos funktsioone, saame arvutada tundide ja minutite ridade otste x ja y koordinaadid. Alloleval pildil kirjeldatakse, kuidas see läheb.

Koordinaatide järgi trükime joonte abil tunni ja minuti käsi. Adafruit GFX raamatukogus on ka teksti printimise funktsioon. See aitab ekraanile printida muid üksikasju (kuupäev, kuu ja kellaaeg numbritega). Saate muuta analoogkella ja teksti positsioone, muutes koodi parameetreid.

Nagu kellaekraan, kasutasime Adafruit GFX raamatukogus teksti printimise funktsiooni OLED -ekraanile trükitud numbrite jaoks sobivates kohtades.

Samm: kohaliku aja leidmine

Kella kõige olulisem osa on see, kuidas saame kohaliku aja täpselt kätte. Sel eesmärgil saate Magicbitis kasutada ESP32 välist RTC kella moodulit või sisseehitatud RC kella. Selles projektis kasutasime teist meetodit. Selle meetodi puhul kasutame Interneti kaudu kohaliku aja saamiseks NTP (võrguaja protokoll) klienti. Interneti kasutamiseks kasutasime ESP32 sisseehitatud WIFI -võimalust. Seetõttu kasutame esimeses etapis WIFI -d Interneti -ühenduse loomiseks, pakkudes SSID -d ja parooli. Siis peaksime gmtOffset ja daylightOffset muutujate seadistama sekunditega. Nende muutujate väärtused on maailma eri piirkondades erinevad. gmtOffset tähendab sekundite arvu, mis erineb GMT -st. Enamiku areside daylightOffset on 3600. Selle leiate Internetist. Pärast praeguse kohaliku aja saamist ei kasutanud me enam WIFI -d. Sest siis arvutame kohaliku aja ESP32 sisseehitatud RC kella järgi. Selleks kasutatakse teeki time.h. Arduino keeles on lihtne näide (Arduino> Näited> ESP32> Aeg> lihtne aeg), et saaksite teada, kuidas see edasi töötab. Samuti saate neid linke kasutada NTP -kliendi kohta lisateabe saamiseks.

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

Pärast kohaliku aja õiget saamist muudame oma aega, näidates tekste ja nurka vastavalt sellele ajainfole igas silmus.

6. samm: häire seadistamine

Vasakule ja paremale nupule klõpsates saate muuta häire kuupäeva ja kellaaega. Lülitage äratus kindlasti välja, kui muudate äratuse kuupäeva ja kellaaega. Pärast kuupäeva ja kellaaja seadistamist lülitage alarm sisse. Sest kui äratus on sisse lülitatud ja kui äratusaeg on selle seadistamise ajal teie praeguse ajaga võrdne, hakkab helisignaal helisema. Põhisilmus kontrollib alati praegust kohalikku aega ja häireteave on võrdne. Kui need on võrdsed, siis sumiseja ja sisseehitatud roheline LED Magicbitis töötavad ühe minuti jooksul.

7. samm: summeri seadistamine

Me kasutame PWM impulsi, et luua sumiseja heli, kasutades koodis funktsiooni analogCwrite (). Kuna kõik raamatukogu funktsioonid on ESP32 -s, kehtib see Magicbiti jaoks. Signaali helisignaali saate muuta selle sageduse ja PWM väärtuse muutmiseks koodis.

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

Sellel lehel kirjeldatakse, kuidas sumin ESP32 -ga töötab.

8. samm: nuppude seadistamine

Kõigi olekute muutmiseks kasutasime Magicbitis kahte sisseehitatud surunuppu. Põhiahel kontrollige alati kahe nupu olekut. Kuna need tõmbusid sisemiselt üles, on normaalne olek kõrge signaaliga. Nii näete nende tihvtide digitaalset lugemist 1. Vaikeetapil kuvatakse ekraanil kellaliides. Sel ajal, kui vajutate mõnda kahest nupust, vahetab see ekraani äratusekraaniks. Samuti loeme aega sekundites alates viimasest nupule vajutamisest. Kui see arv on suurem kui mõni etteantud kestus, kuvatakse ekraanil kellakuva.

Kood on kirjutatud algajatele mõeldud põhifunktsioonide abil. Seega on koodist lihtne aru saada ja koodi toimides saate teada, kuidas see toimib.

9. samm: tõrkeotsing

Mõnikord käivitatakse kell natuke hiljem või see ei kuva graafikat õigesti. Järgmised näpunäited aitavad olukorda lahendada.

  • Veenduge, et andsite õige SSID ja parooli
  • Muutke NTP -serverit (Internetist leiate palju teie piirkonnaga seotud servereid).
  • Muudab Interneti -ühendust. (Võimalik on ka mobiilne leviala).

Samuti saate seeriamonitori abil kõike tõrkeotsingut teha. Lisaks OLED -ekraanile näitab seeriamonitor ajainfot.

Samm: Arduino kood

// teegid OLED -ekraanile

#kaasake

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library to use RC clock // defineerige sisendi ja väljundi nimesid #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int loeb = 0; int praegune aeg = 0; struktuuri tm ajainfo; const char* ssid = "SINU SSID"; // wifi üksikasjad const char* parool = "SINU PAROOL"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // häire muutujad int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool summeriOn = 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}}; // valiku ristkülik const char* ntpServer = "asia.pool.ntp.org"; // server detais const long gmtOffset_sec = 19800; const int päevavalgusOffset_sec = 0; Adafruit_SSD1306 ekraan (128, 64); // OLED -suurus määrab baitide kellaCenterY = (display.height () + 16)/2; // analoogkelladetaili üksikasjad bait clockCenterX = (display.height () - 16)/2; bait kellRadius = 23; bool olek = 0; // ekraan sisse või välja lülitatud boolean Alarm = 0; // häire praegune olek String alarmState = "Alarm ON"; // alarm sisse või välja // muutujad salvestatud aja andmed char dayName [10]; char päevanumber [3]; söekuu [10]; süsiaasta [5]; söetunnid [3]; söeminutid [3]; söe kuunumber [3]; char sekundid [3]; // nupumuutujad bool RightState = 1; bool LeftState = 1; // sumina muutujad int kanal = 0; int Sagedus = 2000; int PWM = 200; int resolutsioon = 8; void setup () {// sisendi ja väljundite määramine pinMode (RightButton, INPUT); pinMode (vasaknupp, INPUT); pinMode (GreenLED, OUTPUT); pinMode (helisignaal, väljund); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // sisestage kuva display.display (); viivitus (3000); display.clearDisplay (); ledcSetup (0, sagedus, eraldusvõime); // pwm parameetrite seadistamine ledcAttachPin (sumin, 0); Serial.begin (115200); // sisendada jadamisside // ühenduda WiFi -ga Serial.printf ("Ühendamine %s", ssid); WiFi.begin (ssid, parool); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Seeria.print ("."); } Serial.println ("ÜHENDATUD"); // init ja hangi aeg configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // katkesta WiFi ühendus, kuna seda pole enam vaja WiFi.disconnect (true); WiFi -režiim (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // hankige praegune aeg // salvestage parema ja vasaku nupu olekud RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // tšekk nuppe vajutatakse, kui (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kui nuppu vajutatakse, kostab helisignaal piiksu heli viivitust (100); if (olek == 0) {// muuda häireekraami olekuks = 1; // muuda olek alarmi olekuks RightState = LeftState = 1; // me vajame ainult muutmisseanssi} loendusi = 0; // lähtestame loenduri}, kui (olek == 1 && (loendab) <5) {// kui äratuskuval ja ajalõpu ei arvutata ekraani olek = 0; display.clearDisplay (); clockFace (); // analoogkella printimineLocalTime (); // kellaaja printimine kellaajale ja muude üksikasjade printimine} onAlarm (); // võrrelge äratusaega kohaliku ajaga ja lülitage sisse häire viivitus (100); // viivitus alarm on and off} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // prindi kellaring (int number = 0; digit = 5) {// on ainult 5 selctions.so lähtestada -1 (-1 = on alarm sisse või välja lülitatud) selectIndex = -1; } dateAndTimeSelection; (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Alarm SEES"; }}} else {if (RightState == 0) {// muudes jaotistes icrement seotud kuupäev või kellaaeg massiivis alarmDateTime [register] = alarmDateTime [indeks] + 1; // indeks on valik}} int võrrelda [4] = {12, 2030, 23, 59}; // kuupäevade ja aastate ülempiirid võrdluskuudel [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // kuude ülemine piir int resetValue [4] = {1, 2020, 0, 0}; // lähteväärtused (int i = 1; i võrrelda [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> võrdluskuu [alarmDateTime [1] - 1]) {// lähtestage väärtused, kui kuud on nende piiridest suuremad alarmDateTime [0] = 1; }} void showAlarm () {// prindi häire üksikasjad String alarmDateTime0 = String (alarmDateTime [0]); // teisenda nõelad näitamiseks String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // kui väärtustel on üks 1 digitaalne, lisage neile "0". if (alarmDateTime [0]

Soovitan: