Bỏ qua tới nội dung
LSLab

Đồng bộ giờ và thời tiết theo vị trí cho đồng hồ

  • Trung cấp
  • Bài viết
  • Từ 16 tuổi
  • 7 phút đọc
Đồng hồ LCD hiện biểu tượng thời tiết cạnh điện thoại có ghim vị trí trên bản đồ.

Đồng hồ lấy giờ Internet bằng SNTP, rồi dùng tọa độ đã lưu để hỏi dịch vụ thời tiết. Thiết kế nên quản lý giờ, múi giờ, vị trí và độ mới dữ liệu riêng biệt. Nhờ vậy, mất mạng không làm mặt giờ biến mất và thời tiết cũ có dấu nhận biết.

Mục lục
Tọa độ đã chọn quyết định khu vực được hỏi thời tiết.
  • Vị trí đã xác nhận
  • Dữ liệu thời tiết
  • Đồng hồ

Bạn sẽ học được gì

  • Tách đồng bộ thời gian khỏi cách hiển thị giờ địa phương.
  • Chuyển địa danh thành tọa độ và lưu lựa chọn đã xác nhận.
  • Thiết kế việc tải thời tiết có thời hạn chờ và trạng thái dữ liệu cũ.

Cần biết trước

Nên đọc về kiến trúc đồng hồ và vòng lặp Arduino; cần biết cách đọc dữ liệu JSON.

Giờ Internet khác múi giờ thế nào?

SNTP dùng phản hồi từ máy chủ thời gian để đặt giờ hệ thống; múi giờ quyết định cách biểu diễn giờ tại địa phương. Tài liệu Espressif hướng dẫn cấu hình biến môi trường TZ, gọi tzset() rồi dùng localtime() để lấy giờ địa phương.

Trong thiết kế này, dữ liệu giờ được lưu và trao đổi theo thời gian chuẩn; chỉ đổi sang giờ địa phương khi vẽ. Múi giờ của API thời tiết và cấu hình múi giờ firmware phải cùng chỉ một khu vực. Nếu dịch vụ trả tên múi giờ dạng IANA, hãy chuyển bằng bảng ánh xạ được kiểm tra hoặc chỉ hỗ trợ danh sách khu vực đã cấu hình. Không đưa thẳng tên đó vào hàm đòi chuỗi quy tắc POSIX.

Sau mỗi lần đồng bộ thành công, ghi nhận thời điểm đồng bộ. Mất mạng thì tiếp tục đọc đồng hồ cục bộ. Khi khởi động mà chưa có giờ hợp lệ, hiện dấu chưa đặt giờ và cho phép cài lại; đừng đưa một ngày mặc định lên như thời gian thật. Bộ định thời RTC của chip bị đặt lại khi cấp nguồn lại, nên yêu cầu giữ giờ sau ngắt hết nguồn cần phần cứng dự phòng riêng.

Với báo thức, thiết kế đề xuất lưu giờ hẹn theo giờ địa phương và các ngày lặp, rồi tính lần hẹn kế tiếp từ cấu hình múi giờ hiện tại. Mất mạng khi giờ vẫn hợp lệ thì tiếp tục kiểm lịch. Nếu chưa có giờ hợp lệ sau mất nguồn, hiện “Chờ đặt giờ”; cho nhập ngày, giờ và múi giờ bằng nút rồi mới kích hoạt lịch.

Sau đồng bộ hoặc đổi múi giờ, tính lại lần hẹn nhưng giữ khóa lần đã xử lý. Chính sách bản đầu bỏ qua giờ hẹn bị vượt khi chỉnh tiến; khi chỉnh lùi hoặc giờ địa phương lặp lại, một lần hẹn chỉ được reo một lần. Báo lại dùng bộ đếm thời gian trôi qua riêng, để chỉnh giờ lịch không tự kéo dài khoảng chờ. Bài firmware giải thích cách lưu lịch và các trạng thái chuông.

Đồng bộ và đổi sang giờ địa phương là các bước riêng.
  • Giờ đồng bộ
  • Quy tắc múi giờ
  • Giờ để hiển thị

Định vị khu vực cho đồng hồ bằng cách nào?

Với đồng hồ đặt cố định, bản đầu đề xuất chọn địa danh thay vì tự thêm GPS. API geocoding nhận từ khóa tìm kiếm và trả danh sách địa danh khớp. Kết quả có tên, tọa độ và thông tin múi giờ để ứng dụng lựa chọn.

Quy trình cài đặt đề xuất là nhập tên địa phương, xem các kết quả kèm khu vực hành chính, chọn đúng nơi rồi lưu. Cần có bước xác nhận để tránh chọn nhầm địa danh trùng tên. Lưu tên để hiển thị và tọa độ để gọi thời tiết; nếu tìm không thấy, cho sửa từ khóa hoặc nhập tọa độ trong trang cài đặt nâng cao.

Preferences của Arduino-ESP32 dùng bộ nhớ không mất dữ liệu khi khởi động lại hoặc mất nguồn. Thiết kế này dùng nó cho địa danh đã xác nhận. Khi đổi vị trí, tăng phiên bản lựa chọn và chỉ nhận kết quả thời tiết gắn với phiên bản hiện tại. Một yêu cầu cũ trả về chậm sẽ không ghi đè thời tiết của nơi mới.

Nếu sau này cần tự định vị, hãy thêm một nguồn tọa độ có sự cho phép của người dùng và vẫn giữ cách nhập tay. Ví dụ nhập địa danh không cần tự xác định vị trí khi di chuyển.

Lưu lựa chọn đã xác nhận thay vì tự lấy kết quả đầu tiên.
  • Các địa danh khớp
  • Người dùng xác nhận
  • Cấu hình được lưu

Tải thời tiết thế nào để giao diện vẫn dùng được?

Chỉ yêu cầu dữ liệu sẽ hiển thị và chỉ thay bản dữ liệu đang dùng sau khi phản hồi được kiểm tra. Open-Meteo nhận tọa độ và các biến thời tiết, trả JSON. Điều kiện hiện tại của dịch vụ dựa trên dữ liệu mô hình; nó không phải cảm biến đo ngay trong phòng đặt đồng hồ.

Luồng minh họa gồm tạo yêu cầu HTTPS, đặt thời hạn chờ, kiểm tra phản hồi, đọc trường cần thiết và xác nhận đủ dữ liệu. Cần kiểm loại dữ liệu, đơn vị và giá trị thiếu. Nếu nhiệt độ không có, dùng dấu chưa có số liệu; giá trị không không thay thế dữ liệu thiếu.

Kết quả tảiCách xử lý đề xuất
Dữ liệu hợp lệ cho đúng vị tríThay bản dữ liệu và thời điểm nhận
Mất mạng hoặc hết thời hạn chờGiữ bản cũ, báo tuổi dữ liệu
JSON hỏng hoặc thiếu trườngBỏ phản hồi lỗi, giữ trạng thái cũ
Máy chủ yêu cầu giảm tần suấtGiãn lần thử tiếp theo
Vị trí đã thay đổiBỏ kết quả thuộc lựa chọn trước

Tách thời điểm dữ liệu có giá trị khỏi thời điểm đồng hồ tải về. Thiết kế có thể dùng lần tải thành công để tính độ cũ trong vận hành, nhưng nên giữ cả dấu thời gian của nguồn. Nếu cần nhiệt độ phòng, đó là một đầu vào cảm biến riêng và phải có nhãn khác.

Khi thử nghiệm, kiểm điều khoản của dịch vụ. Open-Meteo giới hạn API miễn phí cho mục đích phi thương mại; bản thương mại cần phương án phù hợp điều khoản. Thêm ghi nguồn theo yêu cầu dịch vụ ở phần hiển thị hoặc trang thông tin phù hợp trước khi phát hành.

Chỉ dữ liệu hợp lệ cho đúng vị trí mới thay bản đang hiển thị.
  • Phản hồi mạng
  • Kiểm dữ liệu và vị trí
  • Cập nhật bản mới
  • Giữ bản cũ có dấu tuổi

Ví dụ trong đời sống

Người dùng chuyển đồng hồ sang nhà khác và đổi địa danh trong cài đặt. Một yêu cầu thời tiết của nơi cũ vẫn đang chạy. Firmware lưu lựa chọn mới, bỏ phản hồi cũ khi nó về, rồi nhận bản mới gắn với tọa độ đã xác nhận.

Nếu lần tải mới thất bại, mặt đồng hồ báo chưa có thời tiết cho nơi mới. Không giữ nhiệt độ của nơi cũ dưới tên địa danh mới. Giờ vẫn hiển thị theo cấu hình thời gian hiện tại.

Hiểu lầm thường gặp

Đã có giờ mạng là luôn đúng giờ địa phương. Cần cấu hình múi giờ đúng bên cạnh việc đồng bộ.

Nhiệt độ thời tiết là nhiệt độ phòng. Dữ liệu mô hình thời tiết và số đo cảm biến đặt trong phòng là các nguồn khác nhau.

Câu hỏi thường gặp

Có nên tìm địa danh ở mỗi lần lấy thời tiết không?

Thiết kế này chỉ tìm lại khi người dùng đổi vị trí. Những lần tải tiếp theo dùng tọa độ đã lưu.

Mất Internet có cần xóa dự báo không?

Có thể giữ dữ liệu của đúng vị trí và đánh dấu cũ. Dữ liệu của vị trí trước phải được tách khỏi nơi mới.

Có thể dùng miễn phí khi bán đồng hồ không?

Cần kiểm điều khoản và chọn gói phù hợp. Quyền dùng miễn phí phi thương mại không tự áp dụng cho sản phẩm bán ra.

Thuật ngữ trong bài

Tên tiếng Việt, tên tiếng Anh và nghĩa dùng trong bài. Di chuột, chạm hoặc dùng phím Tab tới từ có gạch chân chấm để xem giải thích ngay khi đọc.

SNTPSimple Network Time Protocol
Giao thức đồng bộ giờ với máy chủ thời gian.
geocoding
Tìm thông tin địa điểm và tọa độ từ từ khóa địa danh.
Preferences
Thư viện lưu dữ liệu nhỏ trong bộ nhớ không mất khi ngắt nguồn.

Bài này chưa được đánh dấu là đã xem

Thấy nội dung sai hoặc chưa an toàn?

Báo cho quản trị viên qua email. Thư có sẵn tên bài và đường dẫn.

Báo lỗi bài này
Xem tất cả bài của chủ đề

Nguồn

Các nguồn này viết cho người đọc lớn hơn. Nếu thấy khó, hãy đọc cùng người lớn.