Turinys:
- 1 žingsnis: Aparatūros sąranka
- 2 žingsnis: „Pi“programinės įrangos sąranka
- 3 žingsnis: „Python“sąranka
- 4 veiksmas: paleiskite „Python“
- 5 žingsnis: Ką daryti, jei negyvenu JAV?
- 6 žingsnis: paskutinės mintys
Video: „Covid-19“statistika + „Raspberry Pi“+ I2C LCD: 6 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-31 10:22
Taigi vieną dieną atsitiktinai iš dangaus nusprendžiau pasiimti keletą dalių, kurias gulėjau, ir sukurti kažką, kas man suteiktų realaus laiko statistiką apie „Covid-19“. Neskyriau daug laiko tam, kad atrodytų gražiai, nes kam daryti kažką nuolatinio, kai šis renginys nebus? Todėl mano ekranas yra tiesiog pritvirtintas prie mažos kartoninės dėžutės.
Reikalingos dalys:
- Raspberry Pi - bet koks modelis. Aš naudoju Raspberry Pi 3A+
- 20x4 I2C skystųjų kristalų ekranas - nėra konkretaus prekės ženklo … bet reikia I2C kuprinės
- Moteriški ir moteriški jungiamieji laidai - tik 4 iš jų, norint prijungti I2C prie „Pi“
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Šios nuorodos nukreipiamos tiesiai į šaltinius, iš kurių pirkau. Atsiprašome, kad „Adafruit“šiuo metu neteikia paslaugų, tačiau „Amazon“… tik lėtai, nes pagrindinis dėmesys skiriamas esminiams dalykams, kurių nėra. Visa tai galima rasti kitur „Amazon“ir „eBay“.
Akivaizdu, kad jums reikės kintamosios srovės adapterio, USB kabelio ir „microSD“kortelės.
1 žingsnis: Aparatūros sąranka
Nurodykite pridėtą „pinout“paveikslėlį. Jame rašoma B+, bet tai taikoma ir visiems kitiems po to pasirodžiusiems Raspberry Pi modeliams.
Prie LCD ekrano pritvirtinta kuprinė „I2C“, kad veiktų šis ryšys, reikia tik 4 laidų.
Prijunkite GND prie bet kurio „Raspberry Pi“įžeminimo kaiščio: 6, 9, 14, 20, 25, 30, 34, 39 kaištis. Aš prijungiau jį prie 6 kaiščio.
Prijunkite VCC prie bet kurio iš 5 voltų kaiščių „Raspberry Pi“: 2, 4 kaištis. Aš naudoju 4 kaištį
Prijunkite SDA prie 3 kaiščio.
Prijunkite SCL prie 5 kaiščio.
Jei sekėte mano sąranką, GPIO antraštėse turėsite visus 4 laidus 2x2 modeliu.
Jūsų montavimo būdas gali būti bet koks, kokį tik galite įsivaizduoti … arba visai nieko. Kaip sakiau įžangoje, ši koronaviruso padermė nesitęs amžinai, todėl man nereikia nei vieno, nei kito. Jei nuspręsiu išlaikyti šią sąranką pasibaigus šiam įvykiui, galiu ją paversti orų ekranu ar pan.
Prie visų 4 „Pi 3A+“kampų pritvirtinau veržlę ir varžtą kartu su nailono tarpikliais. Tai griežtai neprivaloma. Aš tai padariau, nes kartais tai turiu ant metalinio paviršiaus, man nepatiko, kad mano laikinosios sąrankos buvo su „Pi“, esančiu dėklo viduje, ir nenoriu rizikuoti, kad jį sugadinsiu, nes pamiršau jį pašalinti iš metalo paviršių prieš įjungdami.
2 žingsnis: „Pi“programinės įrangos sąranka
Kaip sakiau įžangoje, nesvarbu, kokį Raspberry Pi modelį naudojate. Aš naudoju tai „Raspberry Pi 3A+“per „WiFi“, bet taip pat išbandžiau „Raspberry Pi 2“eterneto kabeliu ir „Raspberry Pi Zero 1.3“versiją (pati pirmoji „Pi Zero“su serijinės kameros jungtimi) su USB „WiFi“raktu.
Aš nesiruošiu rašyti, kaip įdiegti „Raspbian“į „MicroSD“kortelę, nes yra milijonai instrukcijų, kaip tai padaryti. Turiu 16 GB „microSD“, kuriame veikia „Raspbian Buster Lite“. Be to, beveik visada naudoju „Raspbian Lite“, nes man nereikia kitų nenaudingų programinės įrangos paketų jokiuose savo projektuose. Jei įdiegiu programinę įrangą naudodamas apt-get, ji įdiegs trūkstamas būtinas sąlygas.
Prisijunkite prie tinklo. Vėlgi, yra milijonai nurodymų, kaip tai padaryti, todėl čia nesigilinu. Galite naudoti laidinį arba belaidį ryšį, tačiau tam reikės interneto ryšio.
Neprivaloma, tačiau galite įgalinti SSH prisijungti naudodami „PuTTY“. Aš padariau.
Atnaujinkite viską, tada paleiskite iš naujo:
sudo apt atnaujinimas
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Tai yra viena sąranka, kurią čia atliksiu. Vėlgi, yra milijonai būdų, kaip tai padaryti, tačiau geriausia nuoroda, kurią radau, yra čia:
Čia yra svarbiausi dalykai:
sudo apt įdiegti i2c-tools
sudo apt įdiegti python-smbus
Taip pat turėsite įjungti I2C
sudo raspi-config
- 5 sąsajos parinktys
- P5 I2C
Perkraukite, kad pritaikytumėte pakeitimus
sudo perkraukite
Dabar atėjo laikas pamatyti, ar iki šiol visa tai darėte teisingai
i2cdetect -y 1
Jei jūsų ekranas yra įjungtas ir jį gali matyti „Raspberry Pi“, turėsite diagramą. 20x4, kurį nusipirkau „Amazon“ir naudoju šiam projektui, adresas yra 27. Techniškai tai bus nustatyta kaip 0x27 python scenarijams, kurie bus pateikti vėliau. Tą patį adresą rodiau 2 16x2 ekranuose, kuriuos taip pat nusipirkau „Amazon“, ir vieną 40x2, kurį radau „eBay“.
3 žingsnis: „Python“sąranka
Taigi dabar apie sudėtingus dalykus. Stengsiuosi, kad viskas būtų kuo paprasčiau. Pradžiai aš tiesiog rašysiu failus į namų katalogą.
palieskite I2C_LCD_driver.py
nano I2C_LCD_driver.py
Įklijuokite žemiau esantį turinį į naujai sukurtą „python“scenarijų.
#-*-kodavimas: utf-8-*- # Originalus kodas rastas: #
"""
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),="">
Žinau, kad šis scenarijus yra gana netvarkingas, bet jis yra veiksmingas. Jame bus rodoma dabartinė JAV „Covid-19“atvejų statistika. Pagrindinė duomenų bazė atnaujinama kas 5 minutes. Mano scenarijus užtrunka 1 minutę, kol visiškai pereinama per 3 puslapius, ir kiekvieną kartą, kai ciklas prasideda iš naujo, gaus atnaujintus skaičius.
4 veiksmas: paleiskite „Python“
Pradėkime:
python covid19.py
Pirmame puslapyje rodomas bendras atvejų ir mirčių skaičius nuo pirmojo koronaviruso atvejo šalyje. Antrame puslapyje rodomi tie atvejų ir mirčių skaičiai, kurie įvyko tik tą dieną. Trečiasis rodo kritinės būklės žmones, tada atvejai ir mirtys vienam milijonui žmonių. Antroji trečiojo puslapio eilutė rodė pirmojo atvejo šalyje datą, tačiau turėjau ją pašalinti, nes scenarijus kartais suklydo ir sudužo, nurodydamas tą eilutę su klaida.
Yra būdų, kaip šį scenarijų paleisti automatiškai, tačiau čia nesileisiu į detales. Aš tiesiog paleisiu savo komandą, kai SSH prisijungsiu prie jo per „PuTTY“. Kol jis veikia, negalėsite vykdyti jokių kitų komandų, kol nepaspausite Ctrl+C.
5 žingsnis: Ką daryti, jei negyvenu JAV?
Šį scenarijų galima modifikuoti, kad būtų rodoma kitų šalių statistika. Kaip matote, mano scenarijuje esantis URL paimtas iš API čia: (nenaudokite „Internet Explorer“šiems puslapiams peržiūrėti. Jis bandys atsisiųsti.json failą. Aš naudojau „Chrome“)
coronavirus-19-api.herokuapp.com/countries/usa
Dabar apsilankykite tuo pačiu adresu, bet vienu aplanku aukščiau
coronavirus-19-api.herokuapp.com/countries
Čia pateikiama kiekvienos šalies statistika. Akivaizdu, kad bus košmaras bandant ištraukti API duomenis iš šio puslapio. Taigi geriausia atidaryti konkrečios šalies puslapį. Mūsų draugams Kanadoje reikės redaguoti scenarijų pagal šį URL:
coronavirus-19-api.herokuapp.com/countries/canada
Čia labai svarbi pastaba. API URL turi būti konkretus … tai reiškia, kad URL nėra tarpų. Naršant žiniatinklyje žiniatinklio adreso tarpai pakeičiami „%20“, o mūsų draugai šalyse, turinčiose 2 dalių pavadinimus, pvz., Naujoji Zelandija, turėtų pakeisti šio scenarijaus URL:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
6 žingsnis: paskutinės mintys
Per daugelį metų aš padariau daug dalykų su „Raspberry Pi“ir „Arduino“, tačiau dauguma to, ką sukūriau, yra tik kitų idėjų atkartojimas. Tai beveik tas pats, išskyrus tai, kad į šią sąranką surinkau kūrinius iš daugelio šaltinių. Nors ši sąranka neapsaugos jūsų nuo sveikatos ir sveikatos šiuo sunkiu metu, ji tikrai jus užims, kai ją nustatysite, ir vėliau jus informuos.
Jei šių dalių dar neturite, nesivaržykite jų pirkti, nebent rimtai ketinate jas statyti. Kaip jau sakiau anksčiau, pristatymo laikas šiuo metu užtrunka ilgiau, nes šios pastangos dedamos į būtiniausius daiktus. Aš jau turėjau šias dalis mokytis ir eksperimentuoti. Prie dėžutės sumontuotas ekranas iš pradžių buvo nustatytas peržiūrėti kito „Raspberry Pi“mano tinklo, kuriame veikia „Pi-Hole“, statistiką realiuoju laiku. Pasibaigus šiam „Covid-19“įvykiui, galiu jį paversti orų ekranu.
Visiems skaitantiems noriu pasakyti šitą pamokomą žodį:
www.instructables.com/id/DIY-Hand-Sanitize…
Aš dar neišbandžiau, bet turiu tuos tikslius ingredientus ir galbūt kurį laiką išbandysiu.
Rekomenduojamas:
„Raspberry Pi“- „HIH6130 I2C“drėgmės ir temperatūros jutiklio „Python“vadovėlis: 4 žingsniai
„Raspberry Pi“- HIH6130 I2C drėgmės ir temperatūros jutiklis „Python“mokymo programa: HIH6130 yra drėgmės ir temperatūros jutiklis su skaitmenine išvestimi. Šie jutikliai užtikrina ± 4% RH tikslumo lygį. Su pirmaujančiu ilgalaikiu stabilumu pramonėje, tikru temperatūros kompensuojamu skaitmeniniu I2C, patikimumu pramonėje, energijos vartojimo efektyvumu
„Raspberry Pi“- HIH6130 I2C drėgmės ir temperatūros jutiklis „Java“pamoka: 4 žingsniai
„Raspberry Pi“- HIH6130 I2C drėgmės ir temperatūros jutiklis „Java“pamoka: HIH6130 yra drėgmės ir temperatūros jutiklis su skaitmenine išvestimi. Šie jutikliai užtikrina ± 4% RH tikslumo lygį. Su pirmaujančiu ilgalaikiu stabilumu pramonėje, tikru temperatūros kompensuojamu skaitmeniniu I2C, patikimumu pramonėje, energijos vartojimo efektyvumu
„Raspberry PI Multiple I2C“įrenginiai: 3 žingsniai
„Raspberry PI Multiple I2C“įrenginiai: nusivylę, nes savo projekte negalite naudoti tų pačių I2C įrenginių kartotinių. Nereikia naudoti lėtų multiplekserių. Naujausias raspbian branduolys palaiko kelių I2C magistralių kūrimą naudojant GPIO kaiščius. Šis sprendimas yra super greitas