Innholdsfortegnelse:
- Trinn 1: Maskinvareoppsett
- Trinn 2: Oppsett av Pi -programvare
- Trinn 3: Python -oppsett
- Trinn 4: Kjør Python
- Trinn 5: Hva om jeg ikke bor i USA?
- Trinn 6: Avsluttende tanker
Video: Covid-19-statistikk + Raspberry Pi + I2C LCD: 6 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-31 10:23
Så tilfeldig ut av det blå en dag, bestemte jeg meg for å få noen deler jeg hadde liggende og lage noe som ville gi meg sanntidsstatistikk om Covid-19. Jeg brukte ikke mye tid på å få det til å se fint ut, fordi hvorfor gjøre noe permanent når dette arrangementet ikke kommer til å bli? Derfor er skjermen min bare montert på en liten pappeske.
Nødvendige deler:
- Raspberry Pi - hvilken som helst modell. Jeg brukte Raspberry Pi 3A+
- 20x4 I2C LCD -skjerm - ikke noe spesielt merke … men trenger I2C -ryggsekken
- Jumper -ledninger til kvinner - bare fire av dem for å koble I2C til Pi
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Disse koblingene går direkte til kildene jeg kjøpte fra. Beklager å si at Adafruit ikke leverer akkurat nå, men Amazon er … bare sakte på grunn av at hovedfokuset deres er på viktige ting, som disse ikke er. Alt finnes andre steder på Amazon og eBay.
Du trenger åpenbart en strømadapter, USB -kabel og microSD -kort for å gå med alt dette.
Trinn 1: Maskinvareoppsett
Se det vedlagte pinout -bildet. Det står B+, men det gjelder alle andre Raspberry Pi -modeller som også har kommet etter den.
Med en I2C -ryggsekk festet til LCD -skjermen, krever denne tilkoblingen bare 4 ledninger for å fungere.
Koble GND til en av jordpinnene på Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Jeg koblet den til pin 6.
Koble VCC til en av de 5 volt pinnene på Raspberry Pi: Pin 2, 4. Jeg brukte pin 4
Koble SDA til pinne 3.
Koble SCL til pin 5.
Hvis du fulgte oppsettet mitt, vil du ende opp med alle 4 ledninger i et 2x2 -mønster på GPIO -overskriftene.
Monteringsmetoden din kan være alt du kan forestille deg … eller ingenting i det hele tatt. Som jeg sa i introduksjonen, vil denne stammen av koronaviruset ikke vare evig, så jeg trenger ikke oppsettet mitt for det heller. Hvis jeg bestemmer meg for å beholde dette oppsettet etter at dette arrangementet er over, kan jeg gjøre det til en værvisning eller noe.
Jeg festet en mutter og bolt sammen med nylon -avstandsstykker til alle 4 hjørnene på Pi 3A+. Dette er strengt valgfritt. Jeg gjorde dette fordi jeg noen ganger har dette på en metalloverflate, likte ikke å ha mine midlertidige oppsett på en Pi som er inne i etuiet, og vil ikke risikere å rote det fordi jeg glemte å fjerne det fra metallet overflaten før du slår den på.
Trinn 2: Oppsett av Pi -programvare
Som jeg sa i introen, spiller det ingen rolle hvilken Raspberry Pi -modell du bruker. Jeg bruker dette på en Raspberry Pi 3A+ over WiFi, men har også testet dette på Raspberry Pi 2 på ethernet -kabel og Raspberry Pi Zero versjon 1.3 (den aller første Pi Zero med seriekamera -kontakten) med en USB WiFi -dongle.
Jeg kommer ikke til å skrive ut hvordan jeg installerer Raspbian på et MicroSD -kort fordi det er millioner av instruksjoner om hvordan du gjør det. Jeg har en 16 GB microSD som kjører Raspbian Buster Lite. På en side notat, jeg bruker nesten alltid Raspbian Lite fordi jeg ikke trenger de andre ubrukelige programvarepakkene i noen av prosjektene mine. Hvis jeg installerer programvare med apt-get, installeres manglende forutsetninger.
Koble til et nettverk. Igjen er det millioner av instruksjoner der ute om hvordan du gjør dette, så jeg skal ikke gå i dybden her. Du kan gå kablet eller trådløst, men dette krever en internettforbindelse.
Valgfritt, men du kan aktivere SSH for å koble til med PuTTY. Jeg gjorde.
Oppdater alt og start deretter på nytt:
sudo apt oppdatering
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Dette er et oppsett som jeg vil gå igjennom her. Igjen er det millioner av måter å gjøre dette på, men den beste referansen jeg fant er her:
Her er høydepunktene:
sudo apt installer i2c-verktøy
sudo apt installer python-smbus
Du må også aktivere I2C
sudo raspi-config
- 5 grensesnittalternativer
- P5 I2C
Start på nytt for å bruke endringene
sudo omstart
Nå er det på tide å se om du har gjort alt dette riktig så langt
i2cdetect -y 1
Hvis skjermen er slått på og kan ses av din Raspberry Pi, har du et diagram som kommer opp. Adressen for 20x4 jeg kjøpte på Amazon og brukte for dette prosjektet er 27. Teknisk vil dette identifisere seg som 0x27 for python -skriptene som kommer senere. Jeg har hatt det samme adresseshowet for 2 16x2 skjermer jeg også kjøpte på Amazon og en 40x2 jeg fant på eBay.
Trinn 3: Python -oppsett
Så nå for de komplekse tingene. Jeg skal prøve å holde det så enkelt som jeg kan. Til å begynne med skal jeg bare skrive filer til hjemmekatalogen.
trykk på I2C_LCD_driver.py
nano I2C_LCD_driver.py
Lim inn innholdet nedenfor i det nyopprettede python -skriptet ditt.
#-*-koding: utf-8-*- # Original kode funnet på: #
"""
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),="">
Jeg vet at dette skriptet er ganske rotete, men det er effektivt. Den vil vise gjeldende statistikk for Covid-19-tilfeller i USA. Hoveddatabasen oppdateres hvert 5. minutt. Skriptet mitt tar 1 minutt å fullstendig bla gjennom 3 sider og vil trekke oppdaterte tall hver gang syklusen begynner igjen.
Trinn 4: Kjør Python
La oss begynne:
python covid19.py
Den første siden viser totalt antall tilfeller og dødsfall siden koronaviruset først rammet landet. Den andre siden viser tallene for tilfeller og dødsfall som bare skjedde denne dagen. Den tredje viser mennesker i kritisk tilstand, deretter tilfeller og dødsfall per million mennesker. Den andre linjen på den tredje siden pleide å vise datoen for den første saken i landet, men jeg måtte fjerne den fordi skriptet noen ganger ville feile og krasje med henvisning til den linjen med en feil.
Det er måter å få dette skriptet til å kjøre automatisk, men jeg vil ikke gå inn på detaljer om det her. Jeg kjører bare min på kommando etter at jeg SSH kobler til den via PuTTY. Mens den kjører, vil du ikke kunne utføre andre kommandoer før du trykker på Ctrl+C.
Trinn 5: Hva om jeg ikke bor i USA?
Dette skriptet kan endres for å vise statistikk for andre land. Som du kanskje ser, hentes nettadressen i skriptet mitt fra et API her: (ikke bruk Internet Explorer for å se disse sidene. Den prøver å laste ned en.json -fil. Jeg brukte Chrome)
coronavirus-19-api.herokuapp.com/countries/usa
Besøk nå den samme adressen, men en mappe høyere
coronavirus-19-api.herokuapp.com/countries
Dette viser statistikken for hvert land. Åpenbart vil det være et mareritt å prøve å hente API -data fra denne siden. Så det er best å åpne siden for ditt spesifikke land. Våre venner i Canada må redigere skriptet til denne URL -adressen:
coronavirus-19-api.herokuapp.com/countries/canada
Veldig viktig note her. URL -en til API -en må være spesifikk … noe som betyr at det ikke er mellomrom i en URL -adresse. I nettlesing erstattes mellomrom i en nettadresse med "%20", og med det sagt vil våre venner i land med to delnavn, for eksempel New Zealand, måtte erstatte nettadressen i dette skriptet med:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Trinn 6: Avsluttende tanker
Jeg har gjort mange ting med Raspberry Pi og Arduino gjennom årene, men det meste jeg har bygd er bare kopier av andres ideer. Denne er nesten den samme bortsett fra at jeg samlet stykker fra mange kilder til dette oppsettet. Selv om dette oppsettet ikke vil holde deg trygg og sunn i denne tøffe tiden, vil det sikkert holde deg opptatt mens du konfigurerer det, og det vil holde deg informert etterpå.
Hvis du ikke allerede har disse delene, må du ikke stresse med å kjøpe dem med mindre du er seriøs med å bygge den. Som jeg sa før, tar leveringstiden lengre tid akkurat nå fordi innsatsen blir lagt mot viktige varer. Jeg hadde bare disse delene allerede for å lære og eksperimentere. Den monterte skjermen ble opprinnelig satt opp for å se sanntidsstatistikk for en annen Raspberry Pi på nettverket mitt som kjører Pi-Hole. Etter at denne Covid-19-hendelsen er over, kan jeg gjøre den til en værvisning.
For alle som leser, vil jeg rope ut til denne instruktive:
www.instructables.com/id/DIY-Hand-Sanitize…
Jeg har ikke prøvd det ennå, men jeg har de nøyaktige ingrediensene, og jeg kan prøve det en gang.
Anbefalt:
Raspberry Pi - HIH6130 I2C Fuktighets- og temperatursensor Pythonopplæring: 4 trinn
Raspberry Pi - HIH6130 I2C Fuktighets- og temperatursensor Pythonopplæring: HIH6130 er en fuktighets- og temperatursensor med digital utgang. Disse sensorene gir et nøyaktighetsnivå på ± 4% RF. Med bransjeledende langsiktig stabilitet, ekte temperaturkompensert digital I2C, bransjeledende pålitelighet, energieffektivitet
Raspberry Pi - HIH6130 I2C Fuktighets- og temperatursensor Java Opplæring: 4 trinn
Raspberry Pi - HIH6130 I2C Fuktighets- og temperatursensor Java Opplæring: HIH6130 er en fuktighets- og temperatursensor med digital utgang. Disse sensorene gir et nøyaktighetsnivå på ± 4% RF. Med bransjeledende langsiktig stabilitet, ekte temperaturkompensert digital I2C, bransjeledende pålitelighet, energieffektivitet