Cuprins:

Covid-19 Statistici + Raspberry Pi + LCD I2C: 6 pași
Covid-19 Statistici + Raspberry Pi + LCD I2C: 6 pași

Video: Covid-19 Statistici + Raspberry Pi + LCD I2C: 6 pași

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

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

Configurare hardware
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

Configurare software Pi
Configurare software Pi
Configurare software Pi
Configurare software Pi
Configurare software Pi
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

Rulați Python
Rulați Python
Rulați Python
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: