Բովանդակություն:

Խելացի զարթուցիչ ՝ օգտագործելով Magicbit (Arduino) ՝ 10 քայլ
Խելացի զարթուցիչ ՝ օգտագործելով Magicbit (Arduino) ՝ 10 քայլ

Video: Խելացի զարթուցիչ ՝ օգտագործելով Magicbit (Arduino) ՝ 10 քայլ

Video: Խելացի զարթուցիչ ՝ օգտագործելով Magicbit (Arduino) ՝ 10 քայլ
Video: Xiaomi Smart Speaker - խելացի բարձրախոսի գլոբալ տարբերակ, Ok Google: Ձայնային դերասան տնային օգնական 2024, Հուլիսի
Anonim
Image
Image

Այս ձեռնարկը ցույց է տալիս, թե ինչպես կարելի է խելացի զարթուցիչ պատրաստել ՝ օգտագործելով OLED էկրան Magicbit dev տախտակում ՝ առանց որևէ RTC մոդուլ օգտագործելու:

Պարագաներ

  • Magicbit
  • USB-A- ից մինչև Micro-USB մալուխ

Քայլ 1: Պատմություն

Այս ձեռնարկում մենք կսովորենք, թե ինչպես կարելի է խելացի զարթուցիչ պատրաստել Magicbit- ի միջոցով:

Քայլ 2: HARDWARE SETUP

Միացրեք ձեր Magicbit- ը համակարգչին `օգտագործելով USB մալուխ:

Քայլ 3: FՐԱԳՐԱՅԻՆ ԿԱՐԳԱՎՈՐՈՄ

Բացեք ձեր Arduino IDE- ն և տեղադրեք տախտակը Arduino IDE- ով: Հետևյալ հղումը վերաբերում է, թե ինչպես դա անել: Այսպիսով, մենք ձեզ խորհուրդ ենք տալիս նախ գնալ հղում և ծանոթանալ Magic bit- ին:

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

Այժմ ընտրեք տախտակի ճիշտ տեսակը և նավահանգիստը: Այս դեպքում տախտակի տեսակը Magicbit է: Գրադարաններն արդեն տեղադրված են, երբ գտնվում են Magicbit գրադարաններում:

Քայլ 4. Տեսություն և մեթոդաբանություն

Եթե նայեք առաջին տեսանյութին, կտեսնեք, որ էկրանն ունի 2 էկրան:

  • ժամացույցի էկրան, որը ցույց է տալիս ժամանակի մանրամասները
  • ազդանշանային էկրան, որը ցույց է տալիս ահազանգի մանրամասները

Այս երկու էկրանի միջև փոխանակման համար մենք օգտագործեցինք Magicbit- ում երկուսի ցանկացած կոճակ: Այս կոճակները միացված են Magicbit- ում ESP32- ի 35 (ձախ կոճակ) և 34 (աջ կոճակ) կապումներին: Timeամանակը և այլ մանրամասներ ցույց տալու համար մենք օգտագործեցինք ներկառուցված OLED էկրան ՝ կախարդում:

Եկեք խոսենք այն մասին, թե ինչպես են աշխատում այս գրաֆիկական էկրանները:

Theամացույցի էկրանն ունի անալոգային ժամացույց, թվային ժամացույց, ամսաթիվ, ամիս և տարի տեքստեր:

Անալոգային ժամացույց ստեղծելու համար մենք օգտագործում ենք որոշ գրաֆիկական գործառույթներ, որոնք առկա են Adafriut GFX կոչվող գրաֆիկական գրադարանում: Օգտագործելով շրջանակի գործառույթը և գծի գործառույթը, մենք ստեղծում ենք ժամացույցի անալոգային դեմք: Պարզ երկրաչափական գործառույթները, որոնք կոչվում են sin և cos, օգտագործվում են ժամացույցի սլաքների դիրքի համար: Այսպիսով, մենք մուտքագրում ենք միայն պտտվող ձեռքերի ժամանակին համապատասխանող անկյունը: դրա համար մենք սկզբում ժամանակը փոխարկում ենք հետևյալի.

  • րոպեական անկյուն = րոպե*(360/60)
  • ժամերի անկյուն = ժամ*(360/12)

Angleամացույցի դեմքի կենտրոնի և ժամացույցի դեմքի 12 համարի միջև չափվող անկյունը: Sin և cos գործառույթների միջոցով կարող ենք հաշվարկել ժամ և րոպե տողերի ծայրերի x և y կոորդինատները: Ստորև բերված նկարը նկարագրում է, թե ինչպես է դա տեղի ունենում:

Ըստ կոորդինատների մենք տպում ենք ժամ և րոպե ձեռքով `գծեր գծելով: Adafruit GFX գրադարանում կա նաև տեքստի տպման գործառույթ: Այն օգնում է տպել այլ մանրամասներ (ամսաթիվը, ամիսը և ժամը ցուցադրվում են թվանշաններով) ցուցադրման վրա: Դուք կարող եք փոխել անալոգային ժամացույցի դիրքը և տեքստի դիրքերը ՝ փոփոխելով պարամետրերը ծածկագրում:

Ինչպես և ժամացույցի էկրանին, մենք Adafruit GFX գրադարանում տեքստի տպման գործառույթ ենք օգտագործել OLED էկրանին համապատասխան վայրերում տպագրվող թվերի համար:

Քայլ 5: Տեղական ժամանակի ստացում

Theամացույցի ամենակարևոր մասն այն է, թե ինչպես ենք մենք ճշգրիտ ստանում տեղական ժամանակը: Այդ նպատակով կարող եք օգտագործել արտաքին RTC ժամացույցի մոդուլ կամ ներկառուցված RC ժամացույց ESP32- ում `Magicbit- ում: Այս նախագծում մենք օգտագործեցինք երկրորդ մեթոդը: Այս մեթոդով մենք օգտագործում ենք NTP (ցանցային ժամանակի նախակոչ) հաճախորդ ՝ տեղական ժամանակն ինտերնետից ստանալու համար: Ինտերնետ հասանելիության համար մենք օգտագործեցինք ներկառուցված WIFI սարք ESP32- ում: Հետևաբար, առաջին փուլում մենք օգտագործում ենք WIFI ՝ ինտերնետ մուտք գործելու համար ՝ տրամադրելով SSID և գաղտնաբառ: Այնուհետև gmtOffset- ը և daylightOffset- ը փոփոխականների մեջ պետք է կազմաձևենք վայրկյանների ընթացքում: Այս փոփոխականների արժեքները տարբերվում են աշխարհի տարածաշրջանից տարածաշրջան: gmtOffset- ը նշանակում է GMT- ից տարբերվող վայրկյանների քանակը: dayերեկվա լույսերի մեծամասնության համար Offset- ը 3600 է: Այն կարող եք գտնել ինտերնետում: Տեղական ժամանակի ստացումից հետո մենք այլևս չենք օգտագործում WIFI: Քանի որ այդ դեպքում մենք տեղական ժամանակը հաշվարկում ենք ESP32- ի ներկառուցված RC ժամացույցից: Դա արվում է time.h գրադարանի միջոցով: Arduino- ում կա մի պարզ օրինակ (Arduino> Օրինակներ> ESP32> >ամանակ> պարզություն), որպեսզի կարողանաք իմանալ, թե ինչպես է դա հետագայում աշխատում: Նաև այս հղումները կարող եք օգտագործել NTP հաճախորդի վերաբերյալ լրացուցիչ գիտելիքների համար:

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

Տեղական ժամանակը ճիշտ ստանալուց հետո մենք փոխում ենք մեր ժամանակը ՝ ցույց տալով տեքստերը և անկյունը ՝ ըստ այդ ժամանակի տեղեկատվության յուրաքանչյուր հանգույցում:

Քայլ 6: theարթուցիչի կարգավորում

Սեղմելով ձախ և աջ կոճակները, կարող եք փոխել ահազանգի ամսաթիվը և ժամը ընտրությունը: Theարթուցիչի ամսաթիվը և ժամը փոխելիս համոզվեք, որ անջատեք ահազանգը: Ամսաթիվը և ժամը սահմանելուց հետո միացրեք ահազանգը: Քանի որ եթե ահազանգը միացված է, և երբ ահազանգի ժամանակը հավասար է ձեր ընթացիկ ժամանակին այն կարգավորելիս, ահազանգի ազդանշանը կզանգի: Հիմնական հանգույցում միշտ ստուգում է ընթացիկ տեղական ժամանակը և ահազանգի տվյալները հավասար են: Եթե դրանք հավասար են, ապա Magicbit- ում կանաչ և LED լուսադիոդային ազդանշանը կաշխատի մեկ րոպեի ընթացքում:

Քայլ 7: Սարքի տեղադրում

Մենք օգտագործում ենք PWM զարկերակը ՝ ազդանշան ստեղծելու համար ՝ օգտագործելով codeC- ում analogCwrite () գործառույթը: Գրադարանի բոլոր գործառույթների պատճառով ESP32- ը վավեր է Magicbit- ի համար: Դուք կարող եք փոխել ազդանշանի ձայնային ազդանշանի ազդանշանը `հաճախականության և PWM արժեքի փոփոխությունից:

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

Այս էջը նկարագրում է, թե ինչպես է ազդանշանն աշխատում ESP32- ի հետ:

Քայլ 8: Կոճակների տեղադրում

Բոլոր վիճակները փոխելու համար մենք օգտագործեցինք Magicbit- ի երկու ներկառուցված կոճակներ: Հիմնական հանգույցը միշտ ստուգում է երկու կոճակների վիճակը: Քանի որ դրանք ներսից քաշվեցին, այնտեղ նորմալ վիճակը բարձր ազդանշան է: Այսպիսով, դուք կարող եք տեսնել, որ այդ կապանքների թվային ընթերցումը 1 -ն է: Լռելյայն փուլում էկրանը ցույց է տալիս ժամացույցի ինտերֆեյսը: Այդ ժամանակ, երբ երկու կոճակներից որևէ մեկը սեղմված է, այն էկրանը փոխում է ահազանգի: Նաև ժամանակը հաշվում ենք վայրկյաններով ՝ վերջին անգամից, երբ կոճակը սեղմված է: Եթե այդ հաշվարկն ավելի մեծ է, քան որոշված նախնական տևողությունը, ապա էկրանը կցուցադրի ժամացույցի էկրանը:

Կոդը գրված է ՝ օգտագործելով հիմնական գործառույթները սկսնակների համար: Այսպիսով, կոդը պարզ է հասկանալ, և դուք կարող եք սովորել, թե ինչպես է այն աշխատում ՝ հղում կատարելով ծածկագրին:

Քայլ 9: Խնդիրների վերացում

Երբեմն ժամացույցը մի փոքր ուշ է սկսվում կամ գրաֆիկան ճիշտ չի ցուցադրվում: Հետեւյալ խորհուրդները կօգնեն լուծել իրավիճակը:

  • Համոզվեք, որ ճիշտ SSID և գաղտնաբառ եք տվել
  • Փոխեք NTP սերվերը (կարող եք գտնել բազմաթիվ սերվերներ ինտերնետից, որոնք վերաբերում են ձեր տարածաշրջանին):
  • Փոխում է ինտերնետ կապը: (հնարավոր է նաև բջջային թեժ կետը):

Բացի այդ, դուք կարող եք ամեն ինչ շտկել ՝ օգտագործելով սերիական մոնիտորը: OLED- ի ցուցադրումից բացի, սերիական մոնիտորը ցույց է տալիս ժամանակի մասին տեղեկատվությունը:

Քայլ 10: Arduino կոդ

// գրադարաններ OLED ցուցադրման համար

#ներառում

#ներառել #ներառել #սահմանել OLED_RESET 4 #ներառել // wifi գրադարան միացման համար #ներառել «time.h» // գրադարան RC ժամացույց // սահմանել մուտքի և ելքի քորոցների անուններ #սահմանել RightButton 34 #սահմանել LeftButton 35 #սահմանել GreenLED 16 #սահմանել Buzzer 25 int PreTime = 0; int հաշվում = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "YOUR SSID"; // wifi մանրամասները const char* գաղտնաբառ = "ՔՈ գաղտնաբառ"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // ահազանգի փոփոխականներ 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}}; // ընտրական ուղղանկյուն const char* ntpServer = "asia.pool.ntp.org"; // սերվերի կալանք երկար gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 էկրան (128, 64); // OLED չափը սահմանում է բայթ clockCenterY = (ցուցադրում. Բարձրություն () + 16)/2; // անալոգային ժամացույցի դեմքի մանրամասներ բայթ clockCenterX = (ցուցադրում. Բարձրություն () - 16)/2; բայթ clockRadius = 23; bool state = 0; // էկրանը միացված կամ անջատված է բուլյան տագնապ = 0; // ահազանգի ընթացիկ վիճակ String alarmState = "Alarm ON"; // alarm on/off // տատանվող ժամանակի տվյալների փոփոխականներ char dayName [10]; ածխածնի օր [3]; char ամիս [10]; ածխածին տարի [5]; այրման ժամեր [3]; այրման րոպեներ [3]; char ամսվա համար [3]; ածխային վայրկյաններ [3]; // կոճակի փոփոխականներ bool RightState = 1; bool LeftState = 1; // buzzer փոփոխականներ int channel = 0; int Հաճախականություն = 2000; int PWM = 200; int լուծում = 8; void setup () {// սահմանել մուտքի և ելքերի pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); ուշացում (3000); display.clearDisplay (); ledcSetup (0, հաճախականություն, լուծում); // կարգավորել pwm պարամետրերը ledcAttachPin (Buzzer, 0); Serial.begin (115200); // ինտերիզացնել սերիական հաղորդակցությունը // միանալ WiFi- ին Serial.printf ("Միացում %s- ին", ssid); WiFi.begin (ssid, գաղտնաբառ); while (WiFi.status ()! = WL_CONNECTED) {ուշացում (500); Serial.print ("."); } Serial.println ("ՄԻԱՎԱ" "); // init և ստանալ ժամանակը configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // անջատել WiFi- ն, քանի որ այն այլևս կարիք չունի WiFi.disconnect (ճշմարիտ); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // ստացեք ընթացիկ ժամանակը // պահեք աջ և ձախ կոճակի վիճակները RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // chaeck the buttouns are pressed if (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // երբ կոճակը սեղմված է, ազդանշանի ազդանշանի հետաձգումը (100); եթե (վիճակ == 0) {// անցնել ազդանշանային էկրանի շրջանակի վիճակին = 1; // փոխել վիճակը տագնապի վիճակի (վիճակ == 1 && (հաշվում է) <5) {// եթե ահազանգի էկրանին և ժամանակի բացակայության դեպքում calcAlarm (); // հաշվարկել տագնապի տեղեկատվության ժամանակի արժեքները showAlarm (); // ցույց տալ արժեքները} else {// եթե ժամացույցի մեջ է էկրանի վիճակ = 0; display.clearDisplay (); clockFace (); // անալոգային ժամացույցի դեմք printLocalTime (); // ժամացույցի դեմքով տպել ժամանակը և տպել այլ մանրամասներ} onAlarm (); // համեմատել տագնապի ժամանակը տեղական ժամանակի հետ և միացնել տագնապի հետաձգումը (100); // հետաձգում ահազանգ միացված և անջատված} void clockFace () {// caalog ժամացույցի երևույթ: selctions.so- ն վերակայեք -1 -ի (-1 = alarn- ը միացված է կամ անջատված է) selectIndex = -1; } dateAndTimeSelection (selectIndex); // փոխել selction} void dateAndTimeSelection (int index) {if (index == -1) {// ահազանգը միացված կամ անջատված է, եթե (RightState == 0) {// միացնել և անջատել ազդանշանի միջև, եթե (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Ահազանգը միացված է"; }}} else {if (RightState == 0) {// այլ ընտրություններում պատկերում ենք զանգվածի alarmDateTime- ում առնչվող ամսաթիվը կամ ժամը [index] = alarmDateTime [index] + 1; // ինդեքսը ընտրություն է}} int համեմատել [4] = {12, 2030, 23, 59}; // ամսաթվերի և տարիների վերին սահմանները int համեմատամսյակում [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // int resetValue ամիսների վերին սահմանը [4] = {1, 2020, 0, 0}; // մեկնարկային արժեքներ (int i = 1; համեմատում եմ [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> համեմատություն ամիս [alarmDateTime [1] - 1]) { /զրոյացնել vlaues, եթե ամիսներն իրենց սահմաններից ավելի մեծ են alarmDateTime [0] = 1; }} void showAlarm () {// տպել ահազանգի մանրամասները String alarmDateTime0 = լարային (alarmDateTime [0]); // խայթերը փոխարկել ցուցադրելու համար String alarmDateTime1 = Լար (alarmDateTime [1]); Լարային alarmDateTime2 = Լար (alarmDateTime [2]); Լարային alarmDateTime3 = Լար (alarmDateTime [3]); Լարային alarmDateTime4 = Լար (alarmDateTime [4]); // եթե արժեքներն ունեն մեկ 1 թվանշան, ապա դրանց ավելացրեք «0»: եթե (alarmDateTime [0]

Խորհուրդ ենք տալիս: