Мазмұны:

Magicbit (Arduino) көмегімен ақылды дабыл сағаты: 10 қадам
Magicbit (Arduino) көмегімен ақылды дабыл сағаты: 10 қадам

Бейне: Magicbit (Arduino) көмегімен ақылды дабыл сағаты: 10 қадам

Бейне: Magicbit (Arduino) көмегімен ақылды дабыл сағаты: 10 қадам
Бейне: 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/kz/latest/…

Енді тақтаның түрі мен портын таңдаңыз. Бұл жағдайда тақтаның түрі Magicbit болып табылады. Кітапханалар Magicbit кітапханаларында болған кезде орнатылады.

4 -қадам: Теория мен әдістеме

Егер сіз бірінші бейнені қарасаңыз, дисплейде 2 экран бар екенін көре аласыз.

  • уақыттың егжей -тегжейін көрсететін сағат экраны
  • дабыл туралы мәліметтерді көрсететін дабыл экраны

Бұл екі экранның арасында ауысу үшін біз Magicbit -те екеуінің кез келген батырмасын қолдандық. Бұл түймелер Magicbit ішіндегі ESP32 35 (сол жақ түймешік) және 34 (оң жақ түйме) түйреуіштеріне қосылған. Уақыт пен басқа да мәліметтерді көрсету үшін біз сыйымдылықта OLED дисплейін қолдандық.

Бұл графикалық экрандар қалай жұмыс істейтіні туралы сөйлесейік.

Сағат экранында аналогтық сағат, цифрлық сағат, күн, ай және жыл мәтіндері бар.

Аналогтық сағатты құру үшін біз графикалық кітапханада Adafriut GFX деп аталатын кейбір графикалық функцияларды қолданамыз. Дөңгелек функциясы мен сызық функциясын қолдана отырып, біз аналогты сағат бетін жасаймыз. Sin және cos деп аталатын қарапайым геометриялық функциялар сағат тілінің позициясында қолданылады. Сондықтан біз бұрылатын қолдың уақытына сәйкес келетін бұрышты енгіземіз. ол үшін алдымен уақытты бұрышқа келесідей түрлендіреміз.

  • минут тілінің бұрышы = минут*(360/60)
  • сағат бұрышы = сағат*(360/12)

Сағат тілінің центрі мен сағат тіліндегі 12 саны арасындағы сызық бойынша өлшенетін бұрыш. Sin және cos функцияларын қолдана отырып, біз сағат пен минут сызықтарының ұштарының x және y координаттарын есептей аламыз. Төмендегі суретте оның қалай жасалып жатқаны сипатталған.

Координаттарға сәйкес біз сызықтармен сағат пен минутты басып шығарамыз. Adafruit GFX кітапханасында мәтінді басып шығару функциясы да бар. Бұл дисплейде басқа мәліметтерді басып шығаруға көмектеседі (күн, ай және уақыт цифрмен көрсетіледі). Сіз кодтағы параметрлерді өзгерту арқылы аналогтық сағат позициясын және мәтіндік позицияларды өзгерте аласыз.

Сағат экраны сияқты, біз Adafruit GFX кітапханасындағы мәтінді басып шығару функциясын OLED дисплейінде сәйкес жерлерде басып шығару үшін қолдандық.

5 -қадам: Жергілікті уақытты алу

Сағаттың ең маңызды бөлігі - біз жергілікті уақытты қалай дәл аламыз. Ол үшін Magicbit -те ESP32 -де сыртқы RTC сағат модулін немесе кіріктірілген 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 -те жасыл жарық диоды бір минут жұмыс істейді.

7 -қадам: Дыбыстық сигналды орнату

Біз кодтағы analogCwrite () функциясын қолдану арқылы дыбыстық сигналды шығару үшін PWM импульсін қолданамыз. Кітапхананың барлық функциялары 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 кітапханасы #қосу «уақыт.h» // кітапхана RC сағаты // кіріс және шығыс түйреуіш атауларын анықтау #Оң жақ батырманы анықтау 34 #анықтау Сол жақ түймешік 35 #анықтау GreenLED 16 #define Buzzer 25 int preTime = 0; int count = 0; int currentTime = 0; tm timeinfo құрылымы; const char* ssid = «YOUR 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»; // 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; // экранды қосу немесе өшіру логикалық Alarm = 0; // дабылдың ағымдағы күйі String alarmState = «Alarm ON»; // дабылды қосу немесе өшіру // varibles сақталған уақыт деректері char dayName [10]; char daynumber [3]; таң айы [10]; шар жыл [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 (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, егер (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // түйме басылса, дыбыстық сигналдың кідірісін (100) шығарады; if (күй == 0) {// дабыл экранының кадр күйіне ауысу = 1; // күйді дабыл күйіне өзгерту RightState = LeftState = 1; // бізге тек қана өзгерту керек} есептер = 0; // есептегішті қалпына келтіру} if (күй == 1 && (есептеледі) <5) {// егер дабыл экранында болса және күту уақыты болмаса, есептеуAlarm (); // дабыл ақпаратының уақыт мәндерін есептеу showAlarm (); // мәндерді көрсету} басқа {// егер сағатта болса экран күйі = 0; display.clearDisplay (); clockFace; дабыл қосулы және өшірулі} void clockFace () {// caalog clock clock display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // басып шығару шеңбері (int цифр = 0; цифр = 5) {// тек 5 бар selctions.so -1 қалпына келтіру (-1 = қосулы немесе өшірулі) selectIndex = -1; } dateAndTimeSelection (selectIndex); // selction өзгерту} void dateAndTimeSelection (int index) {if (index == -1) {// дабыл қосылады немесе өшеді, егер (RightState == 0) {// егер (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 - 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]); String alarmDateTime2 = Жол (alarmDateTime [2]); String alarmDateTime3 = Жол (alarmDateTime [3]); String alarmDateTime4 = Жол (alarmDateTime [4]); // егер мәндерде 1 сан болса, оларға «0» қосыңыз. if (alarmDateTime [0]

Ұсынылған: