Innholdsfortegnelse:

Covid-19-statistikk + Raspberry Pi + I2C LCD: 6 trinn
Covid-19-statistikk + Raspberry Pi + I2C LCD: 6 trinn

Video: Covid-19-statistikk + Raspberry Pi + I2C LCD: 6 trinn

Video: Covid-19-statistikk + Raspberry Pi + I2C LCD: 6 trinn
Video: A Black Hills South Dakota Brewery Tour! | GO TRY Miner Brewing Company's Delicious Craft Beers! 2024, Juli
Anonim
Covid-19 statistikk + Raspberry Pi + I2C LCD
Covid-19 statistikk + Raspberry Pi + I2C LCD

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

Maskinvareoppsett
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

Oppsett av Pi -programvare
Oppsett av Pi -programvare
Oppsett av Pi -programvare
Oppsett av Pi -programvare
Oppsett av Pi -programvare
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

Kjør Python
Kjør Python
Kjør Python
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: