Đồng bộ hóa thời gian mạng dựa trên vị trí sử dụng ESP32
Khi xây dựng một dự án IoT phụ thuộc vào thời gian trong ngày, bạn muốn nó hiển thị thời gian chính xác mà không cần điều chỉnh thủ công. Có vẻ như điều này sẽ dễ dàng thực hiện với ESP32 vì nó được tích hợp không dây và có thể kết nối với Internet.
Tuy nhiên, trong khi có rất nhiều ví dụ trực tuyến cho thấy cách định cấu hình ESP32 để kết nối Internet và đồng bộ hóa thời gian với máy chủ thời gian, hầu hết chúng đều yêu cầu bạn điều chỉnh thời gian tiết kiệm ánh sáng ban ngày theo cách thủ công hai lần một năm, điều này có vẻ khá nực cười cho bất kỳ thiết bị điện tử thế kỷ 21 nào.
Sau đây, chúng tôi sẽ giới thiệu cho bạn một giải pháp cho phép ESP32 hiển thị thời gian chính xác, ở bất kỳ nơi nào trên thế giới, quanh năm. Nhưng trước tiên, hãy xem ví dụ SimpleTime trong Arduino IDE và xem nó hoạt động gì và chúng ta có thể cải thiện nó như thế nào.
Mục Lục
Ví dụ về SimpleTime
Nếu bạn sử dụng Arduino IDE với ESP32, bạn sẽ thấy rằng nó có một ví dụ được gọi là SimpleTime trông như thế này:
Bạn có thể truy cập ví dụ này bằng cách định cấu hình Arduino IDE để sử dụng bảng ESP32, từ Công cụ trình đơn, chẳng hạn như bằng cách chọn Mô-đun nhà phát triển ESP32. Khi bạn đã làm như vậy, bạn có thể truy cập vào ví dụ SimpleTime từ Công cụ menu dưới Ví dụ, ESP32, Thời gian, và Giờ đơn giản.
Người ta có thể mong đợi ví dụ chính thức này để chứng minh cách làm tốt nhất, nhưng có một vấn đề rất lớn trong ví dụ này. Để định cấu hình múi giờ và giờ tiết kiệm ánh sáng ban ngày, bạn phải thay đổi hai dòng sau:
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
Đặt múi giờ bằng cách sử dụng gmtOffset_sec là bất tiện vì bạn phải tìm bù giờ GMT cho vị trí cụ thể của mình. Bạn có thể làm điều này bằng cách tham khảo trang web Greenwich Mean Time. May mắn thay, bạn chỉ cần làm điều này một lần. Các daylightOffset_sec Tuy nhiên, đưa ra một vấn đề lớn hơn vì bạn cần phải điều chỉnh nó hai lần một năm. Điều này có thể yêu cầu bạn gỡ bỏ dự án của mình và kết nối nó với Arduino IDE hai lần một năm, khiến nó hoàn toàn không phù hợp với một dự án IoT mà bạn muốn thiết lập và bỏ quên.
Tìm kiếm một cách tiếp cận tốt hơn
Vậy đâu sẽ là cách tốt hơn để định cấu hình múi giờ và thời gian tiết kiệm ánh sáng ban ngày? Để trả lời câu hỏi này, không cần tìm đâu xa hơn cách PC Windows của bạn xử lý tình huống:
Lưu ý rằng thay vì phải đặt lệch thời gian so với GMT, chúng tôi cho Windows biết múi giờ và vị trí của chúng tôi như thế nào — trong trường hợp của chúng tôi Giờ miền núi (Hoa Kỳ & Canada)—Và sau đó chọn hộp kiểm Tự động điều chỉnh đồng hồ cho Giờ tiết kiệm ánh sáng ban ngày. Kể từ thời điểm đó, Windows sẽ tự động xử lý nó quanh năm. Đây là kiểu tiện lợi mà chúng tôi muốn có từ ESP32 của mình.
Tạo Cơ sở dữ liệu Vị trí cho ESP32
Làm điều tương tự trên ESP32 đòi hỏi một số công việc chân chính. chúng tôi đã bắt đầu với một bài đăng trên blog mô tả cách thiết lập múi giờ bằng cách sử dụng biến môi trường TZ. Đối với vị trí của chúng tôi, nó đã xảy ra MST7MDT, M3.2.0, M11.1.0, theo bảng múi giờ này. Mặc dù điều này đã giải quyết được vấn đề phải điều chỉnh thủ công cho thời gian tiết kiệm ánh sáng ban ngày, chúng tôi muốn quy trình đơn giản hơn mà không cần phải tra cứu chuỗi số và chữ cái cho mỗi vị trí.
Chúng tôi đã chuyển đổi dữ liệu từ trang web thành cơ sở dữ liệu mà bạn có thể sử dụng trực tiếp từ bên trong các bản phác thảo Arduino của mình. Nhấp vào liên kết này để tải xuống trực tiếp tệp zip với bản phác thảo Arduino.
Bản thân cơ sở dữ liệu được lưu trữ trong tệp time_zone.h. Sử dụng cơ sở dữ liệu, mã cho SimpleTime trông giống như sau:
Chúng tôi đã đánh dấu các sửa đổi đối với ví dụ SimpleTime bằng màu vàng. Dòng này sẽ cho phép bản phác thảo sử dụng cơ sở dữ liệu:
#include "time_zones.h"
Dòng này định cấu hình vị trí của bạn:
const char* location = "America/Denver";
Có 461 địa điểm khả thi. Bạn có thể tìm thấy các vị trí có sẵn bằng cách xem tệp time_zone.h hoặc bằng cách xem danh sách múi giờ trên trang web này.
Cuối cùng, dòng sau yêu cầu ESP32 đồng bộ hóa thời gian với máy chủ Internet bằng Giao thức thời gian mạng (NTP):
configTimeWithTz(getTzByLocation(location), ntpServer);
Máy chủ thời gian Internet cụ thể có thể được cấu hình bằng cách sử dụng dòng sau, mặc dù mặc định mặc định sẽ hoạt động tốt cho bạn:
const char* ntpServer = "pool.ntp.org";
Bạn cũng muốn đảm bảo thêm thông tin cho điểm truy cập không dây của mình trên hai dòng sau:
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
Thay thế YOUR_SSID với tên mạng không dây của bạn và MẬT KHẨU CỦA BẠN với mật khẩu được sử dụng để kết nối với nó.
Kết thúc
Khi bạn đã hoàn thành các bước cấu hình, hãy tải bản phác thảo lên ESP32 và nó sẽ sử dụng thời gian chính xác quanh năm mà không cần bất kỳ sự can thiệp nào!
Mặc dù mã này cung cấp cho bạn một điểm khởi đầu tốt, nhưng có nhiều cách thân thiện với người dùng hơn để hoàn thành điều tương tự. Ví dụ: bạn có thể muốn cho phép người dùng định cấu hình mọi thứ từ một trang web hơn là thực hiện nó tại thời điểm biên dịch. Làm như vậy khá nhiều công việc hơn, vì bạn sẽ cần thực hiện những điều sau trong bản phác thảo Arduino của mình:
-
Định cấu hình ESP32 làm điểm truy cập không dây cho cấu hình ban đầu
-
Khởi chạy máy chủ web để hiển thị cho người dùng một trang cấu hình
-
Tạo một biểu mẫu HTML để cho phép người dùng nhập thông tin mạng không dây và chọn vị trí của họ
-
Tạo mã để xử lý các lựa chọn của người dùng và lưu trữ nó trong bộ nhớ không bay hơi
-
Khi bật nguồn trên bo mạch:
-
Đọc cấu hình từ bộ nhớ không bay hơi
-
Kết nối với mạng không dây và đồng bộ hóa thời gian
-
Một dự án thể hiện các bước này là Đồng hồ Dali ESP32. Chính dự án này đã khiến chúng tôi tìm ra cách tốt hơn để thực hiện đồng bộ hóa thời gian trên ESP32.
Kiểm tra mã nguồn của Đồng hồ Dali ESP32 để xem cách hiển thị trang cấu hình web đầy đủ tính năng. Trang cấu hình hiển thị menu kéo xuống để cho phép người dùng chọn vị trí và múi giờ của họ, đồng thời cũng cho phép người dùng đặt thời gian theo cách thủ công bằng tiện ích lịch và thời gian, để thay thế không kết nối!
Đồng bộ hóa thời gian mạng dựa trên vị trí trên ESP32
Giờ đây, bạn đã có tất cả thông tin cần thiết để có thể tự động đặt đồng hồ ESP32 của mình thành thời gian chính xác và cũng có thể điều chỉnh nó cho thời gian tiết kiệm ánh sáng ban ngày. Điều này là hoàn hảo cho các dự án IoT mà bạn không muốn phải điều chỉnh thủ công.
Đọc tiếp
Giới thiệu về tác giả