สารบัญ:

สถิติ Covid-19 + Raspberry Pi + I2C LCD: 6 ขั้นตอน
สถิติ Covid-19 + Raspberry Pi + I2C LCD: 6 ขั้นตอน

วีดีโอ: สถิติ Covid-19 + Raspberry Pi + I2C LCD: 6 ขั้นตอน

วีดีโอ: สถิติ Covid-19 + Raspberry Pi + I2C LCD: 6 ขั้นตอน
วีดีโอ: (TH SUB) Access control and temperature measurement solution for Jetson Platform 2024, พฤศจิกายน
Anonim
สถิติ Covid-19 + Raspberry Pi + I2C LCD
สถิติ Covid-19 + Raspberry Pi + I2C LCD

วันหนึ่งฉันตัดสินใจหยิบชิ้นส่วนที่ฉันโกหกออกมาโดยบังเอิญ และทำบางสิ่งที่จะให้สถิติแบบเรียลไทม์เกี่ยวกับโควิด-19 แก่ฉัน ฉันไม่ได้ใช้เวลามากในการทำให้ดูดีเพราะเหตุใดจึงทำสิ่งที่ถาวรในเมื่อเหตุการณ์นี้ไม่เกิดขึ้น? ดังนั้น จอภาพของฉันจึงถูกติดตั้งไว้บนกล่องกระดาษแข็งขนาดเล็ก

ชิ้นส่วนที่จำเป็น:

  • Raspberry Pi - ทุกรุ่น ฉันใช้ Raspberry Pi 3A+
  • จอ LCD I2C ขนาด 20x4 - ไม่มียี่ห้อใด…แต่ต้องการกระเป๋าเป้ I2C
  • สายจัมเปอร์ตัวเมียกับตัวเมีย - เพียง 4 สายสำหรับเชื่อมต่อ I2C กับ Pi

www.adafruit.com/product/4027

www.amazon.com/gp/product/B01GPUMP9C/ref=p…

www.amazon.com/gp/product/B01L5ULRUA/ref=p…

ลิงก์เหล่านี้ตรงไปยังแหล่งที่มาที่ฉันซื้อ ขออภัยที่ต้องบอกว่า Adafruit ไม่ได้ให้บริการในขณะนี้ แต่ Amazon … ค่อนข้างช้าเนื่องจากเน้นไปที่สินค้าจำเป็นเป็นหลัก ซึ่งสิ่งเหล่านี้ไม่ใช่ ทั้งหมดนี้สามารถพบได้ที่อื่นใน Amazon และ eBay

คุณจะต้องใช้อะแดปเตอร์ AC, สาย USB และการ์ด microSD เพื่อใช้งานทั้งหมดนี้

ขั้นตอนที่ 1: การตั้งค่าฮาร์ดแวร์

การตั้งค่าฮาร์ดแวร์
การตั้งค่าฮาร์ดแวร์

อ้างอิงรูปภาพ pinout ที่แนบมา มันบอกว่า B+ แต่ใช้กับ Raspberry Pi ทุกรุ่นที่มาหลังจากนั้นเช่นกัน

ด้วยกระเป๋าเป้สะพายหลัง I2C ที่ติดอยู่กับจอ LCD การเชื่อมต่อนี้ต้องใช้สายไฟเพียง 4 เส้นเท่านั้น

เชื่อมต่อ GND กับหมุดกราวด์ตัวใดตัวหนึ่งบน Raspberry Pi: พิน 6, 9, 14, 20, 25, 30, 34, 39 ฉันเชื่อมต่อกับพิน 6

เชื่อมต่อ VCC กับพิน 5 โวลต์บน Raspberry Pi: พิน 2, 4 ฉันใช้พิน 4

เชื่อมต่อ SDA กับพิน 3

เชื่อมต่อ SCL กับพิน 5

หากคุณทำตามการตั้งค่าของฉัน คุณจะจบลงด้วยสายทั้งหมด 4 เส้นในรูปแบบ 2x2 บนส่วนหัว GPIO

วิธีการติดตั้งของคุณจะเป็นอะไรก็ได้ที่คุณสามารถจินตนาการได้…หรือไม่มีอะไรเลย ดังที่ฉันได้กล่าวไว้ในบทนำ ไวรัสโคโรนาสายพันธุ์นี้จะไม่คงอยู่ตลอดไป ดังนั้นฉันจึงไม่ต้องตั้งค่าเป็นทั้งคู่ ถ้าฉันตัดสินใจที่จะเก็บการตั้งค่านี้ไว้หลังจากกิจกรรมนี้จบลง ฉันอาจจะเปลี่ยนเป็นการแสดงสภาพอากาศหรืออย่างอื่นก็ได้

ฉันติดน็อตและสลักเกลียวพร้อมกับสเปเซอร์ไนลอนที่มุมทั้ง 4 ของ Pi 3A+ ของฉัน นี่เป็นทางเลือกอย่างเคร่งครัด ฉันทำสิ่งนี้เพราะบางครั้งฉันมีสิ่งนี้บนพื้นผิวโลหะ ไม่ชอบการตั้งค่าชั่วคราวของฉันบน Pi ที่อยู่ภายในเคส และฉันไม่ต้องการที่จะเสี่ยงที่จะทำให้มันพังเพราะฉันลืมเอามันออกจากโลหะ พื้นผิวก่อนเปิดเครื่อง

ขั้นตอนที่ 2: Pi Software Setup

การตั้งค่าซอฟต์แวร์ Pi
การตั้งค่าซอฟต์แวร์ Pi
การตั้งค่าซอฟต์แวร์ Pi
การตั้งค่าซอฟต์แวร์ Pi
การตั้งค่าซอฟต์แวร์ Pi
การตั้งค่าซอฟต์แวร์ Pi

อย่างที่ฉันพูดในอินโทร ไม่สำคัญหรอกว่าคุณใช้ Raspberry Pi รุ่นอะไร ฉันใช้สิ่งนี้กับ Raspberry Pi 3A + ผ่าน WiFi แต่ได้ทดสอบสิ่งนี้กับ Raspberry Pi 2 บนสายเคเบิลอีเธอร์เน็ตและ Raspberry Pi Zero เวอร์ชัน 1.3 (Pi Zero ตัวแรกที่มีขั้วต่อกล้องอนุกรม) พร้อมดองเกิล USB WiFi

ฉันจะไม่พิมพ์วิธีการติดตั้ง Raspbian ลงในการ์ด MicroSD เพราะมีคำแนะนำหลายล้านวิธีในการทำเช่นนั้น ฉันมี microSD ขนาด 16GB ที่ใช้ Raspbian Buster Lite ฉันมักจะใช้ Raspbian Lite เกือบทุกครั้งเพราะฉันไม่ต้องการแพ็คเกจซอฟต์แวร์ที่ไร้ประโยชน์อื่น ๆ ในโครงการของฉัน หากฉันติดตั้งซอฟต์แวร์โดยใช้ apt-get จะติดตั้งข้อกำหนดเบื้องต้นที่ขาดหายไป

เชื่อมต่อกับเครือข่าย อีกครั้งมีคำแนะนำหลายล้านวิธีในการทำเช่นนี้ ดังนั้นฉันจะไม่ลงรายละเอียดในเชิงลึกที่นี่ คุณสามารถใช้แบบมีสายหรือไร้สาย แต่จะต้องเชื่อมต่ออินเทอร์เน็ต

ไม่บังคับ แต่คุณสามารถเปิดใช้งาน SSH เพื่อเชื่อมต่อโดยใช้ PuTTY ฉันทำ.

อัปเดตทุกอย่างแล้วรีบูต:

sudo apt อัปเดต

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo รีบูต

นี่คือการตั้งค่าเดียวที่ฉันจะดำเนินการที่นี่ อีกครั้ง มีหลายวิธีในการทำเช่นนี้ แต่ข้อมูลอ้างอิงที่ดีที่สุดที่ฉันพบอยู่ที่นี่:

นี่คือไฮไลท์:

sudo apt ติดตั้ง i2c-tools

sudo apt ติดตั้ง python-smbus

คุณจะต้องเปิดใช้งาน I2C. ด้วย

sudo raspi-config

- 5 ตัวเลือกการเชื่อมต่อ

- P5 I2C

รีบูตเพื่อใช้การเปลี่ยนแปลง

sudo รีบูต

ถึงเวลาดูว่าคุณทำทุกอย่างถูกต้องหรือไม่

i2cdetect -y 1

หากจอแสดงผลของคุณเปิดขึ้นและ Raspberry Pi สามารถมองเห็นได้ คุณจะมีแผนภูมิปรากฏขึ้น ที่อยู่สำหรับ 20x4 ที่ฉันซื้อใน Amazon และใช้สำหรับโปรเจ็กต์นี้คือ 27 ในทางเทคนิค สิ่งนี้จะระบุเป็น 0x27 สำหรับสคริปต์หลามที่จะมาในภายหลัง ฉันมีที่อยู่เดียวกันที่แสดงสำหรับจอแสดงผลขนาด 16x2 จำนวน 2 จอที่ฉันซื้อใน Amazon และขนาด 40x2 ที่ฉันพบบนอีเบย์

ขั้นตอนที่ 3: การตั้งค่า Python

ตอนนี้สำหรับสิ่งที่ซับซ้อน ฉันจะพยายามทำให้มันง่ายที่สุดเท่าที่จะทำได้ สำหรับการเริ่มต้น ฉันจะเขียนไฟล์ไปยังโฮมไดเร็กตอรี่

แตะ I2C_LCD_driver.py

นาโน I2C_LCD_driver.py

วางเนื้อหาด้านล่างลงในสคริปต์หลามที่สร้างขึ้นใหม่

# -*- การเข้ารหัส: utf-8 -*-# พบรหัสเดิมที่: #

"""

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),="">

ฉันรู้ว่าสคริปต์นี้ค่อนข้างยุ่ง แต่ก็มีประสิทธิภาพ มันจะแสดงสถิติปัจจุบันสำหรับกรณี Covid-19 ในสหรัฐอเมริกา ฐานข้อมูลหลักอัพเดททุก 5 นาที สคริปต์ของฉันใช้เวลา 1 นาทีในการวนรอบ 3 หน้าโดยสมบูรณ์ และจะดึงตัวเลขที่อัปเดตทุกครั้งที่เริ่มรอบใหม่อีกครั้ง

ขั้นตอนที่ 4: เรียกใช้ Python

เรียกใช้ Python
เรียกใช้ Python
เรียกใช้ Python
เรียกใช้ Python

เอาล่ะ:

หลาม covid19.py

หน้าแรกแสดงจำนวนผู้ป่วยและผู้เสียชีวิตทั้งหมดตั้งแต่ coronavirus เข้าสู่ประเทศครั้งแรก หน้าที่สองแสดงตัวเลขสำหรับกรณีและการเสียชีวิตที่เกิดขึ้นเฉพาะในวันปัจจุบันเท่านั้น ภาพที่ 3 แสดงคนที่อยู่ในภาวะวิกฤต จากนั้นมีผู้ป่วยและเสียชีวิตต่อหนึ่งล้านคน บรรทัดที่สองในหน้าที่สามใช้เพื่อแสดงวันที่ของคดีแรกในประเทศ แต่ฉันต้องลบออกเพราะบางครั้งสคริปต์จะเกิดข้อผิดพลาดและผิดพลาดเมื่ออ้างถึงบรรทัดนั้นโดยมีข้อผิดพลาด

มีวิธีทำให้สคริปต์นี้ทำงานโดยอัตโนมัติ แต่ฉันจะไม่ลงรายละเอียดเกี่ยวกับเรื่องนี้ที่นี่ ฉันเพิ่งเรียกใช้คำสั่งของฉันหลังจากที่ฉันเชื่อมต่อ SSH ผ่าน PuTTY ขณะที่กำลังทำงานอยู่ คุณจะไม่สามารถรันคำสั่งอื่นใดได้จนกว่าคุณจะกด Ctrl+C

ขั้นตอนที่ 5: จะเกิดอะไรขึ้นหากฉันไม่ได้อาศัยอยู่ในสหรัฐอเมริกา

สคริปต์นี้สามารถแก้ไขได้เพื่อแสดงสถิติของประเทศอื่น อย่างที่คุณเห็น URL ในสคริปต์ของฉันดึงมาจาก API ที่นี่: (อย่าใช้ Internet Explorer เพื่อดูหน้าเหล่านี้ มันจะพยายามโหลดไฟล์.json ฉันใช้ Chrome)

coronavirus-19-api.herokuapp.com/countries/usa

ตอนนี้ไปที่ที่อยู่เดียวกัน แต่สูงกว่าหนึ่งโฟลเดอร์

coronavirus-19-api.herokuapp.com/countries

รายการนี้แสดงสถิติของแต่ละประเทศ เห็นได้ชัดว่ามันจะเป็นฝันร้ายที่พยายามดึงข้อมูล API จากหน้านี้ ดังนั้นจึงเป็นการดีที่สุดที่จะเปิดเพจสำหรับประเทศของคุณ เพื่อนของเราในแคนาดาจะต้องแก้ไขสคริปต์เป็น URL นี้:

coronavirus-19-api.herokuapp.com/countries/canada

หมายเหตุสำคัญมากที่นี่ URL ที่ไปยัง API ต้องมีความเฉพาะเจาะจง…หมายความว่าไม่มีช่องว่างใน URL ในการท่องเว็บ ช่องว่างในที่อยู่เว็บจะถูกแทนที่ด้วย "%20" และที่กล่าวว่า เพื่อนของเราในประเทศที่มีชื่อส่วน 2 ชื่อ เช่น นิวซีแลนด์ จะต้องแทนที่ URL ในสคริปต์นี้ด้วย:

coronavirus-19-api.herokuapp.com/countries/new%20zealand

ขั้นตอนที่ 6: ความคิดสุดท้าย

ฉันได้ทำหลายสิ่งหลายอย่างกับ Raspberry Pi และ Arduino ในช่วงหลายปีที่ผ่านมา แต่สิ่งที่ฉันสร้างขึ้นส่วนใหญ่เป็นเพียงการจำลองความคิดของผู้อื่น อันนี้เกือบจะเหมือนกันยกเว้นว่าฉันรวบรวมชิ้นส่วนจากหลายแหล่งในการตั้งค่านี้ แม้ว่าการตั้งค่านี้จะไม่ทำให้คุณปลอดภัยและมีสุขภาพที่ดีในช่วงเวลาที่ยากลำบากนี้ แต่ก็จะทำให้คุณไม่ว่างขณะตั้งค่าและจะแจ้งให้คุณทราบในภายหลัง

หากคุณยังไม่มีชิ้นส่วนเหล่านี้ อย่าเครียดกับการซื้อชิ้นส่วนเหล่านี้ เว้นแต่คุณจะจริงจังกับการสร้างมันขึ้นมา อย่างที่ฉันพูดไปก่อนหน้านี้ เวลาจัดส่งใช้เวลานานขึ้นในขณะนี้ เนื่องจากความพยายามเหล่านั้นถูกนำไปใช้กับรายการที่จำเป็น ฉันมีเพียงส่วนเหล่านี้สำหรับการเรียนรู้และทดลองเท่านั้น เดิมจอแสดงผลที่ติดตั้งบนกล่องถูกตั้งค่าเพื่อดูสถิติแบบเรียลไทม์ของ Raspberry Pi เครื่องอื่นบนเครือข่ายของฉันที่ใช้ Pi-Hole หลังจากจบกิจกรรม Covid-19 นี้ ฉันอาจเปลี่ยนเป็นเครื่องแสดงสภาพอากาศ

สำหรับทุกคนที่อ่านฉันอยากจะตะโกนออกไปกับคำแนะนำนี้:

www.instructables.com/id/DIY-Hand-Sanitize…

ฉันยังไม่ได้ลอง แต่มีส่วนผสมที่แน่นอน และฉันอาจจะลองสักครั้ง

แนะนำ: