Đồng hồ báo thức thông minh sử dụng Magicbit (Arduino): 10 bước
Đồng hồ báo thức thông minh sử dụng Magicbit (Arduino): 10 bước
Anonim
Image
Image

Hướng dẫn này chỉ ra cách tạo đồng hồ báo thức thông minh bằng màn hình OLED trong bảng nhà phát triển Magicbit mà không cần sử dụng bất kỳ mô-đun RTC nào.

Quân nhu

  • Magicbit
  • Cáp USB-A đến Micro-USB

Bước 1: Câu chuyện

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về cách tạo đồng hồ Báo thức thông minh bằng Magicbit.

Bước 2: CÀI ĐẶT PHẦN CỨNG

Cắm Magicbit của bạn vào máy tính bằng cáp USB.

Bước 3: CÀI ĐẶT PHẦN MỀM

Mở Arduino IDE của bạn và thiết lập bảng với Arduino IDE. Liên kết sau đây đề cập đến cách thực hiện điều đó. Vì vậy, chúng tôi khuyên bạn trước tiên hãy truy cập liên kết và làm quen với Magic bit.

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

Bây giờ chọn đúng loại bảng và cổng. Trong trường hợp này, loại bảng là Magicbit. Các thư viện đã được cài đặt khi có trong các thư viện Magicbit.

Bước 4: Lý thuyết và Phương pháp luận

Nếu bạn nhìn vào video đầu tiên, bạn có thể thấy màn hình hiển thị có 2 màn hình.

  • màn hình đồng hồ hiển thị chi tiết thời gian
  • màn hình báo động hiển thị chi tiết cảnh báo

Để chuyển đổi giữa hai màn hình này, chúng tôi đã sử dụng bất kỳ nút nhấn nào trong số hai màn hình trong Magicbit. Các nút này được kết nối với chân 35 (nút trái) và 34 (nút phải) của ESP32 trong Magicbit. Để hiển thị thời gian và các chi tiết khác, chúng tôi đã sử dụng màn hình OLED tích hợp trong Magicbit.

Hãy nói về cách hoạt động của các màn hình đồ họa này.

Màn hình đồng hồ có các dạng đồng hồ kim, đồng hồ kỹ thuật số, ngày, tháng, năm.

Để tạo đồng hồ tương tự, chúng tôi sử dụng một số hàm đồ họa có sẵn trong thư viện đồ họa có tên Adafriut GFX. Bằng cách sử dụng chức năng vòng tròn và chức năng dòng, chúng tôi tạo ra mặt đồng hồ kim. Các hàm hình học đơn giản được gọi là sin và cos được sử dụng cho vị trí của kim đồng hồ. Vì vậy, chúng tôi chỉ nhập góc tương ứng với thời gian để xoay tay. cho rằng trước tiên chúng ta chuyển đổi thời gian thành góc như sau.

  • góc của kim phút = phút * (360/60)
  • góc kim giờ = giờ * (360/12)

Góc được đo đối với đường giữa tâm của mặt đồng hồ và số 12 trên mặt đồng hồ. Sử dụng hàm sin và cos, chúng ta có thể tính được tọa độ x và y của các đầu của vạch giờ và phút. Hình ảnh dưới đây mô tả cách nó đang hoạt động.

Theo tọa độ, chúng tôi in kim giờ và kim phút bằng các đường vẽ. Ngoài ra còn có chức năng in văn bản trong thư viện Adafruit GFX. Nó giúp in các chi tiết khác (ngày, tháng và thời gian hiển thị bằng chữ số) trên màn hình. Bạn có thể thay đổi vị trí đồng hồ kim và vị trí văn bản bằng cách thay đổi các thông số trong mã.

Giống như màn hình đồng hồ, chúng tôi đã sử dụng chức năng in văn bản trong thư viện Adafruit GFX để in số trên màn hình OLED ở những vị trí thích hợp.

Bước 5: Lấy Giờ địa phương

