Sadržaj:
- Korak 1: Postavljanje hardvera
- Korak 2: Postavljanje Pi softvera
- Korak 3: Postavljanje Pythona
- Korak 4: Pokrenite Python
- Korak 5: Šta ako ne živim u SAD -u?
- Korak 6: Završne misli
Video: Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-31 10:17
Tako sam jednog dana nasumično, iz vedra neba, odlučio uzeti nekoliko dijelova koje sam ležao i napraviti nešto što će mi dostavljati statistiku u stvarnom vremenu o Covid-19. Nisam uložio mnogo vremena u to da izgleda lijepo jer zašto napraviti nešto trajno kada ovaj događaj neće biti? Stoga je moj ekran samo montiran na malu kartonsku kutiju.
Potrebni delovi:
- Raspberry Pi - bilo koji model. Koristio sam Raspberry Pi 3A+
- 20x4 I2C LCD ekran - nema posebne marke … ali mu 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 direktno na izvore koje sam kupio. Žao mi je što moram reći da se Adafruit trenutno ne isporučuje, 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 adapter naizmjenične struje, USB kabel i microSD kartica.
Korak 1: Postavljanje hardvera
Uputite se na priloženu sliku isječka. Kaže B+, ali se odnosi na sve ostale Raspberry Pi modele koji su došli nakon toga.
Uz I2C ruksak pričvršćen na LCD ekran, za rad ove veze potrebne su 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 ništa. Kao što sam rekao u uvodu, ovaj soj koronavirusa neće trajati vječno, pa mi ne trebaju ni postavke. Ako odlučim 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 zaboravio ukloniti ga iz metala površinu prije uključivanja.
Korak 2: 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 kablu, te Raspberry Pi Zero verzije 1.3 (prvi Pi Zero sa priključkom za serijsku kameru) sa 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 sa Raspbian Buster Lite -om. Sa 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 milioni uputstava o tome 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.
Opcionalno, ali možete omogućiti SSH povezivanje pomoću PuTTY -a. Ja sam uradio.
Ažurirajte sve pa ponovo pokrenite sistem:
sudo apt update
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo ponovno podizanje sustava
Ovo je jedno podešavanje kroz koje ću proći ovdje. Opet, postoje milioni 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 povezivanja
- P5 I2C
Ponovo pokrenite sistem kako biste primijenili promjene
sudo reboot
Sada je vrijeme da provjerite jeste li do sada sve 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, ovo će se identificirati kao 0x27 za python skripte koje će doći kasnije. Imao sam 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 na složene stvari. Potrudiću se da to bude što jednostavnije. Za početak, samo ću pisati datoteke u kućni direktorij.
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 efikasan. 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 je potrebna 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
Počnimo:
python covid19.py
Na prvoj stranici prikazan je ukupan broj slučajeva i smrti od kada je koronavirus prvi put pogodio državu. 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 milion ljudi. Drugi red 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 navodeći tu liniju s greš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 na nju preko PuTTY -a. Dok je pokrenut, nećete moći izvršavati druge naredbe dok ne pritisnete Ctrl+C.
Korak 5: Šta ako ne živim u SAD -u?
Ova se skripta može izmijeniti tako da prikazuje statistiku za druge zemlje. Kao što vidite, 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 jedan folder više
coronavirus-19-api.herokuapp.com/countries
Ovo navodi statistiku za svaku zemlju. Očigledno će biti prava mora pokušati izvući API podatke s ove stranice. Zato je najbolje otvoriti stranicu za svoju zemlju. Naši prijatelji u Kanadi bi morali urediti skriptu na ovaj URL:
coronavirus-19-api.herokuapp.com/countries/canada
Ovde veoma važna napomena. URL API -ja mora biti specifičan … što znači da nema razmaka u URL -u. Prilikom pregledavanja weba, razmaci na web adresi zamjenjuju se s "%20" i s tim u vezi, naši prijatelji u zemljama s dva naziva dijelova, 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 -jem i Arduinom -om godinama, 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 podešavanje neće držati sigurnim i zdravim u ovom teškom vremenu, zasigurno će vas zaokupiti dok ga postavljate, ai naknadno će vas obavještavati.
Ako već nemate ove dijelove, nemojte se opterećivati kupovinom, osim ako ste ozbiljni u izgradnji. Kao što sam već rekao, vrijeme isporuke trenutno traje duže jer se ti napori ulažu u bitne stavke. Ove sam dijelove već imao samo za učenje i eksperimentiranje. Ekran montiran na kutiju prvobitno je postavljen za prikaz statistike u realnom vremenu za drugu Raspberry Pi na mojoj mreži koja radi sa Pi-Hole-om. Nakon što se ovaj događaj Covid-19 završi, mogao bih ga pretvoriti u prikaz vremena.
Za svakoga ko čita, želim da uzviknem ovo uputstvo:
www.instructables.com/id/DIY-Hand-Sanitize…
Još nisam probala, ali imam baš te sastojke i možda ću probati neko vrijeme.
Preporučuje se:
Raspberry Pi - HIH6130 I2C Senzor vlažnosti i temperature Python Vodič: 4 koraka
Raspberry Pi - HIH6130 I2C Senzor vlažnosti i temperature Python Vodič: HIH6130 je senzor vlažnosti i temperature s digitalnim izlazom. Ovi senzori pružaju nivo preciznosti od ± 4% RH. Uz dugoročnu stabilnost, vodeću u industriji, digitalni I2C s kompenzacijom temperature, vodeću pouzdanost u industriji, energetsku učinkovitost
Raspberry Pi - HIH6130 I2C senzor vlažnosti i temperature Java Tutorial: 4 koraka
Raspberry Pi - HIH6130 I2C senzor vlažnosti i temperature Java vodič: HIH6130 je senzor vlažnosti i temperature s digitalnim izlazom. Ovi senzori pružaju nivo preciznosti od ± 4% RH. Uz dugoročnu stabilnost, vodeću u industriji, digitalni I2C s kompenzacijom temperature, vodeću pouzdanost u industriji, energetsku učinkovitost
Raspberry PI više I2C uređaja: 3 koraka
Raspberry PI više I2C uređaja: Frustrirano jer ne možete koristiti više istih I2C uređaja u svom projektu. Nema potrebe za upotrebom sporih multipleksera. Najnovije raspbian kernel podržava stvaranje više I2C sabirnica koristeći GPIO pinove. Ovo rješenje je super brzo