Múi giờ MicroPython

Phần đồng hồ web tương tự như dự án trước của tôi Đồng hồ web Very Simple MicroPython ESP8266/ESP-12. Sự khác biệt chính là nó truy vấn thời gian thông qua NTP [Giao thức thời gian mạng] thay vì sử dụng API của bên thứ ba

ntptime là một thư viện tích hợp sẵn của MicroPython, có thể dễ dàng sử dụng để cập nhật thời gian hệ thống [giờ địa phương] của các bo mạch ESP8266/ESP32 bằng cách gọi đơn giản ntptime. cài đặt thời gian[]. [Xin lưu ý rằng các truy vấn NTP của bạn có thể không phải lúc nào cũng thành công tùy thuộc vào chất lượng kết nối WiFi của bạn. ]

Thời gian bạn nhận được từ NTP là UTC+0; . Ví dụ: đặt timezone_hour = 8 nếu múi giờ của bạn là UTC+8

Dự án này cũng sử dụng máy chủ web không chặn để cung cấp giao diện cài đặt đồng hồ báo thức [nó sẽ không chặn quá trình vòng lặp để chờ kết nối máy khách mới, do đó thời gian của đồng hồ vẫn có thể được hiển thị bình thường]. Và tôi đã viết một đoạn mã có thể phân tích bất kỳ số lượng tham số nào theo bất kỳ tên nào thành một danh sách para_array từ URL. Điều này có thể hữu ích cho những người muốn xây dựng các dự án tương tự

mẫu đầu ra REPL

Connecting to WiFi...
Connected.
Web server is now online on xxx, IP: 192.168.100.155
NTP server query successful.
System time updated: [2019, 12, 4, 7, 56, 25, 2, 338]
New client connected, IP: ['192.168.100.164', 54551]
Alarm has been set to 7:30
Alarm enabled
Sending web page...
Client connection ended.

Bộ rung Piezo hoạt động đóng vai trò là báo thức và có thể sử dụng công tắc nghiêng [tôi đã sử dụng SW-520D] để tắt báo thức bằng cách lắc nó. một 0. Màn hình OLED 96" hiển thị thời gian đồng hồ và thời gian báo thức, trạng thái báo thức ["o" được bật và "x" không] cũng như IP máy chủ [trên mạng WiFI cục bộ của bạn]

Đồng hồ thời gian thực [RTC] là đồng hồ máy tính để giữ thời gian và là một trong những tính năng vi điều khiển phổ biến hơn. Bộ vi điều khiển không có RTC tích hợp yêu cầu chip RTC bên ngoài để giữ thời gian. Thông thường, các bộ vi điều khiển từ phân khúc trung cấp đến cao cấp đều có RTC tích hợp vì tính năng giữ thời gian là cần thiết cho một số ứng dụng nhúng.  

RTC đếm giây, phút, giờ, ngày, tháng và năm. Chúng cũng có thể được sử dụng cho ngày hiện tại và để đo khoảng thời gian.  

Mô-đun máy của MicroPython cung cấp một lớp RTC để định cấu hình và sử dụng cổng được hỗ trợ RTC tích hợp. MicroPython cũng cung cấp một mô-đun “ntptime” đồng bộ hóa thời gian với sự trợ giúp của nguồn đồng hồ hoặc máy chủ.  

Trong bài viết này, chúng ta sẽ khám phá mô-đun RTC của MicroPython và tìm hiểu cách đặt và lấy thời gian trong ESP8266 và ESP32.   

Mô-đun máy
MicroPython bao gồm một số mô-đun dành riêng cho phần cứng. Mô-đun máy là mô-đun quan trọng nhất vì nó quản lý các chức năng phần cứng cơ bản và thiết bị ngoại vi phần cứng tích hợp của các cổng được hỗ trợ.

Mô-đun này có một số lớp để điều khiển đầu vào/đầu ra kỹ thuật số, tín hiệu đầu ra từ các thiết bị bên ngoài, điều chế độ rộng xung, chuyển đổi tương tự sang kỹ thuật số, thiết bị ngoại vi ADC, UART, SPI, I2C, I2S, Bộ hẹn giờ, RTC, bộ đếm thời gian giám sát và thẻ SD

Lớp RTC
Mô-đun máy của MicroPython dành cho lớp RTC được sử dụng để định cấu hình và quản lý đồng hồ thời gian thực của các cổng được hỗ trợ. Nó được nhập trong tập lệnh MicroPython bằng cách sử dụng câu lệnh này.

từ máy nhập khẩu rtc

Ngoài ra, lớp RTC được nhập tự động khi mô-đun máy được nhập như sau

máy nhập khẩu

Sau khi mô-đun được nhập, bạn phải khởi tạo một đối tượng của lớp RTC với sự trợ giúp của phương thức khởi tạo. Phương thức khởi tạo của lớp RTC có nguyên mẫu này.  

máy lớp. RTC[id=0,…]

Hàm tạo lấy tham số “id”, xác định RTC tích hợp [trong trường hợp có nhiều RTC trong cổng được hỗ trợ]. Nếu chỉ có một, thì không cần thiết phải chuyển id làm đối số. Các tham số khác trong phương thức khởi tạo được sử dụng để đặt thời gian trong RTC là tùy chọn.  

Đây là một ví dụ hợp lệ về việc khởi tạo một đối tượng RTC.  

rtc = máy. RTC[]

Lớp RTC cung cấp các phương thức này để duy trì cài đặt ngày giờ…

RTC. init[datetime]. được sử dụng để khởi tạo đối tượng RTC. Nó lấy ngày giờ hiện tại làm đối số. Thời gian dữ liệu được truyền dưới dạng 8-Tuple với định dạng này. [năm, tháng, ngày[, giờ[, phút[, giây[, micro giây[, tzinfo]]]]]]. Bộ dữ liệu phải có các yếu tố năm, tháng và ngày. Những cái khác là tùy chọn và có thể được thông qua hoặc không tùy thuộc vào ứng dụng.

RTC. ngày giờ[[datetimetuple]]. được sử dụng để nhận hoặc đặt ngày và giờ của RTC.

  • Nếu được gọi mà không có đối số, phương thức này trả về thời gian ngày hiện tại được duy trì bởi RTC ở dạng 8-tuple.  
  • Nếu được sử dụng để đặt ngày giờ, phương thức này sẽ lấy 8-tuple làm đối số.  

Bộ dữ liệu phải tuân theo định dạng này. [năm, tháng, ngày, thứ trong tuần, giờ, phút, giây, giây phụ]. Tùy thuộc vào cổng, giây phụ trong bộ dữ liệu có thể là mili giây hoặc micro giây.  

RTC. deinit[]. đặt lại thời gian RTC thành ngày 1 tháng 1 năm 2015 và khởi động lại RTC.

RTC. bây giờ[]. lấy ngày giờ hiện tại từ RTC, được trả về dưới dạng 8-tuple.

Lớp RTC cung cấp các phương thức này để định cấu hình cài đặt báo thức…

RTC. báo thức[id, thời gian, *, lặp lại=Sai]. được sử dụng để đặt báo thức trong RTC. Id phải được chuyển làm đối số nếu có nhiều RTC tích hợp trong một cổng; . Thời gian có thể được chuyển dưới dạng giá trị mili giây hoặc dưới dạng bộ dữ liệu thời gian. Nếu thời gian trôi qua tính bằng mili giây, báo thức có thể được lặp lại bằng cách đặt đối số từ khóa lặp lại thành True. Phần nghìn giây được tính từ ngày giờ hiện tại của RTC.

RTC. alarm_left[alarm_id=0]. trả về số mili giây cho cảnh báo.

RTC. hủy [alarm_id=0]. được sử dụng để hủy báo thức đang chạy.

Lớp RTC cung cấp các phương thức này để cấu hình ngắt…

RTC. irq[*, trigger, handler=None, Wake=machine. nhàn rỗi]. tạo một đối tượng ngắt được kích hoạt bởi cảnh báo RTC. Phải mất ba tham số. kích hoạt, xử lý và đánh thức. Trình kích hoạt luôn được đặt thành RTC. BÁO ĐỘNG0. Trình xử lý là một chức năng gọi lại chạy như một thói quen dịch vụ ngắt. Đánh thức chỉ định chế độ ngủ mà từ đó ngắt RTC có thể đánh thức cổng.

Đồng bộ hóa thời gian bằng ntptime
Không phải lúc nào cũng phải đặt thời gian trong RTC theo cách thủ công. MicroPython cung cấp mô-đun ntptime, hữu ích cho việc đồng bộ hóa thời gian, duy trì tiêu chuẩn UTC và cung cấp thời gian chính xác. Mô-đun này dựa trên Giao thức thời gian mạng [NTP].

Giao thức NTP đồng bộ hóa thời gian RTC của máy tính/bộ điều khiển với máy chủ hoặc nguồn đồng hồ từ xa. Mô-đun tạo điều kiện hiệu chỉnh chính xác thời gian RTC. Tuy nhiên, bảng phải được kết nối với internet qua Ethernet hoặc WiFi để kết nối với máy chủ NTP.  

Mô-đun được nhập trong tập lệnh MicroPython bằng cách sử dụng câu lệnh này.  

nhập ntptime

Mô-đun cung cấp các phương thức này…

ntptime. thời gian định sẵn[]. được sử dụng để đồng bộ hóa thời gian cục bộ được duy trì bởi RTC hoặc nguồn đồng hồ bên trong với thời gian chuẩn UTC. Một số mô-đun ntptime của MicroPython dành riêng cho cổng cho phép phương thức settime[] nhận hai đối số, múi giờ và máy chủ. Mô-đun ntptime của phần sụn MicroPython chính thức không chấp nhận bất kỳ đối số nào. Thời gian kỷ nguyên cho tiêu chuẩn UTC là ngày 1 tháng 1 năm 1970 00. 00. 00. Máy chủ lưu trữ được mô-đun ntptime của MicroPython sử dụng là “pool. ntp. tổ chức”

ntptime. thời gian[]. trả về số giây đã trôi qua kể từ kỷ nguyên UTC. Giá trị trả về là một số nguyên.

Một lần nữa, hãy chắc chắn rằng bo mạch được kết nối với internet qua Ethernet hoặc WiFi để truy cập máy chủ NTP.  

RTC trong ESP8266 và ESP32
ESP8266 và ESP32 có một RTC tích hợp sẵn. Dưới đây là một ví dụ hợp lệ về việc khởi tạo một đối tượng RTC, đặt thời gian và truy xuất thời gian ngày hiện tại trong ESP8266 và ESP32.

RTC trong ESP8266 và ESP32
Cả ESP8266 và ESP32 đều có RTC tích hợp sẵn. Dưới đây là một ví dụ hợp lệ về việc khởi tạo một đối tượng RTC, đặt thời gian và truy xuất thời gian ngày hiện tại trong ESP8266 và ESP32

từ máy nhập khẩu RTC
rtc = RTC[]
rtc. datetime[[2022, 7, 25, 1, 1, 30, 42, 0]] # đặt ngày giờ
in [rtc. datetime[]] # lấy ngày giờ

Đây là một ví dụ hợp lệ về cài đặt thời gian RTC bằng máy chủ NTP trong ESP8266 và ESP32

từ máy nhập khẩu RTC
mạng nhập khẩu
nhập ntptime
trạm = mạng. WLAN [mạng. STA_IF]
ga tàu. đang hoạt động [Đúng]
ga tàu. connect[ssid, password] #replace bằng ssid WiFi và mật khẩu của bạn
rtc = RTC[]
ntptime. cài đặt thời gian[]
in [rtc. ngày giờ[]]

Hiển thị giờ địa phương bằng mô-đun ESP8266
Thời gian do máy chủ NTP trả về là giờ UTC. Để thay đổi thời gian, hãy chuyển đổi dấu thời gian UTC thành dấu thời gian địa phương. Vì MicroPython là một tập hợp con của Python nên nó không có chức năng hoặc phương thức trực tiếp để chuyển đổi thời gian UTC sang múi giờ khác. Vì vậy, cần phải sử dụng mô-đun thời gian của phần sụn MicroPython.

Đối với dự án này, chúng tôi sẽ hiển thị UTC và giờ địa phương với sự trợ giúp của MicroPython và ESP8266.  

Các thành phần cần thiết

1.  ESP8266/ESP32 x1
2.  Máy tính/máy tính xách tay x1
3.  Cáp USB [để kết nối bảng ESP với máy tính] x1

Kết nối mạch
Không có kết nối mạch nào cho dự án này. Chỉ cần kết nối ESP8266/ESP32 với máy tính của bạn bằng cáp USB. Ngoài ra, hãy đảm bảo rằng uPyCraft IDE hoặc Thonny IDE đã được cài đặt trên máy tính của bạn và tải chương trình cơ sở MicroPython lên ESP8266/ESP32 [tìm hiểu cách thực hiện tại đây].

Tiếp theo, khởi chạy uPyCraft IDE. Chọn cổng giao tiếp nối tiếp bằng cách điều hướng Tools->Serial và chọn bo mạch bằng cách điều hướng Tools->board. Sau khi tải lên chương trình cơ sở MicroPython, bạn nên khởi động. py dưới tab thiết bị.  

Tạo một tệp mới bằng cách điều hướng Tệp-> Mới và lưu tệp dưới dạng chính. py. Sao chép tập lệnh dưới đây vào chính. py. Nhấp vào nút 'Tải xuống và chạy' để thực thi tập lệnh.  

Tập lệnh MicroPython

Cách thức hoạt động của dự án
ESP8266 kết nối với máy chủ NTP và nhận thời gian UTC, được sử dụng để đặt ngày giờ RTC. Giờ UTC sau đó được chuyển đổi thành giờ địa phương [IST trong trường hợp này] bằng cách sử dụng các hàm từ mô-đun thời gian. Giờ địa phương được in bởi bảng điều khiển. Cuối cùng, RTC được cập nhật với giờ địa phương.


Tập lệnh MicroPython nhập lớp RTC từ các mô-đun máy, mạng, ntptime và thời gian. Tiếp theo, một đối tượng thuộc lớp WLAN của mô-đun mạng được khởi tạo.

Hàm do người dùng định nghĩa, connect[], được xác định để kết nối với WiFi. Hàm ngắt kết nối [] được xác định để ngắt kết nối ESP8266/ESP32 với WiFi. Để hiểu các chức năng này, hãy xem Cách kết nối ESP8266 và ESP32 với WiFi .

ESP8266/ESP32 kết nối với WiFi bằng cách gọi hàm connect[]. Bạn phải chuyển SSID và khóa/mật khẩu mạng của WiFi cá nhân của mình làm đối số.  

Một đối tượng của lớp RTC được khởi tạo bằng máy. phương thức RTC[]. Thời gian UTC hiện tại được đặt thành ESP8266/ESP32 RTC bằng cách gọi ntptime. cài đặt thời gian[]. Thời gian UTC được đặt trong ESP8266/ESP32 RTC được truy xuất trong một bộ và hiển thị trên bảng điều khiển.  

Để chuyển đổi UTC sang giờ địa phương, hãy sử dụng mô-đun thời gian của MicroPython [tìm hiểu thêm tại đây]. MicroPython là một tập hợp con của mô-đun thời gian tiêu chuẩn của Python và chứa một vài chức năng áp dụng cho các ứng dụng nhúng.

Thời gian UTC được tính bằng giây từ kỷ nguyên UTC bằng cách gọi ntptime. phương thức thời gian []. Thời gian UTC hiện tại được lưu trữ trong biến sec. Chênh lệch múi giờ được lưu trữ trong biến timezone_hour. Bạn có thể thay đổi giá trị chênh lệch múi giờ theo giờ, theo quốc gia hoặc múi giờ của riêng bạn.  

Đây là cách

  • Chênh lệch múi giờ được chuyển đổi thành giá trị tính bằng giây và được lưu trữ trong biến timezone_sec.  
  • Giờ địa phương tính bằng giây có được bằng cách thêm chênh lệch múi giờ tính bằng giây vào thời gian UTC thu được từ RTC.  
  • Sau đó, thời gian ngày địa phương có được bằng cách chuyển số giây được cập nhật làm đối số cho thời gian. phương thức giờ địa phương[].  
  • Thời gian trở về với thời gian. localtime[] được lưu trữ trong một tuple.  
  • Tuple được sử dụng để hiển thị giờ địa phương trên bàn điều khiển. Bộ dữ liệu sau đó được định dạng lại và được sử dụng để cập nhật thời gian ngày RTC thành giờ địa phương.  

Chủ Đề