Phần quan trọng nhất của đồng hồ là cách chúng ta lấy giờ địa phương một cách chính xác. Với mục đích đó, bạn có thể sử dụng mô-đun đồng hồ RTC bên ngoài hoặc đồng hồ RC có sẵn trong ESP32 trong Magicbit. Trong dự án này, chúng tôi sử dụng phương pháp thứ hai. Trong phương pháp này, chúng tôi sử dụng ứng dụng khách NTP (giao thức thời gian mạng) để lấy thời gian cục bộ từ internet. Để truy cập internet, chúng tôi đã sử dụng thiết bị WIFI có sẵn trong ESP32. Ở giai đoạn đầu tiên, chúng tôi sử dụng WIFI để truy cập Internet bằng cách cung cấp SSID và mật khẩu. Sau đó, chúng ta nên cấu hình gmtOffset và daylightOffset trong các biến trong vài giây. Giá trị của các biến này là khác nhau giữa các khu vực trên thế giới. gmtOffset có nghĩa là số giây bạn khác với GMT.. Đối với hầu hết các thời điểm ban ngàyOffset là 3600. Bạn có thể tìm thấy nó trên internet. Sau khi chúng tôi có giờ địa phương hiện tại, chúng tôi không còn sử dụng WIFI nữa. Bởi vì sau đó chúng tôi tính giờ địa phương từ đồng hồ RC có sẵn trong ESP32. Điều này được thực hiện bằng cách sử dụng thư viện time.h. Có một ví dụ đơn giản trong Arduino (Arduino> Examples> ESP32> Time> simpletime) để bạn tìm hiểu thêm về cách hoạt động của điều này. Ngoài ra, bạn có thể sử dụng các liên kết này để có thêm kiến thức về ứng dụng khách NTP.

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

Sau khi nhận được giờ địa phương chính xác, chúng tôi thay đổi thời gian hiển thị văn bản và góc theo thông tin thời gian đó trong mỗi vòng lặp.

Bước 6: Thiết lập báo thức

Bằng cách nhấp vào các nút bên trái và bên phải, bạn có thể thay đổi lựa chọn ngày và giờ báo thức. Đảm bảo tắt báo thức khi bạn thay đổi ngày và giờ báo thức. Sau khi thiết lập ngày và giờ, hãy bật báo thức. Bởi vì nếu báo thức được bật và khi thời gian báo thức bằng với thời gian hiện tại của bạn trong khi bạn thiết lập nó, còi báo thức sẽ đổ chuông. Trong vòng lặp chính luôn luôn kiểm tra giờ địa phương hiện tại và thông tin báo động bằng nhau. Nếu chúng bằng nhau, thì bộ rung và đèn LED xanh tích hợp trong Magicbit sẽ hoạt động trong một phút.

Bước 7: Thiết lập Buzzer

Chúng tôi sử dụng xung PWM để tạo ra âm thanh buzzer bằng cách sử dụng hàm analogCwrite () trong mã. Bởi vì tất cả các chức năng thư viện có trong ESP32 là hợp lệ cho Magicbit. Bạn có thể thay đổi âm thanh bíp của bộ rung từ việc thay đổi tần số và giá trị PWM trong mã.

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

Trang này mô tả về cách bộ rung hoạt động với ESP32.

Bước 8: Thiết lập các nút

Để thay đổi tất cả các trạng thái, chúng tôi đã sử dụng hai nút ấn tích hợp trong Magicbit. Vòng lặp chính luôn kiểm tra trạng thái của hai nút. Bởi vì họ kéo lên bên trong, có trạng thái bình thường là tín hiệu cao. Vì vậy, bạn có thể thấy số đọc của các chân đó là 1. Ở giai đoạn mặc định, màn hình hiển thị giao diện đồng hồ. Tại thời điểm đó, khi một trong hai nút được nhấn, nó sẽ chuyển màn hình sang màn hình báo động. Ngoài ra, chúng tôi đếm thời gian tính bằng giây kể từ lần cuối cùng khi nút được nhấn. Nếu số lượng đó lớn hơn một số thời lượng được xác định trước thì màn hình sẽ hiển thị màn hình đồng hồ.

Mã được viết bằng cách sử dụng các chức năng cơ bản cho người mới bắt đầu. Vì vậy, mã rất đơn giản để hiểu và bạn có thể tìm hiểu phương pháp hoạt động của nó bằng cách tham khảo mã.

Bước 9: Khắc phục sự cố

Một số lần đồng hồ bắt đầu chậm hơn một chút hoặc nó không hiển thị đúng đồ họa. Các mẹo sau đây giúp giải quyết tình huống.

  • Đảm bảo rằng bạn đã cung cấp đúng SSID và mật khẩu
  • Thay đổi máy chủ NTP (bạn có thể tìm thấy nhiều máy chủ từ internet liên quan đến khu vực của bạn).
  • Thay đổi kết nối internet. (Cũng có thể có điểm truy cập di động).

Ngoài ra, bạn có thể khắc phục sự cố mọi thứ bằng cách sử dụng màn hình nối tiếp. Ngoài màn hình OLED nối tiếp màn hình hiển thị thông tin thời gian.

Bước 10: Mã Arduino

// thư viện cho màn hình OLED

#bao gồm

#include #include #define OLED_RESET 4 #include // thư viện wifi để kết nối #include "time.h" // thư viện để sử dụng đồng hồ RC // xác định tên pin đầu vào và đầu ra #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int counts = 0; int currentTime = 0; struct tm timeinfo; const char * ssid = "YOUR SSID"; // chi tiết wifi const char * password = "MẬT KHẨU CỦA BẠN"; int alertDateTime [5] = {1, 1, 2020, 0, 0}; // báo động thay đổi int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; int direct [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}}; // hình chữ nhật lựa chọn const char * ntpServer = "asia.pool.ntp.org"; // server detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display (128, 64); // Kích thước OLED xác định byte clockCenterY = (display.height () + 16) / 2; // chi tiết mặt đồng hồ analog byte clockCenterX = (display.height () - 16) / 2; byte clockRadius = 23; bool state = 0; // bật hoặc tắt màn hình boolean Alarm = 0; // trạng thái hiện tại cảnh báo String alertState = "Alarm ON"; // bật hoặc tắt cảnh báo // thay đổi dữ liệu thời gian được lưu trữ char dayName [10]; char daynumber [3]; char tháng [10]; năm char [5]; giờ char [3]; char phút [3]; char monthnumber [3]; char giây [3]; // các biến nút bool RightState = 1; bool LeftState = 1; // các biến buzzer int channel = 0; int Tần số = 2000; int PWM = 200; int độ phân giải = 8; void setup () {// thiết lập input và ouputs pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display.display (); chậm trễ (3000); display.clearDisplay (); ledcSetup (0, Frequency, Resolution); // cấu hình các tham số pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // kích hoạt giao tiếp nối tiếp // kết nối với WiFi Serial.printf ("Đang kết nối với% s", ssid); WiFi.begin (ssid, mật khẩu); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println ("ĐÃ KẾT NỐI"); // init và lấy thời gian configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); dành thời gian(); // ngắt kết nối WiFi vì nó không còn cần thiết nữa WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // lấy thời gian hiện tại // lưu trữ trạng thái nút bấm bên phải và bên trái RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // nhấn nút bấm các nút nếu (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // khi nhấn nút, bộ rung phát ra tiếng bíp trễ (100); if (state == 0) {// thay đổi thành trạng thái khung màn hình cảnh báo = 1; // thay đổi trạng thái thành trạng thái cảnh báo RightState = LeftState = 1; // chúng ta chỉ cần thay đổi cảnh báo} counts = 0; // đặt lại bộ đếm} nếu (state == 1 && (counts) <5) {// nếu ở màn hình báo thức và không có thời gian chờ thì tínhAlarm (); // tính giá trị thời gian của thông báo báo thức showAlarm (); // hiển thị giá trị} else {// nếu trong đồng hồ trạng thái màn hình = 0; display.clearDisplay (); clockFace (); // mặt đồng hồ tương tự printLocalTime (); // in thời gian trên mặt đồng hồ và in các chi tiết khác} onAlarm (); // so sánh thời gian báo thức với giờ địa phương và bật độ trễ báo thức (100); // delay for bật và tắt báo thức} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // in vòng tròn đồng hồ cho (int digit = 0; digit = 5) {// chỉ có 5 selctions.so đặt lại thành -1 (-1 = được bật hoặc tắt) selectIndex = -1; } dateAndTimeSelection (selectIndex); // thay đổi lựa chọn} void dateAndTimeSelection (int index) {if (index == -1) {// bật hoặc tắt cảnh báo if (RightState == 0) {// phân tích giữa bật và tắt báo thức nếu (alertState == "BẬT báo thức") {alertState = "TẮT báo động"; } else {alertState = "BẬT báo thức"; }}} else {if (RightState == 0) {// trong các lựa chọn khác tạo ngày hoặc giờ liên quan trong mảng alertDateTime [index] = alertDateTime [index] + 1; // chỉ mục là vùng chọn}} int so sánh [4] = {12, 2030, 23, 59}; // giới hạn trên của ngày và năm int Comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // limi trên của tháng int resetValue [4] = {1, 2020, 0, 0}; // các giá trị bắt đầu for (int i = 1; i so sánh [i - 1]) {alertDateTime = resetValue [i - 1]; }} if (alertDateTime [0]> so sánh tháng [alertDateTime [1] - 1]) {// đặt lại vlaues nếu các tháng lớn hơn giới hạn của chúng alertDateTime [0] = 1; }} void showAlarm () {// in chi tiết cảnh báo String alertDateTime0 = String (alertDateTime [0]); // chuyển đổi stings để hiển thị String alertDateTime1 = String (alertDateTime [1]); String alertDateTime2 = String (alertDateTime [2]); String alertDateTime3 = String (alertDateTime [3]); String alertDateTime4 = String (alertDateTime [4]); // nếu các giá trị có một chữ số 1, hãy thêm "0" vào chúng. if (alertDateTime [0]