Cuprins:
- Pasul 1: Configurare hardware
- Pasul 2: Configurare software Pi
- Pasul 3: Configurare Python
- Pasul 4: Rulați Python
- Pasul 5: Ce se întâmplă dacă nu locuiesc în SUA?
- Pasul 6: Gânduri finale
Video: Covid-19 Statistici + Raspberry Pi + LCD I2C: 6 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-31 10:24
Deci, la întâmplare, din senin, într-o zi, am decis să iau câteva părți pe care le aveam și să fac ceva care să-mi ofere statistici în timp real pe Covid-19. Nu am pus mult timp să-l facă să arate frumos, pentru că de ce să fac ceva permanent atunci când acest eveniment nu va fi? Prin urmare, afișajul meu este montat doar pe o cutie mică de carton.
Piese necesare:
- Raspberry Pi - orice model. Am folosit Raspberry Pi 3A +
- Afișaj LCD 20x4 I2C - nicio marcă specială … dar are nevoie de rucsacul I2C
- Sârme jumper de la femelă la femeie - Doar 4 dintre ele pentru a conecta I2C la Pi
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Aceste linkuri merg direct la sursele de la care am achiziționat. Îmi pare rău să spun că Adafruit nu livrează chiar acum, dar Amazon este … doar încet, datorită concentrării lor principale către articole esențiale, care nu sunt. Toate pot fi găsite în altă parte pe Amazon și eBay.
În mod evident, veți avea nevoie de un adaptor de curent alternativ, cablu USB și card microSD pentru a merge cu toate acestea.
Pasul 1: Configurare hardware
Faceți referință la imaginea atașată atașată. Scrie B +, dar se aplică oricărui alt model Raspberry Pi care a venit și după acesta.
Cu un rucsac I2C atașat la afișajul LCD, această conexiune necesită doar 4 fire pentru a funcționa.
Conectați GND la oricare dintre pinii de masă de pe Raspberry Pi: Pinul 6, 9, 14, 20, 25, 30, 34, 39. L-am conectat la pinul 6.
Conectați VCC la oricare dintre pinii de 5 volți de pe Raspberry Pi: Pinul 2, 4. Am folosit pinul 4
Conectați SDA la pinul 3.
Conectați SCL la pinul 5.
Dacă ați urmat configurarea mea, veți ajunge cu toate cele 4 fire într-un model 2x2 pe antetele GPIO.
Metoda ta de montare poate fi orice îți poți imagina … sau nimic. Așa cum am spus în introducere, această tulpină a coronavirusului nu va dura pentru totdeauna, așa că nici nu am nevoie de configurarea mea. Dacă decid să păstrez această configurație după încheierea acestui eveniment, aș putea să o transform într-un afișaj meteo sau ceva de genul acesta.
Am atașat o piuliță și un șurub împreună cu distanțiere din nailon la toate cele 4 colțuri ale Pi 3A +. Acest lucru este strict opțional. Am făcut asta pentru că uneori am asta pe o suprafață metalică, nu mi-a plăcut să am configurațiile mele temporare pe un Pi care se află în interiorul unei carcase și nu vreau să risc să-l încurc deoarece am uitat să-l scot din metal înainte de a o porni.
Pasul 2: Configurare software Pi
După cum am spus în introducere, nu contează ce model de Raspberry Pi folosiți. Folosesc acest lucru pe un Raspberry Pi 3A + prin WiFi, dar am testat și acest lucru pe Raspberry Pi 2 pe cablu Ethernet și Raspberry Pi Zero versiunea 1.3 (primul Pi Zero cu conectorul camerei seriale) cu un dongle USB WiFi.
Nu voi scrie cum să instalez Raspbian pe un card MicroSD, deoarece există milioane de instrucțiuni despre cum să faci asta. Am un microSD de 16 GB care rulează Raspbian Buster Lite. Pe de o parte, folosesc aproape întotdeauna Raspbian Lite pentru că nu am nevoie de celelalte pachete software inutile în niciunul dintre proiectele mele. Dacă instalez software utilizând apt-get, acesta va instala condițiile preliminare lipsă.
Conectați-vă la o rețea. Din nou, există milioane de instrucțiuni despre cum să fac acest lucru, așa că nu voi intra în profunzime aici. Puteți trece prin cablu sau fără fir, dar acest lucru va necesita o conexiune la internet.
Opțional, dar puteți permite SSH să se conecteze utilizând PuTTY. Am facut.
Actualizați totul, apoi reporniți:
actualizare sudo apt
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Aceasta este o configurație prin care voi trece aici. Din nou, există milioane de modalități de a face acest lucru, dar cea mai bună referință pe care am găsit-o este chiar aici:
Iată cele mai importante momente:
sudo apt instalează i2c-tools
sudo apt instalează python-smbus
De asemenea, va trebui să activați I2C
sudo raspi-config
- 5 Opțiuni de interfață
- P5 I2C
Reporniți pentru a aplica modificările
sudo reboot
Acum este timpul să vedem dacă ați făcut totul corect până acum
i2cdetect -y 1
Dacă afișajul dvs. este alimentat și poate fi văzut de Raspberry Pi, veți avea o diagramă care apare. Adresa pentru 20x4 pe care am cumpărat-o pe Amazon și pe care o folosesc pentru acest proiect este 27. Din punct de vedere tehnic, aceasta se va identifica ca 0x27 pentru scripturile python care vor veni mai târziu. Am avut același spectacol de adrese pentru 2 afișaje de 16x2 pe care le-am cumpărat și pe Amazon și unul de 40x2 pe care l-am găsit pe eBay.
Pasul 3: Configurare Python
Deci acum pentru lucrurile complexe. Voi încerca să-l păstrez cât de simplu pot. Pentru început, voi scrie doar fișiere în directorul principal.
atingeți I2C_LCD_driver.py
nano I2C_LCD_driver.py
Inserați conținutul de mai jos în scriptul dvs. Python nou creat.
# - * - codare: utf-8 - * - # Cod original găsit la: #
"""
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),="">
Știu că acest script este destul de dezordonat, dar este eficient. Va afișa statistici actuale pentru cazurile Covid-19 din Statele Unite. Baza de date principală este actualizată la fiecare 5 minute. Scriptul meu durează 1 minut pentru a parcurge complet 3 pagini și va extrage numerele actualizate de fiecare dată când ciclul începe din nou.
Pasul 4: Rulați Python
Sa incepem:
python covid19.py
Prima pagină arată numărul total de cazuri și decese de când coronavirusul a lovit prima dată țara. A doua pagină arată acele cifre pentru cazuri și decese care au avut loc numai în ziua curentă. Al treilea arată persoanele aflate în stare critică, apoi cazuri și decese la un milion de persoane. Cea de-a doua linie de pe a treia pagină obișnuia să arate data primului caz din țară, dar a trebuit să o elimin, deoarece scriptul ar fi uneori eronat și se va prăbuși citând acea linie cu o eroare.
Există modalități de a face acest script să ruleze automat, dar nu voi intra în detalii despre asta aici. Tocmai o execut pe a mea la comandă după ce mă conectez SSH la ea prin PuTTY. În timp ce rulează, nu veți putea executa alte comenzi până când nu apăsați Ctrl + C.
Pasul 5: Ce se întâmplă dacă nu locuiesc în SUA?
Acest script poate fi modificat pentru a afișa statistici pentru alte țări. După cum puteți vedea, adresa URL din scriptul meu se extrage dintr-un API aici: (nu utilizați Internet Explorer pentru a vizualiza aceste pagini. Se va încerca să descarce un fișier.json. Am folosit Chrome)
coronavirus-19-api.herokuapp.com/countries/usa
Acum vizitați aceeași adresă, dar cu un dosar mai mare
coronavirus-19-api.herokuapp.com/countries
Aceasta listează statisticile pentru fiecare țară. Evident, va fi un coșmar care încearcă să extragă date API de pe această pagină. Deci, cel mai bine este să deschideți pagina pentru țara dvs. specifică. Prietenii noștri din Canada ar trebui să editeze scriptul la această adresă URL:
coronavirus-19-api.herokuapp.com/countries/canada
Notă foarte importantă aici. Adresa URL către API trebuie să fie specifică … adică nu există spații într-o adresă URL. În navigarea pe web, spațiile dintr-o adresă web sunt înlocuite cu „% 20” și, cu toate acestea, prietenii noștri din țări cu 2 nume de piese, cum ar fi Noua Zeelandă, de exemplu, ar trebui să înlocuiască adresa URL din acest script cu:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Pasul 6: Gânduri finale
Am făcut multe lucruri cu Raspberry Pi și Arduino de-a lungul anilor, dar cele mai multe dintre ceea ce am construit sunt doar replici ale ideilor altora. Acesta este aproape același, cu excepția faptului că am compilat piese din mai multe surse în această configurație. Deși această configurație nu vă va menține în siguranță și sănătos în acest moment dificil, cu siguranță vă va ține ocupat pe măsură ce ați configurat-o și vă va ține informat ulterior.
Dacă nu aveți deja aceste piese, nu vă stresați să le cumpărați decât dacă sunteți serios în construcția lor. Așa cum am spus mai devreme, timpul de expediere durează mai mult chiar acum, deoarece aceste eforturi sunt depuse pentru articole esențiale. Am avut deja aceste părți doar pentru învățare și experimentare. Afișajul montat pe cutie a fost configurat inițial pentru a vizualiza statisticile în timp real ale unui alt Raspberry Pi din rețeaua mea care rulează Pi-Hole. După încheierea acestui eveniment Covid-19, aș putea să-l transform într-un afișaj meteo.
Pentru oricine citește, vreau să strig acest instructabil:
www.instructables.com/id/DIY-Hand-Sanitize…
Nu l-am încercat încă, dar am acele ingrediente exacte și s-ar putea să încerc ceva timp.
Recomandat:
Cum să citiți datele DHT pe ecranul LCD folosind Raspberry Pi: 6 pași
Cum să citiți datele DHT pe LCD folosind Raspberry Pi: Temperatura și umiditatea relativă sunt date importante despre vreme în medii. Cele două pot fi datele pe care le oferă o mini stație meteo. Citirea temperaturii și a umidității relative cu Raspberry Pi poate fi realizată folosind diferite variante
Interfață LCD 16x2 cu Raspberry Pi: 7 pași
Interfață LCD 16x2 cu Raspberry Pi: Bună ziua, prieteni, astăzi am interfață de afișare 16x2 la Raspberry pi
Utilizarea ecranelor LCD pe Raspberry Pi: 4 pași
Utilizarea LCD-urilor pe Raspberry Pi: În acest Instructable vă voi arăta cum să utilizați un ecran LCD de 16x2 cu un Raspberry Pi folosind codul meu specializat. Codul meu este o versiune modificată a codului de server LCD al lui Matt Hawkins, ceea ce face mai ușoară trimiterea textului pe ecran. Tot ce trebuie: fugiți
Interfață 16x2 LCD alfanumerică și tastatură matricială 4x4 cu Raspberry Pi3: 5 pași (cu imagini)
Interfață Tastatură matricială LCD alfanumerică 16x2 And4x4 cu Raspberry Pi3: În acest instructable, vă explicăm cum să interfațați tastatura matricială LED 16x2 și 4x4 cu Raspberry Pi3. Folosim Python 3.4 pentru dezvoltarea software-ului. Puteți alege și Python 2.7, cu mici modificări