جدول المحتويات:

المنبه الذكي باستخدام Magicbit (Arduino): 10 خطوات
المنبه الذكي باستخدام Magicbit (Arduino): 10 خطوات

فيديو: المنبه الذكي باستخدام Magicbit (Arduino): 10 خطوات

فيديو: المنبه الذكي باستخدام Magicbit (Arduino): 10 خطوات
فيديو: Программирование модуля датчика температуры и влажности ESP8266 ESP01 DHT11 | удаленныйXY | ФЛПрог 2024, يوليو
Anonim
Image
Image

يوضح هذا البرنامج التعليمي كيفية إنشاء منبه ذكي باستخدام شاشة OLED في لوحة Magicbit dev دون استخدام أي وحدة RTC.

اللوازم

  • ماجيكبيت
  • كابل USB-A إلى Micro-USB

الخطوة 1: القصة

في هذا البرنامج التعليمي سوف نتعرف على كيفية صنع منبه ذكي باستخدام Magicbit.

الخطوة 2: إعداد الجهاز

قم بتوصيل Magicbit بالكمبيوتر باستخدام كابل USB.

الخطوة 3: SOFTWARE SETUP

افتح Arduino IDE وقم بإعداد اللوحة باستخدام Arduino IDE. الرابط التالي يشير إلى كيفية القيام بذلك. لذلك نوصيك بالذهاب أولاً إلى الارتباط والتعرف على Magic bit.

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

حدد الآن نوع اللوحة والمنفذ الصحيحين. في هذه الحالة ، يكون نوع اللوحة هو Magicbit. المكتبات مثبتة بالفعل في مكتبات Magicbit.

الخطوة 4: النظرية والمنهجية

إذا نظرت إلى الفيديو الأول ، يمكنك رؤية الشاشة بها شاشتان.

  • شاشة الساعة التي تظهر تفاصيل الوقت
  • شاشة إنذار تظهر تفاصيل التنبيه

للتبديل بين هاتين الشاشتين ، استخدمنا أي زر ضغط من اثنين في Magicbit. هذه الأزرار متصلة بـ 35 (الزر الأيسر) و 34 (الزر الأيمن) من ESP32 في Magicbit. لإظهار الوقت والتفاصيل الأخرى ، استخدمنا شاشة OLED المدمجة في magicbit.

دعنا نتحدث عن كيفية عمل هذه الشاشات الرسومية.

تحتوي شاشة الساعة على نصوص ساعة تناظرية وساعة رقمية وتاريخ وشهر وسنة.

لإنشاء ساعة تناظرية ، نستخدم بعض وظائف الرسومات المتوفرة في مكتبة الرسومات المسماة Adafriut GFX. باستخدام وظيفة الدائرة ووظيفة الخط ، نقوم بإنشاء وجه ساعة تناظري. يتم استخدام الدوال الهندسية البسيطة التي تسمى الخطيئة وجيب التمام لوضع عقارب الساعة. لذلك نقوم فقط بإدخال الزاوية التي تتوافق مع وقت تدوير العقارب. لذلك نقوم أولاً بتحويل الوقت إلى زاوية على النحو التالي.

  • زاوية عقرب الدقائق = الدقائق * (360/60)
  • زاوية عقرب الساعات = ساعات * (360/12)

الزاوية المقاسة بالنسبة للخط بين مركز وجه الساعة والرقم 12 في وجه الساعة ، وباستخدام الدالتين sin و cos يمكننا حساب إحداثيات x و y لنهاية سطور الساعة والدقائق. الصورة أدناه تصف كيف يعمل.

وفقًا للإحداثيات ، نطبع عقرب الساعة والدقائق عن طريق رسم الخطوط. هناك أيضًا وظيفة طباعة نصية في مكتبة Adafruit GFX. يساعد في طباعة التفاصيل الأخرى (التاريخ والشهر والوقت تظهر بالأرقام) على الشاشة. يمكنك تغيير موضع الساعة التناظرية ومواضع النص عن طريق تغيير المعلمات في الكود.

مثل شاشة الساعة ، استخدمنا وظيفة طباعة النص في مكتبة Adafruit GFX لأرقام الطباعة على شاشة OLED في الأماكن المناسبة.

الخطوة الخامسة: الحصول على التوقيت المحلي

أهم جزء في الساعة هو كيف نحصل على التوقيت المحلي بدقة. لهذا الغرض ، يمكنك استخدام وحدة ساعة RTC خارجية أو ساعة RC مدمجة في ESP32 في Magicbit. في هذا المشروع استخدمنا الطريقة الثانية. في هذه الطريقة ، نستخدم عميل NTP (بروتوكول وقت الشبكة) للحصول على التوقيت المحلي من الإنترنت. للوصول إلى الإنترنت ، استخدمنا مرفق WIFI يحمل في ثناياه عوامل في ESP32. لذلك في المرحلة الأولى ، نستخدم WIFI للوصول إلى الإنترنت من خلال توفير SSID وكلمة المرور. ثم يجب علينا تكوين gmtOffset و daylightOffset في المتغيرات بالثواني. تختلف قيم هذه المتغيرات من منطقة إلى أخرى في العالم. gmtOffset تعني عدد الثواني التي تختلف فيها عن GMT.. بالنسبة لمعظم ares daylightOffset هي 3600. يمكنك العثور عليها في الإنترنت. بعد أن حصلنا على التوقيت المحلي الحالي ، لم نعد نستخدم WIFI. لأنه بعد ذلك نحسب التوقيت المحلي من ساعة RC المدمجة في ESP32. يتم ذلك باستخدام مكتبة time.h. يوجد مثال بسيط في Arduino (Arduino> Examples> ESP32> Time> simpleetime) لتتعرف على كيفية عمل ذلك بشكل أكبر. يمكنك أيضًا استخدام هذه الروابط لمزيد من المعلومات حول عميل NTP.

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

بعد الحصول على التوقيت المحلي بشكل صحيح ، نغير وقتنا في إظهار النصوص والزاوية وفقًا لمعلومات الوقت في كل حلقة.

الخطوة 6: إعداد المنبه

من خلال النقر على الزرين الأيمن والأيسر ، يمكنك تغيير تاريخ التنبيه واختيار الوقت. تأكد من إيقاف تشغيل المنبه عند تغيير تاريخ ووقت التنبيه. بعد إعداد التاريخ والوقت ، قم بتشغيل المنبه. لأنه إذا كان المنبه قيد التشغيل وعندما يكون وقت التنبيه مساويًا لوقتك الحالي أثناء إعداده ، فسوف يرن جرس المنبه. في الحلقة الرئيسية يتحقق دائمًا من الوقت المحلي الحالي ومعلومات التنبيه متساوية. إذا كانت هذه متساوية ، فعندئذٍ سيعمل الجرس والمصباح الأخضر المدمج في Magicbit خلال دقيقة واحدة.

الخطوة 7: إعداد الجرس

نستخدم نبض PWM لإنشاء صوت الجرس باستخدام وظيفة analogCwrite () في الكود. نظرًا لأن جميع وظائف المكتبة الموجودة في ESP32 صالحة لـ Magicbit. يمكنك تغيير صوت صفير الجرس من تغيير تردده وقيمة PWM في الكود.

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

توضح هذه الصفحة كيفية عمل الجرس مع ESP32.

الخطوة 8: إعداد الأزرار

لتغيير جميع الحالات ، استخدمنا زري ضغط مدمجين في Magicbit. تتحقق الحلقة الرئيسية دائمًا من حالة زرين. نظرًا لأنهم انسحبوا داخليًا ، هناك حالة طبيعية هي إشارة عالية. حتى تتمكن من رؤية القراءة الرقمية لتلك المسامير هي 1. في المرحلة الافتراضية ، تعرض الشاشة واجهة الساعة. في ذلك الوقت ، عند الضغط على أي من الزرين ، يتم تغيير الشاشة إلى شاشة التنبيه. نحسب أيضًا الوقت بالثواني من آخر مرة تم فيها الضغط على الزر. إذا كان هذا العدد أكبر من بعض المدة المحددة مسبقًا ، فستعرض الشاشة شاشة الساعة.

تمت كتابة الكود باستخدام الوظائف الأساسية للمبتدئين. لذا فإن الكود سهل الفهم ويمكنك معرفة الطريقة التي يعمل بها من خلال الرجوع إلى الكود.

الخطوة 9: استكشاف الأخطاء وإصلاحها

في بعض الأحيان ، تبدأ الساعة في وقت متأخر قليلاً أو لا تعرض الرسومات بشكل صحيح. اتباع النصائح تساعد في حل الموقف.

  • تأكد من أنك أعطيت SSID وكلمة المرور الصحيحين
  • قم بتغيير خادم NTP (يمكنك العثور على العديد من الخوادم من الإنترنت التي تتعلق بمنطقتك).
  • يغير اتصال الإنترنت (يمكن أيضًا استخدام نقطة اتصال الجوال).

كما يمكنك استكشاف كل شيء وإصلاحه باستخدام جهاز العرض التسلسلي. بالإضافة إلى شاشة OLED ، فإن الشاشة التسلسلية تعرض معلومات الوقت.

الخطوة 10: كود اردوينو

// مكتبات لشاشة OLED

#يشمل

#include #include #define OLED_RESET 4 #include // wifi Library for connect #include "time. #define Buzzer 25 int preTime = 0 ؛ عدد صحيح = 0 ؛ int CurrentTime = 0 ؛ هيكل tm timeinfo ؛ const char * ssid = "SSID الخاص بك" ؛ // تفاصيل wifi const char * password = "YOUR PASSWORD" ؛ int alarmDateTime [5] = {1، 1، 2020، 0، 0}؛ // متغيرات التنبيه int dateIndex = 0 ؛ int timeIndex = 0 ؛ int selectIndex = -1 ؛ bool buzzerOn = 0 ؛ الصحيح [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 يحدد بايت clockCenterY = (display.height () + 16) / 2 ؛ // تفاصيل وجه الساعة التناظرية بايت clockCenterX = (display.height () - 16) / 2 ؛ بايت clockRadius = 23 ؛ bool state = 0؛ // screen on or off boolean Alarm = 0؛ // حالة التنبيه الحالية String alarmState = "التنبيه قيد التشغيل" ؛ // التنبيه قيد التشغيل أو الإيقاف // varibles مخزن بيانات الوقت char dayName [10] ؛ رقم شار اليوم [3] ؛ شهر شار [10] ؛ سنة شار [5] ؛ ساعات شار [3] ؛ محضر دقائق [3] ؛ char monthnumber [3]؛ ثواني شار [3] ؛ // متغيرات الزر bool RightState = 1 ؛ منطقي LeftState = 1 ؛ // متغيرات الجرس قناة int = 0 ؛ تردد دولي = 2000 ؛ كثافة العمليات PWM = 200 ؛ قرار كثافة العمليات = 8 ؛ إعداد باطل () {// تعيين الإدخال والإخراج pinMode (RightButton ، INPUT) ؛ pinMode (LeftButton ، INPUT) ؛ pinMode (GreenLED ، الإخراج) ؛ pinMode (الجرس ، الإخراج) ؛ display.begin (SSD1306_SWITCHCAPVCC ، 0x3C) ؛ // intialize display.display () ؛ تأخير (3000) ؛ display.clearDisplay () ، ledcSetup (0 ، التردد ، الدقة) ؛ // تكوين معلمات pwm ledcAttachPin (الجرس ، 0) ؛ Serial.begin (115200) ؛ // intilize الاتصال التسلسلي // الاتصال بشبكة WiFi Serial.printf ("الاتصال بـ٪ s" ، ssid) ؛ WiFi.begin (SSID ، كلمة المرور) ؛ while (WiFi.status ()! = WL_CONNECTED) {delay (500) ؛ Serial.print (".") ؛ } Serial.println ("CONNECTED") ، // init والحصول على الوقت configTime (gmtOffset_sec، daylightOffset_sec، ntpServer) ؛ احصل على وقت()؛ // قطع اتصال WiFi لأنه لم يعد هناك حاجة إلى WiFi. قطع الاتصال (صحيح) ؛ WiFi.mode (WIFI_OFF) ؛ display.clearDisplay () ، } حلقة باطلة () {getTime ()؛ // الحصول على الوقت الحالي // تخزين الزر الأيمن والأيسر للضغط على الدول RightState = digitalRead (RightButton)؛ LeftState = digitalRead (LeftButton) ، // chaeck يتم الضغط على الأزرار إذا (RightState == 0 || LeftState == 0) {ledcWrite (0، 200)؛ // عند الضغط على الزر يصدر صوت صفير تأخير (100) ؛ إذا (الحالة == 0) {// التغيير إلى حالة إطار شاشة التنبيه = 1 ؛ // تغيير الحالة إلى حالة التنبيه RightState = LeftState = 1 ؛ // نحتاج فقط إلى تغيير sceern} counts = 0 ؛ // إعادة تعيين عداد} إذا (state == 1 && (counts) <5) {// if in the alarm screen and no timeout calculateAlarm ()؛ // احسب قيم الوقت لمعلومات التنبيه showAlarm () ؛ // إظهار القيم} else {// إذا كان في الساعة حالة الشاشة = 0 ؛ display.clearDisplay () ، clockFace () ؛ // وجه الساعة التناظرية printLocalTime () ؛ // وقت الطباعة في وجه الساعة وطباعة التفاصيل الأخرى} onAlarm () ؛ // مقارنة وقت التنبيه بالتوقيت المحلي وتشغيل تأخير التنبيه (100) ؛ // تأخير لـ المنبه قيد التشغيل والإيقاف} void clockFace () {// caalog clock face display.drawCircle (clockCenterX، clockCenterY، clockRadius، WHITE)؛ // طباعة دائرة المراقبة لـ (int digit = 0 ؛ digit = 5) {// فقط لديها 5 إعادة تعيين selctions.so إلى -1 (-1 = يتم تشغيل أو إيقاف تشغيل التنبيه) selectIndex = -1 ؛ } dateAndTimeSelection (selectIndex)؛ // change selction} void dateAndTimeSelection (int index) {if (index == -1) {// alarm on or off if (RightState == 0) {// التبديل بين تشغيل وإيقاف التنبيه إذا (alarmState == "التنبيه قيد التشغيل") {alarmState = "تم إيقاف التنبيه" ؛ } else {alarmState = "التنبيه قيد التشغيل" ؛ }}} else {if (RightState == 0) {// في عناصر أخرى icrement يرتبط التاريخ أو الوقت في مجموعة alarmDateTime [index] = alarmDateTime [index] + 1 ؛ // الفهرس هو التحديد}} int مقارنة [4] = {12 ، 2030 ، 23 ، 59} ؛ // الحدود العليا للتواريخ والسنوات في الشهر [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]) {// reset 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]) ، // إذا كانت القيم تحتوي على رقم واحد ، أضف "0" إليها. إذا (alarmDateTime [0]

موصى به: