Obsah:

Statistiky Covid-19 + Raspberry Pi + I2C LCD: 6 kroků
Statistiky Covid-19 + Raspberry Pi + I2C LCD: 6 kroků

Video: Statistiky Covid-19 + Raspberry Pi + I2C LCD: 6 kroků

Video: Statistiky Covid-19 + Raspberry Pi + I2C LCD: 6 kroků
Video: Сводные таблицы Excel с нуля до профи за полчаса + Дэшборды! | 1-ое Видео курса "Сводные Таблицы" 2024, Listopad
Anonim
Statistiky Covid-19 + LCD Raspberry Pi + I2C
Statistiky Covid-19 + LCD Raspberry Pi + I2C

Jednoho dne jsem se tedy náhodně z ničeho nic rozhodl, že si pořídím pár dílů, které jsem měl kolem sebe, a vytvořím něco, co mi poskytne statistiky o Covid-19 v reálném čase. Nevěnoval jsem tomu mnoho času, aby to vypadalo hezky, protože proč dělat něco trvalého, když tato událost nebude? Můj displej je proto namontován na malou kartonovou krabici.

Potřebné díly:

  • Raspberry Pi - jakýkoli model. Použil jsem Raspberry Pi 3A+
  • 20x4 I2C LCD displej - žádná konkrétní značka … ale potřebuje batoh I2C
  • Propojovací vodiče žena - žena - pouze 4 z nich pro připojení I2C k Pi

www.adafruit.com/product/4027

www.amazon.com/gp/product/B01GPUMP9C/ref=p…

www.amazon.com/gp/product/B01L5ULRUA/ref=p…

Tyto odkazy směřují přímo ke zdrojům, ze kterých jsem nakoupil. Omlouváme se, že Adafruit právě nedodává, ale Amazon je … jen pomalu, protože se zaměřují hlavně na základní položky, které nejsou. Vše najdete jinde na Amazonu a eBay.

K tomu všemu budete samozřejmě potřebovat napájecí adaptér, kabel USB a kartu microSD.

Krok 1: Nastavení hardwaru

Nastavení hardwaru
Nastavení hardwaru

Podívejte se na přiložený obrázek pinoutu. Píše se tam B+, ale platí to pro každý další model Raspberry Pi, který přišel i po tomto.

S I2C batohem připojeným k LCD displeji toto připojení vyžaduje pouze 4 dráty.

Připojte GND k jednomu ze zemnicích kolíků na Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Připojil jsem ho na pin 6.

Připojte VCC k jednomu z 5 voltových pinů na Raspberry Pi: Pin 2, 4. Použil jsem pin 4

Připojte SDA na pin 3.

Připojte SCL ke kolíku 5.

Pokud jste se řídili mým nastavením, skončíte se všemi 4 vodiči ve vzoru 2x2 na záhlavích GPIO.

Váš způsob montáže může být cokoli, co si dokážete představit … nebo vůbec nic. Jak jsem řekl v úvodu, tento kmen koronaviru nebude trvat věčně, takže ani nepotřebuji své nastavení. Pokud se rozhodnu ponechat toto nastavení po skončení této události, mohl bych z něj udělat zobrazení počasí nebo tak něco.

Do všech 4 rohů mého Pi 3A+jsem připevnil matici a šroub spolu s nylonovými rozpěrkami. Toto je zcela volitelné. Udělal jsem to, protože to mám někdy na kovovém povrchu, nerad jsem měl dočasná nastavení na Pi, které je uvnitř pouzdra, a nechtěl jsem riskovat, že to pokazím, protože jsem to zapomněl odstranit z kovu povrch před zapnutím.

Krok 2: Nastavení softwaru Pi

Nastavení softwaru Pi
Nastavení softwaru Pi
Nastavení softwaru Pi
Nastavení softwaru Pi
Nastavení softwaru Pi
Nastavení softwaru Pi

Jak jsem řekl v úvodu, nezáleží na tom, jaký model Raspberry Pi používáte. Používám to na Raspberry Pi 3A+ přes WiFi, ale také jsem to testoval na Raspberry Pi 2 na ethernetovém kabelu a Raspberry Pi Zero verze 1.3 (úplně první Pi Zero s konektorem sériové kamery) s USB WiFi donglem.

Nebudu psát, jak nainstalovat Raspbian na kartu MicroSD, protože existují miliony pokynů, jak to udělat. Mám 16GB microSD se systémem Raspbian Buster Lite. Na druhou stranu, téměř vždy používám Raspbian Lite, protože v žádném z mých projektů nepotřebuji další zbytečné softwarové balíčky. Pokud nainstaluji software pomocí apt-get, nainstaluje chybějící předpoklady.

Připojte se k síti. Opět existují miliony návodů, jak to udělat, takže zde nebudu zacházet do hloubky. Můžete použít kabelové nebo bezdrátové připojení, ale to vyžaduje připojení k internetu.

Volitelné, ale můžete povolit připojení SSH pomocí PuTTY. Udělal jsem.

Aktualizujte vše a poté restartujte:

sudo apt aktualizace

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo restart

Toto je jedno nastavení, které zde projdu. Opět existují miliony způsobů, jak to udělat, ale nejlepší reference, kterou jsem našel, je právě zde:

Zde jsou hlavní body:

sudo apt install i2c-tools

sudo apt install python-smbus

Také budete muset povolit I2C

sudo raspi-config

- 5 možností rozhraní

- P5 I2C

Změny použijete restartováním

sudo restart

Nyní je načase zjistit, zda jste to vše dosud dělali správně

i2cdetect -y 1

Pokud je váš displej zapnutý a váš Raspberry Pi ho vidí, zobrazí se graf. Adresa pro 20x4, kterou jsem koupil na Amazonu a používám pro tento projekt, je 27. Technicky to bude u skriptů pythonu, které přijdou později, identifikovat jako 0x27. Měl jsem stejnou adresu pro 2 displeje 16x2, které jsem také koupil na Amazonu, a jeden 40x2, který jsem našel na eBay.

Krok 3: Nastavení Pythonu

Takže teď ke složitým věcem. Pokusím se to udržet co nejjednodušší. Pro začátek budu jen zapisovat soubory do domovského adresáře.

dotkněte se I2C_LCD_driver.py

nano I2C_LCD_driver.py

Vložte níže uvedený obsah do nově vytvořeného skriptu pythonu.

#-*-kódování: utf-8-*- # Původní kód nalezen 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),="">

Vím, že tento skript je dost chaotický, ale je účinný. Ukáže aktuální statistiky pro případy Covid-19 ve Spojených státech. Hlavní databáze se aktualizuje každých 5 minut. Mému skriptu trvá 1 minutu, než úplně projde 3 stránky, a vytáhne aktualizovaná čísla pokaždé, když cyklus začne znovu.

Krok 4: Spusťte Python

Spusťte Python
Spusťte Python
Spusťte Python
Spusťte Python

Pojďme začít:

python covid19.py

Na první stránce je uveden celkový počet případů a úmrtí od doby, kdy koronavirus poprvé zasáhl zemi. Na druhé stránce jsou uvedena čísla případů a úmrtí, ke kterým došlo pouze v aktuální den. Třetí ukazuje lidi v kritickém stavu, pak případy a úmrtí na jeden milion lidí. Na druhém řádku na třetí stránce se zobrazovalo datum prvního případu v zemi, ale musel jsem ho odstranit, protože skript se někdy omylem vytratil a citoval tento řádek s chybou.

Existují způsoby, jak tento skript spustit automaticky, ale nebudu se o tom zde rozepisovat. Právě jsem spustil svůj příkaz na příkaz poté, co se k němu připojím SSH přes PuTTY. Dokud je spuštěn, nebudete moci provádět žádné další příkazy, dokud nestisknete Ctrl+C.

Krok 5: Co když nežiji v USA?

Tento skript lze upravit tak, aby zobrazoval statistiky pro jiné země. Jak vidíte, adresa URL v mém skriptu pochází z API zde: (k prohlížení těchto stránek nepoužívejte Internet Explorer. Pokusí se stáhnout soubor.json. Použil jsem Chrome)

coronavirus-19-api.herokuapp.com/countries/usa

Nyní navštivte stejnou adresu, ale o jednu složku výše

coronavirus-19-api.herokuapp.com/countries

Zde jsou uvedeny statistiky pro každou zemi. Očividně to bude noční můra pokoušet se stáhnout data API z této stránky. Nejlepší je tedy otevřít stránku pro vaši konkrétní zemi. Naši přátelé v Kanadě by museli upravit skript na tuto adresu URL:

coronavirus-19-api.herokuapp.com/countries/canada

Velmi důležitá poznámka zde. Adresa URL rozhraní API musí být konkrétní … což znamená, že v adrese URL nesmí být mezery. Při procházení webu jsou mezery ve webové adrese nahrazeny „%20“a s tím souvisí, že naši přátelé v zemích se dvěma názvy dílů, například na Novém Zélandu, budou muset adresu URL v tomto skriptu nahradit:

coronavirus-19-api.herokuapp.com/countries/new%20zealand

Krok 6: Závěrečné myšlenky

Za ta léta jsem s Raspberry Pi a Arduino udělal mnoho věcí, ale většina z toho, co jsem vytvořil, jsou jen replikace myšlenek ostatních. Tenhle je téměř stejný, kromě toho, že jsem do tohoto nastavení sestavil kousky z mnoha zdrojů. Přestože vás toto nastavení v této těžké době neudrží v bezpečí a zdraví, určitě vás při nastavování zabaví a následně vás bude informovat.

Pokud tyto díly ještě nemáte, nestresujte se jejich koupí, pokud to s jeho stavbou nemyslíte vážně. Jak jsem již řekl, doba přepravy se nyní prodlužuje, protože toto úsilí je věnováno zásadním položkám. Tyto části jsem měl pouze k učení a experimentování. Krabicový displej byl původně nastaven tak, aby zobrazoval statistiky jiného Raspberry Pi v reálném čase v mé síti, na které běží Pi-Hole. Poté, co tato událost Covid-19 skončí, bych z ní mohl udělat zobrazení počasí.

Pro každého, kdo čte, chci vykřičet tento pokyn:

www.instructables.com/id/DIY-Hand-Sanitize…

Ještě jsem to nezkoušel, ale mám ty přesné ingredience a možná to někdy zkusím.

Doporučuje: