Mục lục:

NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM: 7 bước
NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM: 7 bước

Video: NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM: 7 bước

Video: NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM: 7 bước
Video: video 2: Hướng dẫn kết nối internet và lấy dữ liệu thời gian thực trên esp8266 nodeMCU 2024, Tháng mười một
Anonim
NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM
NODEMCU Lua ESP8266 Với Đồng hồ Thời gian Thực (RTC) & EEPROM

Nhận được thời gian chính xác là điều cần thiết nếu bạn muốn giữ nhật ký dữ liệu. Có nhiều cách khác nhau để lấy thời gian từ các nguồn trên Internet.

Bạn có thể hỏi tại sao không sử dụng ESP8266 để giữ thời gian cho bạn? Bạn có thể, nó có RTC bên trong (Đồng hồ thời gian thực) riêng, nhưng ESP8266 có 3 tần số xung nhịp hoạt động khác nhau - 52MHz khi khởi động, 80MHz khi hoạt động thường xuyên và 160MHz nếu được tăng cường. Nếu bạn cần giữ thời gian chính xác hơn, đặc biệt là trong thời gian dài hơn, thì RTC bên ngoài có thể cung cấp giải pháp. Các mô-đun này cũng có pin dự phòng trong trường hợp mất điện. RTC không chính xác đến mức kinh khủng vì nó đếm thời gian trôi qua kể từ khi nó được thiết lập và mặc dù nó có thể làm được cho hầu hết các ứng dụng, nhưng nó có thể không đủ tốt để giữ thời gian quan trọng. Có thể lấy thời gian chính xác từ máy chủ thời gian SNTP mà từ đó RTC có thể được cập nhật định kỳ nếu được yêu cầu.

DS1307 Mô-đun RTC I2C tí hon (ở trên) là một ví dụ về những mặt hàng này và có thể được mua trên Ebay và các nhà cung cấp khác với giá dưới £ 2. Ngoài ra còn có những chiếc khác như DS1302 và DS3231 hoạt động theo cách tương tự và có giá từ 99p trở lên.

Mô-đun DS1307 sử dụng giao diện I2C và đối với ESP-01 nên được kết nối như sau:

Vcc - 3.3v, Gnd - Gnd, SDA - D3, SCL - D4

SDA và SCL có thể được kết nối với bất kỳ chân I / O nào trên ESP8266 lớn hơn (thay đổi mã cho phù hợp). Chỉ cần kết nối các chân bên trái trên mô-đun này.

Bước 1: Giờ Google

Giờ Google
Giờ Google

Có rất nhiều ví dụ về việc lấy thời gian từ Google và trông giống như thế này. Khi bạn chạy chương trình GoogleTime.lua, bạn nhận được kết quả như sau:

dofile ("GoogleTime.lua")> Thời gian: Thứ Sáu, ngày 15 tháng 12 năm 2017 11:19:45 GMT

Vấn đề với phương pháp này là bạn lấy thời gian ở định dạng chuỗi và bạn phải chia chuỗi thành các bit riêng lẻ của nó cho giờ, phút, giây, v.v. RTC chấp nhận thời gian ở định dạng đặc biệt, tức là tem thời gian UNIX. Theo thuật ngữ của giáo dân, đây là số giây đã trôi qua kể từ Thứ Năm, ngày 1 tháng 1 năm 1970 cho đến ngày và giờ hiện tại. Kỷ nguyên UNIX (1970/01/01 00:00:00) được hầu hết các hệ điều hành máy tính sử dụng và thời gian trôi qua được lưu trữ dưới dạng số 32 bit có dấu. Điều này có nghĩa là hệ thống này sẽ hoạt động đến ngày 19 tháng 1 năm 2038 khi số lượng sẽ trở nên quá lớn để lưu trữ theo cách này. Một giải pháp là lưu trữ số dưới dạng 64 bit, nhưng hiện tại, phương pháp 32 bit sẽ là đủ.

Để đặt thời gian thành ngày 9 tháng 7 năm 2015, 18:29:49 trên RTC nội bộ, bạn sẽ sử dụng dòng mã này:

rtctime.set (1436430589, 0)

2 thông số là giây và micro giây.

Bạn có thể tìm thêm thông tin bằng cách đọc Tài liệu NodeMCU.

Bước 2: Máy chủ thời gian SNTP

Máy chủ thời gian SNTP
Máy chủ thời gian SNTP

Giao thức thời gian mạng đơn giản (SNTP) được cung cấp từ nhiều nguồn trên Internet và nhiều quốc gia trên thế giới đã có dịch vụ này.

Chương trình, SNTPTime2.lua đặt thời gian trên RTC nội bộ. Bạn cần có các mô-đun rtctime & sntp trong bản dựng của mình khi bạn flash ESP8266 của mình. Chương trình lấy thời gian từ máy chủ tính bằng giây và micro giây và đặt RTC nội bộ bằng rtctime.set (giây, usec).

Sau đó, chương trình sẽ hiển thị ngày và giờ ở các định dạng khác nhau.

Có rất nhiều Máy chủ SNTP trên khắp thế giới và một số như sau:

  • sntp.sync ({"216.239.35.0"},
  • sntp.sync ({"0.uk.pool.ntp.org", "0.uk.pool.ntp.org"},
  • sntp.sync ({"3.uk.pool.ntp.org", "143.210.16.201"},
  • sntp.sync ({"0.uk.pool.ntp.org", "1.uk.pool.ntp.org", "3.uk.pool.ntp.org"},

Tất cả các dòng mã trên có thể được thay thế vào chương trình SNTPTime2.lua.

Có nhiều Máy chủ SNTP hơn tại các địa chỉ bên dưới có thể được sử dụng lại trong chương trình.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google cũng cung cấp các máy chủ thời gian tại các địa chỉ sau:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

Bạn cần nhớ lấy thời gian từ quốc gia bạn đang ở hoặc bạn có thể phải sửa đổi nó cho các múi giờ khác nhau trên thế giới. Ngoài ra, một số quốc gia có thời gian tiết kiệm ánh sáng ban ngày, vì vậy bạn cũng có thể phải giải quyết vấn đề đó.

Bước 3: Lấy thời gian từ mô-đun RTC

Nhận thời gian từ mô-đun RTC
Nhận thời gian từ mô-đun RTC

Chương trình GetRTCTime.lua đọc thời gian từ RTC nội bộ.

Phần đầu tiên đọc thời gian và hiển thị nó bằng giây và micro giây.

Phần thứ hai chuyển đổi nó thành định dạng dễ đọc hơn cho con người.

khi gọi tm = rtctime.epoch2cal (rtctime.get ()), nó trả về:

  • năm - 1970 ~ 2038
  • mon - tháng 1 ~ 12 trong năm hiện tại
  • day - ngày 1 ~ 31 trong tháng hiện tại
  • giờ
  • min
  • giây
  • day - ngày 1 ~ 366 trong năm hiện tại
  • wday - ngày 1 ~ 7 trong tuần hiện tại (Chủ nhật là 1)

Mỗi mục có thể được truy cập dưới dạng tm ["ngày"], tm ["năm"]…

Bạn có thể tìm thêm thông tin bằng cách đọc Tài liệu NodeMCU.

DisplaySNTPtime.lua là một cách hiển thị ngày và giờ phức tạp hơn trên màn hình LCD 128 x 64 OLED, vì nó được kết nối dễ dàng và có thể được sử dụng với các chương trình này.

Bước 4: Bộ nhớ người dùng RTC

Một chút khác biệt so với việc lưu giữ thời gian là RTC nội bộ trên ESP8266 có địa chỉ bộ nhớ 128 x 32 bit mà lập trình viên có thể truy cập. Chúng đặc biệt hữu ích vì chúng có thể tồn tại trong chu kỳ ngủ sâu của ESP8266. Lập trình viên có quyền kiểm soát việc sử dụng chúng và đảm bảo rằng chúng không bị ghi đè một cách vô tình.

Tôi đã bao gồm RTCmem.lua, một chương trình đơn giản thể hiện công dụng của nó. Bạn cần có mô-đun rtcmem trong bản dựng của mình.

Bước 5: Mô-đun RTC bên ngoài

Mô-đun RTC bên ngoài
Mô-đun RTC bên ngoài

Các mô-đun RTC bên ngoài kết nối với ESP8266 thông qua giao diện I2C, chỉ sử dụng hai chân I / O và do đó hoạt động với ESP-01 cũng như hầu hết các thiết bị ESP8266 khác.

Địa chỉ mô-đun RTC là 0x68 và được truy cập bằng các lệnh I2C thông thường. Tuy nhiên, có một điều cần lưu ý, dữ liệu trong thanh ghi RTC được lưu trữ ở định dạng BCD (cơ sở 16), vì vậy các chương trình của bạn phải giải quyết vấn đề này. Ngày và giờ được lưu trữ trong 7 thanh ghi trong RTC. Trên RTC nội bộ, các chuyển đổi BCD được thực hiện bởi mô-đun rtctime.

SetExtRTC.lua chuyển đổi dữ liệu sang BCD và đặt thời gian.

ReadExtRTC.lua đọc dữ liệu thời gian và in ra. LƯU Ý: dữ liệu được in ra dưới dạng thập lục phân.

Tôi đã không dành nhiều thời gian để định dạng màn hình vì bạn có thể có ý tưởng của riêng mình về những gì bạn muốn làm với ngày và giờ. Đây là động cơ cơ bản ở dạng đơn giản nhất, vì vậy bạn có thể phát triển nó hơn nữa nếu muốn.

Bước 6: Ghi dữ liệu

Đăng nhập vào dữ liệu
Đăng nhập vào dữ liệu

Nếu bạn quan sát kỹ các mô-đun RTC, bạn sẽ nhận thấy rằng chúng có một IC AT24C32 EEPROM hoặc tương tự được tích hợp sẵn bên trong, hoặc bạn có thể sử dụng bo mạch 24C256 như trên. Hầu hết các IC EEPROM này đều có đầu ra chân tương tự như trên. Chúng có nhiều dung lượng lưu trữ khác nhau nhưng đều được truy cập theo cùng một cách. Vì AT24C32 đã được hàn vào bo mạch nên nó có thể được sử dụng trực tiếp từ I2C của RTC bên ngoài.

Nếu bạn chỉ có một IC 24C256 hoặc tương tự, bạn có thể thiết lập nó trong một bảng mạch bánh mì, kết nối A1, A2 và A3 với Gnd, Vcc với 3.3V và SDA VÀ SCL với I2C, WP có thể được thả nổi. Một số IC EEPROM chỉ hoạt động ở 5V, vì vậy hãy kiểm tra bảng dữ liệu liên quan trước.

ByteWR.lua ghi 1 byte dữ liệu vào vị trí bộ nhớ 0x00 của EEPROM và đọc ngược lại.

Desiderata.lua viết một vài dòng từ văn bản nổi tiếng vào EEPROM.

eeRead.lua đọc dữ liệu từ EEPROM và in ra.

LƯU Ý: Các chương trình này cũng phải hoạt động với các bảng EEPROM khác.

Bước 7: Kết luận

Tôi đã cố gắng chỉ ra cách RTC và EEPROM hoạt động để ghi dữ liệu. Đây chỉ là bước khởi đầu để bạn phát triển hơn nữa. Bạn có thể kết nối các thiết bị khác nhau với bus I2C như cảm biến ánh sáng, cảm biến áp suất khí quyển, cảm biến nhiệt độ và độ ẩm và ghi lại dữ liệu trên EEPROM.

Đề xuất: