Obsah:
- Krok 1: Nastavenie hardvéru
- Krok 2: Nastavenie softvéru Pi
- Krok 3: Nastavenie Pythonu
- Krok 4: Spustite Python
- Krok 5: Čo keď nežijem v USA?
- Krok 6: Záverečné myšlienky
Video: Štatistiky Covid-19 + Raspberry Pi + I2C LCD: 6 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-31 10:24
Jedného dňa som sa teda náhodne vybral z ničoho nič a rozhodol som sa nechať ležať niekoľko častí, ktoré som mal okolo seba, a vytvoriť niečo, čo by mi poskytlo štatistiky o Covid-19 v reálnom čase. Nevenoval som tomu veľa času, aby to vyzeralo pekne, pretože prečo robiť niečo trvalé, keď sa táto udalosť nekoná? Preto je môj displej práve namontovaný na malú kartónovú škatuľu.
Potrebné diely:
- Raspberry Pi - akýkoľvek model. Použil som Raspberry Pi 3A+
- 20x4 I2C LCD displej - žiadna konkrétna značka … ale potrebuje batoh I2C
- Prepojovacie vodiče medzi ženami a ženami - iba 4 z nich na pripojenie I2C k Pi
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Tieto odkazy smerujú priamo na zdroje, z ktorých som kúpil. Ospravedlňujeme sa, keď povieme, že Adafruit práve nedodáva, ale Amazon je … len pomaly, pretože sa zameriava hlavne na nevyhnutné položky, ktoré nie sú. Všetko nájdete inde na Amazone a eBay.
K tomu všetkému budete očividne potrebovať sieťový adaptér, kábel USB a kartu microSD.
Krok 1: Nastavenie hardvéru
Pozrite sa na priložený obrázok pinoutu. Hovorí sa tam B+, ale platí to pre každý ďalší model Raspberry Pi, ktorý prišiel aj po tomto.
S batohom I2C pripevneným k LCD displeju toto spojenie vyžaduje iba 4 vodiče.
Pripojte GND k akémukoľvek uzemňovaciemu kolíku na Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Pripojil som ho na pin 6.
Pripojte VCC k jednému z 5 voltových pinov na Raspberry Pi: Pin 2, 4. Použil som pin 4
Pripojte SDA na pin 3.
Pripojte SCL k pinu 5.
Ak ste postupovali podľa môjho nastavenia, skončíte so všetkými 4 vodičmi vo vzore 2x2 na hlavičkách GPIO.
Spôsobom montáže môže byť čokoľvek, čo si dokážete predstaviť … alebo nič. Ako som povedal v úvode, tento kmeň koronavírusu nebude trvať večne, takže nepotrebujem ani svoje nastavenie. Ak sa rozhodnem ponechať toto nastavenie po skončení tejto udalosti, možno z neho urobím zobrazenie počasia alebo niečo podobné.
Do všetkých 4 rohov môjho Pi 3A+som pripevnil maticu a skrutku spolu s nylonovými rozperami. Toto je prísne voliteľné. Urobil som to, pretože to niekedy mám na kovovom povrchu, nepáčilo sa mi mať dočasné nastavenia na Pi, ktoré je vnútri puzdra, a nechcem riskovať, že to pokazím, pretože som to zabudol odstrániť z kovu. povrch pred zapnutím.
Krok 2: Nastavenie softvéru Pi
Ako som povedal v úvode, nezáleží na tom, aký model Raspberry Pi použijete. Používam to na Raspberry Pi 3A+ cez WiFi, ale testoval som to aj na Raspberry Pi 2 na ethernetovom kábli a Raspberry Pi Zero verzie 1.3 (úplne prvé Pi Zero s konektorom sériovej kamery) s USB WiFi donglom.
Nebudem písať, ako nainštalovať Raspbian na kartu MicroSD, pretože existuje milión návodov, ako to urobiť. Mám 16 GB microSD so systémom Raspbian Buster Lite. Na okraj, takmer vždy používam Raspbian Lite, pretože ostatné zbytočné softvérové balíky nepotrebujem v žiadnom zo svojich projektov. Ak nainštalujem softvér pomocou apt-get, nainštaluje chýbajúce predpoklady.
Pripojte sa k sieti. Opäť existujú milióny návodov, ako to urobiť, takže tu nejdem do hĺbky. Môžete ísť káblovo alebo bezdrôtovo, ale bude to vyžadovať internetové pripojenie.
Voliteľné, ale môžete povoliť pripojenie SSH pomocou PuTTY. Urobil som.
Aktualizujte všetko a potom reštartujte počítač:
sudo apt aktualizácia
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Toto je jedno z nastavení, ktoré tu prejdem. Opäť existuje niekoľko spôsobov, ako to urobiť, ale najlepšia referencia, ktorú som našiel, je práve tu:
Tu sú hlavné body:
sudo apt install i2c-tools
sudo apt install python-smbus
Budete tiež musieť povoliť I2C
sudo raspi-config
- 5 možností rozhrania
- P5 I2C
Vykonajte zmeny reštartovaním
sudo reštart
Teraz je načase zistiť, či ste to všetko doteraz robili správne
i2cdetect -y 1
Ak je váš displej zapnutý a váš Raspberry Pi ho vidí, zobrazí sa graf, ktorý sa zobrazí. Adresa 20x4, ktorú som kúpil na Amazone a používam na tento projekt, je 27. Technicky to bude pre pythonové skripty, ktoré prídu neskôr, identifikovať ako 0x27. Mal som rovnakú adresu zobrazenú pre 2 displeje 16x2, ktoré som tiež kúpil na Amazone, a jeden 40x2, ktorý som našiel na eBay.
Krok 3: Nastavenie Pythonu
Takže teraz ku komplexným veciam. Pokúsim sa to udržať čo najjednoduchšie. Na začiatok budem písať súbory do domovského adresára.
dotknite sa položky I2C_LCD_driver.py
nano I2C_LCD_driver.py
Vložte nižšie uvedený obsah do novo vytvoreného skriptu python.
#-*-kódovanie: utf-8-*- # Pôvodný kód sa nachádza 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),="">
Viem, že tento scenár je dosť chaotický, ale je efektívny. Ukáže aktuálne štatistiky o prípadoch Covid-19 v USA. Hlavná databáza sa aktualizuje každých 5 minút. Mojmu skriptu trvá 1 minútu, kým úplne prejde 3 stranami, a natiahne aktualizované čísla zakaždým, keď sa cyklus začne znova.
Krok 4: Spustite Python
Poďme začať:
python covid19.py
Prvá stránka zobrazuje celkový počet prípadov a úmrtí od prvého zasiahnutia krajiny novým koronavírusom. Druhá stránka zobrazuje čísla prípadov a úmrtí, ku ktorým došlo iba v aktuálny deň. Tretí zobrazuje ľudí v kritickom stave, potom prípady a úmrtia na milión ľudí. Druhý riadok na tretej strane používal na zobrazenie dátumu prvého prípadu v krajine, ale musel som ho odstrániť, pretože skript sa niekedy pokazil a zlyhal, pričom tento riadok uviedol s chybou.
Existujú spôsoby, ako zaistiť automatické spustenie tohto skriptu, ale nebudem sa tu o tom podrobnejšie zaoberať. Spustím svoj príkaz na príkaz potom, čo sa k nemu pripojím SSH prostredníctvom PuTTY. Kým je spustený, nebudete môcť vykonávať žiadne ďalšie príkazy, kým nestlačíte Ctrl+C.
Krok 5: Čo keď nežijem v USA?
Tento skript je možné upraviť tak, aby zobrazoval štatistiky pre iné krajiny. Ako vidíte, adresa URL v mojom skripte pochádza z rozhrania API tu: (na zobrazenie týchto stránok nepoužívajte Internet Explorer. Pokúsi sa stiahnuť súbor.json. Použil som prehliadač Chrome)
coronavirus-19-api.herokuapp.com/countries/usa
Teraz navštívte rovnakú adresu, ale o jeden priečinok vyššie
coronavirus-19-api.herokuapp.com/countries
Tu sú uvedené štatistiky pre každú krajinu. Očividne to bude nočná mora pokúšať sa stiahnuť údaje API z tejto stránky. Preto je najlepšie otvoriť stránku pre vašu konkrétnu krajinu. Naši priatelia v Kanade by museli upraviť skript na túto adresu URL:
coronavirus-19-api.herokuapp.com/countries/canada
Tu je veľmi dôležitá poznámka. Adresa URL rozhrania API musí byť konkrétna … to znamená, že v adrese URL nie sú medzery. Pri prehliadaní webu sú medzery vo webovej adrese nahradené „%20“, a preto naši priatelia v krajinách s dvoma názvami častí, ako napríklad na Novom Zélande, budú musieť nahradiť adresu URL v tomto skripte týmto:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Krok 6: Záverečné myšlienky
Za tie roky som s Raspberry Pi a Arduino urobil veľa vecí, ale väčšina z toho, čo som postavil, je len replikáciou myšlienok iných. Ten je takmer rovnaký, ibaže som do tohto nastavenia zostavil kúsky z mnohých zdrojov. Napriek tomu, že vás toto nastavenie v tomto ťažkom období neudrží v bezpečí a zdraví, určite vás pri nastavovaní zabaví a neskôr vás bude informovať.
Ak tieto diely ešte nemáte, nestresujte sa ich kúpou, pokiaľ to s výstavbou nemyslíte vážne. Ako som už povedal, doba prepravy sa v súčasnosti predlžuje, pretože sa vynakladá úsilie na nevyhnutné položky. Tieto časti som mal iba na učenie a experimentovanie. Krabicový displej bol pôvodne nastavený tak, aby zobrazoval štatistiky iného Raspberry Pi v reálnom čase v mojej sieti, na ktorej je spustený Pi-Hole. Keď sa skončí táto udalosť Covid-19, možno ju premením na zobrazenie počasia.
Pre každého, kto číta, sa chcem rozlúčiť s týmto pokynom:
www.instructables.com/id/DIY-Hand-Sanitize…
Ešte som to neskúsila, ale mám tie presné ingrediencie a možno to niekedy skúsim.
Odporúča:
Raspberry Pi - snímač vlhkosti a teploty HIH6130 I2C Python Výukový program: 4 kroky
Senzor vlhkosti a teploty Raspberry Pi - HIH6130 I2C Python Návod: HIH6130 je snímač vlhkosti a teploty s digitálnym výstupom. Tieto senzory poskytujú úroveň presnosti ± 4% relatívnej vlhkosti. Vďaka špičkovej dlhodobej stabilite, skutočnému digitálnemu I2C s teplotnou kompenzáciou, špičkovej spoľahlivosti, energetickej účinnosti
Raspberry Pi - HIH6130 Senzor vlhkosti a teploty I2C Java Výukový program: 4 kroky
Senzor vlhkosti a teploty Raspberry Pi - HIH6130 I2C Java Výukový program: HIH6130 je snímač vlhkosti a teploty s digitálnym výstupom. Tieto senzory poskytujú úroveň presnosti ± 4% relatívnej vlhkosti. Vďaka špičkovej dlhodobej stabilite, skutočnému digitálnemu I2C s teplotnou kompenzáciou, špičkovej spoľahlivosti, energetickej účinnosti
Viaceré zariadenia I2C Raspberry PI: 3 kroky
Viaceré zariadenia I2C Raspberry PI: Frustrované, pretože vo svojom projekte nemôžete použiť násobky rovnakých zariadení I2C. Nie je potrebné používať pomalé multiplexory. Najnovšie jadro raspbian podporuje vytváranie viacerých zberníc I2C pomocou pinov GPIO. Toto riešenie je super rýchle