Satura rādītājs:

Covid-19 statistika + Raspberry Pi + I2C LCD: 6 soļi
Covid-19 statistika + Raspberry Pi + I2C LCD: 6 soļi

Video: Covid-19 statistika + Raspberry Pi + I2C LCD: 6 soļi

Video: Covid-19 statistika + Raspberry Pi + I2C LCD: 6 soļi
Video: 🦠 Мониторинг Covid-19 на ESP8266 (😷 Статистика по коронавирусу на Arduino) 2024, Jūlijs
Anonim
Covid-19 statistika + Raspberry Pi + I2C LCD
Covid-19 statistika + Raspberry Pi + I2C LCD

Tāpēc kādu dienu nejauši no zila gaisa es nolēmu iegūt dažas daļas, kas man bija gulējušas, un izveidot kaut ko tādu, kas man sniegtu reālā laika statistiku par Covid-19. Es neveltīju daudz laika, lai tas izskatītos jauki, jo kāpēc padarīt kaut ko pastāvīgu, ja šis pasākums nebūs? Tāpēc mans displejs ir vienkārši uzstādīts nelielā kartona kastē.

Nepieciešamās detaļas:

  • Raspberry Pi - jebkurš modelis. Es izmantoju Raspberry Pi 3A+
  • 20x4 I2C LCD displejs - nav konkrēta zīmola … bet tam ir nepieciešama I2C mugursoma
  • Džemperu vadi no sievietēm līdz sievietēm - tikai 4 no tiem, lai savienotu I2C ar Pi

www.adafruit.com/product/4027

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

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

Šīs saites atrodas tieši uz avotiem, no kuriem es iegādājos. Atvainojiet, ka Adafruit šobrīd nesniedz piegādi, bet Amazon ir … tikai lēnām, jo to galvenā uzmanība tiek pievērsta svarīgākajām precēm, kuras tās nav. Visu var atrast citur Amazon un eBay.

Lai to paveiktu, jums, protams, būs nepieciešams maiņstrāvas adapteris, USB kabelis un microSD karte.

1. darbība. Aparatūras iestatīšana

Aparatūras iestatīšana
Aparatūras iestatīšana

Atsaucieties uz pievienoto pinout attēlu. Tajā ir rakstīts B+, bet tas attiecas arī uz visiem citiem Raspberry Pi modeļiem, kas parādījušies arī pēc tam.

Ja LCD displejam ir pievienota I2C mugursoma, šī savienojuma darbībai nepieciešami tikai 4 vadi.

Pievienojiet GND jebkurai Raspberry Pi zemējuma tapai: 6., 9., 14., 20., 25., 30., 34., 39. tapa. Es to pievienoju 6. tapai.

Savienojiet VCC ar kādu no 5 voltu tapām Raspberry Pi: 2., 4. tapa. Es izmantoju 4. tapu

Pievienojiet SDA 3. tapai.

Pievienojiet SCL 5. tapai.

Ja jūs sekojāt manam iestatījumam, jūs nonāksit pie visiem 4 vadiem 2x2 shēmā GPIO galvenēs.

Jūsu montāžas metode var būt jebkas, ko varat iedomāties … vai vispār nekas. Kā es teicu ievadā, šis koronavīrusa celms neturpināsies mūžīgi, tāpēc man nav nepieciešama neviena iestatīšana. Ja es nolemšu saglabāt šo iestatījumu pēc šī pasākuma beigām, es varētu to pārvērst par laika apstākļu displeju vai tamlīdzīgu.

Es pievienoju uzgriezni un skrūvi kopā ar neilona starplikām pie visiem Pi 3A+4 stūriem. Tas ir stingri neobligāti. Es to darīju, jo man dažreiz tas ir uz metāla virsmas, man nepatika, ka pagaidu iestatījumi tika izveidoti uz Pi, kas atrodas korpusa iekšpusē, un es nevēlos riskēt to sajaukt, jo aizmirsu to noņemt no metāla virsmu pirms tās ieslēgšanas.

2. darbība. Pi programmatūras iestatīšana

Pi programmatūras iestatīšana
Pi programmatūras iestatīšana
Pi programmatūras iestatīšana
Pi programmatūras iestatīšana
Pi programmatūras iestatīšana
Pi programmatūras iestatīšana

Kā jau ievadā teicu, nav nozīmes tam, kādu Raspberry Pi modeli izmantojat. Es to izmantoju Raspberry Pi 3A+, izmantojot WiFi, bet esmu to pārbaudījis arī Raspberry Pi 2, izmantojot Ethernet kabeli, un Raspberry Pi Zero versiju 1.3 (pati pirmā Pi Zero ar sērijas kameras savienotāju) ar USB WiFi dongli.

Es nerakstīšu, kā instalēt Raspbian uz MicroSD kartes, jo ir miljoniem norādījumu, kā to izdarīt. Man ir 16 GB microSD, kurā darbojas Raspbian Buster Lite. Kā piezīmi, es gandrīz vienmēr izmantoju Raspbian Lite, jo nevienā no maniem projektiem man nav vajadzīgas citas bezjēdzīgas programmatūras pakotnes. Ja instalēju programmatūru, izmantojot apt-get, tā instalēs trūkstošos priekšnosacījumus.

Izveidojiet savienojumu ar tīklu. Atkal ir miljoniem norādījumu, kā to izdarīt, tāpēc es šeit neiedziļināšos. Varat izmantot vadu vai bezvadu savienojumu, taču tam būs nepieciešams interneta savienojums.

Neobligāti, bet jūs varētu iespējot SSH savienojumu, izmantojot PuTTY. ES izdarīju.

Atjauniniet visu un pēc tam restartējiet:

sudo apt atjauninājums

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo atsāknēšana

Šī ir viena iestatīšana, ko es šeit izskatīšu. Atkal ir miljoniem veidu, kā to izdarīt, bet labākā atsauce, ko atradu, ir šeit:

Šeit ir uzsvērti:

sudo apt instalēt i2c-tools

sudo apt instalēt python-smbus

Jums būs arī jāiespējo I2C

sudo raspi-config

- 5 saskarnes iespējas

- P5 I2C

Lai piemērotu izmaiņas, atsāknējiet

sudo atsāknēšana

Tagad ir pienācis laiks pārbaudīt, vai līdz šim visu izdarījāt pareizi

i2cdetect -y 1

Ja jūsu displejs ir ieslēgts un to var redzēt jūsu Raspberry Pi, jums parādīsies diagramma. 20x4, ko es nopirku vietnē Amazon un izmantoju šim projektam, adrese ir 27. Tehniski tas tiks identificēts kā 0x27 python skriptiem, kas parādīsies vēlāk. Man bija tāda pati adrešu izstāde 2 16x2 displejiem, kurus es arī nopirku Amazon, un vienam 40x2, ko atradu eBay.

3. darbība: Python iestatīšana

Tātad tagad par sarežģītām lietām. Es centīšos to saglabāt pēc iespējas vienkāršāk. Iesācējiem es vienkārši rakstīšu failus mājas direktorijā.

pieskarieties I2C_LCD_driver.py

nano I2C_LCD_driver.py

Ielīmējiet zemāk esošo saturu jaunizveidotajā python skriptā.

#-*-kodēšana: utf-8-*- # Oriģinālais kods atrasts: #

"""

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

Es zinu, ka šis skripts ir diezgan netīrs, bet tas ir efektīvs. Tajā tiks parādīta pašreizējā statistika par Covid-19 gadījumiem ASV. Galvenā datu bāze tiek atjaunināta ik pēc 5 minūtēm. Mans skripts aizņem 1 minūti, lai pilnībā pārvietotos pa 3 lappusēm, un katru reizi, kad cikls sākas no jauna, tiks parādīti atjauninātie skaitļi.

4. darbība: palaidiet Python

Palaidiet Python
Palaidiet Python
Palaidiet Python
Palaidiet Python

Sāksim:

python covid19.py

Pirmajā lapā ir parādīts kopējais saslimšanas gadījumu un nāves gadījumu skaits kopš koronavīrusa pirmās parādīšanās valstī. Otrajā lappusē ir parādīti gadījumi un nāves gadījumi, kas notikuši tikai pašreizējā dienā. Trešais parāda cilvēkus kritiskā stāvoklī, pēc tam gadījumus un nāves gadījumus uz vienu miljonu cilvēku. Trešās lapas otrajā rindā tika parādīts pirmās lietas datums valstī, bet man tas bija jānoņem, jo skripts dažreiz kļūdījās un avarēja, atsaucoties uz šo rindu ar kļūdu.

Ir veidi, kā šo skriptu palaist automātiski, taču es šeit neiedziļināšos detaļās. Es tikai palaižu raktuves pēc komandas pēc tam, kad es SSH izveidoju savienojumu ar to, izmantojot PuTTY. Kamēr tas darbojas, jūs nevarēsit izpildīt citas komandas, kamēr nenospiedīsit Ctrl+C.

5. solis: Ko darīt, ja es nedzīvoju ASV?

Šo skriptu var mainīt, lai parādītu citu valstu statistiku. Kā redzat, mana skripta URL tiek iegūts no API šeit: (neizmantojiet pārlūkprogrammu Internet Explorer, lai skatītu šīs lapas. Tā mēģinās lejupielādēt.json failu. Es izmantoju pārlūku Chrome)

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

Tagad apmeklējiet to pašu adresi, bet vienu mapi augstāk

coronavirus-19-api.herokuapp.com/countries

Šeit ir uzskaitīta katras valsts statistika. Acīmredzot tas būs murgs, mēģinot izvilkt API datus no šīs lapas. Tāpēc vislabāk ir atvērt lapu savai valstij. Mūsu draugiem Kanādā būtu jārediģē skripts uz šo URL:

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

Šeit ir ļoti svarīga piezīme. API vietrādim URL jābūt konkrētam… tas nozīmē, ka URL nav atstarpju. Tīmekļa pārlūkošanas laikā tīmekļa adreses atstarpes tiek aizstātas ar "%20", un mūsu draugiem valstīs ar 2 daļu nosaukumiem, piemēram, Jaunzēlandei, šajā skriptā vajadzēs aizstāt URL ar:

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

6. solis: pēdējās domas

Gadu gaitā esmu darījis daudzas lietas ar Raspberry Pi un Arduino, taču lielākā daļa no tā, ko esmu uzbūvējis, ir tikai citu ideju atkārtojumi. Šis ir gandrīz tāds pats, izņemot to, ka šajā iestatījumā esmu apkopojis gabalus no daudziem avotiem. Lai gan šī iestatīšana neļaus jums būt drošam un veselīgam šajā grūtajā laikā, tā noteikti jūs aizņems, kad to iestatīsit, un pēc tam jūs informēs.

Ja jums vēl nav šo detaļu, neuztraucieties par to iegādi, ja vien neesat nopietni domājis par to izveidi. Kā jau teicu iepriekš, piegādes laiks šobrīd aizņem ilgāku laiku, jo šie centieni tiek veltīti būtiskām precēm. Šīs daļas man bija tikai mācībām un eksperimentiem. Uz kastes uzstādītais displejs sākotnēji tika iestatīts, lai reālā laika statistiku skatītu par citu Raspberry Pi manā tīklā, kurā darbojas Pi-Hole. Kad šis Covid-19 notikums būs beidzies, es varētu to pārvērst par laika apstākļu displeju.

Ikvienam, kas lasa, es vēlos pateikt šo pamācību:

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

Es to vēl neesmu izmēģinājis, bet man ir šīs precīzās sastāvdaļas, un es varētu kādu laiku to izmēģināt.

Ieteicams: