Inhoudsopgave:

Covid-19-statistieken + Raspberry Pi + I2C LCD - Ajarnpa
Covid-19-statistieken + Raspberry Pi + I2C LCD - Ajarnpa

Video: Covid-19-statistieken + Raspberry Pi + I2C LCD - Ajarnpa

Video: Covid-19-statistieken + Raspberry Pi + I2C LCD - Ajarnpa
Video: MJC Stream: Видишь енота? А он есть! Главное об ML и компьютерном зрении 2024, November
Anonim
Covid-19-statistieken + Raspberry Pi + I2C LCD
Covid-19-statistieken + Raspberry Pi + I2C LCD

Dus op een dag, willekeurig uit het niets, besloot ik een paar onderdelen te kopen die ik had liggen en iets te maken dat me realtime statistieken over Covid-19 zou opleveren. Ik heb er niet veel tijd in gestoken om het er mooi uit te laten zien, want waarom zou je iets permanents maken als dit evenement er niet zal zijn? Daarom is mijn display gewoon op een kleine kartonnen doos gemonteerd.

Onderdelen nodig:

  • Raspberry Pi - elk model. Ik gebruikte Raspberry Pi 3A+
  • 20x4 I2C LCD-scherm - geen bepaald merk … maar heeft wel de I2C-rugzak nodig
  • Vrouwelijke naar vrouwelijke jumperdraden - slechts 4 van hen om de I2C op de Pi. aan te sluiten

www.adafruit.com/product/4027

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

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

Deze links gaan rechtstreeks naar de bronnen waarvan ik heb gekocht. Het spijt me te moeten zeggen dat Adafruit momenteel niet levert, maar Amazon is … slechts langzaam omdat ze zich voornamelijk richten op essentiële items, wat niet het geval is. Alles is elders op Amazon en eBay te vinden.

Je hebt natuurlijk een AC-adapter, USB-kabel en microSD-kaart nodig om bij dit alles te passen.

Stap 1: Hardware-installatie

apparatuur installatie
apparatuur installatie

Raadpleeg de bijgevoegde pinout-afbeelding. Er staat B+, maar het is ook van toepassing op elk ander Raspberry Pi-model dat daarna is gekomen.

Met een I2C-rugzak bevestigd aan het LCD-scherm, heeft deze verbinding slechts 4 draden nodig om te werken.

Sluit GND aan op een van de aardingspinnen op de Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Ik heb hem aangesloten op pin 6.

Sluit VCC aan op een van de 5 volt-pinnen op de Raspberry Pi: Pin 2, 4. Ik gebruikte pin 4

Sluit SDA aan op pin 3.

Sluit SCL aan op pin 5.

Als je mijn setup hebt gevolgd, krijg je alle 4 draden in een 2x2 patroon op de GPIO-headers.

Je montagemethode kan alles zijn wat je maar kunt bedenken … of helemaal niets. Zoals ik in de intro al zei, zal deze soort van het coronavirus niet eeuwig duren, dus ik heb mijn opstelling ook niet nodig. Als ik besluit om deze opstelling te behouden nadat dit evenement voorbij is, kan ik er een weerdisplay van maken of zoiets.

Ik heb een moer en bout samen met nylon afstandhouders aan alle 4 de hoeken van mijn Pi 3A+ bevestigd. Dit is strikt optioneel. Ik deed dit omdat ik dit soms op een metalen oppervlak heb, ik vond het niet leuk om mijn tijdelijke opstellingen op een Pi in een behuizing te hebben, en ik wil niet het risico lopen het te verknoeien omdat ik vergat het van het metaal te verwijderen oppervlak voordat u het inschakelt.

Stap 2: Pi-software instellen

Pi-software instellen
Pi-software instellen
Pi-software instellen
Pi-software instellen
Pi-software instellen
Pi-software instellen

Zoals ik in de intro al zei, maakt het niet uit welk Raspberry Pi-model je gebruikt. Ik gebruik dit op een Raspberry Pi 3A+ via wifi, maar heb dit ook getest op Raspberry Pi 2 op ethernetkabel en Raspberry Pi Zero versie 1.3 (de allereerste Pi Zero met de seriële cameraconnector) met een USB WiFi-dongle.

Ik ga niet typen hoe ik Raspbian op een MicroSD-kaart moet installeren, omdat er miljoenen instructies zijn om dat te doen. Ik heb een 16GB microSD met Raspbian Buster Lite. Even terzijde, ik gebruik bijna altijd Raspbian Lite omdat ik de andere nutteloze softwarepakketten in geen van mijn projecten nodig heb. Als ik software installeer met apt-get, zal het ontbrekende vereisten installeren.

Verbind met een netwerk. Nogmaals, er zijn miljoenen instructies om dit te doen, dus ik zal hier niet dieper ingaan. U kunt bekabeld of draadloos gaan, maar hiervoor is een internetverbinding vereist.

Optioneel, maar u kunt SSH inschakelen om verbinding te maken met PuTTY. Ik deed.

Werk alles bij en start opnieuw op:

sudo apt update

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

Dit is een opstelling die ik hier zal doornemen. Nogmaals, er zijn miljoenen manieren om dit te doen, maar de beste referentie die ik heb gevonden is hier:

Dit zijn de hoogtepunten:

