Turinys:

„Covid-19“statistika + „Raspberry Pi“+ I2C LCD: 6 žingsniai
„Covid-19“statistika + „Raspberry Pi“+ I2C LCD: 6 žingsniai

Video: „Covid-19“statistika + „Raspberry Pi“+ I2C LCD: 6 žingsniai

Video: „Covid-19“statistika + „Raspberry Pi“+ I2C LCD: 6 žingsniai
Video: 🦠 Мониторинг Covid-19 на ESP8266 (😷 Статистика по коронавирусу на Arduino) 2024, Liepa
Anonim
„Covid-19“statistika + „Raspberry Pi“+ I2C skystųjų kristalų ekranas
„Covid-19“statistika + „Raspberry Pi“+ I2C skystųjų kristalų ekranas

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

Techninės įrangos sąranka
Techninės įrangos 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

Pi programinės įrangos sąranka
Pi programinės įrangos sąranka
Pi programinės įrangos sąranka
Pi programinės įrangos sąranka
Pi programinės įrangos sąranka
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“

Paleiskite „Python“
Paleiskite „Python“
Paleiskite „Python“
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: