Përmbajtje:

Ora inteligjente e alarmit duke përdorur Magicbit (Arduino): 10 hapa
Ora inteligjente e alarmit duke përdorur Magicbit (Arduino): 10 hapa

Video: Ora inteligjente e alarmit duke përdorur Magicbit (Arduino): 10 hapa

Video: Ora inteligjente e alarmit duke përdorur Magicbit (Arduino): 10 hapa
Video: Hipokrati - Alarmi! Ja aparaturat e rrezikshme, kur duhet të bëhet ekografia dhe rezonanca 2024, Korrik
Anonim
Image
Image

Ky mësim tregon se si të bëni një orë alarmi të zgjuar duke përdorur ekranin OLED në bordin Magicbit dev pa përdorur ndonjë modul RTC.

Furnizimet

  • Magicbit
  • Kabllo USB-A në mikro-USB

Hapi 1: Histori

Në këtë tutorial ne do të mësojmë se si të bëjmë një orë zgjimi të zgjuar duke përdorur Magicbit.

Hapi 2: RREGULLIMI I HARDWARE

Lidheni Magicbit tuaj me kompjuterin duke përdorur kabllo USB.

Hapi 3: SETUP SOFTWARE

Hapni IDE tuaj Arduino dhe vendosni tabelën me Arduino IDE. Lidhja e mëposhtme tregon se si ta bëni këtë. Kështu që ne ju rekomandojmë që së pari të shkoni te lidhja dhe të njiheni me Magic bit.

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

Tani zgjidhni llojin dhe portën e saktë të tabelës. Në këtë rast lloji i bordit është Magicbit. Bibliotekat janë instaluar tashmë kur janë në bibliotekat në Magicbit.

Hapi 4: Teori dhe Metodologji

Nëse shikoni videon e parë, mund të shihni që ekrani ka 2 ekrane.

  • ekrani i orës i cili tregon detajet e kohës
  • ekran alarmi i cili tregon detajet e alarmit

Për kalimin midis këtyre dy ekraneve ne përdorëm çdo buton prej dy në Magicbit. Këta butona janë të lidhur me 35 kunjat (butoni i majtë) dhe 34 (butoni i djathtë) të ESP32 në Magicbit. Për të treguar kohën dhe detajet e tjera ne përdorëm ekranin e integruar OLED në magicbit.

Le të flasim se si funksionojnë këto ekrane grafike.

Ekrani i orës ka orë analoge, orë dixhitale, tekste të datës, muajit dhe vitit.

Për krijimin e orës analoge ne përdorim disa funksione grafike të cilat janë të disponueshme në bibliotekën grafike të quajtur Adafriut GFX. Duke përdorur funksionin e rrethit dhe funksionin e linjës, ne krijojmë një faqe analoge të orës. Funksionet e thjeshta gjeometrike të quajtura sin dhe cos përdoren për pozicionin e akrepave të orës. Pra, ne futim vetëm këndin që korrespondon me kohën për duart e rrotullimit. për këtë ne fillimisht e konvertojmë kohën në kënd si më poshtë.

  • këndi i dorës së minutës = minuta*(360/60)
  • këndi i orëve të dorës = orë*(360/12)

Këndi i matur në lidhje me vijën midis qendrës së faqes së orës dhe numrit 12 në faqen e orës. Duke përdorur funksionet sin dhe cos ne mund të llogarisim koordinatat x dhe y të skajeve të vijave të orës dhe minutës. Fotografia më poshtë përshkruan se si po ecën.

Sipas koordinatave ne shtypim orë dhe minutë duke vizatuar linja. Ekziston gjithashtu një funksion printimi teksti në bibliotekën Adafruit GFX. Ndihmon për të printuar detaje të tjera (data, muaji dhe ora shfaqen me shifra) në ekran. Mund të ndryshoni pozicionin analog të orës dhe pozicionet e tekstit duke ndryshuar parametrat në kod.

Ashtu si në ekranin e orës, ne përdorëm funksionin e printimit të tekstit në bibliotekën Adafruit GFX për numrat e printuar në ekranin OLED në vendet e duhura.

Hapi 5: Marrja e kohës lokale

Pjesa më e rëndësishme e orës është se si e marrim kohën lokale me saktësi. Për këtë qëllim mund të përdorni modulin e jashtëm të orës RTC ose orën e integruar RC në ESP32 në Magicbit. Në këtë projekt ne përdorëm metodën e dytë. Në këtë metodë ne përdorim klientin NTP (koha e rrjetit protokallërues) për të marrë kohën lokale nga interneti. Për qasje në internet ne përdorëm objektin e integruar WIFI në ESP32. Prandaj në fazën e parë ne përdorim WIFI për qasje në internet duke siguruar SSID dhe fjalëkalim. Atëherë ne duhet të konfigurojmë gmtOffset dhe daylightOffset në variabla në sekonda. Vlerat e këtyre variablave ndryshojnë nga rajoni në rajon në botë. gmtOffset nënkupton numrin e sekondave që ndryshoni nga GMT.. Për shumicën e orëve të ditësOffset është 3600. Mund ta gjeni në internet. Pasi morëm kohën aktuale lokale nuk përdorëm më WIFI. Sepse atëherë ne llogarisim kohën lokale nga ora e integruar RC në ESP32. Kjo bëhet duke përdorur bibliotekën time.h. Ekziston një shembull i thjeshtë në Arduino (Arduino> Shembuj> ESP32> Koha> koha e thjeshtë) që ju të mësoni se si funksionon më tej. Gjithashtu këto lidhje mund t'i përdorni për njohuri të mëtejshme në lidhje me klientin NTP.

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

Pasi të kemi marrë kohën lokale në mënyrë korrekte, ne ndryshojmë kohën tonë duke treguar tekste dhe kënd sipas informacionit të asaj kohe në çdo lak.

Hapi 6: Vendosja e alarmit

Duke klikuar butonat majtas dhe djathtas mund të ndryshoni zgjedhjen e datës dhe orës së alarmit. Sigurohuni që ta fikni alarmin kur ndryshoni datën dhe orën e alarmit. Pasi të keni vendosur datën dhe orën ndizni alarmin. Sepse nëse alarmi është ndezur dhe kur koha e alarmit është e barabartë me kohën tuaj aktuale kur e vendosni, do të bjerë zilja e alarmit. Në lakin kryesor kontrollon gjithmonë kohën aktuale lokale dhe informacioni i alarmit është i barabartë. Nëse ato janë të barabarta, atëherë zilja dhe LED e gjelbër e ndërtuar në Magicbit do të funksionojë gjatë një minute.

Hapi 7: Vendosja e ziles

Ne përdorim pulsin PWM për të krijuar tingullin e ziles duke përdorur funksionin analogCwrite () në kod. Për shkak se të gjitha funksionet e bibliotekës janë në ESP32, është e vlefshme për Magicbit. Mund të ndryshoni tingullin e sinjalit të ziles nga ndryshimi i frekuencës dhe vlerës së PWM në kod.

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

Kjo faqe përshkruan se si funksionon zile me ESP32.

Hapi 8: Vendosja e butonave

Për të ndryshuar të gjitha gjendjet, ne përdorëm dy butona të integruar në Magicbit. Laku kryesor kontrolloni gjithmonë gjendjen e dy butonave. Për shkak se ata u tërhoqën brenda, gjendja normale është me sinjal të lartë. Kështu që mund të shihni që leximi dixhital i atyre kunjave është 1. Në fazën e paracaktuar, ekrani tregon ndërfaqen e orës. Në atë kohë, kur shtypet ndonjë nga dy butonat, atëherë ai ndryshon ekranin në ekran alarmi. Gjithashtu ne llogarisim kohën në sekonda nga hera e fundit kur është shtypur butoni. Nëse ky numër është më i madh se një kohëzgjatje e paracaktuar, atëherë ekrani do të shfaqë ekranin e orës.

Kodi është shkruar duke përdorur funksionet bazë për fillestarët. Pra, kodi është i thjeshtë për tu kuptuar dhe ju mund të mësoni metodën se si funksionon duke iu referuar kodit.

Hapi 9: Zgjidhja e problemeve

Disa herë ora fillon pak më vonë ose nuk shfaq grafikat siç duhet. Ndjekja e këshillave do të ndihmojë në zgjidhjen e situatës.

  • Sigurohuni që keni dhënë SSID -in dhe fjalëkalimin e duhur
  • Ndryshoni serverin NTP (mund të gjeni shumë serverë nga interneti që lidhet me rajonin tuaj).
  • Ndryshon lidhjen e internetit. (Pika e nxehtë e lëvizshme mund të jetë gjithashtu e mundur).

Gjithashtu ju mund të zgjidhni gjithçka duke përdorur monitorin serik. Përveç ekranit OLED, monitori serik tregon informacionin e kohës.

Hapi 10: Kodi Arduino

// bibliotekat për ekran OLED

#përfshi

#include #include #define OLED_RESET 4 #include // biblioteka wifi për lidhjen #përfshijë "time.h" // bibliotekën për përdorim RC // // përcaktoni emrat e pin -ve të hyrjes dhe daljes #përcaktoni butonin e djathtë 34 #përcaktoni butonin e majtë 35 #përcaktoni GreenLED 16 #define Buzzer 25 int PreTime = 0; int numëron = 0; int currentTime = 0; strukt tm timeinfo; const char* ssid = "SSID -i YT"; // detaje wifi const char* fjalëkalimi = "FJALA JUAJ". int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // variablat e alarmit 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}}; // drejtkëndësh përzgjedhjeje const char* ntpServer = "asia.pool.ntp.org"; // server detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Shfaqja Adafruit_SSD1306 (128, 64); // Madhësia OLED përcakton bajt clockCenterY = (ekran. Lartësia () + 16)/2; // detajet e orës analoge të faqes byte clockCenterX = (ekran. Lartësia () - 16)/2; byte clockRadius = 23; gjendje bool = 0; // ekran i ndezur ose i fikur Alarmi boolean = 0; // gjendja e alarmit aktual String alarmState = "Alarmi ON"; // alarmi aktiv ose joaktiv // ndryshoret e të dhënave të ruajtura të kohës char dayName [10]; char daynumber [3]; muaji char [10]; viti char [5]; orë kar [3]; minutat e karbonit [3]; char muajsh [3]; sekonda kar [3]; // variablat e butonit bool RightState = 1; bool LeftState = 1; // variablat buzzer int channel = 0; int Frekuenca = 2000; int PWM = 200; int rezolucion = 8; void setup () {// vendos hyrjen dhe daljet pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intializoj shfaqjen e ekranit.display (); vonesë (3000); display.clearDisplay (); ledcSetup (0, Frekuenca, rezolucioni); // konfiguroni parametrat pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // intilizoni komunikimin serik // lidheni me WiFi Serial.printf ("Lidhja me %s", ssid); WiFi.filloni (ssid, fjalëkalim); ndërsa (WiFi.status ()! = WL_CONNECTED) {vonesë (500); Serial.print ("."); } Serial.println ("LIDHUR"); // init dhe merrni konfigurimin e kohës (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // shkëputeni WiFi pasi nuk është më i nevojshëm WiFi. shkëputeni (e vërtetë); Modaliteti WiFi (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // merrni kohën aktuale // ruani gjendjet e butonit të djathtë dhe të majtë RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // kontrolloni prapanicat shtypen nëse (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kur shtypet butoni, zilja lëshon zhurmë të zhurmës (100); nëse (gjendja == 0) {// kaloni në gjendjen e kornizës së ekranit të alarmit = 1; // ndryshoni gjendjen në gjendjen e alarmit RightState = LeftState = 1; // ne kemi nevojë vetëm për ndryshimin e numrave të sceern} = 0; // reset counter} nëse (gjendja == 1 && (numëron) <5) {// nëse është në ekranin e alarmit dhe nuk ka kohë të llogariturAlarm (); // llogarit vlerat e kohës të informacionit të alarmit showAlarm (); // shfaq vlerat} tjetër {// nëse është në orë gjendja e ekranit = 0; display.clearDisplay (); clockFace (); // faqe analoge e orës printLocalTime (); // printoni kohën në faqen e orës dhe printoni detaje të tjera} onAlarm (); // krahasoni kohën e alarmit me kohën lokale dhe ndizni vonesën e alarmit (100); // vonesë për alarm ndezur dhe fikur} void clockFace () {// shfaqja e faqes së orës caalog.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // printo rrethin e orës për (int shifra = 0; shifra = 5) {// të ketë vetëm 5 selctions.so rivendoset në -1 (-1 = është alarn aktiv ose jo) selectIndex = -1; } dateAndTimeSelection (selectIndex); // ndrysho seleksionin} data voidAndTimeSelection (int index) {if (index == -1) {// alarmi ndizet ose fiket nëse (RightState == 0) {// kaloni midis ndezjes dhe fikjes së alarmit nëse (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Alarmi ON"; }}} tjetër {if (RightState == 0) {// në përzgjedhje të tjera e lidh datën ose kohën në grupin alarmDateTime [indeksi] = alarmDateTime [indeksi] + 1; // indeksi është përzgjedhja}} int krahaso [4] = {12, 2030, 23, 59}; // kufijtë e sipërm të datave dhe viteve në krahasim [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // kufiri i sipërm i muajve int resetValue [4] = {1, 2020, 0, 0}; // vlerat fillestare për (int i = 1; unë krahasoj [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> krahasim muaji [alarmDateTime [1] - 1]) {// rivendos vlaueset nëse muajt janë më të mëdhenj se limitet e tyre alarmDateTime [0] = 1; }} void showAlarm () {// printo detajet e alarmit String alarmDateTime0 = String (alarmDateTime [0]); // konvertoni thumbat në shfaqje String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // nëse vlerat kanë një shifër 1, shtoni atyre "0". nëse (alarmDateTime [0]

Recommended: