Мазмуну:

Magicbit (Arduino) колдонуу менен акылдуу ойготкуч саат: 10 кадам
Magicbit (Arduino) колдонуу менен акылдуу ойготкуч саат: 10 кадам

Video: Magicbit (Arduino) колдонуу менен акылдуу ойготкуч саат: 10 кадам

Video: Magicbit (Arduino) колдонуу менен акылдуу ойготкуч саат: 10 кадам
Video: Connecting with Arduino IDE 2024, Ноябрь
Anonim
Image
Image

Бул окуу куралы кандай RTC модулун колдонбостон Magicbit dev тактасында OLED дисплейин колдонуп акылдуу ойготкуч жасоону көрсөтөт.

Жабдуулар

  • Magicbit
  • USB-Aдан Micro-USB кабелине

1 -кадам: Окуя

Бул үйрөткүчтө биз Magicbitти колдонуп акылдуу ойготкучту кантип жасоону үйрөнөбүз.

2 -кадам: ЖАБДЫК ЖӨНДӨӨ

USB кабели аркылуу Magicbitти компьютерге туташтырыңыз.

3 -кадам: ПРОГРАММА ЖӨНДӨӨ

Arduino IDEди ачыңыз жана Arduino IDE менен тактаны орнотуңуз. Төмөнкү шилтеме муну кантип жасоону билдирет. Ошентип, биз биринчи шилтемеге өтүүнү жана Magic бит менен таанышууну сунуштайбыз.

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

Эми тактанын түрүн жана портун туура тандаңыз. Бул учурда тактанын түрү Magicbit болуп саналат. Китепканалар буга чейин Magicbit китепканаларында орнотулган.

4 -кадам: Теория жана методология

Биринчи видеону карасаңыз, дисплейде 2 экран бар экенин көрө аласыз.

  • убакыт деталдарын көрсөтүүчү саат экраны
  • ойготкучтун чоо -жайын көрсөтүүчү ойготкуч экран

Бул экрандын ортосунда которуштуруу үчүн, биз Magicbitте экөөнүн каалаган баскычын колдондук. Бул баскычтар Magicbit'теги ESP32нин 35 (сол баскычы) жана 34 (оң баскыч) казыктарына туташтырылган. Убакытты жана башка деталдарды көрсөтүү үчүн сыйкырдуу OLED дисплейде колдондук.

Бул графикалык экрандар кантип иштээри жөнүндө сүйлөшөлү.

Сааттын экранында аналогдук саат, санарип саат, күн, ай жана жыл тексттери бар.

Аналогдук саатты түзүү үчүн биз Adafriut GFX деп аталган графикалык китепканада бар кээ бир графикалык функцияларды колдонобуз. Айлана функциясын жана линия функциясын колдонуу менен биз аналогдук саат жүзүн түзөбүз. Күн жана кос деп аталган жөнөкөй геометриялык функциялар саат жебелеринин абалына колдонулат. Ошентип, биз колдорду айлантуу убактысына туура келген бурчту гана киргизебиз. ал үчүн биз алгач убакытты төмөнкүдөй бурчка айландырабыз.

  • мүнөттүн бурчу = мүнөт*(360/60)
  • сааттын бурчу = саат*(360/12)

Күндүн жүзү менен сааттын ортосундагы 12 -чекиттин ортосундагы чекке карата өлчөнгөн бурч. Син жана cos функцияларын колдонуу менен биз сааттын жана мүнөт линияларынын учтарынын х жана у координаттарын эсептей алабыз. Төмөндөгү сүрөттө анын кандай иштеп жатканы сүрөттөлгөн.

Координаттар боюнча биз сызыктар менен саат жана мүнөттөрдү басып чыгарабыз. 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> Мисалдар> ESP32> Убакыт> жөнөкөй убакыт). Ошондой эле бул шилтемелерди NTP кардары жөнүндө кошумча маалымат алуу үчүн колдонсоңуз болот.

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

Жергиликтүү убакытты туура алгандан кийин, биз текстти жана бурчту көрсөтүү менен убакытыбызды өзгөртүп, ар бир циклде ошол убакыттын маалыматын көрсөтөбүз.

6 -кадам: Ойготкучту орнотуу

Сол жана оң баскычтарды басуу менен сиз ойготкучтун күнүн жана убактысын өзгөртө аласыз. Ойготкучтун датасын жана убактысын өзгөрткөндө, ойготкучту өчүрүүнү тактаңыз. Күндү жана убакытты орноткондон кийин, ойготкучту күйгүзүңүз. Анткени, эгер ойготкуч күйгүзүлгөн болсо жана сиз аны орнотуп жатканда, ойготкуч учурдагы убактыңызга барабар болсо, анда коңгуроо шыңгырайт. Негизги циклде ар дайым учурдагы жергиликтүү убакыт текшерилет жана сигналдык маалымат бирдей. Эгерде алар барабар болсо, анда Magicbit'те жашыл LED менен курулган сигнал бир мүнөттүн ичинде иштейт.

7 -кадам: Buzzer орнотуу

Биз коддогу analogCwrite () функциясын колдонуу менен коңгуроонун үнүн чыгаруу үчүн PWM импульсун колдонобуз. Китепкананын бардык функциялары ESP32де болгондуктан Magicbit үчүн жарактуу. Сиз коңгуроонун сигналын анын жыштыгын жана коддогу PWM маанисин өзгөртө аласыз.

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

Бул баракчада buzzerдин ESP32 менен кантип иштээри сүрөттөлгөн.

8 -кадам: Баскычтарды орнотуу

Бардык штаттарды өзгөртүү үчүн биз Magicbit'те орнотулган эки баскычты колдондук. Негизги цикл ар дайым эки баскычтын абалын текшерет. Алар ички тартылгандыктан, нормалдуу абал жогорку сигнал. Ошентип, сиз бул казыктардын санарип окуусун көрө аласыз 1. Демейки баскычта дисплей саат интерфейсин көрсөтөт. Ошол учурда, эки баскычтын бирөөсү басылганда, экранды сигналдык экранга алмаштырат. Ошондой эле биз баскыч басылган акыркы убакыттан секундду эсептейбиз. Эгерде бул сан алдын ала аныкталган узактыктан чоң болсо, анда дисплей саат экранын көрсөтөт.

Код башталгычтар үчүн негизги функцияларды колдонуу менен жазылган. Ошентип, кодду түшүнүү жөнөкөй жана сиз кодго шилтеме берүү менен анын кантип иштээрин үйрөнө аласыз.

9 -кадам: Мүчүлүштүктөрдү оңдоо

Кээде саат бир аз кеч башталат же графиканы туура көрсөтпөйт. Кийинки кеңештер кырдаалды чечүүгө жардам берет.

  • Туура SSID менен сырсөздү бергениңизди текшериңиз
  • NTP серверин алмаштырыңыз (интернеттен сиздин аймакка тиешелүү көптөгөн серверлерди таба аласыз).
  • Интернет байланышын өзгөртөт. (Мобилдик байланыш түйүнү да мүмкүн).

Ошондой эле сиз сериялык монитордун жардамы менен бардык көйгөйлөрдү чече аласыз. OLED дисплейден тышкары сериялык монитор убакыт маалыматын көрсөтөт.

10 -кадам: Arduino коду

// OLED дисплейи үчүн китепканалар

#кошуу

#кошуу #кошуу #аныктоо OLED_RESET 4 #кошуу // кошуу үчүн wifi китепканасы #кошуу "time.h" // китепкана колдонуу үчүн RC сааты // киргизүү жана чыгаруу пин аталыштарын аныктоо #Оңго баскычын аныктоо 34 #аныктоо Сол баскычын 35 #аныктоо GreenLED 16 #define Buzzer 25 int preTime = 0; int counts = 0; int currentTime = 0; struktur tm timeinfo; const char* ssid = "СИЗДИН SSID"; // wifi маалыматы const char* 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}}; // тандоо тик бурчтуу 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; байт clockRadius = 23; bool state = 0; // экранды күйгүзүү же өчүрүү логикалык Ойготкуч = 0; // ойготкучтун учурдагы абалы String alarmState = "Alarm ON"; // alarm on or off // varibles сакталган убакыт маалыматтары day dayName [10]; char daynumber [3]; чар ай [10]; чар жыл [5]; char сааттары [3]; char мүнөт [3]; char айлык саны [3]; char seconds [3]; // баскычтын өзгөрмөлөрү bool RightState = 1; bool LeftState = 1; // ызы -чуунун өзгөрмөлөрү int channel = 0; int Frequency = 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 (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // учурдагы убакытты алуу // оң жана сол баскычтарды сактоо RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // chaeck buttouns басылат, эгерде (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // баскыч басылганда, коңгуроо бип үнүнүн кечигүүсүн чыгарат (100); if (state == 0) {// ойготкуч экранынын кадр абалына өзгөртүү = 1; // абалды сигнал абалына өзгөртүү RightState = LeftState = 1; // бизге бир гана өзгөртүү керек sceern} count = 0; // эсептегичти баштапкы абалга} (абал == 1 && (эсептейт) <5) {// эгер ойготкуч экранда болсо жана күтүү убактысы жок болсо, эсептөөAlarm (); // сигналдын убакыттын маанилерин эсептөө showAlarm (); // баалуулуктарды көрсөтүү} башка {// эгерде саатта экран абалы = 0; display.clearDisplay (); clockFace (); // аналогдук сааттын жүзү printLocalTime (); // сааттын бетинде басып чыгаруу жана башка деталдарды басып чыгаруу} onAlarm (); // жергиликтүү убакыт менен ойготуу убактысын салыштыруу жана ойготуу кечигүүсүн күйгүзүү (100); // кечиктирүү ойготкучту күйгүзүү жана өчүрүү} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); selctions.so -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 solish [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]> салыштыруу [alarmDateTime [1] - 1]) {// айлар чектеринен чоң болсо, vlaues баштапкы абалга келтирүү alarmDateTime [0] = 1; }} void showAlarm () {// ойготкучтун маалыматын басып чыгаруу String alarmDateTime0 = String (alarmDateTime [0]); // стингдерди көрсөтүү String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = Сап (alarmDateTime [2]); String alarmDateTime3 = Сап (alarmDateTime [3]); String alarmDateTime4 = Сап (alarmDateTime [4]); // эгерде баалуулуктарда бир 1 цифра болсо, аларга "0" кошуңуз. эгер (alarmDateTime [0]

Сунушталууда: