![Интелигентен будилник, използващ Magicbit (Arduino): 10 стъпки Интелигентен будилник, използващ Magicbit (Arduino): 10 стъпки](https://i.howwhatproduce.com/images/002/image-3038-25-j.webp)
Съдържание:
- Консумативи
- Стъпка 1: История
- Стъпка 2: НАСТРОЙКА НА ХАРАКТЕРИСТИКА
- Стъпка 3: НАСТРОЙКА НА СОФТУЕР
- Стъпка 4: Теория и методология
- Стъпка 5: Получаване на местно време
- Стъпка 6: Настройване на алармата
- Стъпка 7: Настройване на зумера
- Стъпка 8: Настройка на бутоните
- Стъпка 9: Отстраняване на неизправности
- Стъпка 10: Arduino код
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 12:57
![Image Image](https://i.howwhatproduce.com/images/002/image-3038-27-j.webp)
![](https://i.ytimg.com/vi/hex3exju5Rw/hqdefault.jpg)
Този урок показва как да направите интелигентен будилник с помощта на OLED дисплей в Magicbit dev board, без да използвате никакъв RTC модул.
Консумативи
- Magicbit
- USB-A към Micro-USB кабел
Стъпка 1: История
В този урок ще научим как да направите интелигентен будилник с помощта на Magicbit.
Стъпка 2: НАСТРОЙКА НА ХАРАКТЕРИСТИКА
Включете вашия Magicbit към компютър с помощта на USB кабел.
Стъпка 3: НАСТРОЙКА НА СОФТУЕР
Отворете вашата Arduino IDE и настройте дъската с Arduino IDE. Следващата връзка описва как да направите това. Затова ви препоръчваме първо да отидете на връзка и да се запознаете с Magic bit.
magicbit-arduino.readthedocs.io/en/latest/…
Сега изберете правилния тип платка и порт. В този случай типът платка е Magicbit. Библиотеките вече са инсталирани, когато са в библиотеките на Magicbit.
Стъпка 4: Теория и методология
Ако погледнете първия видеоклип, можете да видите, че дисплеят има 2 екрана.
- часовник, който показва подробности за времето
- алармен екран, който показва подробности за алармата
За превключване между тези два екрана използвахме всеки бутон от двама в Magicbit. Тези бутони са свързани към 35 (ляв бутон) и 34 (десен бутон) щифтове на ESP32 в Magicbit. За да покажем часа и други подробности, използвахме вграден OLED дисплей в magicbit.
Нека поговорим за това как работят тези графични екрани.
Екранът на часовника има аналогов часовник, цифров часовник, дата, месец и година.
За създаване на аналогов часовник използваме някои графични функции, които са налични в графичната библиотека, наречена Adafriut GFX. Използвайки кръгова функция и линейна функция, ние създаваме аналогов циферблат. Простите геометрични функции, наречени sin и cos, се използват за позицията на стрелките на часовника. Така че въвеждаме само ъгъла, който съответства на времето за завъртане на ръцете. за това първо преобразуваме времето в ъгъл, както следва.
- ъгъл на минутна стрелка = минути*(360/60)
- стрелка на часовете = часове*(360/12)
Ъгълът, измерен по отношение на линията между центъра на циферблата и номер 12. В циферблата с помощта на sin и cos функции можем да изчислим координатите x и y на краищата на часовите и минутните линии. Снимката по -долу описва как се справя.
Съгласно координатите ние отпечатваме часовата и минутна стрелка по линии за чертане. В библиотеката на Adafruit GFX има и функция за печат на текст. Помага за отпечатване на други данни (дата, месец и час, показани в цифри) на дисплея. Можете да промените позицията на аналоговия часовник и текстовите позиции, като промените параметрите в кода.
Подобно на часовника, ние използвахме функция за печат на текст в библиотеката Adafruit GFX за отпечатване на номера на OLED дисплей на подходящи места.
Стъпка 5: Получаване на местно време
Най -важната част от часовника е как точно получаваме местното време. За тази цел можете да използвате външен RTC часовник или вграден RC часовник в ESP32 в Magicbit. В този проект използвахме втори метод. В този метод използваме клиент NTP (протокол за мрежово време) за получаване на локалното време от интернет. За достъп до интернет използвахме вградено WIFI съоръжение в ESP32. Затова на първия етап използваме WIFI за достъп до интернет чрез предоставяне на SSID и парола. След това трябва да конфигурираме gmtOffset и daylightOffset в променливи за секунди. Стойностите на тези променливи са различни в различните региони в света. gmtOffset означава броя секунди, които се различават от GMT.. За повечето области дневна светлина Offset е 3600. Можете да го намерите в интернет. След като получихме текущото местно време, вече не използвахме WIFI. Защото тогава ние изчисляваме местното време от вградения RC часовник в ESP32. Това става чрез библиотека time.h. Има прост пример в Arduino (Arduino> Примери> ESP32> Време> simpletime), за да научите как това работи по -нататък. Също така тези връзки можете да използвате за по -нататъшни познания за NTP клиента.
- https://dronebotworkshop.com/esp32-intro/
- https://lastminuteengineers.com/esp32-ntp-server-d…
След като получим правилно местното време, ние променяме времето си за показване на текстове и ъгъл според информацията за това време във всеки цикъл.
Стъпка 6: Настройване на алармата
Чрез натискане на левия и десния бутон можете да промените датата и часа на алармата. Не забравяйте да изключите алармата, когато променяте датата и часа на алармата. След като настроите датата и часа, включете алармата. Защото ако алармата е включена и когато аларменото време е равно на текущото ви време, докато го настройвате, аларменият сигнал ще звъни. В главния цикъл винаги проверява текущото местно време и информацията за алармата са равни. Ако те са равни, тогава зумерът и вграденият зелен светодиод в Magicbit ще работят в продължение на една минута.
Стъпка 7: Настройване на зумера
Използваме PWM импулс, за да създадем звуков сигнал чрез функцията analogCwrite () в кода. Поради всички библиотечни функции, ESP32 е валиден за Magicbit. Можете да промените звуковия сигнал на зумера от промяна на неговата честота и стойност на ШИМ в кода.
techtutorialsx.com/2017/06/15/esp32-arduin…
Тази страница описва как зумерът работи с ESP32.
Стъпка 8: Настройка на бутоните
За промяна на всички състояния използвахме два вградени бутона в Magicbit. Главният контур винаги проверява състоянието на два бутона. Тъй като те се изтеглиха вътрешно, нормалното състояние е висок сигнал. Така че можете да видите цифровото четене на тези пинове са 1. На етапа по подразбиране дисплеят показва интерфейса на часовника. По това време, когато се натисне някой от двата бутона, екранът се променя на екран за аларма. Също така броим времето в секунди от последния път, когато бутонът е натиснат. Ако този брой е по -голям от определена продължителност, тогава дисплеят ще покаже екрана на часовника.
Кодът е написан с помощта на основни функции за начинаещи. Така че кодът е лесен за разбиране и можете да научите метода как работи, като препратите кода.
Стъпка 9: Отстраняване на неизправности
Понякога часовникът се стартира малко по -късно или не показва правилно графиката. Следните съвети помагат да се реши ситуацията.
- Уверете се, че сте дали правилния SSID и парола
- Променете NTP сървъра (можете да намерите много сървъри от интернет, които са свързани с вашия регион).
- Променя интернет връзката (може и мобилна гореща точка).
Също така можете да отстраните всички проблеми с помощта на сериен монитор. В допълнение към OLED дисплея серийният монитор показва информация за часа.
Стъпка 10: Arduino код
// библиотеки за OLED дисплей
#включва
#include #include #define OLED_RESET 4 #include // wifi библиотека за свързване #include "time.h" // библиотека за използване RC часовник // дефиниране на входни и изходни имена на пинове #дефиниране на RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int броене = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "YOUR 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"; // подробности за сървъра const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 дисплей (128, 64); // OLED размер определя байт clockCenterY = (display.height () + 16)/2; // подробности за аналоговия часовник байт clockCenterX = (display.height () - 16)/2; байтов часовникRadius = 23; bool state = 0; // екранът е включен или изключен boolean Alarm = 0; // текущо състояние на алармата String alarmState = "Alarm ON"; // аларма включена или изключена // променя запаметените данни за времето char dayName [10]; char daynumber [3]; char месец [10]; char година [5]; часови часове [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 (зумер, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // инициализира дисплея display.display (); забавяне (3000); display.clearDisplay (); ledcSetup (0, Честота, разделителна способност); // конфигуриране на pwm параметри ledcAttachPin (Звънец, 0); Serial.begin (115200); // установяване на серийна комуникация // свързване към WiFi Serial.printf ("Свързване към %s", ssid); WiFi.begin (ssid, парола); while (WiFi.status ()! = WL_CONNECTED) {забавяне (500); Serial.print ("."); } Serial.println ("CONNECTED"); // стартиране и получаване на времето 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); // отметка на бутоните се натиска, ако (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // когато бутонът е натиснат, зумерът издава звуков сигнал за забавяне (100); if (state == 0) {// промяна в състояние на кадъра на екрана на алармата = 1; // промяна на състоянието в състояние на аларма RightState = LeftState = 1; // имаме нужда само от смяна sceern} count = 0; // нулиране на брояча} if (състояние == 1 && (брои) <5) {// ако е в алармен екран и няма време за изчакване calculaAlarm (); състояние на екрана = 0; display.clearDisplay (); clockFace (); // аналогов циферблат printLocalTime (); // време за отпечатване в циферблат и отпечатване на други подробности} onAlarm (); // сравняваме времето на алармата с местното време и включваме забавянето на алармата (100); // забавяне за аларма за включване и изключване} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // отпечатвате кръга на часовника за (int цифра = 0; цифра = 5) {// има само 5 selctions.so reset to -1 (-1 = е аларма включена или изключена) selectIndex = -1; } dateAndTimeSelection (selectIndex); // промяна на секция} void dateAndTimeSelection (int index) {if (index == -1) {// аларма включена или изключена if (RightState == 0) {// превключване между аларма за включване и изключване, ако (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Аларма ВКЛ."; }}} else {if (RightState == 0) {// в други секции icrement на съответната дата или час в масива alarmDateTime [индекс] = alarmDateTime [индекс] + 1; // индексът е изборът}} int compare [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]> comparemonth [alarmDateTime [1] - 1]) {// нулиране на vlaues, ако месеците са по -големи от техните граници alarmDateTime [0] = 1; }} void showAlarm () {// отпечатайте подробности за алармата String alarmDateTime0 = String (alarmDateTime [0]); // конвертираме жилата, за да покажем String alarmDateTime1 = String (alarmDateTime [1]); Низ alarmDateTime2 = Низ (alarmDateTime [2]); Низ alarmDateTime3 = Низ (alarmDateTime [3]); Низ alarmDateTime4 = Низ (alarmDateTime [4]); // ако стойностите имат една цифра 1, добавете "0" към тях. ако (alarmDateTime [0]
Препоръчано:
Интелигентен будилник - Intel Edison - Iot RoadShow - Сао Пауло: 4 стъпки
![Интелигентен будилник - Intel Edison - Iot RoadShow - Сао Пауло: 4 стъпки Интелигентен будилник - Intel Edison - Iot RoadShow - Сао Пауло: 4 стъпки](https://i.howwhatproduce.com/images/003/image-8825-j.webp)
Интелигентен будилник - Intel Edison - Iot RoadShow - Сао Пауло: Едно от големите достойнства на всеки, който живее или работи в голям град, е управлението на времето. В днешно време пътуванията са постоянни и тъй като трафикът е един от основните фактори. Мислейки за това, направих малко приложение, което използва интеграцията с Google M
WakeupNow - Интелигентен будилник: 8 стъпки
![WakeupNow - Интелигентен будилник: 8 стъпки WakeupNow - Интелигентен будилник: 8 стъпки](https://i.howwhatproduce.com/images/005/image-14996-j.webp)
WakeupNow - Интелигентен будилник: Както всеки знае, животът на студентите е много труден, те имат дълъг ден с лекции, много домашни и като цяло имат луд живот. Те нямат време за нищо и ако им предложите да добавят няколко часа към деня, те ще се зарадват. Разгърнете
Нощен будилник с будилник MP3: 6 стъпки (със снимки)
![Нощен будилник с будилник MP3: 6 стъпки (със снимки) Нощен будилник с будилник MP3: 6 стъпки (със снимки)](https://i.howwhatproduce.com/images/006/image-16540-j.webp)
Нощен алармен будилник с букви за MP3: За този проект исках да направя удобен и напълно функционален часовник за нощна аларма. Моите лични предпоставки за нощен будилник са: Четене при всяка светлина, без да заслепява през нощта MP3 мелодии за аларма Привличане
Събуди ме - интелигентен будилник: 6 стъпки
![Събуди ме - интелигентен будилник: 6 стъпки Събуди ме - интелигентен будилник: 6 стъпки](https://i.howwhatproduce.com/images/007/image-19273-j.webp)
Wake Me Up - интелигентен будилник: Wake me up е интелигентен будилник, който може да се използва и като интелигентна светлина. Това дава възможност за спокоен, естествен начин да започнете деня си. Будилникът е оборудван и с 4*7 сегмент
Интелигентен будилник: интелигентен будилник, направен с Raspberry Pi: 10 стъпки (със снимки)
![Интелигентен будилник: интелигентен будилник, направен с Raspberry Pi: 10 стъпки (със снимки) Интелигентен будилник: интелигентен будилник, направен с Raspberry Pi: 10 стъпки (със снимки)](https://i.howwhatproduce.com/images/007/image-19330-j.webp)
Интелигентен будилник: интелигентен будилник, направен с Raspberry Pi: Искали ли сте някога интелигентен часовник? Ако е така, това е решението за вас! Направих Smart Alarm Clock, това е часовник, който можете да промените часа на алармата според уебсайта. Когато алармата изгасне, ще се чуе звук (зумер) и 2 светлини ще