Πίνακας περιεχομένων:

Covid-19 Stats + Raspberry Pi + I2C LCD: 6 Βήματα
Covid-19 Stats + Raspberry Pi + I2C LCD: 6 Βήματα

Βίντεο: Covid-19 Stats + Raspberry Pi + I2C LCD: 6 Βήματα

Βίντεο: Covid-19 Stats + Raspberry Pi + I2C LCD: 6 Βήματα
Βίντεο: Display Covid-19 Data Using Maker Pi Pico and CircuitPython 2024, Ιούλιος
Anonim
Covid-19 Stats + Raspberry Pi + I2C LCD
Covid-19 Stats + Raspberry Pi + I2C LCD

Έτσι, τυχαία, απροσδόκητα μια μέρα, αποφάσισα να πάρω μερικά κομμάτια που είχα ξαπλωμένα και να φτιάξω κάτι που θα μου έδινε στατιστικά στοιχεία σε πραγματικό χρόνο για τον Covid-19. Δεν αφιέρωσα πολύ χρόνο για να το κάνω να φαίνεται όμορφο γιατί γιατί να γίνει κάτι μόνιμο όταν αυτό το γεγονός δεν πρόκειται να γίνει; Επομένως, η οθόνη μου είναι απλά τοποθετημένη σε ένα μικρό κουτί από χαρτόνι.

Απαιτούμενα μέρη:

  • Raspberry Pi - οποιοδήποτε μοντέλο. Χρησιμοποίησα το Raspberry Pi 3A+
  • Οθόνη LCD 20x4 I2C - δεν έχει ιδιαίτερη μάρκα… αλλά χρειάζεται το σακίδιο I2C
  • Καλώδια από jumper σε θηλυκά jumper - Μόλις 4 από αυτά για να συνδέσουν το I2C με το Pi

www.adafruit.com/product/4027

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

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

Αυτοί οι σύνδεσμοι πηγαίνουν απευθείας στις πηγές από τις οποίες αγόρασα. Λυπάμαι που λέω ότι το Adafruit δεν παραδίδει αυτήν τη στιγμή, αλλά το Amazon … αργά οφείλεται στο ότι η κύρια εστίασή τους είναι στα βασικά είδη, τα οποία δεν είναι. Όλα μπορούν να βρεθούν αλλού στο Amazon και το eBay.

Προφανώς θα χρειαστείτε έναν προσαρμογέα εναλλασσόμενου ρεύματος, ένα καλώδιο USB και μια κάρτα microSD για να τα συνδυάσετε όλα αυτά.

Βήμα 1: Ρύθμιση υλικού

Ρύθμιση υλικού
Ρύθμιση υλικού

Ανατρέξτε στη συνημμένη εικόνα pinout. Λέει B+, αλλά ισχύει για κάθε άλλο μοντέλο Raspberry Pi που έχει έρθει μετά από αυτό επίσης.

Με ένα σακίδιο I2C προσαρτημένο στην οθόνη LCD, αυτή η σύνδεση απαιτεί μόνο 4 καλώδια για να λειτουργήσει.

Συνδέστε το GND σε οποιαδήποτε από τις ακίδες γείωσης στο Raspberry Pi: Καρφίτσα 6, 9, 14, 20, 25, 30, 34, 39. Το συνέδεσα στην καρφίτσα 6.

Συνδέστε το VCC σε οποιονδήποτε από τους πείρους 5 volt στο Raspberry Pi: Pin 2, 4. Χρησιμοποίησα τον πείρο 4

Συνδέστε το SDA στο pin 3.

Συνδέστε το SCL στο pin 5.

Εάν ακολουθήσατε τη ρύθμισή μου, θα καταλήξετε και στα 4 καλώδια σε μοτίβο 2x2 στις κεφαλίδες GPIO.

Η μέθοδος τοποθέτησής σας μπορεί να είναι οτιδήποτε μπορείτε να φανταστείτε… ή τίποτα απολύτως. Όπως είπα στην εισαγωγή, αυτό το στέλεχος του κορονοϊού δεν πρόκειται να διαρκέσει για πάντα, οπότε δεν χρειάζομαι τη ρύθμιση μου σε κανένα από τα δύο. Εάν αποφασίσω να διατηρήσω αυτήν τη ρύθμιση μετά την ολοκλήρωση αυτού του συμβάντος, μπορεί να το μετατρέψω σε ένδειξη καιρού ή κάτι τέτοιο.

Έβαλα ένα παξιμάδι και ένα μπουλόνι μαζί με νάιλον αποστάτες και στις 4 γωνίες του Pi 3A+μου. Αυτό είναι αυστηρά προαιρετικό. Το έκανα επειδή μερικές φορές το έχω σε μια μεταλλική επιφάνεια, δεν μου άρεσε να έχω τις προσωρινές μου ρυθμίσεις σε ένα Pi που είναι μέσα σε μια θήκη και δεν θέλω να διακινδυνεύσω να το χαλάσω επειδή ξέχασα να το αφαιρέσω από το μέταλλο επιφάνεια πριν την ενεργοποιήσετε.

Βήμα 2: Ρύθμιση λογισμικού Pi

Ρύθμιση λογισμικού Pi
Ρύθμιση λογισμικού Pi
Ρύθμιση λογισμικού Pi
Ρύθμιση λογισμικού Pi
Ρύθμιση λογισμικού Pi
Ρύθμιση λογισμικού Pi

Όπως είπα στην εισαγωγή, δεν έχει σημασία τι μοντέλο Raspberry Pi χρησιμοποιείτε. Το χρησιμοποιώ σε Raspberry Pi 3A+ μέσω WiFi, αλλά το έχω δοκιμάσει και σε Raspberry Pi 2 σε καλώδιο ethernet και στο Raspberry Pi Zero έκδοση 1.3 (το πρώτο Pi Zero με τον σύνδεσμο σειριακής κάμερας) με USB dongle WiFi.

Δεν πρόκειται να γράψω πώς να εγκαταστήσετε το Raspbian σε κάρτα MicroSD επειδή υπάρχουν εκατομμύρια οδηγίες για το πώς να το κάνετε αυτό. Έχω microSD 16 GB που τρέχει Raspbian Buster Lite. Σε μια δευτερεύουσα σημείωση, χρησιμοποιώ σχεδόν πάντα το Raspbian Lite επειδή δεν χρειάζομαι τα άλλα άχρηστα πακέτα λογισμικού σε κανένα από τα έργα μου. Εάν εγκαταστήσω λογισμικό χρησιμοποιώντας το apt-get, θα εγκαταστήσει προαπαιτούμενα που λείπουν.

Σύνδεση σε δίκτυο. Και πάλι, υπάρχουν εκατομμύρια οδηγίες εκεί έξω για το πώς να το κάνετε αυτό, οπότε δεν θα πάω σε βάθος εδώ. Μπορείτε να συνδεθείτε ενσύρματα ή ασύρματα, αλλά αυτό θα απαιτήσει σύνδεση στο Διαδίκτυο.

Προαιρετικό, αλλά θα μπορούσατε να ενεργοποιήσετε τη σύνδεση SSH χρησιμοποιώντας το PuTTY. Το έκανα.

Ενημερώστε τα πάντα και κάντε επανεκκίνηση:

sudo apt ενημέρωση

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

Αυτή είναι μια ρύθμιση που θα περάσω εδώ. Και πάλι, υπάρχουν εκατομμύρια τρόποι για να το κάνετε αυτό, αλλά η καλύτερη αναφορά που βρήκα είναι εδώ:

Εδώ είναι τα κυριότερα σημεία:

sudo apt install i2c-tools

sudo apt εγκατάσταση python-smbus

Θα χρειαστεί επίσης να ενεργοποιήσετε το I2C

sudo raspi-config

- 5 επιλογές διασύνδεσης

- P5 I2C

Επανεκκινήστε για να εφαρμόσετε τις αλλαγές

sudo επανεκκίνηση

Τώρα ήρθε η ώρα να δούμε αν τα κάνατε όλα σωστά μέχρι τώρα

i2cdetect -y 1

Εάν η οθόνη σας είναι ενεργοποιημένη και είναι ορατή από το Raspberry Pi, θα εμφανιστεί ένα γράφημα. Η διεύθυνση για το 20x4 που αγόρασα στο Amazon και χρησιμοποιώ για αυτό το έργο είναι 27. Τεχνικά αυτό θα προσδιοριστεί ως 0x27 για τα σενάρια python που θα έρθουν αργότερα. Είχα την ίδια εμφάνιση διεύθυνσης για 2 οθόνες 16x2 που αγόρασα επίσης στο Amazon και μία 40x2 που βρήκα στο eBay.

Βήμα 3: Ρύθμιση Python

Τώρα για τα περίπλοκα πράγματα. Θα προσπαθήσω να το κρατήσω όσο πιο απλό μπορώ. Για αρχή, θα γράψω αρχεία στον αρχικό κατάλογο.

αγγίξτε I2C_LCD_driver.py

nano I2C_LCD_driver.py

Επικολλήστε το παρακάτω περιεχόμενο στο πρόσφατα δημιουργημένο σενάριο python.

#-*-κωδικοποίηση: utf-8-*- # Ο αρχικός κώδικας βρέθηκε στη διεύθυνση: #

"""

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

Ξέρω ότι αυτό το σενάριο είναι αρκετά ακατάστατο, αλλά είναι αποτελεσματικό. Θα δείξει τις τρέχουσες στατιστικές για τα κρούσματα Covid-19 στις Ηνωμένες Πολιτείες. Η κύρια βάση δεδομένων ενημερώνεται κάθε 5 λεπτά. Το σενάριό μου διαρκεί 1 λεπτό για να περιηγηθεί πλήρως σε 3 σελίδες και θα τραβά ενημερωμένους αριθμούς κάθε φορά που ξεκινά ξανά ο κύκλος.

Βήμα 4: Εκτελέστε Python

Εκτελέστε Python
Εκτελέστε Python
Εκτελέστε Python
Εκτελέστε Python

Ας ξεκινήσουμε:

python covid19.py

Στην πρώτη σελίδα εμφανίζονται συνολικοί αριθμοί κρουσμάτων και θανάτων από τότε που ο κορονοϊός έπληξε για πρώτη φορά τη χώρα. Η δεύτερη σελίδα δείχνει αυτούς τους αριθμούς για περιπτώσεις και θανάτους που συνέβησαν μόνο την τρέχουσα ημέρα. Το τρίτο δείχνει άτομα σε κρίσιμη κατάσταση, μετά περιπτώσεις και θανάτους ανά ένα εκατομμύριο ανθρώπους. Η δεύτερη γραμμή στην τρίτη σελίδα έδειχνε την ημερομηνία της πρώτης περίπτωσης στη χώρα, αλλά έπρεπε να την αφαιρέσω επειδή το σενάριο μερικές φορές θα έβγαινε λάθος και θα έπεφτε αναφέροντας αυτήν τη γραμμή με ένα σφάλμα.

Υπάρχουν τρόποι για να εκτελέσετε αυτό το σενάριο αυτόματα, αλλά δεν θα αναφερθώ σε λεπτομέρειες εδώ. Απλώς τρέχω το δικό μου κατόπιν εντολής αφού συνδεθώ με το SSH μέσω του PuTTY. Ενώ εκτελείται, δεν θα μπορείτε να εκτελέσετε άλλες εντολές μέχρι να πατήσετε Ctrl+C.

Βήμα 5: Τι θα συμβεί αν δεν ζήσω στις ΗΠΑ;

Αυτό το σενάριο μπορεί να τροποποιηθεί ώστε να εμφανίζει στατιστικά στοιχεία για άλλες χώρες. Όπως μπορείτε να δείτε, η διεύθυνση URL στο σενάριό μου προέρχεται από ένα API εδώ: (μην χρησιμοποιήσετε τον Internet Explorer για να δείτε αυτές τις σελίδες. Θα προσπαθήσει να κατεβάσει ένα αρχείο.json. Χρησιμοποίησα το Chrome)

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

Επισκεφθείτε τώρα την ίδια διεύθυνση, αλλά έναν φάκελο ψηλότερα

coronavirus-19-api.herokuapp.com/countries

Αυτό παραθέτει τα στατιστικά για κάθε χώρα. Προφανώς θα είναι ένας εφιάλτης που προσπαθεί να τραβήξει δεδομένα API από αυτήν τη σελίδα. Είναι καλύτερα λοιπόν να ανοίξετε τη σελίδα για τη συγκεκριμένη χώρα σας. Οι φίλοι μας στον Καναδά θα πρέπει να επεξεργαστούν το σενάριο σε αυτήν τη διεύθυνση URL:

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

Πολύ σημαντική σημείωση εδώ. Η διεύθυνση URL στο API πρέπει να είναι συγκεκριμένη… δεν σημαίνει κενά σε μια διεύθυνση URL. Κατά την περιήγηση στον ιστό, τα κενά σε μια διεύθυνση ιστού αντικαθίστανται από "%20" και με αυτό, οι φίλοι μας σε χώρες με 2 ονόματα μερών, όπως η Νέα Ζηλανδία για παράδειγμα, θα πρέπει να αντικαταστήσουν τη διεύθυνση URL σε αυτό το σενάριο με:

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

Βήμα 6: Τελικές σκέψεις

Έχω κάνει πολλά πράγματα με το Raspberry Pi και το Arduino όλα αυτά τα χρόνια, αλλά τα περισσότερα από αυτά που έχω φτιάξει είναι απλώς αντιγραφές ιδεών άλλων. Αυτό είναι σχεδόν το ίδιο, εκτός από τη συλλογή κομματιών από πολλές πηγές σε αυτήν τη ρύθμιση. Παρόλο που αυτή η ρύθμιση δεν θα σας κρατήσει ασφαλείς και υγιείς κατά τη διάρκεια αυτής της δύσκολης περιόδου, σίγουρα θα σας κρατήσει απασχολημένους καθώς το ρυθμίσατε και θα σας κρατήσει ενήμερους μετά.

Εάν δεν έχετε ήδη αυτά τα εξαρτήματα, μην αγχώνεστε όταν τα αγοράζετε, εκτός εάν είστε σοβαροί για την κατασκευή του. Όπως είπα και πριν, οι χρόνοι αποστολής διαρκούν περισσότερο αυτή τη στιγμή επειδή αυτές οι προσπάθειες καταβάλλονται σε βασικά είδη. Είχα μόνο αυτά τα μέρη ήδη για μάθηση και πειραματισμό. Η οθόνη που ήταν τοποθετημένη στο κιβώτιο είχε αρχικά ρυθμιστεί για προβολή στατιστικών σε πραγματικό χρόνο για ένα άλλο Raspberry Pi στο δίκτυό μου που εκτελεί Pi-Hole. Αφού τελειώσει αυτό το συμβάν Covid-19, ίσως το μετατρέψω σε οθόνη καιρού.

Για όποιον διαβάζει, θέλω να φωνάξω αυτό το διδακτικό:

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

Δεν το έχω δοκιμάσει ακόμα, αλλά έχω ακριβώς αυτά τα συστατικά και ίσως το δοκιμάσω κάποια στιγμή.

Συνιστάται: