Indholdsfortegnelse:

Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 trin
Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 trin

Video: Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 trin

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

Så tilfældigt ud af det blå en dag besluttede jeg mig for at få et par dele, jeg havde liggende, og lave noget, der ville levere mig statistik i realtid om Covid-19. Jeg brugte ikke meget tid på at få det til at se godt ud, for hvorfor lave noget permanent, når denne begivenhed ikke kommer til at være? Derfor er mit display bare monteret på en lille papkasse.

Nødvendige dele:

  • Raspberry Pi - enhver model. Jeg brugte Raspberry Pi 3A+
  • 20x4 I2C LCD Display - intet bestemt mærke … men har brug for I2C rygsæk
  • Kvinder til hun -jumperledninger - Bare 4 af dem for at forbinde 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 links går direkte til de kilder, jeg købte fra. Beklager at sige, at Adafruit ikke leverer lige nu, men Amazon er … bare langsomt på grund af deres hovedfokus er mod væsentlige varer, hvilket disse ikke er. Alt kan findes andre steder på Amazon og eBay.

Du skal naturligvis bruge en lysnetadapter, USB -kabel og microSD -kort til alt dette.

Trin 1: Hardwareopsætning

Hardwareopsætning
Hardwareopsætning

Se det vedhæftede pinout -billede. Det siger B+, men det gælder for hver anden Raspberry Pi -model, der også er kommet efter den.

Med en I2C -rygsæk tilsluttet LCD -displayet kræver denne forbindelse kun 4 ledninger for at fungere.

Tilslut GND til en af jordstifterne på Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Jeg sluttede den til pin 6.

Tilslut VCC til en af de 5 volt pins på Raspberry Pi: Pin 2, 4. Jeg brugte pin 4

Tilslut SDA til pin 3.

Tilslut SCL til pin 5.

Hvis du fulgte min opsætning, ender du med alle 4 ledninger i et 2x2 -mønster på GPIO -overskrifterne.

Din monteringsmetode kan være alt, hvad du kan forestille dig … eller slet ikke noget. Som jeg sagde i introduktionen, vil denne stamme af coronavirus ikke vare evigt, så jeg behøver heller ikke min opsætning. Hvis jeg beslutter mig for at beholde denne opsætning, efter at denne begivenhed er overstået, kan jeg gøre det til et vejrvisning eller noget.

Jeg fastgjorde en møtrik og bolt sammen med nylonafstandsstykker til alle 4 hjørner af min Pi 3A+. Dette er strengt valgfrit. Jeg gjorde dette, fordi jeg nogle gange har dette på en metaloverflade, kunne ikke lide at have mine midlertidige opsætninger på en Pi, der er inde i en sag, og vil ikke risikere at ødelægge det, fordi jeg glemte at fjerne det fra metallet overfladen, før den tændes.

Trin 2: Opsætning af Pi -software

Opsætning af Pi -software
Opsætning af Pi -software
Opsætning af Pi -software
Opsætning af Pi -software
Opsætning af Pi -software
Opsætning af Pi -software

Som jeg sagde i introduktionen, er det ligegyldigt hvilken Raspberry Pi -model du bruger. Jeg bruger dette på en Raspberry Pi 3A+ over WiFi, men har også testet dette på Raspberry Pi 2 på ethernet -kabel og Raspberry Pi Zero version 1.3 (den allerførste Pi Zero med seriekamera -stikket) med en USB WiFi -dongle.

Jeg vil ikke skrive ud, hvordan man installerer Raspbian på et MicroSD -kort, fordi der er millioner af instruktioner om, hvordan man gør det. Jeg har en 16 GB microSD, der kører Raspbian Buster Lite. På en sidebemærkning bruger jeg næsten altid Raspbian Lite, fordi jeg ikke har brug for de andre ubrugelige softwarepakker i nogen af mine projekter. Hvis jeg installerer software ved hjælp af apt-get, installerer det manglende forudsætninger.

Opret forbindelse til et netværk. Igen er der millioner af instruktioner derude om, hvordan man gør dette, så jeg vil ikke gå i dybden her. Du kan gå kablet eller trådløst, men dette kræver en internetforbindelse.

Valgfrit, men du kan aktivere SSH til at oprette forbindelse ved hjælp af PuTTY. Jeg gjorde.

Opdater alt, og genstart derefter:

sudo apt opdatering

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot

Dette er en opsætning, som jeg vil gennemgå her. Igen er der millioner af måder at gøre dette på, men den bedste reference, jeg fandt, er lige her:

Her er højdepunkterne:

sudo apt installere i2c-værktøjer

sudo apt installere python-smbus

Du skal også aktivere I2C

sudo raspi-config

- 5 grænsefladeindstillinger

- P5 I2C

Genstart for at anvende ændringerne

sudo genstart

Nu er det tid til at se, om du har gjort alt dette korrekt indtil nu

i2cdetect -y 1

Hvis din skærm er tændt og kan ses af din Raspberry Pi, har du et diagram, der kommer op. Adressen til de 20x4, jeg købte på Amazon og brugte til dette projekt, er 27. Teknisk set identificeres dette som 0x27 for de python -scripts, der kommer senere. Jeg har haft det samme adresseshow for 2 16x2 skærme, jeg også købte på Amazon og et 40x2, jeg fandt på eBay.

Trin 3: Python -opsætning

Så nu til de komplekse ting. Jeg vil prøve at holde det så enkelt som jeg kan. Til at begynde med vil jeg bare skrive filer til hjemmekataloget.

tryk på I2C_LCD_driver.py

nano I2C_LCD_driver.py

Indsæt nedenstående indhold i dit nyoprettede python -script.

#-*-kodning: utf-8-*- # Original kode fundet 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 ved, at dette script er ret rodet, men det er effektivt. Det viser aktuelle statistikker for Covid-19-tilfælde i USA. Hoveddatabasen opdateres hvert 5. minut. Mit script tager 1 minut at fuldstændig gennemgå 3 sider og trækker opdaterede numre hver gang cyklussen begynder igen.

Trin 4: Kør Python

Kør Python
Kør Python
Kør Python
Kør Python

Lad os begynde:

python covid19.py

Den første side viser det samlede antal tilfælde og dødsfald, siden coronavirus først ramte landet. Den anden side viser disse tal for tilfælde og dødsfald, der kun fandt sted den aktuelle dag. Den tredje viser mennesker i kritisk tilstand, derefter tilfælde og dødsfald pr. Million mennesker. Den anden linje på den tredje side plejede at vise datoen for den første sag i landet, men jeg var nødt til at fjerne den, fordi scriptet nogle gange ville fejle og gå ned med henvisning til denne linje med en fejl.

Der er måder at få dette script til at køre automatisk, men jeg vil ikke gå ind på detaljer om det her. Jeg kører bare min på kommando, efter at jeg SSH har oprettet forbindelse til den via PuTTY. Mens den kører, kan du ikke udføre andre kommandoer, før du trykker på Ctrl+C.

Trin 5: Hvad hvis jeg ikke bor i USA?

Dette script kan ændres til at vise statistik for andre lande. Som du måske ser, hentes URL'en i mit script fra en API her: (brug ikke Internet Explorer til at se disse sider. Den vil forsøge at downloade en.json -fil. Jeg brugte Chrome)

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

Besøg nu den samme adresse, men en mappe højere

coronavirus-19-api.herokuapp.com/countries

Dette viser statistikken for hvert land. Det er naturligvis et mareridt, der forsøger at hente API -data fra denne side. Så det er bedst at åbne siden for dit specifikke land. Vores venner i Canada skulle redigere scriptet til denne URL:

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

Meget vigtig note her. URL'en til API skal være specifik … hvilket betyder, at der ikke er mellemrum i en URL. I webbrowsing erstattes mellemrum i en webadresse med "%20", og med det sagt ville vores venner i lande med 2 delnavne, f.eks. New Zealand, skulle erstatte URL'en i dette script med:

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

Trin 6: Afsluttende tanker

Jeg har gjort mange ting med Raspberry Pi og Arduino gennem årene, men det meste af det, jeg har bygget, er bare replikationer af andres ideer. Denne er næsten den samme, bortset fra at jeg har samlet stykker fra mange kilder til denne opsætning. Selvom denne opsætning ikke vil holde dig sikker og sund i denne hårde tid, vil den helt sikkert holde dig beskæftiget, mens du konfigurerer den, og den vil holde dig informeret bagefter.

Hvis du ikke allerede har disse dele, skal du ikke stresse dig selv med at købe dem, medmindre du er seriøs om at bygge dem. Som jeg sagde før, tager leveringstider længere tid lige nu, fordi disse bestræbelser bliver lagt på væsentlige varer. Jeg havde kun disse dele allerede til at lære og eksperimentere. Den monterede skærm blev oprindeligt konfigureret til at se realtidsstatistik for en anden Raspberry Pi på mit netværk, der kører Pi-Hole. Efter denne Covid-19-begivenhed er forbi, kan jeg gøre den til en vejrvisning.

For alle, der læser, vil jeg give et råb til denne instruktive:

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

Jeg har ikke prøvet det endnu, men jeg har de nøjagtige ingredienser, og jeg kan prøve det et stykke tid.

Anbefalede: