Агуулгын хүснэгт:

Magicbit (Arduino) ашиглан ухаалаг сэрүүлэгтэй цаг: 10 алхам
Magicbit (Arduino) ашиглан ухаалаг сэрүүлэгтэй цаг: 10 алхам

Видео: Magicbit (Arduino) ашиглан ухаалаг сэрүүлэгтэй цаг: 10 алхам

Видео: Magicbit (Arduino) ашиглан ухаалаг сэрүүлэгтэй цаг: 10 алхам
Видео: Обзор и конфигурация модуля EBYTE LoRa 2024, Арваннэгдүгээр
Anonim
Image
Image

Энэхүү заавар нь RTC модулийг ашиглахгүйгээр Magicbit dev самбар дээрх OLED дэлгэцийг ашиглан ухаалаг сэрүүлэгтэй цагийг хэрхэн хийхийг харуулав.

Хангамж

  • Magicbit
  • USB-A-аас микро-USB кабель

Алхам 1: Түүх

Энэхүү гарын авлагад бид Magicbit ашиглан ухаалаг сэрүүлэгтэй цаг хийх талаар сурах болно.

Алхам 2: Тоног төхөөрөмжийн тохиргоо

USB кабель ашиглан Magicbit -ийг компьютерт холбоно уу.

Алхам 3: ПРОГРАММЫН ТӨВЛӨГӨӨ

Arduino IDE -ээ нээгээд Arduino IDE ашиглан самбарыг тохируулна уу. Үүнийг хэрхэн яаж хийхийг доорх линкээс харж болно. Тиймээс бид эхлээд холбоос руу орж Magic bit -тэй танилцахыг зөвлөж байна.

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

Одоо зөв самбарын төрөл, портыг сонгоно уу. Энэ тохиолдолд самбарын төрөл нь Magicbit юм. Номын санг Magicbit номын санд байх үед аль хэдийн суулгасан болно.

Алхам 4: Онол, арга зүй

Хэрэв та эхний видеог үзвэл дэлгэц нь 2 дэлгэцтэй болохыг харж болно.

  • цагийн дэлгэцийг харуулсан цагны дэлгэц
  • сэрүүлгийн дэлгэрэнгүй мэдээллийг харуулсан дохиоллын дэлгэц

Эдгээр хоёр дэлгэцийн хооронд шилжихийн тулд бид Magicbit дээрх хоёр товчлуурыг ашигласан. Эдгээр товчлуурууд нь Magicbit дахь ESP32 -ийн 35 (зүүн товчлуур) ба 34 (баруун товчлуур) зүүтэй холбогдсон байна. Цаг хугацаа болон бусад дэлгэрэнгүй мэдээллийг харуулахын тулд бид sehrbbit дээр OLED дэлгэцийг ашигласан.

Эдгээр график дэлгэц хэрхэн ажилладаг талаар ярилцъя.

Цагийн дэлгэц нь аналог цаг, дижитал цаг, огноо, сар, жилийн тексттэй.

Аналог цаг үүсгэхийн тулд бид Adafriut GFX хэмээх график номын санд байдаг зарим график функцийг ашигладаг. Тойргийн функц ба шугамын функцийг ашиглан бид аналог цагны нүүрийг бий болгодог. Sin ба cos гэж нэрлэгддэг энгийн геометрийн функцуудыг цагийн зүүний байрлалд ашигладаг. Тиймээс бид гараа эргүүлэх цагтай тохирох өнцгийг л оруулна. Үүний тулд бид эхлээд цагийг өнцөг болгон дараах байдлаар хөрвүүлнэ.

  • минутын гарны өнцөг = минут*(360/60)
  • цагийн өнцөг гар = цаг*(360/12)

Цагийн нүүрний төв ба цагийн нүүрний 12 дугаарын хоорондох шугамыг хэмжих өнцөг. Sin ба cos функцийг ашиглан цаг, минутын шугамын төгсгөлүүдийн x ба y координатыг тооцоолж болно. Доорх зурган дээр энэ нь хэрхэн хийгдэж байгааг дүрсэлсэн болно.

Координатын дагуу бид зургийн зургаар цаг, минутыг гараар хэвлэнэ. Adafruit GFX номын санд текст хэвлэх функц байдаг. Энэ нь бусад дэлгэрэнгүй мэдээллийг (огноо, сар, цагийг цифрээр харуулах) дэлгэц дээр хэвлэхэд тусалдаг. Та кодын параметрүүдийг өөрчилснөөр аналог цагийн байрлал, текстийн байрлалыг өөрчилж болно.

Цагийн дэлгэцийн нэгэн адил бид Adafruit GFX номын санд текст хэвлэх функцийг ашиглан OLED дэлгэц дээр дугаарыг зохих газруудад хэвлэх боломжтой болсон.

Алхам 5: Орон нутгийн цаг авах

Цагны хамгийн чухал хэсэг бол тухайн орон нутгийн цагийг хэрхэн үнэн зөв олж авах явдал юм. Үүний тулд та гадаад RTC цагийн модулийг эсвэл Magicbit дахь ESP32 дээр суурилуулсан RC цагийг ашиглаж болно. Энэ төсөлд бид хоёр дахь аргыг ашигласан. Энэ аргын хувьд бид интернэтээс орон нутгийн цагаа авахын тулд NTP (сүлжээний цагийн протокол) клиент ашигладаг. Интернетэд нэвтрэхийн тулд бид ESP32 дээр суулгагдсан WIFI төхөөрөмжийг ашигласан. Эхний шатанд бид SSID болон нууц үгээ ашиглан интернетэд нэвтрэхийн тулд WIFI ашигладаг. Дараа нь бид gmtOffset болон daylightOffset -ийг секундын дотор хувьсагч хэлбэрээр тохируулах ёстой. Эдгээр хувьсагчийн утга нь дэлхийн бүс нутгаас хамаарч өөр өөр байдаг. gmtOffset гэдэг нь GMT -ээс ялгаатай секундын тоо гэсэн үг юм. Ихэнх тохиолдолд өдрийн гэрэл 3600 байдаг. Орон нутгийн одоогийн цагийг авсны дараа бид WIFI ашиглахаа больсон. Яагаад гэвэл бид ESP32 дээр суурилуулсан RC цагнаас орон нутгийн цагийг тооцдог. Үүнийг time.h номын сан ашиглан хийдэг. Arduino -д (Arduino> Examples> ESP32> Time> simpletime) энгийн жишээ бий бөгөөд энэ нь цаашид хэрхэн ажиллах талаар олж мэдэх болно. Эдгээр холбоосыг ашиглан та NTP клиентийн талаар нэмэлт мэдээлэл авах боломжтой.

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

Орон нутгийн цагийг зөв авсны дараа бид тухайн цаг хугацааны дагуу текст, өнцгийг харуулах цагийг өөрчилдөг.

Алхам 6: Сэрүүлгийг тохируулах

Зүүн ба баруун товчлуур дээр дарж сэрүүлгийн огноо, цагийн сонголтыг өөрчлөх боломжтой. Сэрүүлгийн огноо, цагийг өөрчлөхдөө сэрүүлгээ унтраахаа мартуузай. Огноо, цагийг тохируулсны дараа сэрүүлгийг асаана уу. Учир нь хэрэв сэрүүлэг асаалттай байгаа бөгөөд үүнийг тохируулах үед сэрүүлгийн цаг таны одоогийн цагтай тэнцүү бол дохиоллын дуугарах болно. Үндсэн циклд одоогийн орон нутгийн цагийг байнга шалгаж, дохиоллын мэдээлэл тэнцүү байна. Хэрэв эдгээр нь тэнцүү бол Magicbit -д байрлуулсан ногоон LED дохио нэг минутын дотор ажиллах болно.

Алхам 7: Баззерыг тохируулах

Бид кодын analogCwrite () функцийг ашиглан дуут дохиог үүсгэхийн тулд PWM импульсийг ашигладаг. Номын сангийн бүх функц ESP32 -д байдаг тул Magicbit -д хүчинтэй байдаг. Та дохионы дуут дохиог кодын давтамж, ХОУХ -ны утгыг өөрчлөхөөс өөрчилж болно.

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

Энэ хуудас нь buzzer ESP32 -тэй хэрхэн ажилладаг талаар тайлбарласан болно.

Алхам 8: Товчлууруудыг тохируулах

Бүх мужийг өөрчлөхийн тулд бид Magicbit дээр суурилуулсан хоёр товчлуурыг ашигласан. Үндсэн гогцоо нь үргэлж хоёр товчлуурын төлөв байдлыг шалгадаг. Тэд дотогшоо татсан тул дохио хэвийн байна. Тиймээс та эдгээр тээглүүрийн дижитал уншилтыг харж болно. Анхдагч шатанд дэлгэц нь цагийн интерфэйсийг харуулдаг. Тухайн үед хоёр товчлуурын аль нэгийг дарахад дэлгэцийг дохиоллын дэлгэц болгон өөрчилдөг. Мөн бид хамгийн сүүлд товчлуур дарагдсан үеэс хойшхи хугацааг секундээр тоолно. Хэрэв энэ тоо урьдчилан тодорхойлсон хугацаанаас их байвал дэлгэц нь цагийн дэлгэцийг харуулна.

Кодыг эхлэгчдэд зориулсан үндсэн функцуудыг ашиглан бичсэн болно. Тиймээс кодыг ойлгоход хялбар бөгөөд кодыг ашиглан энэ нь хэрхэн ажилладаг талаар олж мэдэх боломжтой юм.

Алхам 9: Алдааг олж засварлах

Заримдаа цаг арай хожуу эхэлдэг эсвэл графикийг зөв харуулдаггүй. Дараахь зөвлөмжүүд нь нөхцөл байдлыг шийдвэрлэхэд тусална.

  • Зөв SSID болон нууц үгээ оруулсан эсэхээ шалгаарай
  • NTP серверийг өөрчлөх (та интернетээс өөрийн бүс нутагтай холбоотой олон сервер олох боломжтой).
  • Интернэт холболтыг өөрчилдөг. (Гар утасны халуун цэг бас боломжтой).

Мөн та цуваа дэлгэц ашиглан бүх асуудлыг шийдэж чадна. OLED дэлгэцээс гадна цуваа дэлгэц нь цагийн мэдээллийг харуулдаг.

Алхам 10: Arduino код

// OLED дэлгэцийн номын сан

#оруулах

#include #include #dele OLED_RESET 4 #include // wifi номын санг холбох #include "time.h" // ашиглах номын сан RC цаг // оролт гаралтын зүү нэрийг тодорхойлох #баруун товчлуурыг 34 тодорхойлох #зүүн товчлуурыг 35 тодорхойлох #ногоон тодорхойлох LEDLED 16 #dezine Buzzer 25 int preTime = 0; int тоолох = 0; int currentTime = 0; бүтэц tm timeinfo; const char* ssid = "ТАНЫ SSID"; // wifi -ийн дэлгэрэнгүй мэдээлэл const char* password = "ТАНЫ НУУЦ ҮГ"; 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"; // server detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 дэлгэц (128, 64); // OLED хэмжээ нь байт цагийг тодорхойлохCenterY = (display.height () + 16)/2; байт цаг Радиус = 23; bool төлөв = 0; // дэлгэц асах эсвэл унтраах boolean Alarm = 0; // дохиоллын одоогийн төлөв String alarmState = "Alarm ON"; // дохиолол асах эсвэл унтраах // varibles хадгалагдсан цагийн өгөгдөл char dayName [10]; char өдрийн тоо [3]; char сар [10]; char жил [5]; char цаг [3]; char минут [3]; char сарны дугаар [3]; char секунд [3]; // товчлуурын хувьсагчид bool RightState = 1; bool LeftState = 1; // дуут дохионы хувьсагчид int channel = 0; int давтамж = 2000; int PWM = 200; int нарийвчлал = 8; void setup () {// оролт ба гаралтыг тохируулах pinMode (RightButton, INPUT); pinMode (Зүүн товчлуур, оролт); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // дэлгэцийг харуулах дэлгэц.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 горим (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // одоогийн цагийг авах // баруун болон зүүн товчлуурыг хадгалах RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // товчлуурыг дарахад дохио дууны саатал (100) гаргадаг; if (төлөв == 0) {// дохиоллын дэлгэцийн хүрээний төлөвт шилжих = 1; // төлөвийг дохиоллын төлөвт өөрчлөх RightState = LeftState = 1; (төлөв == 1 && (тоологддог) <5) {// хэрэв дохиоллын дэлгэц дээр байгаа бол цаг дуусахгүй бол тооцоолохAlarm (); // дохиоллын мэдээллийн цагийн үзүүлэлтийг тооцоолох showAlarm (); // утгыг харуулах} өөр {// хэрэв цагтай бол дэлгэцийн төлөв = 0; display.clearDisplay (); clockFace (); // аналог цагны нүүрийг хэвлэхLocalTime (); // цагны нүүрэн дээр хэвлэх ба бусад дэлгэрэнгүйг хэвлэх} onAlarm (); // сэрүүлгийн цагийг орон нутгийн цагаар харьцуулж, сэрүүлгийн саатлыг асаах (100); // сэрүүлэг асаах, унтраах} хүчингүй clockFace () {// цагны нүүрний дэлгэц.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // хэвлэх цагны тойрог (int оронтой = 0; оронтой = 5) {// зөвхөн 5 -тай selctions. Тиймээс дахин тохируулах -1 (-1 = энэ нь асаах эсвэл унтраах) selectIndex = -1; } dateAndTimeSelection; (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Alarm ON"; }}} else {if (RightState == 0) {// бусад сонголтуудын хувьд массив alarmDateTime [index] = alarmDateTime [index] + 1; // индекс бол сонголт}} int харьцуулах [4] = {12, 2030, 23, 59}; // огноо, жилүүдийн дээд хязгаарууд int comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // саруудын дээд лими int resetValue [4] = {1, 2020, 0, 0}; // (int i = 1; i [i - 1] -ийг харьцуулах) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// сарууд хязгаараасаа их байвал vlaues -ийг анхны байдалд нь оруулах alarmDateTime [0] = 1; }} void showAlarm () {// дохиоллын дэлгэрэнгүйг хэвлэх String alarmDateTime0 = String (alarmDateTime [0]); // харуулалтыг харуулах String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // хэрэв утгууд нэг 1 тоон тэмдэгтэй бол тэдэнд "0" нэмнэ үү. хэрэв (alarmDateTime [0]

Зөвлөмж болгож буй: