Kazalo:
- 1. korak: Namestitev strojne opreme
- 2. korak: Namestitev programske opreme Pi
- 3. korak: Nastavitev Pythona
- 4. korak: Zaženite Python
- 5. korak: Kaj če ne živim v ZDA?
- Korak 6: Zadnje misli
Video: Statistika Covid-19 + Raspberry Pi + I2C LCD: 6 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-31 10:24
Tako sem se nekega dne naključno iz nič nenadoma odločil, da bom dobil nekaj delov, ki sem jih imel, in naredil nekaj, kar bi mi v realnem času prineslo statistiko o Covid-19. Nisem vložil veliko časa v to, da bi bilo videti lepo, zakaj zakaj narediti nekaj trajnega, ko tega dogodka ne bo? Zato je moj zaslon le nameščen na majhno kartonsko škatlo.
Potrebni deli:
- Raspberry Pi - kateri koli model. Uporabil sem Raspberry Pi 3A+
- 20x4 LCD zaslon I2C - brez posebne znamke … vendar potrebuje nahrbtnik I2C
- Moške žice za ženske - samo 4 od njih za priključitev I2C na Pi
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Te povezave gredo neposredno do virov, ki sem jih kupil. Žal moram povedati, da Adafruit trenutno ne dobavlja, Amazon pa … počasi, ker je njihov glavni poudarek na bistvenih izdelkih, ki pa to niso. Vse lahko najdete drugje na Amazonu in eBayu.
Za vse to boste očitno potrebovali napajalnik, kabel USB in kartico microSD.
1. korak: Namestitev strojne opreme
Skličite se na priloženo sliko pinout. Piše B+, vendar velja tudi za vse druge modele Raspberry Pi, ki so prišli po tem modelu.
Z nahrbtnikom I2C, pritrjenim na LCD zaslon, za to povezavo potrebujete le 4 žice.
Priključite GND na katerega koli od ozemljitvenih zatičev na Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Priključil sem ga na pin 6.
VCC priključite na enega od 5 -voltnih zatičev na Raspberry Pi: Pin 2, 4. Uporabil sem pin 4
Priključite SDA na pin 3.
Priključite SCL na pin 5.
Če ste sledili moji nastavitvi, boste imeli na glavi GPIO vse 4 žice v vzorcu 2x2.
Vaš način pritrditve je lahko karkoli si zamislite … ali pa sploh nič. Kot sem rekel v uvodu, ta sev koronavirusa ne bo trajal večno, zato moje nastavitve niti ne potrebujem. Če se odločim obdržati to nastavitev tudi po tem dogodku, jo lahko spremenim v prikaz vremena ali kaj podobnega.
Na vse 4 vogale mojega Pi 3A+sem pritrdil matico in vijak skupaj z najlonskimi distančniki. To je strogo neobvezno. To sem naredil, ker imam včasih to na kovinski površini, ni mi bilo všeč, da imam začasne nastavitve na Pi, ki je v ohišju, in ne želim tvegati, da bi ga zmotil, ker sem ga pozabil odstraniti iz kovine površino, preden jo vklopite.
2. korak: Namestitev programske opreme Pi
Kot sem rekel v uvodu, ni pomembno, kateri model Raspberry Pi uporabljate. To uporabljam na Raspberry Pi 3A+ prek WiFi, vendar sem to preizkusil tudi na Raspberry Pi 2 na ethernetnem kablu in Raspberry Pi Zero različice 1.3 (prvi Pi Zero s priključkom za serijsko kamero) s ključem USB WiFi.
Ne bom tipkal, kako namestiti Raspbian na kartico MicroSD, ker obstaja na milijone navodil, kako to storiti. Imam 16 GB microSD z Raspbian Buster Lite. Po drugi strani skoraj vedno uporabljam Raspbian Lite, ker v nobenem od svojih projektov ne potrebujem drugih neuporabnih programskih paketov. Če programsko opremo namestim z apt-get, bo namestila manjkajoče predpogoje.
Povežite se z omrežjem. Spet obstaja na milijone navodil, kako to storiti, zato se tukaj ne bom poglobil. Lahko uporabite žično ali brezžično povezavo, vendar bo za to potrebna internetna povezava.
Izbirno, vendar lahko omogočite povezavo SSH s pomočjo PuTTY. Jaz sem.
Posodobite vse in znova zaženite:
sudo apt posodobitev
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
To je ena nastavitev, skozi katero bom šel skozi. Spet obstaja na milijone načinov za to, toda najboljša referenca, ki sem jo našel, je tukaj:
Tu so poudarki:
sudo apt namestite i2c-tools
sudo apt namestite python-smbus
Omogočiti morate tudi I2C
sudo raspi-config
- 5 možnosti vmesnika
- P5 I2C
Znova zaženite, da uporabite spremembe
sudo ponovni zagon
Zdaj je čas, da vidimo, ali ste vse to doslej naredili pravilno
i2cdetect -y 1
Če je vaš zaslon vklopljen in ga lahko vidi vaš Raspberry Pi, boste imeli grafikon, ki se prikaže. Naslov 20x4, ki sem ga kupil na Amazonu in uporabil za ta projekt, je 27. Tehnično bo to identificirano kot 0x27 za skripte python, ki bodo prišli kasneje. Isti naslov sem imel za 2 zaslona 16x2, ki sem jih kupil tudi na Amazonu, in enega 40x2, ki sem ga našel na eBayu.
3. korak: Nastavitev Pythona
Torej zdaj za zapletene stvari. Poskušal bom čim bolj preprosto. Za začetek bom samo zapisoval datoteke v domači imenik.
dotaknite se I2C_LCD_driver.py
nano I2C_LCD_driver.py
Spodnjo vsebino prilepite v novo ustvarjen skript python.
#-*-kodiranje: utf-8-*- # Izvirna koda najdena na: #
"""
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),="">
Vem, da je ta scenarij precej neurejen, vendar je učinkovit. Prikazal bo trenutno statistiko primerov Covid-19 v Združenih državah. Glavna baza se posodablja vsakih 5 minut. Moj skript traja 1 minuto, da se popolnoma prelevi po 3 straneh, in vsakič, ko se cikel znova začne, potegne posodobljene številke.
4. korak: Zaženite Python
Začnimo:
python covid19.py
Na prvi strani je prikazano skupno število primerov in smrti, odkar je koronavirus prvič prizadel državo. Na drugi strani so navedene tiste številke primerov in smrti, ki so se zgodili samo na ta dan. Tretji prikazuje ljudi v kritičnem stanju, nato primere in smrti na milijon ljudi. Druga vrstica na tretji strani je včasih prikazovala datum prvega primera v državi, vendar sem ga moral odstraniti, ker bi se skript včasih zmotil in se zrušil, pri čemer je navedel to vrstico z napako.
Obstajajo načini za samodejni zagon tega skripta, vendar se tukaj ne bom spuščal v podrobnosti. Ko ukaz SSH povežem prek PuTTY -ja, ga izvedem na ukaz. Med izvajanjem ne boste mogli izvajati drugih ukazov, dokler ne pritisnete Ctrl+C.
5. korak: Kaj če ne živim v ZDA?
Ta skript lahko spremenite tako, da prikazuje statistiko za druge države. Kot lahko vidite, URL v mojem skriptu potegne iz API -ja tukaj: (za ogled teh strani ne uporabljajte Internet Explorerja. Poskušal bo prenesti datoteko.json. Uporabil sem Chrome)
coronavirus-19-api.herokuapp.com/countries/usa
Zdaj obiščite isti naslov, vendar eno mapo višje
coronavirus-19-api.herokuapp.com/countries
To navaja statistiko za vsako državo. Očitno bo nočna mora poskušati izvleči podatke API s te strani. Zato je najbolje, da stran odprete za svojo državo. Naši prijatelji v Kanadi bi morali urediti skript na ta URL:
coronavirus-19-api.herokuapp.com/countries/canada
Tu je zelo pomembna opomba. URL vmesnika API mora biti določen … kar pomeni, da v URL -ju ni presledkov. Pri brskanju po spletu se presledki v spletnem naslovu nadomestijo z "%20" in s tem bi morali naši prijatelji v državah z dvema imenoma delov, na primer v Novi Zelandiji, URL v tem skriptu zamenjati z:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Korak 6: Zadnje misli
Z Raspberry Pi in Arduinom sem v preteklih letih naredil veliko stvari, vendar je večina tega, kar sem zgradil, le ponovitve zamisli drugih. Ta je skoraj enak, le da sem v to postavitev sestavil dele iz številnih virov. Čeprav vas ta nastavitev v teh težkih časih ne bo varovala in ohranjala, vas bo zagotovo zasedla, ko jo nastavite, in vas bo pozneje obveščala.
Če teh delov še nimate, se ne obremenjujte z nakupom, razen če se resno lotevate gradnje. Kot sem že rekel, čas pošiljanja trenutno traja dlje, ker so ta prizadevanja usmerjena v bistvene izdelke. Te dele sem imel samo za učenje in eksperimentiranje. Zaslon, nameščen v škatli, je bil prvotno nastavljen za ogled statistike v realnem času za drugo Raspberry Pi v mojem omrežju, ki izvaja Pi-Hole. Ko se ta dogodek Covid-19 konča, ga lahko spremenim v prikaz vremena.
Za vsakogar, ki bere, želim povedati temu poučevalcu:
www.instructables.com/id/DIY-Hand-Sanitize…
Nisem še poskusil, vendar imam točno te sestavine in morda bom poskusil še kdaj.
Priporočena:
Raspberry Pi - HIH6130 I2C senzor vlažnosti in temperature Python Vadnica: 4 koraki
Raspberry Pi - HIH6130 I2C Senzor vlažnosti in temperature Python Vadnica: HIH6130 je senzor vlažnosti in temperature z digitalnim izhodom. Ti senzorji zagotavljajo natančnost ± 4% RH. Z dolgoročno stabilnostjo v industriji, resnično temperaturno kompenziranim digitalnim I2C, vodilno zanesljivostjo v industriji, energetsko učinkovitostjo
Raspberry Pi - HIH6130 I2C senzor vlažnosti in temperature Java Vadnica: 4 koraki
Raspberry Pi - HIH6130 I2C senzor vlažnosti in temperature Java Vadnica: HIH6130 je senzor vlažnosti in temperature z digitalnim izhodom. Ti senzorji zagotavljajo natančnost ± 4% RH. Z dolgoročno stabilnostjo v industriji, resnično temperaturno kompenziranim digitalnim I2C, vodilno zanesljivostjo v industriji, energetsko učinkovitostjo
Raspberry PI več I2C naprav: 3 koraki
Več naprav I2C Raspberry PI: razočarano, ker v svojem projektu ne morete uporabljati več istih naprav I2C. Ni treba uporabljati počasnih multiplekserjev. Najnovejše raspbian jedro podpira ustvarjanje več vodilov I2C z uporabo zatičev GPIO. Ta rešitev je zelo hitra