Spisu treści:

Statystyki Covid-19 + Raspberry Pi + I2C LCD: 6 kroków
Statystyki Covid-19 + Raspberry Pi + I2C LCD: 6 kroków

Wideo: Statystyki Covid-19 + Raspberry Pi + I2C LCD: 6 kroków

Wideo: Statystyki Covid-19 + Raspberry Pi + I2C LCD: 6 kroków
Wideo: Use a Raspberry Pi to Fight COVID-19 with Rosetta@Home 2024, Listopad
Anonim
Statystyki Covid-19 + Raspberry Pi + I2C LCD
Statystyki Covid-19 + Raspberry Pi + I2C LCD

Tak więc pewnego dnia losowo, niespodziewanie, postanowiłem zdobyć kilka części, które leżałem i stworzyć coś, co dostarczy mi statystyk dotyczących Covid-19 w czasie rzeczywistym. Nie poświęciłem dużo czasu na to, żeby wyglądało ładnie, bo po co robić coś trwałego, kiedy tego wydarzenia nie będzie? Dlatego mój wyświetlacz jest po prostu przymocowany do małego kartonowego pudełka.

Potrzebne części:

  • Raspberry Pi - dowolny model. Użyłem Raspberry Pi 3A+
  • Wyświetlacz LCD 20x4 I2C - brak konkretnej marki… ale potrzebuje plecaka I2C
  • Zworki żeńskie do żeńskich - tylko 4 z nich do podłączenia I2C do Pi

www.adafruit.com/product/4027

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

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

Te linki prowadzą bezpośrednio do źródeł, z których kupiłem. Przykro mi to mówić, że Adafruit nie dostarcza teraz, ale Amazon jest… po prostu powoli, ponieważ koncentruje się głównie na podstawowych przedmiotach, którymi nie są. Wszystkie można znaleźć w innych miejscach na Amazon i eBay.

Oczywiście do tego wszystkiego będziesz potrzebować zasilacza sieciowego, kabla USB i karty microSD.

Krok 1: Konfiguracja sprzętu

Konfiguracja sprzętu
Konfiguracja sprzętu

Odnieś się do załączonego obrazu pinout. Mówi B+, ale dotyczy również każdego innego modelu Raspberry Pi, który pojawił się po nim.

Z plecakiem I2C przymocowanym do wyświetlacza LCD, to połączenie wymaga do działania tylko 4 przewodów.

Podłącz GND do jednego z pinów masy na Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Podłączyłem go do pinu 6.

Podłącz VCC do jednego z 5-woltowych pinów na Raspberry Pi: Pin 2, 4. Użyłem pinu 4

Podłącz SDA do pinu 3.

Podłącz SCL do styku 5.

Jeśli postępowałeś zgodnie z moją konfiguracją, skończysz ze wszystkimi 4 przewodami w układzie 2x2 na nagłówkach GPIO.

Twoja metoda montażu może być wszystkim, co możesz sobie wyobrazić… lub wcale. Jak powiedziałem we wstępie, ten szczep koronawirusa nie będzie trwał wiecznie, więc nie potrzebuję też mojej konfiguracji. Jeśli zdecyduję się zachować tę konfigurację po zakończeniu tego wydarzenia, mogę zmienić ją w wyświetlanie pogody lub coś w tym rodzaju.

Przymocowałem nakrętkę i śrubę wraz z nylonowymi przekładkami do wszystkich 4 rogów mojego Pi 3A +. Jest to całkowicie opcjonalne. Zrobiłem to, ponieważ czasami mam to na metalowej powierzchni, nie podobało mi się, że mam tymczasowe ustawienia na Pi, które znajduje się w obudowie, i nie chcę ryzykować zepsucia, ponieważ zapomniałem usunąć go z metalu powierzchni przed włączeniem.

Krok 2: Konfiguracja oprogramowania Pi

Konfiguracja oprogramowania Pi
Konfiguracja oprogramowania Pi
Konfiguracja oprogramowania Pi
Konfiguracja oprogramowania Pi
Konfiguracja oprogramowania Pi
Konfiguracja oprogramowania Pi

Jak wspomniałem we wstępie, nie ma znaczenia, jakiego modelu Raspberry Pi używasz. Używam tego na Raspberry Pi 3A+ przez Wi-Fi, ale przetestowałem to również na Raspberry Pi 2 na kablu Ethernet i Raspberry Pi Zero w wersji 1.3 (pierwsze Pi Zero ze złączem szeregowym kamery) z kluczem USB WiFi.

Nie zamierzam pisać, jak zainstalować Raspbian na karcie MicroSD, ponieważ istnieją miliony instrukcji, jak to zrobić. Mam kartę microSD o pojemności 16 GB z systemem Raspbian Buster Lite. Na marginesie, prawie zawsze używam Raspbian Lite, ponieważ nie potrzebuję innych bezużytecznych pakietów oprogramowania w żadnym z moich projektów. Jeśli zainstaluję oprogramowanie za pomocą apt-get, zainstaluje ono brakujące wymagania wstępne.

Połączyć się z siecią. Ponownie, istnieją miliony instrukcji, jak to zrobić, więc nie będę się tutaj zagłębiał. Możesz przejść przewodowo lub bezprzewodowo, ale będzie to wymagało połączenia z Internetem.

Opcjonalne, ale możesz włączyć połączenie SSH za pomocą PuTTY. Zrobiłem.

Zaktualizuj wszystko, a następnie uruchom ponownie:

aktualizacja sudo apt

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

To jest jedna konfiguracja, przez którą tutaj przejdę. Ponownie, istnieją miliony sposobów, aby to zrobić, ale najlepsze odniesienie, jakie znalazłem, znajduje się tutaj:

Oto najważniejsze informacje:

sudo apt install i2c-tools

sudo apt install python-smbus

Będziesz także musiał włączyć I2C

sudo raspi-config

- 5 opcji interfejsu

- P5 I2C

Uruchom ponownie, aby zastosować zmiany

ponowne uruchomienie sudo

Teraz nadszedł czas, aby sprawdzić, czy do tej pory zrobiłeś to wszystko poprawnie

i2cdetect -y 1

Jeśli twój wyświetlacz jest włączony i może być widziany przez twoje Raspberry Pi, pojawi się wykres. Adres dla 20x4 kupionego na Amazon i używanego w tym projekcie to 27. Technicznie będzie to identyfikowane jako 0x27 dla skryptów Pythona, które pojawią się później. Miałem ten sam adres dla 2 wyświetlaczy 16x2, które również kupiłem na Amazon i jednego 40x2, który znalazłem na eBayu.

Krok 3: Konfiguracja Pythona

A teraz przejdźmy do skomplikowanych rzeczy. Postaram się, aby to było tak proste, jak tylko potrafię. Na początek będę po prostu zapisywał pliki w katalogu domowym.

dotknij I2C_LCD_driver.py

nano I2C_LCD_driver.py

Wklej poniższą treść do nowo utworzonego skryptu Pythona.

# -*- kodowanie: utf-8 -*-# Oryginalny kod znaleziony pod adresem: #

"""

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),="">

Wiem, że ten skrypt jest dość niechlujny, ale jest skuteczny. Pokaże aktualne statystyki dotyczące przypadków Covid-19 w Stanach Zjednoczonych. Główna baza danych jest aktualizowana co 5 minut. Mój skrypt potrzebuje 1 minuty, aby przejść przez 3 strony i będzie pobierał zaktualizowane liczby za każdym razem, gdy cykl zaczyna się od nowa.

Krok 4: Uruchom Pythona

Uruchom Pythona
Uruchom Pythona
Uruchom Pythona
Uruchom Pythona

Zaczynajmy:

python covid19.py

Pierwsza strona pokazuje całkowitą liczbę przypadków i zgonów od czasu, gdy koronawirus po raz pierwszy uderzył w ten kraj. Druga strona pokazuje te liczby dla przypadków i zgonów, które miały miejsce tylko w bieżącym dniu. Trzecia pokazuje osoby w stanie krytycznym, następnie przypadki i zgony na milion osób. Drugi wiersz na trzeciej stronie wskazywał datę pierwszego przypadku w kraju, ale musiałem go usunąć, ponieważ skrypt czasami wykazywał błąd i zawieszał się, powołując się na ten wiersz z błędem.

Istnieją sposoby na to, aby ten skrypt uruchamiał się automatycznie, ale nie będę tutaj omawiał szczegółów na ten temat. Po prostu uruchamiam mój na polecenie po połączeniu się z nim SSH przez PuTTY. Gdy jest uruchomiony, nie będziesz w stanie wykonać żadnych innych poleceń, dopóki nie naciśniesz Ctrl + C.

Krok 5: Co jeśli nie mieszkam w USA?

Ten skrypt można zmodyfikować, aby wyświetlać statystyki dla innych krajów. Jak widać, adres URL w moim skrypcie pochodzi z interfejsu API tutaj: (nie używaj Internet Explorera do przeglądania tych stron. Będzie próbował pobrać plik.json. Użyłem Chrome)

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

Teraz odwiedź ten sam adres, ale o jeden folder wyżej

coronavirus-19-api.herokuapp.com/countries

Zawiera statystyki dla każdego kraju. Oczywiście, próba pobrania danych API z tej strony będzie koszmarem. Najlepiej więc otworzyć stronę dla swojego kraju. Nasi przyjaciele z Kanady musieliby edytować skrypt do tego adresu URL:

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

Tutaj bardzo ważna uwaga. Adres URL do interfejsu API musi być określony… co oznacza brak spacji w adresie URL. Podczas przeglądania stron internetowych spacje w adresie internetowym są zastępowane przez „%20”, a co za tym idzie, nasi znajomi w krajach z dwiema nazwami częściowymi, na przykład w Nowej Zelandii, musieliby zastąpić adres URL w tym skrypcie następującym:

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

Krok 6: Końcowe myśli

Przez lata robiłem wiele rzeczy z Raspberry Pi i Arduino, ale większość tego, co zbudowałem, to tylko repliki pomysłów innych. Ten jest prawie taki sam, z wyjątkiem tego, że skompilowałem elementy z wielu źródeł do tej konfiguracji. Chociaż ta konfiguracja nie zapewni Ci bezpieczeństwa i zdrowia w tym trudnym czasie, z pewnością zajmie Ci to podczas konfigurowania, a później będzie Cię informować.

Jeśli nie masz jeszcze tych części, nie stresuj się kupowaniem ich, chyba że poważnie myślisz o ich budowie. Jak powiedziałem wcześniej, czas wysyłki trwa teraz dłużej, ponieważ wysiłki te są podejmowane w celu uzyskania niezbędnych przedmiotów. Miałem już tylko te części do nauki i eksperymentowania. Wyświetlacz montowany w pudełku był pierwotnie skonfigurowany do przeglądania statystyk w czasie rzeczywistym innego Raspberry Pi w mojej sieci, w której działa Pi-Hole. Po zakończeniu tego wydarzenia Covid-19 mogę zmienić go w pokaz pogody.

Dla każdego, kto czyta, chcę wykrzyczeć to pouczające:

www.instructables.com/id/DIY-dezynfekcja rąk…

Jeszcze tego nie próbowałem, ale mam dokładnie te składniki i może kiedyś spróbuję.

Zalecana: