Mục lục:
- Bước 1: Thiết lập phần cứng
- Bước 2: Thiết lập phần mềm Pi
- Bước 3: Thiết lập Python
- Bước 4: Chạy Python
- Bước 5: Nếu tôi không sống ở Mỹ thì sao?
- Bước 6: Kết luận
Video: Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD: 6 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-31 10:26
Vì vậy, một cách ngẫu nhiên vào một ngày nọ, tôi quyết định lấy một vài phần tôi đã biết và tạo ra thứ gì đó sẽ cung cấp cho tôi số liệu thống kê thời gian thực trên Covid-19. Tôi đã không dành nhiều thời gian để làm cho nó trông đẹp mắt vì tại sao phải làm một cái gì đó vĩnh viễn trong khi sự kiện này sẽ không diễn ra? Do đó, màn hình của tôi chỉ được gắn vào một hộp các tông nhỏ.
Các bộ phận cần thiết:
- Raspberry Pi - bất kỳ mô hình nào. Tôi đã sử dụng Raspberry Pi 3A +
- Màn hình LCD 20x4 I2C - không có thương hiệu cụ thể… nhưng cần ba lô I2C
- Dây nhảy từ nữ đến nữ - Chỉ cần 4 trong số chúng để kết nối I2C với Pi
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Các liên kết này đi thẳng đến các nguồn tôi đã mua. Rất tiếc phải nói rằng Adafruit không giao hàng ngay bây giờ, nhưng Amazon thì… chậm chạp do tập trung chính của họ là hướng tới các mặt hàng thiết yếu, những thứ này thì không. Tất cả có thể được tìm thấy ở những nơi khác trên Amazon và eBay.
Rõ ràng là bạn sẽ cần bộ chuyển đổi AC, cáp USB và thẻ nhớ microSD để thực hiện tất cả những điều này.
Bước 1: Thiết lập phần cứng
Tham khảo hình ảnh sơ đồ chân kèm theo. Nó nói B +, nhưng nó cũng áp dụng cho mọi kiểu Raspberry Pi khác ra đời sau kiểu đó.
Với một ba lô I2C được gắn vào màn hình LCD, kết nối này chỉ cần 4 dây để hoạt động.
Kết nối GND với bất kỳ chân nối đất nào trên Raspberry Pi: Chân 6, 9, 14, 20, 25, 30, 34, 39. Tôi đã kết nối nó với chân 6.
Kết nối VCC với một trong các chân 5 vôn trên Raspberry Pi: Chân 2, 4. Tôi đã sử dụng chân 4
Kết nối SDA với chân 3.
Kết nối SCL với chân 5.
Nếu bạn làm theo thiết lập của tôi, bạn sẽ kết thúc với tất cả 4 dây theo mẫu 2x2 trên các tiêu đề GPIO.
Phương pháp gắn kết của bạn có thể là bất cứ thứ gì bạn có thể tưởng tượng… hoặc không có gì cả. Như tôi đã nói trong phần giới thiệu, dòng coronavirus này sẽ không tồn tại mãi mãi, vì vậy tôi không cần thiết lập của mình. Nếu tôi quyết định giữ thiết lập này sau khi sự kiện này kết thúc, tôi có thể biến nó thành màn hình thời tiết hoặc thứ gì đó.
Tôi đã gắn một đai ốc và bu lông cùng với miếng đệm nylon vào tất cả 4 góc của Pi 3A +. Đây hoàn toàn là tùy chọn. Tôi đã làm điều này vì đôi khi tôi để cái này trên bề mặt kim loại, không thích thiết lập tạm thời của mình trên một Pi nằm bên trong hộp đựng và không muốn có nguy cơ làm nó rối tung lên vì tôi quên tháo nó ra khỏi kim loại bề mặt trước khi bật nguồn.
Bước 2: Thiết lập phần mềm Pi
Như tôi đã nói trong phần giới thiệu, không quan trọng bạn sử dụng kiểu Raspberry Pi nào. Tôi đang sử dụng tính năng này trên Raspberry Pi 3A + qua WiFi nhưng cũng đã thử nghiệm điều này trên Raspberry Pi 2 trên cáp ethernet và Raspberry Pi Zero phiên bản 1.3 (Pi Zero đầu tiên có đầu nối máy ảnh nối tiếp) với khóa USB WiFi.
Tôi sẽ không tìm hiểu cách cài đặt Raspbian vào thẻ MicroSD vì có hàng triệu hướng dẫn về cách thực hiện điều đó. Tôi có một thẻ nhớ microSD 16GB chạy Raspbian Buster Lite. Một lưu ý nhỏ là tôi hầu như luôn sử dụng Raspbian Lite vì tôi không cần các gói phần mềm vô dụng khác trong bất kỳ dự án nào của mình. Nếu tôi cài đặt phần mềm bằng apt-get, nó sẽ cài đặt các điều kiện tiên quyết bị thiếu.
Kết nối với một mạng lưới. Một lần nữa, có hàng triệu hướng dẫn trên mạng về cách thực hiện việc này, vì vậy tôi sẽ không đi sâu ở đây. Bạn có thể kết nối có dây hoặc không dây, nhưng điều này sẽ yêu cầu kết nối internet.
Tùy chọn, nhưng bạn có thể bật SSH để kết nối bằng PuTTY. Tôi đã làm.
Cập nhật mọi thứ sau đó khởi động lại:
cập nhật apt sudo
sudo apt nâng cấp -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Đây là một trong những thiết lập mà tôi sẽ xem qua ở đây. Một lần nữa, có hàng triệu cách để làm điều này, nhưng tài liệu tham khảo tốt nhất mà tôi tìm thấy là ngay tại đây:
Dưới đây là những điểm nổi bật:
sudo apt cài đặt i2c-tools
sudo apt cài đặt python-smbus
Bạn cũng sẽ cần kích hoạt I2C
sudo raspi-config
- 5 tùy chọn giao diện
- P5 I2C
Khởi động lại để áp dụng các thay đổi
khởi động lại sudo
Bây giờ là lúc để xem bạn đã làm tất cả điều này một cách chính xác cho đến nay chưa
i2cdetect -y 1
Nếu màn hình của bạn được bật nguồn và Raspberry Pi của bạn có thể nhìn thấy, bạn sẽ có một biểu đồ xuất hiện. Địa chỉ cho 20x4 mà tôi đã mua trên Amazon và sử dụng cho dự án này là 27. Về mặt kỹ thuật, địa chỉ này sẽ được xác định là 0x27 cho các tập lệnh python sẽ có sau. Tôi đã có cùng một địa chỉ hiển thị cho 2 màn hình 16x2 mà tôi cũng đã mua trên Amazon và một màn hình 40x2 mà tôi tìm thấy trên eBay.
Bước 3: Thiết lập Python
Vì vậy, bây giờ cho những thứ phức tạp. Tôi sẽ cố gắng giữ nó đơn giản nhất có thể. Đối với người mới bắt đầu, tôi sẽ chỉ ghi tệp vào thư mục chính.
chạm vào I2C_LCD_driver.py
nano I2C_LCD_driver.py
Dán nội dung dưới đây vào tập lệnh python mới tạo của bạn.
# - * - mã hóa: utf-8 - * - # Mã gốc được tìm thấy tại: #
"""
Compiled, mashed and generally mutilated 2014-2015 by Denis Pleic Made available under GNU GENERAL PUBLIC LICENSE
# Modified Python I2C library for Raspberry Pi
# as found on https://gist.github.com/DenisFromHR/cc863375a6e19… # Joined existing 'i2c_lib.py' and 'lcddriver.py' into a single library # added bits and pieces from various sources # By DenisFromHR (Denis Pleic) # 2015-02-10, ver 0.1
"""
# i2c bus (0 -- original Pi, 1 -- Rev 2 Pi)
I2CBUS = 0
# LCD Address
ADDRESS = 0x27
import smbus
from time import sleep
class i2c_device:
def _init_(self, addr, port=I2CBUS): self.addr = addr self.bus = smbus. SMBus(port)
# Write a single command
def write_cmd(self, cmd): self.bus.write_byte(self.addr, cmd) sleep(0.0001)
# Write a command and argument
def write_cmd_arg(self, cmd, data): self.bus.write_byte_data(self.addr, cmd, data) sleep(0.0001)
# Write a block of data
def write_block_data(self, cmd, data): self.bus.write_block_data(self.addr, cmd, data) sleep(0.0001)
# Read a single byte
def read(self): return self.bus.read_byte(self.addr)
# Read
def read_data(self, cmd): return self.bus.read_byte_data(self.addr, cmd)
# Read a block of data
def read_block_data(self, cmd): return self.bus.read_block_data(self.addr, cmd)
# commands
LCD_CLEARDISPLAY = 0x01 LCD_RETURNHOME = 0x02 LCD_ENTRYMODESET = 0x04 LCD_DISPLAYCONTROL = 0x08 LCD_CURSORSHIFT = 0x10 LCD_FUNCTIONSET = 0x20 LCD_SETCGRAMADDR = 0x40 LCD_SETDDRAMADDR = 0x80
# flags for display entry mode
LCD_ENTRYRIGHT = 0x00 LCD_ENTRYLEFT = 0x02 LCD_ENTRYSHIFTINCREMENT = 0x01 LCD_ENTRYSHIFTDECREMENT = 0x00
# flags for display on/off control
LCD_DISPLAYON = 0x04 LCD_DISPLAYOFF = 0x00 LCD_CURSORON = 0x02 LCD_CURSOROFF = 0x00 LCD_BLINKON = 0x01 LCD_BLINKOFF = 0x00
# flags for display/cursor shift
LCD_DISPLAYMOVE = 0x08 LCD_CURSORMOVE = 0x00 LCD_MOVERIGHT = 0x04 LCD_MOVELEFT = 0x00
# flags for function set
LCD_8BITMODE = 0x10 LCD_4BITMODE = 0x00 LCD_2LINE = 0x08 LCD_1LINE = 0x00 LCD_5x10DOTS = 0x04 LCD_5x8DOTS = 0x00
# flags for backlight control
LCD_BACKLIGHT = 0x08 LCD_NOBACKLIGHT = 0x00
En = 0b00000100 # Enable bit
Rw = 0b00000010 # Read/Write bit Rs = 0b00000001 # Register select bit
class lcd:
#initializes objects and lcd def _init_(self): self.lcd_device = i2c_device(ADDRESS)
self.lcd_write(0x03)
self.lcd_write(0x03) self.lcd_write(0x03) self.lcd_write(0x02)
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON) self.lcd_write(LCD_CLEARDISPLAY) self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT) sleep(0.2)
# clocks EN to latch command
def lcd_strobe(self, data): self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT) sleep(.0005) self.lcd_device.write_cmd(((data & ~En) | LCD_BACKLIGHT)) sleep(.0001)
def lcd_write_four_bits(self, data):
self.lcd_device.write_cmd(data | LCD_BACKLIGHT) self.lcd_strobe(data)
# write a command to lcd
def lcd_write(self, cmd, mode=0): self.lcd_write_four_bits(mode | (cmd & 0xF0)) self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
# write a character to lcd (or character rom) 0x09: backlight | RS=DR< # works! def lcd_write_char(self, charvalue, mode=1): self.lcd_write_four_bits(mode | (charvalue & 0xF0)) self.lcd_write_four_bits(mode | ((charvalue << 4) & 0xF0)) # put string function with optional char positioning def lcd_display_string(self, string, line=1, pos=0): if line == 1: pos_new = pos elif line == 2: pos_new = 0x40 + pos elif line == 3: pos_new = 0x14 + pos elif line == 4: pos_new = 0x54 + pos
self.lcd_write(0x80 + pos_new)
for char in string:
self.lcd_write(ord(char), Rs)
# clear lcd and set to home
def lcd_clear(self): self.lcd_write(LCD_CLEARDISPLAY) self.lcd_write(LCD_RETURNHOME)
# define backlight on/off (lcd.backlight(1); off= lcd.backlight(0)
def backlight(self, state): # for state, 1 = on, 0 = off if state == 1: self.lcd_device.write_cmd(LCD_BACKLIGHT) elif state == 0: self.lcd_device.write_cmd(LCD_NOBACKLIGHT)
# add custom characters (0 - 7)
def lcd_load_custom_chars(self, fontdata): self.lcd_write(0x40); for char in fontdata: for line in char: self.lcd_write_char(line)
The address in that content assumes your LCD address is 0x27. If this is not the case for you, you will need to change it on the line "ADDRESS = 0x27" before you type Ctrl+X to save and exit. Otherwise, just save and exit. This file will need to exist in the same directory as the script that we will use later.
That code was on "https://www.circuitbasics.com/raspberry-pi-i2c-lcd-set-up-and-programming/" just in case it did not paste correctly onto this page.
Now create and edit the main python script:
touch covid19.py
nano covid19.py
Paste the below text into your newly created python script.
import I2C_LCD_driverimport socket import time import fcntl import struct import json import urllib2
display = I2C_LCD_driver.lcd()
url = ("https://coronavirus-19-api.herokuapp.com/countries/usa") data = json.load(urllib2.urlopen(url))
try:
while True: data = json.load(urllib2.urlopen(url)) cases = data['cases'] todaycases = data['todayCases'] deaths = data['deaths'] todaydeaths = data['todayDeaths'] recovered = data['recovered'] active = data['active'] critical = data['critical'] casesperonemillion = data['casesPerOneMillion'] deathsperonemillion = data['deathsPerOneMillion'] display.lcd_display_string("COVID-19 Total Stats", 1) display.lcd_display_string("Cases: " + str(cases), 2) display.lcd_display_string("Deaths: " + str(deaths), 3) display.lcd_display_string("Recovered: " + str(recovered), 4) time.sleep(30) display.lcd_display_string(" ", 1) display.lcd_display_string(" ", 2) display.lcd_display_string(" ", 3) display.lcd_display_string(" ", 4) display.lcd_display_string("COVID-19: " + "%s" %time.strftime("%Y/%m/%d"), 1) display.lcd_display_string("Cases: " + str(todaycases), 2) display.lcd_display_string("Deaths: " + str(todaydeaths), 3) display.lcd_display_string("Active: " + str(active), 4) time.sleep(20) display.lcd_display_string(" ", 1) display.lcd_display_string(" ", 2) display.lcd_display_string(" ", 3) display.lcd_display_string(" str(recovered),="">
Tôi biết kịch bản này khá lộn xộn, nhưng nó hiệu quả. Nó sẽ hiển thị số liệu thống kê hiện tại cho các trường hợp Covid-19 ở Hoa Kỳ. Cơ sở dữ liệu chính được cập nhật 5 phút một lần. Tập lệnh của tôi mất 1 phút để hoàn toàn xoay vòng qua 3 trang và sẽ kéo các số cập nhật mỗi khi chu kỳ bắt đầu lại.
Bước 4: Chạy Python
Hãy bắt đầu nào:
python covid19.py
Trang đầu tiên hiển thị tổng số trường hợp mắc và tử vong kể từ khi virus corona lần đầu tiên tấn công quốc gia này. Trang thứ hai hiển thị những con số đó cho các trường hợp và tử vong chỉ xảy ra vào ngày hiện tại. Hình thứ ba cho thấy những người trong tình trạng nguy kịch, sau đó là các trường hợp và tử vong trên một triệu người. Dòng thứ hai trên trang thứ ba được sử dụng để hiển thị ngày của trường hợp đầu tiên trong nước, nhưng tôi phải xóa nó đi vì tập lệnh đôi khi sẽ bị lỗi và bị lỗi khi trích dẫn dòng đó có lỗi.
Có nhiều cách để làm cho tập lệnh này chạy tự động, nhưng tôi sẽ không đi vào chi tiết về điều đó ở đây. Tôi chỉ chạy lệnh của mình sau khi tôi SSH kết nối với nó thông qua PuTTY. Trong khi nó đang chạy, bạn sẽ không thể thực hiện bất kỳ lệnh nào khác cho đến khi bạn nhấn Ctrl + C.
Bước 5: Nếu tôi không sống ở Mỹ thì sao?
Tập lệnh này có thể được sửa đổi để hiển thị số liệu thống kê cho các quốc gia khác. Như bạn có thể thấy, URL trong tập lệnh của tôi lấy từ một API tại đây: (không sử dụng Internet Explorer để xem các trang này. Nó sẽ cố gắng tải xuống tệp.json. Tôi đã sử dụng Chrome)
coronavirus-19-api.herokuapp.com/countries/usa
Bây giờ hãy truy cập cùng một địa chỉ đó, nhưng một thư mục cao hơn
coronavirus-19-api.herokuapp.com/countries
Điều này liệt kê các số liệu thống kê cho mọi quốc gia. Rõ ràng sẽ là một cơn ác mộng khi cố gắng lấy dữ liệu API từ trang này. Vì vậy, tốt nhất là mở trang cho quốc gia cụ thể của bạn. Bạn bè của chúng tôi ở Canada sẽ cần chỉnh sửa tập lệnh thành URL này:
coronavirus-19-api.herokuapp.com/countries/canada
Lưu ý rất quan trọng ở đây. URL tới API cần phải cụ thể… nghĩa là không có khoảng trắng trong URL. Trong duyệt web, khoảng trắng trong địa chỉ web được thay thế bằng "% 20" và như đã nói, bạn bè của chúng tôi ở các quốc gia có 2 tên phần, chẳng hạn như New Zealand, sẽ cần thay thế URL trong tập lệnh này bằng:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Bước 6: Kết luận
Tôi đã làm nhiều thứ với Raspberry Pi và Arduino trong nhiều năm, nhưng hầu hết những gì tôi đã xây dựng chỉ là bản sao của những ý tưởng khác. Cái này gần như giống nhau ngoại trừ tôi đã biên dịch các phần từ nhiều nguồn vào thiết lập này. Mặc dù thiết lập này sẽ không giữ cho bạn an toàn và khỏe mạnh trong thời gian khó khăn này, nhưng nó chắc chắn sẽ khiến bạn bận rộn khi thiết lập và nó sẽ thông báo cho bạn sau đó.
Nếu bạn chưa có những bộ phận này, đừng căng thẳng khi mua chúng trừ khi bạn nghiêm túc về việc xây dựng nó. Như tôi đã nói trước đây, thời gian vận chuyển hiện đang mất nhiều thời gian hơn vì những nỗ lực đó đang được tập trung vào các mặt hàng thiết yếu. Tôi chỉ có những phần này để học hỏi và thử nghiệm. Màn hình được gắn trong hộp ban đầu được thiết lập để xem thống kê thời gian thực của một Raspberry Pi khác trên mạng của tôi đang chạy Pi-Hole. Sau khi sự kiện Covid-19 này kết thúc, tôi có thể biến nó thành một màn hình hiển thị thời tiết.
Đối với bất kỳ ai đang đọc, tôi muốn gửi lời cảm ơn đến tài liệu hướng dẫn này:
www.instructables.com/id/DIY-Hand-Sanifying…
Tôi chưa thử, nhưng tôi có những thành phần chính xác đó, và tôi có thể thử một lúc.
Đề xuất:
Raspberry Pi - Cảm biến độ ẩm & nhiệt độ HIH6130 I2C Hướng dẫn Python: 4 bước
Raspberry Pi - HIH6130 I2C Độ ẩm & Cảm biến Nhiệt độ Hướng dẫn Python: HIH6130 là một cảm biến độ ẩm và nhiệt độ với đầu ra kỹ thuật số. Các cảm biến này cung cấp mức độ chính xác ± 4% RH. Với độ ổn định lâu dài hàng đầu trong ngành, I2C kỹ thuật số bù nhiệt độ thực, Độ tin cậy hàng đầu trong ngành, Hiệu quả năng lượng
Raspberry Pi - Cảm biến độ ẩm & nhiệt độ HIH6130 I2C Hướng dẫn sử dụng Java: 4 bước
Raspberry Pi - Cảm biến độ ẩm và nhiệt độ HIH6130 I2C Hướng dẫn sử dụng Java: HIH6130 là cảm biến độ ẩm và nhiệt độ với đầu ra kỹ thuật số. Các cảm biến này cung cấp mức độ chính xác ± 4% RH. Với độ ổn định lâu dài hàng đầu trong ngành, I2C kỹ thuật số bù nhiệt độ thực, Độ tin cậy hàng đầu trong ngành, Hiệu quả năng lượng
Raspberry PI Nhiều thiết bị I2C: 3 bước
Raspberry PI Nhiều thiết bị I2C: Thất vọng vì bạn không thể sử dụng nhiều thiết bị I2C giống nhau trong dự án của mình. Không cần sử dụng bộ ghép kênh chậm. Nhân raspbian mới nhất hỗ trợ việc tạo nhiều bus I2C bằng cách sử dụng các chân GPIO. Giải pháp này là siêu nhanh