Spisu treści:
- Krok 1: Konfiguracja sprzętu
- Krok 2: Konfiguracja oprogramowania Pi
- Krok 3: Konfiguracja Pythona
- Krok 4: Uruchom Pythona
- Krok 5: Co jeśli nie mieszkam w USA?
- Krok 6: Końcowe myśli
Wideo: Statystyki Covid-19 + Raspberry Pi + I2C LCD: 6 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-31 10:23
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
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
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
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:
Raspberry Pi - HIH6130 I2C Czujnik wilgotności i temperatury Samouczek Pythona: 4 kroki
Raspberry Pi - HIH6130 I2C Humidity & Temperature Sensor Python Tutorial: HIH6130 to czujnik wilgotności i temperatury z wyjściem cyfrowym. Czujniki te zapewniają poziom dokładności ±4% RH. Z wiodącą w branży długoterminową stabilnością, cyfrowym I2C z prawdziwą kompensacją temperatury, wiodącą w branży niezawodnością, energooszczędnością
Raspberry Pi - HIH6130 I2C Czujnik wilgotności i temperatury Samouczek Java: 4 kroki
Raspberry Pi - HIH6130 I2C Humidity & Temperature Sensor Java Tutorial: HIH6130 to czujnik wilgotności i temperatury z wyjściem cyfrowym. Czujniki te zapewniają poziom dokładności ±4% RH. Z wiodącą w branży długoterminową stabilnością, cyfrowym I2C z prawdziwą kompensacją temperatury, wiodącą w branży niezawodnością, energooszczędnością
Raspberry PI Wiele urządzeń I2C: 3 kroki
Raspberry PI Multiple I2C Devices: Sfrustrowany, ponieważ nie możesz używać wielokrotności tych samych urządzeń I2C w swoim projekcie. Nie ma potrzeby używania wolnych multiplekserów. Najnowsze jądro raspbian obsługuje tworzenie wielu magistral I2C za pomocą pinów GPIO. To rozwiązanie jest superszybkie