Turinys:

Išmanusis žadintuvas naudojant „Magicbit“(„Arduino“): 10 žingsnių
Išmanusis žadintuvas naudojant „Magicbit“(„Arduino“): 10 žingsnių

Video: Išmanusis žadintuvas naudojant „Magicbit“(„Arduino“): 10 žingsnių

Video: Išmanusis žadintuvas naudojant „Magicbit“(„Arduino“): 10 žingsnių
Video: „Xiaomi Mi Smart Clock“ – pasaulinė versija su „Google Assistant“. Įvykių balsas per namų asistentą 2024, Lapkritis
Anonim
Image
Image

Ši pamoka parodo, kaip padaryti išmanųjį žadintuvą naudojant OLED ekraną „Magicbit dev“plokštėje, nenaudojant jokio RTC modulio.

Prekės

  • „Magicbit“
  • Kabelis nuo USB-A iki mikro-USB

1 žingsnis: istorija

Šioje pamokoje sužinosime, kaip pasigaminti išmanųjį žadintuvą naudojant „Magicbit“.

2 veiksmas: Aparatūros sąranka

Prijunkite „Magicbit“prie kompiuterio naudodami USB kabelį.

3 žingsnis: PROGRAMINĖS ĮRANGOS SĄRANGA

Atidarykite „Arduino IDE“ir nustatykite lentą naudodami „Arduino IDE“. Toliau pateikta nuoroda nurodo, kaip tai padaryti. Taigi rekomenduojame pirmiausia apsilankyti nuorodoje ir susipažinti su „Magic Bit“.

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

Dabar pasirinkite tinkamą plokštės tipą ir prievadą. Šiuo atveju plokštės tipas yra „Magicbit“. Bibliotekos jau yra įdiegtos, kai „Magicbit“bibliotekose.

4 žingsnis: teorija ir metodika

Jei pažvelgsite į pirmąjį vaizdo įrašą, pamatysite, kad ekrane yra 2 ekranai.

  • laikrodžio ekranas, kuriame rodoma išsami informacija apie laiką
  • aliarmo ekranas, kuriame rodoma išsami informacija apie aliarmą

Norėdami perjungti šiuos du ekranus, „Magicbit“naudojome bet kurį dviejų mygtukų mygtuką. Šie mygtukai yra prijungti prie 35 (kairysis mygtukas) ir 34 (dešinysis mygtukas) „Magicbit“ESP32 kaiščių. Norėdami parodyti laiką ir kitą informaciją, „Magicbit“naudojome įmontuotą OLED ekraną.

Pakalbėkime apie tai, kaip veikia šie grafiniai ekranai.

Laikrodžio ekrane yra analoginis laikrodis, skaitmeninis laikrodis, datos, mėnesio ir metų tekstai.

Norėdami sukurti analoginį laikrodį, naudojame kai kurias grafikos funkcijas, kurias galima rasti grafikos bibliotekoje „Adafriut GFX“. Naudodami apskritimo funkciją ir linijos funkciją sukuriame analoginį laikrodžio rodyklę. Paprastos geometrinės funkcijos, vadinamos sin ir cos, naudojamos laikrodžio rodyklių padėčiai. Taigi mes įvedame tik kampą, kuris atitinka sukamųjų rankų laiką. tam pirmiausia laiką paverčiame kampu taip.

  • minutės rodyklės kampas = minutės*(360/60)
  • valandų rodyklės kampas = valandos*(360/12)

Kampas, išmatuotas pagal liniją tarp laikrodžio vidurio centro ir skaičiaus 12 laikrodžio rodyklėje. Naudodamiesi sin ir cos funkcijomis, galime apskaičiuoti valandų ir minučių eilučių galų x ir y koordinates. Žemiau esančioje nuotraukoje aprašoma, kaip tai veikia.

Remdamiesi koordinatėmis, mes piešiame valandos ir minutės ranka brėždami linijas. „Adafruit GFX“bibliotekoje taip pat yra teksto spausdinimo funkcija. Tai padeda spausdinti kitą informaciją (datą, mėnesį ir laiką skaitmenimis) ekrane. Analoginio laikrodžio padėtį ir teksto pozicijas galite pakeisti pakeisdami kodo parametrus.

Kaip ir laikrodžio ekranas, mes naudojome teksto spausdinimo funkciją „Adafruit GFX“bibliotekoje, norėdami spausdinti numerius OLED ekrane atitinkamose vietose.

5 veiksmas: nustatykite vietos laiką

Svarbiausia laikrodžio dalis yra tai, kaip tiksliai gauname vietos laiką. Tam tikslui galite naudoti išorinį RTC laikrodžio modulį arba integruotą RC laikrodį ESP32 sistemoje „Magicbit“. Šiame projekte mes panaudojome antrąjį metodą. Šiuo metodu mes naudojame NTP (tinklo laiko protokolo) klientą, kad gautume vietinį laiką iš interneto. Prieigai prie interneto naudojome integruotą WIFI įrenginį ESP32. Todėl pirmame etape mes naudojame WIFI prieigai prie interneto, pateikdami SSID ir slaptažodį. Tada per kelias sekundes turėtume sukonfigūruoti kintamuosius gmtOffset ir daylightOffset. Šių kintamųjų reikšmės skirtinguose pasaulio regionuose skiriasi. „gmtOffset“reiškia sekundžių skaičių, kuriuo jūs skiriatės nuo GMT. Gavę dabartinį vietos laiką, mes nebesinaudojome WIFI. Nes tada mes apskaičiuojame vietinį laiką iš ESP32 integruoto RC laikrodžio. Tai daroma naudojant time.h biblioteką. Yra paprastas pavyzdys „Arduino“(„Arduino“> Pavyzdžiai> ESP32> Laikas> paprastas laikas), kad galėtumėte sužinoti, kaip tai veikia toliau. Taip pat šias nuorodas galite naudoti norėdami sužinoti daugiau apie NTP klientą.

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

Teisingai gavę vietinį laiką, mes keičiame savo laiką rodydami tekstus ir kampą pagal tą laiko informaciją kiekvienoje kilpoje.

6 veiksmas: aliarmo nustatymas

Spustelėję kairįjį ir dešinįjį mygtukus, galite pakeisti žadintuvo datos ir laiko pasirinkimą. Keisdami žadintuvo datą ir laiką, būtinai išjunkite žadintuvą. Nustatę datą ir laiką, įjunkite žadintuvą. Nes jei žadintuvas įjungtas ir kai jo nustatymo metu žadintuvo laikas yra lygus jūsų dabartiniam laikui, skambės aliarmo signalas. Pagrindinėje kilpoje visada tikrinamas dabartinis vietinis laikas ir aliarmo informacija yra lygi. Jei jie yra lygūs, garsinis signalas ir žalias šviesos diodas „Magicbit“veiks vieną minutę.

7 veiksmas: garso signalo nustatymas

Mes naudojame PWM impulsą, kad sukurtume garsinį signalą, naudodami kodo funkciją „analogCwrite“(). Kadangi visos bibliotekos funkcijos yra ESP32, galioja „Magicbit“. Signalo garsą galite pakeisti nuo kodo dažnio ir PWM vertės.

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

Šiame puslapyje aprašoma, kaip garsinis signalas veikia su ESP32.

8 veiksmas: mygtukų nustatymas

Norėdami pakeisti visas būsenas, „Magicbit“naudojome du įmontuotus mygtukus. Pagrindinė kilpa visada tikrina dviejų mygtukų būseną. Kadangi jie buvo pakelti viduje, įprasta būsena yra didelis signalas. Taigi galite matyti, kad tų kaiščių skaitmeninis nuskaitymas yra 1. Numatytuoju etapu ekrane rodoma laikrodžio sąsaja. Tuo metu, kai paspaudžiamas bet kuris iš dviejų mygtukų, ekranas pasikeičia į pavojaus ekraną. Taip pat skaičiuojame laiką sekundėmis nuo paskutinio karto, kai paspaudžiamas mygtukas. Jei šis skaičius yra ilgesnis už tam tikrą iš anksto nustatytą trukmę, ekrane bus rodomas laikrodžio ekranas.

Kodas rašomas naudojant pagrindines funkcijas pradedantiesiems. Taigi kodą suprasti paprasta ir jūs galite sužinoti, kaip jis veikia, nurodydami kodą.

9 veiksmas: trikčių šalinimas

Kartais laikrodis paleidžiamas šiek tiek vėliau arba netinkamai rodoma grafika. Šie patarimai padės išspręsti situaciją.

  • Įsitikinkite, kad nurodėte teisingą SSID ir slaptažodį
  • Pakeiskite NTP serverį (internete galite rasti daug serverių, susijusių su jūsų regionu).
  • Keičia interneto ryšį. (Taip pat galima mobilioji interneto prieigos taškas).

Taip pat galite išspręsti visas problemas naudodami serijinį monitorių. Be OLED ekrano serijinis monitorius rodo laiko informaciją.

10 veiksmas: „Arduino“kodas

// bibliotekos OLED ekranui

#įtraukti

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library for use RC clock // apibrėžti įvesties ir išvesties kaiščių pavadinimus #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int skaičiuoja = 0; int currentTime = 0; struktura tm laiko informacija; const char* ssid = "JŪSŲ SSID"; // wifi informacija const char* password = "JŪSŲ PASLAPTIS"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // aliarmo kintamieji 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}}; // pasirinkimo stačiakampis const char* ntpServer = "asia.pool.ntp.org"; // serverio detis const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; „Adafruit_SSD1306“ekranas (128, 64); // OLED dydžio apibrėžimas baitų laikrodis baitų laikrodisRadius = 23; bool state = 0; // ekranas įjungtas arba išjungtas boolean Alarm = 0; // aliarmo dabartinė būsena String alarmState = "Alarm ON"; // signalizacija įjungta arba išjungta // kintamieji saugomi laiko duomenys char dayName [10]; char daynumber [3]; anglies mėnuo [10]; anglies metai [5]; anglies valandos [3]; anglies minutės [3]; char mėnesio numeris [3]; char sekundės [3]; // mygtuko kintamieji bool RightState = 1; bool LeftState = 1; // garsinio signalo kintamieji int channel = 0; int Dažnis = 2000; int PWM = 200; int rezoliucija = 8; void setup () {// nustatyti įvestį ir išvestį pinMode („RightButton“, „INPUT“); pinMode (kairysis mygtukas, Įvestis); pinMode (GreenLED, OUTPUT); pinMode (garsinis signalas, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); vėlavimas (3000); display.clearDisplay (); ledcSetup (0, dažnis, skiriamoji geba); // konfigūruoti pwm parametrus ledcAttachPin („Buzzer“, 0); Serial.begin (115200); // intilize serial communication // prisijungti prie WiFi Serial.printf ("Prisijungimas prie %s", ssid); WiFi.begin (ssid, slaptažodis); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serijinis atspaudas ("."); } Serial.println ("CONNECTED"); // init ir gauti laiką configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // atjungti WiFi, nes to nebereikia WiFi.disconnect (true); „WiFi.mode“(WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // gauti dabartinį laiką // išsaugoti dešiniojo ir kairiojo mygtuko būsenas RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // paspausti užpakaliniai mygtukai, jei (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kai paspaudžiamas mygtukas, garsinis signalas skleidžia pyptelėjimą (100); if (būsena == 0) {// pakeisti į pavojaus ekrano rėmelio būseną = 1; // pakeisti būseną į pavojaus būseną RightState = LeftState = 1; // mums reikia tik pakeisti sceern} count = 0; // reset counter}, jei (būsena == 1 && (skaičius) <5) {// jei yra aliarmo ekrane ir nėra skirtojo laiko apskaičiavimo ekrano būsena = 0; display.clearDisplay (); clockFace (); // analoginis laikrodžio rodinys printLocalTime (); // spausdinimo laikas pagal laikrodžio rodyklę ir kitos detalės spausdinimas} onAlarm (); // palyginkite žadintuvo laiką su vietiniu laiku ir įjunkite pavojaus signalo uždelsimą (100); // delsa signalizacija įjungta ir išjungta} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // spausdinti laikrodžio apskritimą (int skaitmuo = 0; skaitmuo = 5) {// turi tik 5 selctions.so atstatyti į -1 (-1 = ar signalizacija įjungta arba išjungta) selectIndex = -1; } dateAndTimeSelection (selectIndex); // keisti selction} void dateAndTimeSelection (int indeksas) {if (index == -1) {// aliarmas įjungtas arba išjungtas, jei (RightState == 0) {// perjungti įjungimo ir išjungimo signalą, jei (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Alarm ON"; }}} else {if (RightState == 0) {// kitose srityse icrement susijusi data arba laikas masyve alarmDateTime [indeksas] = alarmDateTime [indeksas] + 1; // indeksas yra pasirinkimas}} int palyginti [4] = {12, 2030, 23, 59}; // viršutinės datų ir metų ribos per palyginamąjį mėnesį [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // viršutinė mėnesių riba int resetValue [4] = {1, 2020, 0, 0}; // pradinės reikšmės (int i = 1; i palyginti [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> Comparemonth [alarmDateTime [1] - 1]) {// iš naujo nustatyti reikšmes, jei mėnesiai yra didesni už jų ribas alarmDateTime [0] = 1; }} void showAlarm () {// spausdinti išsamią informaciją apie aliarmą String alarmDateTime0 = String (alarmDateTime [0]); // konvertuoti stygas į rodomą String alarmDateTime1 = Styga (alarmDateTime [1]); String alarmDateTime2 = Styga (alarmDateTime [2]); String alarmDateTime3 = Styga (alarmDateTime [3]); String alarmDateTime4 = Styga (alarmDateTime [4]); // jei reikšmės turi vieną skaitmenį, prie jų pridėkite „0“. if (alarmDateTime [0]

Rekomenduojamas: