Innehållsförteckning:

Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 steg
Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 steg

Video: Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 steg

Video: Covid-19 Statistik + Raspberry Pi + I2C LCD: 6 steg
Video: Hiển thị số ca nhiễm Covid trên màn hình LCD I2C với Raspberry Pi 2024, November
Anonim
Covid-19 Statistik + Raspberry Pi + I2C LCD
Covid-19 Statistik + Raspberry Pi + I2C LCD

Så slumpmässigt ur det blå en dag bestämde jag mig för att få några delar jag hade att ligga och göra något som skulle kunna ge mig realtidsstatistik om Covid-19. Jag lade inte mycket tid på att få det att se bra ut, varför göra något permanent när det här evenemanget inte kommer att bli? Därför är min display bara monterad på en liten kartong.

Delar som behövs:

  • Raspberry Pi - vilken modell som helst. Jag använde Raspberry Pi 3A+
  • 20x4 I2C LCD -skärm - inget särskilt märke … men behöver I2C -ryggsäcken
  • Kvinnliga till kvinnliga bygelkablar - Bara 4 av dem för att ansluta I2C till Pi

www.adafruit.com/product/4027

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

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

Dessa länkar går direkt till källorna jag köpte från. Ledsen att säga att Adafruit inte levererar just nu, men Amazon är … bara långsamt på grund av att deras huvudsakliga fokus ligger på viktiga artiklar, vilket dessa inte är. Allt finns på andra ställen på Amazon och eBay.

Du behöver uppenbarligen en nätadapter, USB -kabel och microSD -kort för allt detta.

Steg 1: Maskinvaruinstallation

Hardware Setup
Hardware Setup

Hänvisa till den bifogade pinout -bilden. Det står B+, men det gäller alla andra Raspberry Pi -modeller som har kommit efter den också.

Med en I2C -ryggsäck ansluten till LCD -skärmen kräver denna anslutning bara 4 ledningar för att fungera.

Anslut GND till någon av jordpinnarna på Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Jag kopplade den till pin 6.

Anslut VCC till någon av de 5 volt stiften på Raspberry Pi: Pin 2, 4. Jag använde pin 4

Anslut SDA till stift 3.

Anslut SCL till stift 5.

Om du följde min inställning kommer du att få alla fyra ledningar i ett 2x2 -mönster på GPIO -rubrikerna.

Din monteringsmetod kan vara allt du kan tänka dig … eller ingenting alls. Som jag sa i inledningen kommer denna stam av coronaviruset inte att pågå för evigt, så jag behöver inte heller min inställning. Om jag bestämmer mig för att behålla den här inställningen när den här händelsen är över kan jag göra den till en vädervisning eller något.

Jag fäst en mutter och bult tillsammans med nylon distanser till alla 4 hörnen på min Pi 3A+. Detta är strikt valfritt. Jag gjorde det här för att jag ibland har det här på en metallyta, tyckte inte om att ha mina tillfälliga inställningar på en Pi som är inuti ett fodral och vill inte riskera att förstöra det eftersom jag glömde ta bort det från metallen ytan innan du sätter på den.

Steg 2: Pi Software Setup

Pi Software Setup
Pi Software Setup
Pi Software Setup
Pi Software Setup
Pi Software Setup
Pi Software Setup

Som jag sa i introt spelar det ingen roll vilken Raspberry Pi -modell du använder. Jag använder detta på en Raspberry Pi 3A+ över WiFi men har också testat detta på Raspberry Pi 2 på ethernet -kabel och Raspberry Pi Zero version 1.3 (den allra första Pi Zero med seriekamerans kontakt) med en USB WiFi -dongel.

Jag tänker inte skriva ut hur jag installerar Raspbian på ett MicroSD -kort eftersom det finns miljontals instruktioner om hur man gör det. Jag har en 16 GB microSD som kör Raspbian Buster Lite. På en sida noterar jag nästan alltid Raspbian Lite eftersom jag inte behöver de andra värdelösa mjukvarupaket i något av mina projekt. Om jag installerar programvara med apt-get installeras saknade förutsättningar.

Anslut till ett nätverk. Återigen finns det miljontals instruktioner där ute om hur man gör detta, så jag kommer inte att gå in på djupet här. Du kan gå trådbundet eller trådlöst, men detta kräver en internetanslutning.

Valfritt, men du kan aktivera SSH för att ansluta med PuTTY. Jag gjorde.

Uppdatera allt och starta sedan om:

sudo apt uppdatering

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

Detta är en installation som jag kommer att gå igenom här. Återigen finns det miljontals sätt att göra detta, men den bästa referensen jag hittade finns här:

Här är höjdpunkterna:

sudo apt installera i2c-verktyg

sudo apt installera python-smbus

Du måste också aktivera I2C

sudo raspi-config

- 5 gränssnittsalternativ

- P5 I2C

Starta om för att tillämpa ändringarna

sudo starta om

Nu är det dags att se om du har gjort allt rätt hittills

i2cdetect -y 1

Om din bildskärm startas och kan ses av din Raspberry Pi kommer du att ha ett diagram som kommer upp. Adressen för 20x4 som jag köpte på Amazon och använder för detta projekt är 27. Tekniskt identifieras detta som 0x27 för python -skripten som kommer senare. Jag har haft samma adressvisning för 2 16x2 skärmar som jag också köpte på Amazon och en 40x2 som jag hittade på eBay.

Steg 3: Python -installation

Så nu för de komplexa grejerna. Jag ska försöka hålla det så enkelt som möjligt. Till att börja med skriver jag bara filer till hemkatalogen.

tryck på I2C_LCD_driver.py

nano I2C_LCD_driver.py

Klistra in nedanstående innehåll i ditt nyskapade python -skript.

#-*-kodning: utf-8-*- # Original kod hittades på: #

"""

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

Jag vet att det här skriptet är ganska rörigt, men det är effektivt. Den kommer att visa aktuell statistik för Covid-19-fall i USA. Huvuddatabasen uppdateras var 5: e minut. Mitt skript tar 1 minut att bläddra igenom tre sidor och kommer att dra uppdaterade nummer varje gång cykeln börjar igen.

Steg 4: Kör Python

Kör Python
Kör Python
Kör Python
Kör Python

Låt oss börja:

python covid19.py

Den första sidan visar totalt antal fall och dödsfall sedan coronaviruset drabbade landet först. Den andra sidan visar siffrorna för fall och dödsfall som inträffade endast den aktuella dagen. Den tredje visar människor i kritiskt tillstånd, sedan fall och dödsfall per miljon människor. Den andra raden på den tredje sidan visade datumet för det första fallet i landet, men jag var tvungen att ta bort det eftersom skriptet ibland skulle fel och krascha med hänvisning till den raden med ett fel.

Det finns sätt att få detta skript att köras automatiskt, men jag kommer inte att gå in på detaljer om det här. Jag kör bara min på kommando efter att jag SSH ansluter till den via PuTTY. Medan den körs kommer du inte att kunna utföra andra kommandon förrän du trycker på Ctrl+C.

Steg 5: Vad händer om jag inte bor i USA?

Detta skript kan ändras för att visa statistik för andra länder. Som du kanske ser hämtar webbadressen i mitt skript från ett API här: (använd inte Internet Explorer för att visa dessa sidor. Den försöker ladda ner en.json -fil. Jag använde Chrome)

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

Besök nu samma adress, men en mapp högre

coronavirus-19-api.herokuapp.com/countries

Detta visar statistiken för varje land. Uppenbarligen blir det en mardröm att försöka hämta API -data från den här sidan. Så det är bäst att öppna sidan för ditt specifika land. Våra vänner i Kanada skulle behöva redigera skriptet till denna URL:

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

Mycket viktig anteckning här. URL: en till API: et måste vara specifikt … vilket betyder att det inte finns några mellanslag i en URL. Vid webbläsning ersätts mellanslag i en webbadress med "%20" och med det sagt skulle våra vänner i länder med två delnamn, till exempel Nya Zeeland, behöva ersätta webbadressen i detta skript med:

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

Steg 6: Slutliga tankar

Jag har gjort många saker med Raspberry Pi och Arduino genom åren, men det mesta av det jag har byggt är bara repliker av andras idéer. Den här är nästan densamma förutom att jag har sammanställt bitar från många källor till den här inställningen. Även om denna inställning inte kommer att hålla dig säker och frisk under denna tuffa tid, kommer den säkert att hålla dig upptagen när du ställer in den och den kommer att hålla dig informerad efteråt.

Om du inte redan har dessa delar, stressa inte dig själv att köpa dem om du inte menar allvar med att bygga den. Som jag sa tidigare tar leveranstider längre tid just nu eftersom dessa ansträngningar läggs på viktiga saker. Jag hade bara dessa delar redan för att lära mig och experimentera. Den lådmonterade skärmen var ursprungligen inställd för att se realtidsstatistik för en annan Raspberry Pi på mitt nätverk som kör Pi-Hole. Efter att denna Covid-19-händelse är över kan jag förvandla den till en vädervisning.

För alla som läser vill jag skrika till den här instruerbara:

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

Jag har inte provat det än, men jag har de exakta ingredienserna, och jag kan prova det någon gång.

Rekommenderad: