Talaan ng mga Nilalaman:
- Mga gamit
- Hakbang 1: Kwento
- Hakbang 2: HARDWARE SETUP
- Hakbang 3: SOFTWARE SETUP
- Hakbang 4: Teorya at Pamamaraan
- Hakbang 5: Pagkuha ng Lokal na Oras
- Hakbang 6: Pag-set up ng Alarm
- Hakbang 7: Pag-set up ng Buzzer
- Hakbang 8: Pag-set up ng Mga Pindutan
- Hakbang 9: Pag-troubleshoot
- Hakbang 10: Arduino Code
2025 May -akda: John Day | [email protected]. Huling binago: 2025-01-13 06:58
Ipinapakita ng tutorial na ito kung paano gumawa ng isang smart alarm clock gamit ang OLED display sa Magicbit dev board nang hindi gumagamit ng anumang module ng RTC.
Mga gamit
- Magicbit
- USB-A hanggang sa Micro-USB Cable
Hakbang 1: Kwento
Sa tutorial na ito matututunan natin ang tungkol sa kung paano gumawa ng isang matalinong orasan ng Alarm gamit ang Magicbit.
Hakbang 2: HARDWARE SETUP
I-plug ang iyong Magicbit sa computer gamit ang USB cable.
Hakbang 3: SOFTWARE SETUP
Buksan ang iyong Arduino IDE at i-setup ang board gamit ang Arduino IDE. Ang sumusunod na link ay tumutukoy kung paano ito gawin. Kaya inirerekumenda namin sa iyo na pumunta muna sa link at maging pamilyar sa Magic bit.
magicbit-arduino.readthedocs.io/en/latest/…
Piliin ngayon ang tamang uri ng board at port. Sa kasong ito ang uri ng board ay Magicbit. Ang mga aklatan ay naka-install na kapag ang sa mga library ng Magicbit.
Hakbang 4: Teorya at Pamamaraan
Kung titingnan mo ang unang video, maaari mong makita ang display na may 2 mga screen.
- orasan screen na nagpapakita ng detalye ng oras
- alarm screen na nagpapakita ng mga detalye ng alarma
Para sa pag-toggle sa pagitan ng dalawang screen na ito ay gumamit kami ng anumang push button ng dalawa sa Magicbit. Ang mga pindutan na ito ay konektado sa 35 (kaliwang pindutan) at 34 (kanang pindutan) na mga pin ng ESP32 sa Magicbit. Upang maipakita ang oras at iba pang mga detalye ginamit namin ang builtin na OLED display sa magicbit.
Pinapayagan nating pag-usapan kung paano gumagana ang mga graphic screen.
Ang orasan ng screen ay may mga analog na orasan, digital na orasan, petsa, buwan at taon na mga teksto.
Para sa paglikha ng analog na orasan gumagamit kami ng ilang mga pag-andar ng graphics na magagamit sa graphics library na tinatawag na Adafriut GFX. Sa pamamagitan ng paggamit ng pag-andar ng bilog at paggana ng linya lumikha kami ng mukha ng analog na orasan. Ang mga simpleng pagpapaandar na geometrical na tinatawag na sin at cos ay ginagamit sa posisyon ng mga kamay ng orasan. Kaya't inilalagay lamang namin ang anggulo na tumutugma sa oras para sa paikutin na mga kamay. para sa na unang namin convert ang oras sa anggulo tulad ng sumusunod.
- anggulo ng minutong kamay = minuto * (360/60)
- anggulo ng oras ng kamay = oras * (360/12)
Ang anggulo na sinusukat na patungkol sa linya sa pagitan ng gitna ng mukha ng orasan at numero 12 sa mukha ng orasan. Gamit ang mga pag-andar ng kasalanan at cos maaari nating kalkulahin ang mga koordinasyon ng x at y ng mga linya ng oras at minuto. Inilalarawan ng larawan sa ibaba kung paano ito ginagawa.
Ayon sa mga coordinate ay nag-print kami ng oras at minutong kamay sa pamamagitan ng mga linya ng pagguhit. Mayroon ding pagpapaandar sa pag-print ng teksto sa Adafruit GFX library. Nakatutulong itong mai-print ang iba pang mga detalye (ipakita ang petsa, buwan at oras sa mga digit) na ipinapakita. Maaari mong baguhin ang posisyon ng analog na orasan at mga posisyon ng teksto sa pamamagitan ng pagbabago ng mga parameter sa code.
Tulad ng tulad ng orasan ng screen ginamit namin ang pag-print ng teksto sa Adafruit GFX library para sa mga naka-print na numero sa pagpapakita ng OLED sa mga naaangkop na lugar.
Hakbang 5: Pagkuha ng Lokal na Oras
Ang pinakamahalagang bahagi ng orasan ay kung paano namin nakukuha ang lokal na oras nang tumpak. Para sa hangaring iyon maaari mong gamitin ang panlabas na module ng orasan ng RTC o inbuilt RC na orasan sa ESP32 sa Magicbit. Sa proyektong ito ginamit namin ang pangalawang pamamaraan. Sa pamamaraang ito ginagamit namin ang NTP (network time protocall) client para makuha ang lokal na oras mula sa internet. Para sa pag-access sa internet ginamit namin ang built in na pasilidad ng WIFI sa ESP32. Dahil dito sa unang yugto ginagamit namin ang WIFI para sa pag-access sa internet sa pamamagitan ng pagbibigay ng SSID at password. Pagkatapos dapat nating i-configure ang gmtOffset at daylightOffset sa mga variable sa segundo. Ang mga halaga ng mga variable na ito ay magkakaiba sa bawat rehiyon sa buong mundo. Ang ibig sabihin ng gmtOffset bilang ng mga segundo naiiba ka mula sa GMT.. For most most ares daylightOffset is 3600. Mahahanap mo ito sa internet. Matapos makuha namin ang kasalukuyang lokal na oras hindi na kami gumamit ng WIFI. Dahil kinakalkula namin ang lokal na oras mula sa inbuilt RC na orasan sa ESP32. Ginagawa ito sa pamamagitan ng paggamit ng library ng time.h. Mayroong simpleng halimbawa sa Arduino (Arduino> Mga Halimbawa> ESP32> Oras> simpleng) para malaman mo ang tungkol sa kung paano ito gumana nang higit pa. Gayundin ang mga link na ito ay maaari mong gamitin para sa karagdagang kaalaman tungkol sa NTP client.
- https://dronebotworkshop.com/esp32-intro/
- https://lastminuteengineers.com/esp32-ntp-server-d…
Matapos makuha nang tama ang lokal na oras, binabago namin ang aming oras sa pagpapakita ng mga teksto at anggulo ayon sa impormasyong iyon ng oras sa bawat loop.
Hakbang 6: Pag-set up ng Alarm
Sa pamamagitan ng pag-click sa kaliwa at kanang mga pindutan maaari mong baguhin ang petsa ng alarma at pagpili ng oras. Tiyaking patayin ang alarma kapag binago mo ang petsa at oras ng alarma. Matapos i-set up ang petsa at oras buksan ang alarma. Dahil kung ang alarma ay nakabukas at kung kailan ang oras ng alarma ay katumbas ng iyong kasalukuyang oras habang ini-set up mo ito, tatunog ang alarm buzzer. Sa pangunahing loop palaging suriin ang kasalukuyang lokal na oras at ang impormasyon ng alarma ay pantay. Kung ang mga iyon ay pantay, pagkatapos ay buzzer at built sa berdeng LED sa Magicbit ay gagana sa loob ng isang minuto.
Hakbang 7: Pag-set up ng Buzzer
Gumagamit kami ng PWM pulse upang likhain ang tunog ng buzzer sa pamamagitan ng paggamit ng function na analogCwrite () sa code. Dahil sa lahat ng mga pagpapaandar sa library ay nasa ESP32 ay wasto para sa Magicbit. Maaari mong baguhin ang tunog ng beep ng buzzer mula sa pagbabago ng dalas at halaga ng PWM sa code.
techtutorialsx.com/2017/06/15/esp32-arduin…
Inilalarawan ng pahinang ito ang tungkol sa kung paano gumagana ang buzzer sa ESP32.
Hakbang 8: Pag-set up ng Mga Pindutan
Para sa pagbabago ng lahat ng mga estado ginamit namin ang dalawang built in na push button sa Magicbit. Palaging suriin ng pangunahing loop ang estado ng dalawang mga pindutan. Dahil sila ay nakuha sa loob, doon normal na estado ay mataas na signal. Kaya maaari mong makita ang digital na nabasa ng mga pin na iyon ay 1. Sa default na yugto ang display ay nagpapakita ng interface ng orasan. Sa oras na iyon, kapag ang alinman sa dalawang pindutan ay pinindot, pagkatapos ay binago nito ang screen sa alarm screen. Din namin bilangin ang oras sa segundo mula sa huling oras kapag ang pindutan ay pinindot. Kung ang bilang na iyon ay mas malaki kaysa sa ilang paunang natukoy na tagal pagkatapos ay ipapakita ng display ang screen ng orasan.
Ang code ay nakasulat sa pamamagitan ng paggamit ng pangunahing mga pag-andar para sa mga nagsisimula. Kaya't ang code ay simple upang maunawaan at maaari mong malaman ang pamamaraan kung paano ito gumagana sa pamamagitan ng pag-refer sa code.
Hakbang 9: Pag-troubleshoot
Ang ilang mga oras na ang orasan ay nagsisimula nang kaunti mamaya o hindi ito ipinapakita nang maayos ang mga graphic. Ang pagsunod sa mga tip ay makakatulong upang malutas ang sitwasyon.
- Tiyaking binigyan mo ng tamang SSID at password
- Baguhin ang NTP server (maaari kang makahanap ng maraming mga server mula sa internet na nauugnay sa iyong rehiyon).
- Binabago ang koneksyon sa internet. (Maaari ring posible ang mobile hotspot).
Gayundin maaari mong i-troubleshoot ang lahat sa pamamagitan ng paggamit ng serial monitor. Bilang karagdagan sa OLED display serial monitor ay nagpapakita ng impormasyon sa oras.
Hakbang 10: Arduino Code
// mga aklatan para sa pagpapakita ng OLED
# isama
#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library for use RC clock // tukuyin ang mga pangalan ng input at output na pin #define Buzzer 25 int preTime = 0; int count = 0; int currentTime = 0; istraktura ng timeinfo; const char * ssid = "IYONG SSID"; // mga detalye sa wifi const char * password = "IYONG PASSWORD"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // alarm varibles 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}}; // pagpili rektanggulo const char * ntpServer = "asia.pool.ntp.org"; // server detais const long gmtOffset_sec = 19800; Const int daylightOffset_sec = 0; Display ng Adafruit_SSD1306 (128, 64); // OLED size tukuyin ang byte clockCenterY = (display.height () + 16) / 2; // mga detalye ng mukha ng analog na orasan byte clockCenterX = (display.height () - 16) / 2; byte clockRadius = 23; bool state = 0; // screen on or off boolean Alarm = 0; // alarm kasalukuyang estado String alarmState = "Alarm ON"; // alarm on or off // varibles naka-imbak na data data char dayName [10]; char daynumber [3]; buwan ng char [10]; taon ng char [5]; oras ng char [3]; char minuto [3]; numero ng buwan ng char [3]; segundo ng char [3]; // variable variable bool RightState = 1; bool LeftState = 1; // variable ng buzzer int channel = 0; int Frequency = 2000; int PWM = 200; int resolusyon = 8; void setup () {// set input at ouputs pinMode (RightButton, INPUT); pinMode (Left Button, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); pagkaantala (3000); display.clearDisplay (); ledcSetup (0, Frequency, resolusyon); // configure pwm parameter ledcAttachPin (Buzzer, 0); Serial.begin (115200); // intilize serial komunikasyon // kumonekta sa WiFi Serial.printf ("Kumokonekta sa% s", ssid); WiFi.begin (ssid, password); habang (WiFi.status ()! = WL_CONNected) {pagkaantala (500); Serial.print ("."); } Serial.println ("Nakakonekta"); // init at kunin ang oras configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // idiskonekta ang WiFi dahil hindi na ito kinakailangan ng WiFi. idiskonekta (totoo); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // get current time // store right and left pushbutton states RightState = digitalRead (Rightbutton); LeftState = digitalRead (Left Button); // chaeck ang mga pindutan ay pinindot kung (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // kapag ang pindutan ay pinindot ang buzzer emit beep sound pagkaantala (100); kung (state == 0) {// baguhin sa alarm screen frame estado = 1; // baguhin ang estado sa estado ng alarma RightState = LeftState = 1; // kailangan lang namin ng pagbabago sceern} bilang = 0; // reset counter} kung (state == 1 && (count) <5) {// kung sa alarm screen at walang timeout calculalAlarm (); // kalkulahin ang mga halaga ng oras ng alarm informaton showAlarm (); // ipakita ang mga halaga} iba pa {// kung sa orasan estado ng screen = 0; display.clearDisplay (); clockFace (); // analog orasan na naka-printLocalTime (); // oras ng pag-print sa mukha ng orasan at i-print ang iba pang mga detalye} onAlarm (); // ihambing ang oras ng alarma sa lokal na oras at i-on ang pagkaantala ng alarma (100); // pagkaantala para sa alarma at patayin} walang bisa ang clockFace () {// caalog clock display display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // print watch circle para sa (int digit = 0; digit = 5) {// mayroon lamang 5 selctions.so reset sa -1 (-1 = ay alarn on o off) selectIndex = -1; } dateAndTimeSelection (selectIndex); // change selction} void dateAndTimeSelection (int index) {if (index == -1) {// alarm on or off if (RightState == 0) {// togle between on and off alarm if (alarmState == "Alarm ON") {alarmState = "OFF Alarm"; } iba pa {alarmState = "ALarm ON"; }}} iba pa {kung (RightState == 0) {// sa iba pang mga pagpipilian ay nagpapapasok sa nauugnay na petsa o oras sa array alarmDateTime [index] = alarmDateTime [index] + 1; // index ay ang pagpipilian}} int ihambing [4] = {12, 2030, 23, 59}; // itaas na mga limitasyon ng mga petsa at taon intompemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // upper limi of the months int resetValue [4] = {1, 2020, 0, 0}; // pagsisimula ng mga halaga para sa (int i = 1; ihinahambing ko ang [i - 1]) {alarmDateTime = resetValue [i - 1]; }} kung (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// reset vlaues kung buwan ay mas malaki kaysa sa kanilang mga limitasyon alarmDateTime [0] = 1; }} void showAlarm () {// mga detalye ng pag-print ng alarm String alarmDateTime0 = String (alarmDateTime [0]); // convert stings to show String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // kung ang mga halaga ay may isang 1 digita ang idagdag na "0" sa kanila. kung (alarmDateTime [0]