sudo apt installeer i2c-tools

sudo apt install python-smbus

U moet ook I2C. inschakelen

sudo raspi-config

- 5 interface-opties

- P5 I2C

Start opnieuw op om de wijzigingen toe te passen

sudo reboot

Nu is het tijd om te kijken of je dit tot nu toe allemaal goed hebt gedaan

i2cdetect -y 1

Als uw display is ingeschakeld en kan worden gezien door uw Raspberry Pi, heeft u een grafiek die verschijnt. Het adres voor de 20x4 die ik op Amazon heb gekocht en voor dit project gebruik is 27. Technisch gezien zal dit zich identificeren als 0x27 voor de python-scripts die later zullen komen. Ik heb dezelfde adresshow gehad voor 2 16x2-schermen die ik ook op Amazon kocht en een 40x2 die ik op eBay vond.

Stap 3: Python-installatie

Dus nu voor de complexe dingen. Ik zal proberen het zo simpel mogelijk te houden. Om te beginnen zal ik alleen bestanden naar de homedirectory schrijven.

raak I2C_LCD_driver.py aan

nano I2C_LCD_driver.py

Plak de onderstaande inhoud in uw nieuw gemaakte python-script.

# -*- codering: utf-8 -*-# Originele code gevonden op: #

"""

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

Ik weet dat dit script nogal rommelig is, maar het is effectief. Het toont de huidige statistieken voor Covid-19-gevallen in de Verenigde Staten. De hoofddatabase wordt elke 5 minuten bijgewerkt. Mijn script duurt 1 minuut om volledig door 3 pagina's te bladeren en zal bijgewerkte nummers trekken elke keer dat de cyclus opnieuw begint.

Stap 4: Voer Python uit

Python uitvoeren
Python uitvoeren
Python uitvoeren
Python uitvoeren

Laten we beginnen:

python covid19.py

De eerste pagina toont het totale aantal gevallen en sterfgevallen sinds het coronavirus het land voor het eerst trof. De tweede pagina toont de aantallen voor gevallen en sterfgevallen die alleen op de huidige dag plaatsvonden. De derde toont mensen in kritieke toestand, dan gevallen en sterfgevallen per miljoen mensen. De tweede regel op de derde pagina toonde de datum van het eerste geval in het land, maar ik moest het verwijderen omdat het script soms een fout zou maken en vastliep door die regel met een fout aan te halen.

Er zijn manieren om dit script automatisch te laten werken, maar daar ga ik hier niet op in. Ik voer de mijne gewoon op commando uit nadat ik er SSH verbinding mee heb gemaakt via PuTTY. Terwijl het actief is, kunt u geen andere opdrachten uitvoeren totdat u op Ctrl+C drukt.

Stap 5: Wat als ik niet in de VS woon?

Dit script kan worden aangepast om statistieken voor andere landen weer te geven. Zoals je misschien ziet, haalt de URL in mijn script hier uit een API: (gebruik geen Internet Explorer om deze pagina's te bekijken. Het zal proberen een.json-bestand te downloaden. Ik heb Chrome gebruikt)

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

Ga nu naar datzelfde adres, maar een map hoger

coronavirus-19-api.herokuapp.com/countries

Dit geeft een overzicht van de statistieken voor elk land. Het zal duidelijk een nachtmerrie zijn om API-gegevens van deze pagina te halen. Het is dus het beste om de pagina voor uw specifieke land te openen. Onze vrienden in Canada zouden het script naar deze URL moeten bewerken:

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

Heel belangrijke opmerking hier. De URL naar de API moet specifiek zijn … wat betekent dat er geen spaties in een URL zijn. Tijdens het surfen op het web worden spaties in een webadres vervangen door "%20" en dat gezegd hebbende, zouden onze vrienden in landen met twee deelnamen, zoals Nieuw-Zeeland, de URL in dit script moeten vervangen door:

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

Stap 6: Laatste gedachten

Ik heb in de loop der jaren veel dingen gedaan met Raspberry Pi en Arduino, maar het meeste van wat ik heb gebouwd, zijn slechts replica's van de ideeën van anderen. Deze is bijna hetzelfde, behalve dat ik stukken uit vele bronnen in deze opstelling heb gecompileerd. Hoewel deze opstelling je niet veilig en gezond zal houden tijdens deze moeilijke tijd, zal het je zeker bezig houden tijdens het opzetten en het zal je achteraf op de hoogte houden.

Als je deze onderdelen nog niet hebt, wees dan niet gestresst om ze te kopen, tenzij je serieus bent over het bouwen ervan. Zoals ik al eerder zei, duren de levertijden momenteel langer omdat die inspanningen worden gedaan voor essentiële items. Ik had alleen deze onderdelen al om te leren en te experimenteren. Het op een doos gemonteerde display was oorspronkelijk ingesteld om realtime-statistieken te bekijken van een andere Raspberry Pi op mijn netwerk waarop Pi-Hole draait. Nadat dit Covid-19-evenement voorbij is, kan ik er een weerdisplay van maken.

Voor iedereen die leest, wil ik een schreeuw geven aan deze instructable:

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

Ik heb het nog niet geprobeerd, maar ik heb die exacte ingrediënten, en misschien ga ik het een keer proberen.