Obsah:

Štatistiky Covid-19 + Raspberry Pi + I2C LCD: 6 krokov
Štatistiky Covid-19 + Raspberry Pi + I2C LCD: 6 krokov

Video: Štatistiky Covid-19 + Raspberry Pi + I2C LCD: 6 krokov

Video: Štatistiky Covid-19 + Raspberry Pi + I2C LCD: 6 krokov
Video: Valuing private car ownership and use in the U.S. 2024, Júl
Anonim
Štatistiky Covid-19 + LCD Raspberry Pi + I2C
Štatistiky Covid-19 + LCD Raspberry Pi + I2C

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

Nastavenie hardvéru
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

Nastavenie softvéru Pi
Nastavenie softvéru Pi
Nastavenie softvéru Pi
Nastavenie softvéru Pi
Nastavenie softvéru Pi
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

Spustite Python
Spustite Python
Spustite Python
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: