Inhaltsverzeichnis:

Covid-19-Statistik + Raspberry Pi + I2C-LCD - Gunook
Covid-19-Statistik + Raspberry Pi + I2C-LCD - Gunook

Video: Covid-19-Statistik + Raspberry Pi + I2C-LCD - Gunook

Video: Covid-19-Statistik + Raspberry Pi + I2C-LCD - Gunook
Video: COVID19 Tracker / CoronaVirus Live Outbreak Data Tracker using NodeMCU ESP8266 and 16x2 LCD Display 2024, November
Anonim
Covid-19-Statistiken + Raspberry Pi + I2C-LCD
Covid-19-Statistiken + Raspberry Pi + I2C-LCD

Also beschloss ich eines Tages zufällig aus heiterem Himmel, ein paar Teile, die ich herumliegen hatte, zu besorgen und etwas zu machen, das mir Echtzeit-Statistiken zu Covid-19 liefern würde. Ich habe nicht viel Zeit darauf verwendet, es schön aussehen zu lassen, denn warum etwas dauerhaft machen, wenn diese Veranstaltung nicht stattfinden wird? Daher ist mein Display einfach auf einen kleinen Karton montiert.

Benötigte Teile:

  • Raspberry Pi - jedes Modell. Ich habe Raspberry Pi 3A+ verwendet
  • 20x4 I2C-LCD-Display - keine bestimmte Marke … braucht aber den I2C-Rucksack
  • Weibliche zu weibliche Überbrückungsdrähte - Nur 4 davon zum Verbinden des I2C mit dem Pi

www.adafruit.com/product/4027

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

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

Diese Links führen direkt zu den Quellen, bei denen ich gekauft habe. Es tut mir leid zu sagen, dass Adafruit im Moment nicht liefert, aber Amazon liefert… Alle sind an anderer Stelle bei Amazon und eBay zu finden.

Dazu benötigen Sie natürlich ein Netzteil, ein USB-Kabel und eine microSD-Karte.

Schritt 1: Hardware-Setup

Hardware-Setup
Hardware-Setup

Verweisen Sie auf das beigefügte Pinbelegungsbild. Es sagt B+, aber es gilt auch für jedes andere Raspberry Pi-Modell, das nach diesem gekommen ist.

Mit einem am LCD-Display befestigten I2C-Rucksack benötigt diese Verbindung nur 4 Drähte, um zu funktionieren.

Verbinden Sie GND mit einem der Massepins des Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Ich habe es mit Pin 6 verbunden.

Verbinden Sie VCC mit einem der 5-Volt-Pins des Raspberry Pi: Pin 2, 4. Ich habe Pin 4 verwendet

Verbinden Sie SDA mit Pin 3.

Verbinden Sie SCL mit Pin 5.

Wenn Sie meinem Setup gefolgt sind, werden Sie am Ende alle 4 Drähte in einem 2x2-Muster auf den GPIO-Headern haben.

Ihre Montagemethode kann alles sein, was Sie sich vorstellen können … oder gar nichts. Wie ich im Intro sagte, wird dieser Stamm des Coronavirus nicht ewig dauern, also brauche ich mein Setup auch nicht. Wenn ich mich entscheide, dieses Setup nach dieser Veranstaltung beizubehalten, kann ich es in eine Wetteranzeige oder so umwandeln.

Ich habe eine Mutter und Schraube zusammen mit Nylon-Abstandshaltern an allen 4 Ecken meines Pi 3A + befestigt. Dies ist strikt optional. Ich habe das gemacht, weil ich das manchmal auf einer Metalloberfläche habe, meine temporären Setups nicht gerne auf einem Pi haben, das sich in einem Gehäuse befindet, und ich nicht riskieren möchte, es zu vermasseln, weil ich vergessen habe, es vom Metall zu entfernen Oberfläche, bevor Sie es einschalten.

Schritt 2: Pi-Software-Setup

Pi-Software-Setup
Pi-Software-Setup
Pi-Software-Setup
Pi-Software-Setup
Pi-Software-Setup
Pi-Software-Setup

Wie ich im Intro sagte, spielt es keine Rolle, welches Raspberry Pi-Modell Sie verwenden. Ich verwende dies auf einem Raspberry Pi 3A + über WiFi, habe dies jedoch auch auf Raspberry Pi 2 über Ethernet-Kabel und Raspberry Pi Zero Version 1.3 (der allererste Pi Zero mit dem seriellen Kameraanschluss) mit einem USB-WLAN-Dongle getestet.

Ich werde nicht schreiben, wie man Raspbian auf einer MicroSD-Karte installiert, da es Millionen von Anweisungen dazu gibt. Ich habe eine 16GB microSD mit Raspbian Buster Lite. Nebenbei bemerkt verwende ich fast immer Raspbian Lite, weil ich die anderen nutzlosen Softwarepakete in keinem meiner Projekte benötige. Wenn ich Software mit apt-get installiere, werden fehlende Voraussetzungen installiert.

Mit einem Netzwerk verbinden. Auch hier gibt es Millionen von Anweisungen, wie dies zu tun ist, daher werde ich hier nicht in die Tiefe gehen. Sie können kabelgebunden oder drahtlos gehen, aber dies erfordert eine Internetverbindung.

Optional, aber Sie können SSH aktivieren, um eine Verbindung mit PuTTY herzustellen. Ich tat.

Aktualisieren Sie alles und starten Sie dann neu:

sudo apt-Update

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

Dies ist ein Setup, das ich hier durchgehen werde. Auch hier gibt es Millionen von Möglichkeiten, aber die beste Referenz, die ich gefunden habe, ist hier:

Hier die Highlights:

sudo apt install i2c-tools

sudo apt installiere python-smbus

Sie müssen auch I2C aktivieren

sudo raspi-config

- 5 Schnittstellenoptionen

- P5 I2C

Starten Sie neu, um die Änderungen zu übernehmen

sudo neu starten

Jetzt ist es an der Zeit zu sehen, ob Sie das bisher alles richtig gemacht haben

i2cdetect -y 1

Wenn Ihr Display eingeschaltet ist und von Ihrem Raspberry Pi gesehen werden kann, wird ein Diagramm angezeigt. Die Adresse für das 20x4, das ich bei Amazon gekauft habe und für dieses Projekt verwende, ist 27. Technisch wird dies als 0x27 für die später erscheinenden Python-Skripte identifiziert. Ich habe dieselbe Adressanzeige für 2 16x2-Displays, die ich auch bei Amazon gekauft habe, und ein 40x2-Display, das ich bei eBay gefunden habe.

Schritt 3: Python-Setup

So, nun zu den komplexen Dingen. Ich werde versuchen, es so einfach wie möglich zu halten. Für den Anfang schreibe ich nur Dateien in das Home-Verzeichnis.

Berühren Sie I2C_LCD_driver.py

nano I2C_LCD_driver.py

Fügen Sie den folgenden Inhalt in Ihr neu erstelltes Python-Skript ein.

# -*- Kodierung: utf-8 -*-# Originalcode gefunden unter: #

"""

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

Ich weiß, dass dieses Skript ziemlich chaotisch ist, aber es ist effektiv. Es zeigt aktuelle Statistiken zu Covid-19-Fällen in den USA. Die Hauptdatenbank wird alle 5 Minuten aktualisiert. Mein Skript benötigt 1 Minute, um 3 Seiten vollständig zu durchlaufen, und zieht jedes Mal aktualisierte Zahlen, wenn der Zyklus erneut beginnt.

Schritt 4: Python ausführen

Python ausführen
Python ausführen
Python ausführen
Python ausführen

Lass uns anfangen:

Python covid19.py

Die erste Seite zeigt die Gesamtzahl der Fälle und Todesfälle seit dem ersten Auftreten des Coronavirus im Land. Die zweite Seite zeigt die Zahlen für Fälle und Todesfälle, die nur am aktuellen Tag aufgetreten sind. Die dritte zeigt Menschen in kritischem Zustand, dann Fälle und Todesfälle pro eine Million Menschen. Die zweite Zeile auf der dritten Seite zeigte früher das Datum des ersten Falls im Land, aber ich musste sie entfernen, weil das Skript manchmal fehlerhaft war und abstürzte, wenn diese Zeile mit einem Fehler zitiert wurde.

Es gibt Möglichkeiten, dieses Skript automatisch auszuführen, aber ich werde hier nicht ins Detail gehen. Ich führe meine nur auf Befehl aus, nachdem ich über PuTTY eine SSH-Verbindung zu ihr hergestellt habe. Während es ausgeführt wird, können Sie keine anderen Befehle ausführen, bis Sie Strg+C drücken.

Schritt 5: Was ist, wenn ich nicht in den USA lebe?

Dieses Skript kann geändert werden, um Statistiken für andere Länder anzuzeigen. Wie Sie vielleicht sehen, wird die URL in meinem Skript hier von einer API abgerufen: (Verwenden Sie nicht den Internet Explorer, um diese Seiten anzuzeigen. Es wird versucht, eine.json-Datei herunterzuladen. Ich habe Chrome verwendet)

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

Besuchen Sie jetzt dieselbe Adresse, aber einen Ordner höher

coronavirus-19-api.herokuapp.com/countries

Dies listet die Statistiken für jedes Land auf. Offensichtlich wird es ein Albtraum sein, API-Daten von dieser Seite abzurufen. Öffnen Sie also am besten die Seite für Ihr spezifisches Land. Unsere Freunde in Kanada müssten das Skript zu dieser URL bearbeiten:

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

Sehr wichtiger Hinweis hier. Die URL zur API muss spezifisch sein, d. h. keine Leerzeichen in einer URL. Beim Surfen im Internet werden Leerzeichen in einer Webadresse durch "%20" ersetzt und unsere Freunde in Ländern mit zwei Teilnamen, wie zum Beispiel Neuseeland, müssten die URL in diesem Skript ersetzen durch:

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

Schritt 6: Abschließende Gedanken

Ich habe im Laufe der Jahre viele Dinge mit Raspberry Pi und Arduino gemacht, aber das meiste, was ich gebaut habe, sind nur Nachbildungen der Ideen anderer. Dieses ist fast das gleiche, außer dass ich Stücke aus vielen Quellen in dieses Setup kompiliert habe. Obwohl dieses Setup Sie in dieser schwierigen Zeit nicht sicher und gesund hält, wird es Sie sicherlich während der Einrichtung beschäftigen und Sie danach auf dem Laufenden halten.

Wenn Sie diese Teile noch nicht haben, sollten Sie sich nicht stressen, sie zu kaufen, es sei denn, Sie wollen es ernsthaft bauen. Wie ich bereits sagte, dauern die Lieferzeiten im Moment länger, da diese Bemühungen auf wesentliche Artikel gerichtet sind. Ich hatte diese Teile nur schon zum Lernen und Experimentieren. Das auf der Box montierte Display wurde ursprünglich eingerichtet, um Echtzeitstatistiken eines anderen Raspberry Pi in meinem Netzwerk anzuzeigen, auf dem Pi-Hole ausgeführt wird. Nachdem dieses Covid-19-Ereignis vorbei ist, könnte ich es in eine Wetteranzeige verwandeln.

Für jeden, der liest, möchte ich diesem instructable einen Schrei geben:

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

Ich habe es noch nicht probiert, aber ich habe genau diese Zutaten und werde es vielleicht einmal ausprobieren.