สารบัญ:
- เสบียง
- ขั้นตอนที่ 1: เรื่องราว
- ขั้นตอนที่ 2: การตั้งค่าฮาร์ดแวร์
- ขั้นตอนที่ 3: การติดตั้งซอฟต์แวร์
- ขั้นตอนที่ 4: ทฤษฎีและระเบียบวิธี
- ขั้นตอนที่ 5: รับเวลาท้องถิ่น
- ขั้นตอนที่ 6: การตั้งค่านาฬิกาปลุก
- ขั้นตอนที่ 7: การตั้งค่า Buzzer
- ขั้นตอนที่ 8: การตั้งค่าปุ่ม
- ขั้นตอนที่ 9: การแก้ไขปัญหา
- ขั้นตอนที่ 10: รหัส Arduino
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
บทช่วยสอนนี้แสดงวิธีสร้างนาฬิกาปลุกอัจฉริยะโดยใช้จอแสดงผล OLED ในบอร์ด Magicbit dev โดยไม่ต้องใช้โมดูล 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..สำหรับ ares daylightOffset ส่วนใหญ่คือ 3600 คุณสามารถค้นหาได้ในอินเทอร์เน็ต หลังจากที่เราได้เวลาท้องถิ่นปัจจุบัน เราก็ไม่ได้ใช้ WIFI อีกต่อไป เพราะเราคำนวณเวลาท้องถิ่นจากนาฬิกา RC ในตัวใน ESP32 ทำได้โดยใช้ไลบรารี time.h มีตัวอย่างง่ายๆ ใน Arduino (Arduino>Examples> ESP32> Time>simpletime) เพื่อให้คุณได้เรียนรู้วิธีการทำงานต่อไป คุณสามารถใช้ลิงก์เหล่านี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับไคลเอ็นต์ NTP ได้
- https://dronebotworkshop.com/esp32-intro/
- https://lastminuteengineers.com/esp32-ntp-server-d…
หลังจากได้เวลาท้องถิ่นอย่างถูกต้องแล้ว เราก็เปลี่ยนเวลาแสดงข้อความและมุมตามข้อมูลเวลานั้นในทุกวง
ขั้นตอนที่ 6: การตั้งค่านาฬิกาปลุก
เมื่อคลิกปุ่มซ้ายและขวา คุณจะเปลี่ยนการเลือกวันที่และเวลาปลุกได้ ตรวจสอบให้แน่ใจว่าปิดการปลุกเมื่อคุณเปลี่ยนวันที่และเวลาปลุก หลังจากตั้งค่าวันที่และเวลาให้เปิดนาฬิกาปลุก เพราะหากนาฬิกาปลุกเปิดอยู่และเมื่อเวลาปลุกเท่ากับเวลาปัจจุบันของคุณในขณะที่คุณตั้งค่า เสียงเตือนจะดังขึ้น ในลูปหลักจะตรวจสอบเวลาท้องถิ่นปัจจุบันและข้อมูลการเตือนเสมอกัน หากเท่ากัน ออดและไฟ LED สีเขียวในตัวใน Magicbit จะทำงานภายในหนึ่งนาที
ขั้นตอนที่ 7: การตั้งค่า Buzzer
เราใช้พัลส์ PWM เพื่อสร้างเสียงกริ่งโดยใช้ฟังก์ชัน analogCwrite() ในโค้ด เนื่องจากฟังก์ชั่นห้องสมุดทั้งหมดอยู่ใน ESP32 จึงใช้ได้กับ Magicbit คุณสามารถเปลี่ยนเสียงบี๊บของออดจากการเปลี่ยนความถี่และค่า PWM ในโค้ด
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 library สำหรับเชื่อมต่อ #include "time.h"//library for use RC clock //กำหนดชื่อพินอินพุตและเอาต์พุต #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define พรีไทม์ 25 int ของ Buzzer = 0; จำนวน int = 0; int ปัจจุบันเวลา = 0; โครงสร้าง tm timeinfo; const char* ssid = "SSID ของคุณ"; // รายละเอียด wifi const char* รหัสผ่าน = "รหัสผ่านของคุณ"; int alarmDateTime[5] = {1, 1, 2020, 0, 0};//ตัวแปรปลุก int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; บูลออดเปิด = 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";//เซิร์ฟเวอร์ detais ยาว gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display (128, 64);//ขนาด OLED กำหนด byte clockCenterY = (display.height() + 16) / 2;// รายละเอียดหน้าปัดนาฬิกาแบบแอนะล็อก byte clockCenterX = (display.height() - 16) / 2; ไบต์ clockRadius = 23; bool state = 0;// เปิดหรือปิดหน้าจอบูลีน Alarm = 0;// สถานะปัจจุบันของสัญญาณเตือน String alarmState = "Alarm ON";// เปิดหรือปิดการปลุก // ตัวแปรเวลาจัดเก็บข้อมูล ถ่าน dayName[10]; เลขวันถ่าน[3]; ถ่านเดือน[10]; ถ่านปี[5]; ชั่วโมงถ่าน[3]; นาทีถ่าน[3]; ถ่านเดือน[3]; ถ่านวินาที[3]; //ปุ่มตัวแปรบูล RightState = 1; บูล LeftState = 1; //ตัวแปรออดช่อง int = 0; int ความถี่ = 2000; int PWM = 200; ความละเอียด int = 8; การตั้งค่าเป็นโมฆะ () {// ตั้งค่าอินพุตและเอาต์พุต pinMode (RightButton, INPUT); pinMode (ปุ่มซ้าย, อินพุต); โหมดพิน (ไฟ LED สีเขียว, เอาต์พุต); pinMode (ออด, เอาต์พุต); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // เปิดใช้งาน display.display(); ล่าช้า (3000); display.clearDisplay(); ledcSetup(0, ความถี่, ความละเอียด); // กำหนดค่าพารามิเตอร์ pwm ledcAttachPin (Buzzer, 0); Serial.begin(115200);//intilize การสื่อสารแบบอนุกรม //เชื่อมต่อกับ WiFi Serial.printf("กำลังเชื่อมต่อกับ %s ", ssid); WiFi.begin(ssid, รหัสผ่าน); ในขณะที่ (WiFi.status () != WL_CONNECTED) { ล่าช้า (500); Serial.print("."); } Serial.println(" เชื่อมต่อแล้ว"); // เริ่มต้นและรับเวลา configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); getTime(); // ยกเลิกการเชื่อมต่อ WiFi เนื่องจากไม่จำเป็นต้องใช้ WiFi.disconnect (จริง); WiFi.mode (WIFI_OFF); display.clearDisplay(); } วงเป็นโมฆะ () { getTime ();// รับเวลาปัจจุบัน // เก็บสถานะปุ่มกดขวาและซ้าย RightState = digitalRead (RightButton); LeftState = digitalRead (ปุ่มซ้าย); // เช็คปุ่มจะถูกกดถ้า (RightState == 0 || LeftState == 0) { ledcWrite(0, 200);//เมื่อกดปุ่มออดจะส่งเสียงบี๊บล่าช้า (100); if (state == 0) {// เปลี่ยนเป็นสถานะเฟรมของหน้าจอเตือน = 1;// เปลี่ยนสถานะเป็นสถานะการเตือน RightState = LeftState = 1; // เราต้องการเพียงการเปลี่ยนแปลง } นับ = 0; // รีเซ็ตตัวนับ } ถ้า (state == 1 && (นับ) < 5) {// ถ้าอยู่ในหน้าจอนาฬิกาปลุกและไม่มีการหมดเวลา calcAlarm();// คำนวณค่าเวลาของข้อมูลการเตือน showAlarm();// แสดงค่า } อื่น {// ถ้าอยู่ในนาฬิกา สถานะหน้าจอ = 0; display.clearDisplay(); clockFace();//หน้าปัดนาฬิกาแบบแอนะล็อก printLocalTime();//พิมพ์เวลาในหน้าปัดนาฬิกาและพิมพ์รายละเอียดอื่นๆ } onAlarm();// เปรียบเทียบเวลาปลุกกับเวลาท้องถิ่นและเปิดการหน่วงเวลาปลุก (100); // หน่วงเวลาสำหรับ เปิดและปิดนาฬิกาปลุก } void clockFace() { //caalog clock face display.drawCircle(clockCenterX, clockCenterY, clockRadius, WHITE);// พิมพ์วงกลมนาฬิกาสำหรับ (int หลัก = 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 == "Alarm ON") { alarmState = "Alarm OFF"; } อื่น ๆ { alarmState = "Alarm ON"; } } } else { if (RightState == 0) { // ในตัวเลือกอื่นจะเพิ่มวันที่หรือเวลาที่เกี่ยวข้องในอาร์เรย์ alarmDateTime[index] = alarmDateTime[index] + 1; //index คือการเลือก } } int เปรียบเทียบ[4] = {12, 2030, 23, 59}; //ขีดจำกัดบนของวันที่และปี int comparisonmonth[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; } } โมฆะ showAlarm () {// พิมพ์รายละเอียดการเตือน String alarmDateTime0 = String (alarmDateTime[0]); //แปลง stings เพื่อแสดง String alarmDateTime1 = String (alarmDateTime[1]); สตริง alarmDateTime2 = สตริง (alarmDateTime[2]); สตริง alarmDateTime3 = สตริง (alarmDateTime[3]); สตริง alarmDateTime4 = สตริง (alarmDateTime[4]); //ถ้าค่ามี 1 หลัก ให้เพิ่ม "0" ลงไป ถ้า (alarmDateTime[0]