INHOUDSOPGAWE:
- Stap 1: hardeware -opstelling
- Stap 2: Pi -sagteware -opstelling
- Stap 3: Python -opstelling
- Stap 4: Begin Python
- Stap 5: Wat as ek nie in die VSA woon nie?
- Stap 6: Laaste gedagtes
Video: Covid-19 Statistieke + Framboos Pi + I2C LCD: 6 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-31 10:16
Ek het eendag lukraak uit die bloute besluit om 'n paar dele wat ek gehad het, te laat lê en iets te maak wat my real-time statistieke oor Covid-19 sou lewer. Ek het nie veel tyd daaraan bestee om dit mooi te laat lyk nie, want waarom moet u iets permanent maak as hierdie gebeurtenis nie gaan plaasvind nie? Daarom is my skerm net op 'n klein kartondoos gemonteer.
Onderdele benodig:
- Framboos Pi - enige model. Ek het Raspberry Pi 3A+ gebruik
- 20x4 I2C LCD -skerm - geen spesifieke handelsmerk nie … maar het wel die I2C -rugsak nodig
- Springdrade van vrou tot vrou - slegs 4 daarvan om die I2C aan die Pi te koppel
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Hierdie skakels gaan direk na die bronne waaruit ek gekoop het. Ek is jammer om te sê dat Adafruit nie tans lewer nie, maar Amazon is … net stadig, omdat hulle hoofsaaklik fokus op belangrike items, wat dit nie is nie. Alles kan elders op Amazon en eBay gevind word.
U benodig natuurlik 'n wisselstroomadapter, USB -kabel en microSD -kaart om dit alles te kan hanteer.
Stap 1: hardeware -opstelling
Verwys na die aangehegte pinout -prentjie. Dit sê B+, maar dit is van toepassing op elke ander Raspberry Pi -model wat ook daarna gekom het.
Met 'n I2C -rugsak wat aan die LCD -skerm gekoppel is, benodig hierdie verbinding slegs 4 drade om te werk.
Koppel GND aan enige van die grondpenne op die Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Ek het dit aan pin 6 gekoppel.
Koppel VCC aan een van die 5 volt penne op die Raspberry Pi: Pin 2, 4. Ek het pin 4 gebruik
Koppel SDA aan pen 3.
Koppel SCL aan Pin 5.
As u my opstelling gevolg het, eindig u met al 4 drade in 'n 2x2 -patroon op die GPIO -opskrifte.
U monteermetode kan alles wees wat u u kan voorstel … of glad niks. Soos ek in die inleiding gesê het, sal hierdie stam van die koronavirus nie vir ewig duur nie, so ek het my instelling ook nie nodig nie. As ek besluit om hierdie opstelling te behou nadat hierdie geleentheid verby is, kan ek dit verander in 'n weerweergawe of iets.
Ek het 'n moer en bout saam met nylon afstandhouers aan al vier hoeke van my Pi 3A+vasgemaak. Dit is streng opsioneel. Ek het dit gedoen omdat ek dit soms op 'n metaaloppervlak het, ek het nie daarvan gehou om my tydelike instellings op 'n Pi in die omhulsel te hê nie, en ek wil nie die risiko loop om dit deurmekaar te maak nie, want ek het vergeet om dit uit die metaal te verwyder oppervlak voordat dit aangeskakel word.
Stap 2: Pi -sagteware -opstelling
Soos ek in die inleiding gesê het, maak nie saak watter Raspberry Pi -model u gebruik nie. Ek gebruik dit op 'n Raspberry Pi 3A+ via WiFi, maar het dit ook getoets op Raspberry Pi 2 op ethernetkabel en Raspberry Pi Zero weergawe 1.3 (die heel eerste Pi Zero met die seriële kamera -aansluiting) met 'n USB WiFi -dongle.
Ek gaan nie uitskryf hoe om Raspbian op 'n MicroSD -kaart te installeer nie, want daar is miljoene instruksies oor hoe om dit te doen. Ek het 'n 16 GB microSD met Raspbian Buster Lite. Op 'n kanttekening gebruik ek byna altyd Raspbian Lite omdat ek nie die ander nuttelose sagtewarepakkette in enige van my projekte nodig het nie. As ek sagteware met apt-get installeer, sal die ontbrekende voorvereistes geïnstalleer word.
Koppel aan 'n netwerk. Weereens, daar is miljoene instruksies oor hoe om dit te doen, so ek sal nie hier in diepte ingaan nie. U kan bedraad of draadloos gaan, maar dit benodig 'n internetverbinding.
Opsioneel, maar u kan SSH in staat stel om via PuTTY aan te sluit. Ek het.
Dateer alles op en herlaai dan:
sudo apt -opdatering
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo herlaai
Dit is een opstelling wat ek hier sal ondergaan. Daar is weer miljoene maniere om dit te doen, maar die beste verwysing wat ek gevind het, is hier:
Hier is die hoogtepunte:
sudo apt installeer i2c-tools
sudo apt installeer python-smbus
U sal ook I2C moet aktiveer
sudo raspi-config
- 5 koppelvlakopsies
- P5 I2C
Herlaai om die veranderinge toe te pas
sudo herlaai
Dit is nou tyd om te sien of u dit alles reg gedoen het tot dusver
i2cdetect -y 1
As u skerm aangeskakel is en deur u Raspberry Pi gesien kan word, het u 'n grafiek wat verskyn. Die adres vir die 20x4 wat ek op Amazon gekoop het en wat ek vir hierdie projek gebruik het, is 27. Tegnies sal dit identifiseer as 0x27 vir die python -skrifte wat later kom. Ek het dieselfde adres vertoon vir 2 16x2 skerms wat ek ook op Amazon gekoop het en een 40x2 wat ek op eBay gevind het.
Stap 3: Python -opstelling
So nou vir die komplekse dinge. Ek sal probeer om dit so eenvoudig as moontlik te hou. Om mee te begin, sal ek net lêers na die tuisgids skryf.
raak I2C_LCD_driver.py
nano I2C_LCD_driver.py
Plak die onderstaande inhoud in u nuutgeskepte python -script.
#-*-kodering: utf-8-*- # Oorspronklike kode gevind 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),="">
Ek weet dat hierdie skrif redelik morsig is, maar dit is effektief. Dit sal die huidige statistieke vir Covid-19-gevalle in die Verenigde State toon. Die hoofdatabasis word elke 5 minute bygewerk. My script neem 1 minuut om heeltemal deur 3 bladsye te blaai en sal elke keer as die siklus weer begin, opgedateerde nommers kry.
Stap 4: Begin Python
Laat ons begin:
python covid19.py
Die eerste bladsy toon die totale aantal gevalle en sterftes sedert die koronavirus die land die eerste keer getref het. Die tweede bladsy toon die getalle vir gevalle en sterftes wat slegs op die huidige dag plaasgevind het. Die derde toon mense in 'n kritieke toestand, dan gevalle en sterftes per miljoen mense. Die tweede reël op die derde bladsy het die datum van die eerste geval in die land aangedui, maar ek moes dit verwyder omdat die skrif soms 'n fout kon maak en die reël met 'n fout kon neerstort.
Daar is maniere om hierdie skrif outomaties te laat loop, maar ek sal hier nie in besonderhede ingaan nie. Ek voer myne net op bevel nadat ek via PuTTY daaraan gekoppel is. Terwyl dit loop, kan u geen ander opdragte uitvoer voordat u op Ctrl+C druk nie.
Stap 5: Wat as ek nie in die VSA woon nie?
Hierdie skrif kan aangepas word om statistieke vir ander lande te wys. Soos u kan sien, haal die URL in my script hier 'n API af: (moenie Internet Explorer gebruik om hierdie bladsye te sien nie. Dit sal probeer om 'n.json -lêer af te laai. Ek het Chrome gebruik)
coronavirus-19-api.herokuapp.com/countries/usa
Besoek nou dieselfde adres, maar een gids hoër
coronavirus-19-api.herokuapp.com/countries
Dit bevat die statistieke vir elke land. Dit is duidelik 'n nagmerrie wat probeer om API -data van hierdie bladsy af te haal. Dit is dus die beste om die bladsy vir u spesifieke land oop te maak. Ons vriende in Kanada sal die skrif na hierdie URL moet wysig:
coronavirus-19-api.herokuapp.com/countries/canada
Baie belangrike opmerking hier. Die URL na die API moet spesifiek wees … wat beteken dat daar geen spasies in 'n URL is nie. By webblaai word spasies in 'n webadres vervang met '%20' en met dit gesê, moet ons vriende in lande met twee onderdele, soos byvoorbeeld Nieu -Seeland, die URL in hierdie skrif vervang met:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Stap 6: Laaste gedagtes
Ek het deur die jare baie dinge met Raspberry Pi en Arduino gedoen, maar die meeste van wat ek opgebou het, is slegs replikasies van ander se idees. Hierdie een is byna dieselfde, behalwe dat ek stukke uit baie bronne in hierdie opset saamgestel het. Alhoewel hierdie opset u nie veilig en gesond sal hou tydens hierdie moeilike tyd nie, sal dit u beslis besig hou terwyl u dit opstel, en dit sal u daarna op hoogte hou.
As u nog nie hierdie onderdele het nie, moet u nie daarop aandring om dit te koop nie, tensy u ernstig is om dit te bou. Soos ek al voorheen gesê het, neem afleweringstye nou langer, want die pogings word aangewend om belangrike items te gebruik. Ek het slegs hierdie dele gehad om te leer en te eksperimenteer. Die skerm wat op die kassie gemonteer is, is oorspronklik ingestel om real-time statistieke van 'n ander Raspberry Pi op my netwerk met Pi-Hole te sien. Nadat hierdie Covid-19-geleentheid verby is, kan ek dit in 'n weervertoning verander.
Vir almal wat lees, wil ek 'n uitroep gee aan hierdie instruksionele:
www.instructables.com/id/DIY-Hand-Sanitize…
Ek het dit nog nie probeer nie, maar ek het die presiese bestanddele, en ek sal dit dalk 'n rukkie probeer.
Aanbeveel:
Framboos Pi - HIH6130 I2C Python -tutoriaal vir humiditeit en temperatuur sensor: 4 stappe
Raspberry Pi - HIH6130 I2C Humiditeits- en temperatuursensor Python -tutoriaal: HIH6130 is 'n humiditeits- en temperatuursensor met digitale uitset. Hierdie sensors bied 'n akkuraatheidsvlak van ± 4% RH. Met die toonaangewende langtermynstabiliteit, ware temperatuurgekompenseerde digitale I2C, toonaangewende betroubaarheid in die bedryf, energie-doeltreffendheid
Framboos Pi - HIH6130 I2C Humiditeits- en temperatuursensor Java -tutoriaal: 4 stappe
Raspberry Pi - HIH6130 I2C Humiditeits- en temperatuursensor Java -tutoriaal: HIH6130 is 'n humiditeits- en temperatuursensor met digitale uitset. Hierdie sensors bied 'n akkuraatheidsvlak van ± 4% RH. Met die toonaangewende langtermynstabiliteit, ware temperatuurgekompenseerde digitale I2C, toonaangewende betroubaarheid in die bedryf, energie-doeltreffendheid
Framboos PI Meervoudige I2C -toestelle: 3 stappe
Framboos PI Meervoudige I2C -toestelle: gefrustreerd omdat u nie veelvoude van dieselfde I2C -toestelle in u projek kan gebruik nie. U hoef nie stadige multiplexers te gebruik nie. Die nuutste raspbian -kern ondersteun die skepping van verskeie I2C -busse met GPIO -penne. Hierdie oplossing is super vinnig