Mục lục:

Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD: 6 bước
Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD: 6 bước

Video: Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD: 6 bước

Video: Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD: 6 bước
Video: Hiển thị số ca nhiễm Covid trên màn hình LCD I2C với Raspberry Pi 2024, Tháng bảy
Anonim
Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD
Số liệu thống kê Covid-19 + Raspberry Pi + I2C LCD

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

Thiết lập phần cứng
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

Thiết lập phần mềm Pi
Thiết lập phần mềm Pi
Thiết lập phần mềm Pi
Thiết lập phần mềm Pi
Thiết lập phần mềm Pi
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

Chạy Python
Chạy Python
Chạy Python
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: