Sadržaj:

Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 koraka
Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 koraka

Video: Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 koraka

Video: Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 koraka
Video: Hiển thị số ca nhiễm Covid trên màn hình LCD I2C với Raspberry Pi 2024, Srpanj
Anonim
Statistika Covid-19 + Raspberry Pi + I2C LCD
Statistika Covid-19 + Raspberry Pi + I2C LCD

Tako sam jednog dana nasumice odjednom odlučio nabaviti nekoliko dijelova koje sam ležao i napraviti nešto što će mi dostavljati statistiku u stvarnom vremenu o Covid-19. Nisam uložio puno vremena u to da izgleda lijepo jer zašto napraviti nešto trajno kad ovaj događaj neće biti? Stoga je moj zaslon samo montiran na malu kartonsku kutiju.

Potrebni dijelovi:

  • Raspberry Pi - bilo koji model. Koristio sam Raspberry Pi 3A+
  • 20x4 I2C LCD zaslon - nema posebne marke … ali treba I2C ruksak
  • Žice kratkospojnika za žene - samo 4 za spajanje I2C na Pi

www.adafruit.com/product/4027

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

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

Ove veze idu izravno na izvore koje sam kupio. Žao mi je što Adafruit trenutno ne isporučuje proizvode, ali Amazon je … samo polako jer im je glavni fokus na bitnim stavkama, a to nisu. Sve se može pronaći drugdje na Amazonu i eBayu.

Očigledno će vam za sve ovo trebati ispravljač, USB kabel i microSD kartica.

Korak 1: Postavljanje hardvera

Postavljanje hardvera
Postavljanje hardvera

Uputite se na priloženu sliku isječka. Kaže B+, ali se odnosi na svaki drugi model Raspberry Pi koji je došao nakon toga.

S I2C ruksakom pričvršćenim na LCD zaslon, za povezivanje su potrebne samo 4 žice.

Spojite GND na bilo koji od kontakata za uzemljenje na Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Spojio sam ga na pin 6.

Spojite VCC na bilo koji od 5 voltnih pinova na Raspberry Pi: Pin 2, 4. Koristio sam pin 4

Spojite SDA na pin 3.

Spojite SCL na pin 5.

Ako ste slijedili moje postavljanje, završit ćete sa sve 4 žice u 2x2 uzorku na GPIO zaglavljima.

Vaš način montaže može biti bilo što što zamislite … ili uopće ništa. Kao što sam rekao u uvodu, ovaj soj koronavirusa neće trajati vječno, pa mi niti za jedno ne treba moje postavljanje. Odlučim li zadržati ovu postavku nakon završetka ovog događaja, mogao bih je pretvoriti u prikaz vremena ili slično.

Pričvrstio sam maticu i vijak zajedno s najlonskim odstojnicima na sva 4 ugla svog Pi 3A+. Ovo je strogo neobavezno. Učinio sam to jer ponekad imam ovo na metalnoj površini, nije mi se svidjelo da imam privremene postavke na Pi -u koji se nalazi unutar kućišta i ne želim riskirati da ga zabrljam jer sam ga zaboravio ukloniti iz metala površinu prije uključivanja.

Korak 2: Postavljanje Pi softvera

Postavljanje Pi softvera
Postavljanje Pi softvera
Postavljanje Pi softvera
Postavljanje Pi softvera
Postavljanje Pi softvera
Postavljanje Pi softvera

Kao što sam rekao u uvodu, nije važno koji model Raspberry Pi koristite. Koristim ovo na Raspberry Pi 3A+ preko WiFi -a, ali sam to testirao i na Raspberry Pi 2 na Ethernet kabelu, te Raspberry Pi Zero verzije 1.3 (prvi Pi Zero s priključkom za serijsku kameru) s USB WiFi ključem.

Neću tipkati kako instalirati Raspbian na MicroSD karticu jer postoje milijuni uputa kako to učiniti. Imam 16 GB microSD -a na kojem radi Raspbian Buster Lite. S druge strane, gotovo uvijek koristim Raspbian Lite jer mi ne trebaju drugi beskorisni softverski paketi u bilo kojem od mojih projekata. Ako instaliram softver pomoću apt-get, instalirat će nedostajuće preduvjete.

Povežite se na mrežu. Opet, postoje milijuni uputa kako to učiniti, tako da ovdje neću ulaziti u detalje. Možete koristiti žičanu ili bežičnu vezu, ali za to je potrebna internetska veza.

Izborno, ali možete omogućiti SSH povezivanje pomoću PuTTY -a. Učinio sam.

Ažurirajte sve, a zatim ponovno pokrenite sustav:

sudo apt ažuriranje

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo ponovno podizanje sustava

Ovo je jedno postavljanje kroz koje ću proći ovdje. Opet, postoje milijuni načina za to, ali najbolja referenca koju sam pronašao je upravo ovdje:

Ovdje su istaknuti:

sudo apt instalirajte i2c-tools

sudo apt instalirajte python-smbus

Također ćete morati omogućiti I2C

sudo raspi-config

- 5 Opcija sučelja

- P5 I2C

Ponovo pokrenite sustav kako biste primijenili promjene

sudo ponovno podizanje sustava

Sada je vrijeme da provjerite jeste li sve ovo dosad radili ispravno

i2cdetect -y 1

Ako je vaš zaslon uključen i vaš Raspberry Pi ga može vidjeti, imat ćete grafikon koji će se pojaviti. Adresa za 20x4 koji sam kupio na Amazonu i koji koristim za ovaj projekt je 27. Tehnički će se to identificirati kao 0x27 za python skripte koje će doći kasnije. Imao sam tu istu emisiju adresa za 2 ekrana 16x2 koje sam također kupio na Amazonu i jedan 40x2 koji sam pronašao na eBayu.

Korak 3: Postavljanje Pythona

Pa sada o složenim stvarima. Pokušat ću to učiniti što jednostavnijim. Za početak, samo ću pisati datoteke u kućni imenik.

dodirnite I2C_LCD_driver.py

nano I2C_LCD_driver.py

Zalijepite donji sadržaj u novostvorenu python skriptu.

#-*-kodiranje: utf-8-*- # Originalni kod pronađen na: #

"""

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

Znam da je ovaj scenarij prilično neuredan, ali učinkovit. Prikazat će trenutne statističke podatke o slučajevima Covid-19 u Sjedinjenim Državama. Glavna baza podataka ažurira se svakih 5 minuta. Mojoj skripti treba 1 minuta da potpuno prelista tri stranice i povući će ažurirane brojeve svaki put kad ciklus počne iznova.

Korak 4: Pokrenite Python

Pokrenite Python
Pokrenite Python
Pokrenite Python
Pokrenite Python

Započnimo:

python covid19.py

Na prvoj stranici prikazan je ukupan broj slučajeva i smrti od kada je koronavirus prvi put pogodio zemlju. Druga stranica prikazuje one brojeve slučajeva i smrti koji su se dogodili samo na današnji dan. Treći prikazuje ljude u kritičnom stanju, zatim slučajeve i smrt na milijun ljudi. Drugi redak na trećoj stranici prikazivao je datum prvog slučaja u zemlji, ali morao sam ga ukloniti jer bi skripta ponekad pogriješila i srušila se citirajući taj redak s pogreškom.

Postoje načini za automatsko pokretanje ove skripte, ali ovdje neću ulaziti u detalje o tome. Ja samo pokrećem svoju naredbu nakon što se SSH povežem s PuTTY -jem. Dok je pokrenut, nećete moći izvršavati druge naredbe dok ne pritisnete Ctrl+C.

Korak 5: Što ako ne živim u SAD -u?

Ova se skripta može izmijeniti tako da prikazuje statistiku za druge zemlje. Kao što možete vidjeti, URL u mojoj skripti vuče se iz API -ja ovdje: (nemojte koristiti Internet Explorer za pregled ovih stranica. Pokušat će preuzeti datoteku.json. Koristio sam Chrome)

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

Sada posjetite tu istu adresu, ali jednu mapu više

coronavirus-19-api.herokuapp.com/countries

Ovo navodi statistiku za svaku zemlju. Očito će to biti noćna mora koja pokušava izvući API podatke s ove stranice. Zato je najbolje otvoriti stranicu za svoju zemlju. Naši prijatelji u Kanadi trebali bi urediti skriptu na ovaj URL:

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

Ovdje vrlo važna napomena. URL API -ja mora biti specifičan … što znači da nema razmaka u URL -u. Pri pregledavanju weba razmaci na web adresi zamjenjuju se s "%20", a naši prijatelji u zemljama s dva naziva, poput Novog Zelanda, na primjer, trebaju zamijeniti URL u ovoj skripti sa:

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

Korak 6: Završne misli

Učinio sam mnoge stvari s Raspberry Pi i Arduinom tijekom godina, ali većina onoga što sam izgradio samo su replikacije tuđih ideja. Ovaj je gotovo isti, osim što sam u ovu postavku sastavio komade iz mnogih izvora. Iako vas ovo postavljanje neće držati sigurnim i zdravim u ovom teškom razdoblju, zasigurno će vas zaokupiti dok ga postavljate, ai naknadno će vas informirati.

Ako već nemate ove dijelove, nemojte se opterećivati kupnjom, osim ako ste ozbiljni u izgradnji. Kao što sam već rekao, vrijeme isporuke sada traje duže jer se ti napori ulažu u bitne stavke. Ove sam dijelove već imao samo za učenje i eksperimentiranje. Zaslon montiran na kutiju izvorno je postavljen za prikaz statistike u stvarnom vremenu za drugu Raspberry Pi na mojoj mreži koja radi s Pi-Holeom. Nakon što ovaj događaj Covid-19 završi, mogao bih ga pretvoriti u prikaz vremena.

Za svakoga tko čita, želim uputiti ovo uputstvo:

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

Nisam ga još probala, ali imam upravo te sastojke i možda ću probati neko vrijeme.

Preporučeni: