Talaan ng mga Nilalaman:

Covid-19 Stats + Raspberry Pi + I2C LCD: 6 na Hakbang
Covid-19 Stats + Raspberry Pi + I2C LCD: 6 na Hakbang

Video: Covid-19 Stats + Raspberry Pi + I2C LCD: 6 na Hakbang

Video: Covid-19 Stats + Raspberry Pi + I2C LCD: 6 na Hakbang
Video: COVID-19 Realtime Status by ESP8266 || Interfacing ESP8266 With OLED Display 2024, Nobyembre
Anonim
Covid-19 Stats + Raspberry Pi + I2C LCD
Covid-19 Stats + Raspberry Pi + I2C LCD

Kaya nang sapalaran sa labas ng asul isang araw, nagpasya akong kumuha ng ilang bahagi na nakahiga ako at gumawa ng isang bagay na maghahatid sa akin ng mga istatistika ng real time sa Covid-19. Hindi ako naglagay ng maraming oras upang gawin itong maganda dahil bakit gumawa ng isang permanenteng bagay na hindi mangyayari ang kaganapang ito? Samakatuwid, ang aking display ay naka-mount lamang sa isang maliit na kahon ng karton.

Mga bahaging kinakailangan:

  • Raspberry Pi - anumang modelo. Gumamit ako ng Raspberry Pi 3A +
  • 20x4 I2C LCD Display - walang partikular na tatak … ngunit kailangan ang I2C backpack
  • Babae sa mga babaeng jumper wires - 4 lamang sa mga ito upang ikonekta ang I2C sa Pi

www.adafruit.com/product/4027

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

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

Direkta ang mga link na ito sa mga mapagkukunan na binili ko. Paumanhin na sabihin na ang Adafruit ay hindi naghahatid ngayon, ngunit ang Amazon ay… mabagal lamang dahil sa kanilang pangunahing pokus na patungo sa mahahalagang item, na kung saan hindi. Ang lahat ay matatagpuan sa ibang lugar sa Amazon at eBay.

Malinaw na kakailanganin mo ng isang ad adapter, USB cable, at microSD card upang sumama sa lahat ng ito.

Hakbang 1: Pag-setup ng Hardware

Pag-setup ng Hardware
Pag-setup ng Hardware

Sanggunian ang nakalakip na larawan ng pinout. Sinasabi nito ang B +, ngunit nalalapat ito sa bawat iba pang modelo ng Raspberry Pi na sumunod din sa isa.

Sa isang I2C backpack na nakakabit sa LCD display, ang koneksyon na ito ay nangangailangan lamang ng 4 na mga wire upang gumana.

Ikonekta ang GND sa anumang isa sa mga ground pin sa Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Ikinonekta ko ito sa pin 6.

Ikonekta ang VCC sa alinman sa 5 volt pin sa Raspberry Pi: Pin 2, 4. Gumamit ako ng pin 4

Ikonekta ang SDA sa pin 3.

Ikonekta ang SCL sa Pin 5.

Kung sinundan mo ang aking pag-set up, magtatapos ka sa lahat ng 4 na mga wire sa isang pattern na 2x2 sa mga header ng GPIO.

Ang iyong mounting na pamamaraan ay maaaring maging anumang naiisip mo … o wala man lang. Tulad ng sinabi ko sa panimula, ang pilay ng coronavirus na ito ay hindi magtatagal magpakailanman, kaya hindi ko kailangan ang aking pag-set up sa alinman. Kung magpasya akong panatilihin ang pag-set up na ito matapos ang kaganapan na ito ay natapos na, maaari ko itong gawing isang display ng panahon o iba pa.

Nag-attach ako ng isang nut at bolt kasama ang mga nylon spacer sa lahat ng 4 na sulok ng aking Pi 3A +. Mahigpit na opsyonal ito. Ginawa ko ito dahil minsan mayroon ako nito sa isang metal na ibabaw, hindi ginugusto ang pagkakaroon ng aking pansamantalang pag-set up sa isang Pi na nasa loob ng isang kaso, at ayaw ipagsapalaran na gulo ito dahil nakalimutan kong alisin ito mula sa metal ibabaw bago paandar ito.

Hakbang 2: Pag-setup ng Pi Software

Pag-setup ng Pi Software
Pag-setup ng Pi Software
Pag-setup ng Pi Software
Pag-setup ng Pi Software
Pag-setup ng Pi Software
Pag-setup ng Pi Software

Tulad ng sinabi ko sa intro, hindi mahalaga kung ano ang gagamitin mong modelo ng Raspberry Pi. Ginagamit ko ito sa isang Raspberry Pi 3A + sa paglipas ng WiFi ngunit nasubukan din ito sa Raspberry Pi 2 sa ethernet cable, at Raspberry Pi Zero bersyon 1.3 (ang kauna-unahang Pi Zero na may konektor ng serial camera) na may USB WiFi dongle.

Hindi ko i-type kung paano i-install ang Raspbian sa isang MicroSD card dahil may milyun-milyong mga tagubilin sa kung paano ito gawin. Mayroon akong isang 16GB microSD na tumatakbo sa Raspbian Buster Lite. Sa isang tala, halos palaging gumagamit ako ng Raspbian Lite dahil hindi ko kailangan ang iba pang mga walang silbi na software packages sa alinman sa aking mga proyekto. Kung mag-install ako ng software gamit ang apt-get, mag-i-install ito ng mga nawawalang mga kinakailangan.

Kumonekta sa isang network. Muli, may milyun-milyong mga tagubilin doon kung paano ito gawin, kaya't hindi ako lalalim dito. Maaari kang mag-wire o mag-wireless, ngunit mangangailangan ito ng isang koneksyon sa internet.

Opsyonal, ngunit maaari mong paganahin ang SSH na kumonekta gamit ang PuTTY. Ginawa ko.

I-update ang lahat pagkatapos ay i-reboot:

sudo apt update

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

Ito ay isang pag-setup na dadaan ako dito. Muli, may milyun-milyong mga paraan upang magawa ito, ngunit ang pinakamahusay na sanggunian na nakita ko ay narito mismo:

Narito ang mga highlight:

sudo apt i-install ang i2c-tool

sudo apt i-install ang python-smbus

Kakailanganin mo ring paganahin ang I2C

sudo raspi-config

- 5 Mga Pagpipilian sa Interfacing

- P5 I2C

I-reboot upang mailapat ang mga pagbabago

sudo reboot

Ngayon ay oras na upang makita kung nagawa mo ito ng tama hanggang ngayon

i2cdetect -y 1

Kung ang iyong display ay pinalakas at maaaring makita ng iyong Raspberry Pi, magkakaroon ka ng isang tsart na lalabas. Ang address para sa binili kong 20x4 sa Amazon at ginagamit para sa proyektong ito ay 27. Teknikal na makikilala ito bilang 0x27 para sa mga script ng sawa na darating mamaya. Nagkaroon ako ng parehong palabas sa address para sa 2 16x2 display na binili ko din sa Amazon at isang 40x2 na nakita ko sa eBay.

Hakbang 3: Pag-setup ng Python

Kaya ngayon para sa mga kumplikadong bagay. Susubukan kong panatilihin itong kasing simple ng makakaya ko. Para sa mga nagsisimula, magsusulat lamang ako ng mga file sa direktoryo sa bahay.

pindutin ang I2C_LCD_driver.py

nano I2C_LCD_driver.py

I-paste ang nilalaman sa ibaba sa iyong bagong nilikha na script ng sawa.

# - * - coding: utf-8 - * - # Orihinal na code na natagpuan sa: #

"""

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

Alam kong ang script na ito ay medyo magulo, ngunit epektibo ito. Ipapakita nito ang kasalukuyang istatistika para sa mga kaso ng Covid-19 sa Estados Unidos. Ang pangunahing database ay nai-update bawat 5 minuto. Ang aking script ay tumatagal ng 1 minuto upang ganap na mag-ikot sa pamamagitan ng 3 mga pahina at kukuha ng na-update na mga numero sa tuwing magsisimula muli ang pag-ikot.

Hakbang 4: Patakbuhin ang Python

Patakbuhin ang Python
Patakbuhin ang Python
Patakbuhin ang Python
Patakbuhin ang Python

Magsimula tayo:

python covid19.py

Ipinapakita ng unang pahina ang kabuuang bilang ng mga kaso at pagkamatay mula noong unang tumama ang coronavirus sa bansa. Ipinapakita ng pangalawang pahina ang mga bilang na iyon para sa mga kaso at pagkamatay na naganap lamang sa kasalukuyang araw. Ang pangatlo ay nagpapakita ng mga taong nasa kritikal na kondisyon, pagkatapos ay mga kaso at pagkamatay bawat isang milyong katao. Ang pangalawang linya sa ikatlong pahina ay ginamit upang ipakita ang petsa ng unang kaso sa bansa, ngunit kinailangan kong alisin ito dahil ang script ay kung minsan ay nagkakamali at nag-crash na binabanggit ang linya na may isang error.

Mayroong mga paraan upang maisagawa ang script na ito nang awtomatiko, ngunit hindi ko ididetalye ang tungkol dito. Pinatakbo ko lang ang minahan pagkatapos ng SSH na kumonekta dito sa pamamagitan ng PuTTY. Habang tumatakbo ito, hindi ka makakagawa ng anumang iba pang mga utos hanggang sa pindutin mo ang Ctrl + C.

Hakbang 5: Paano Kung Hindi Ako Nakatira sa USA?

Maaaring baguhin ang script na ito upang maipakita ang mga istatistika para sa ibang mga bansa. Tulad ng nakikita mo, ang URL sa aking script ay kumukuha mula sa isang API dito: (huwag gumamit ng Internet Explorer upang matingnan ang mga pahinang ito. Susubukan nitong mag-dowload ng isang.json file. Ginamit ko ang Chrome)

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

Ngayon ay bisitahin ang parehong address, ngunit isang folder ang mas mataas

coronavirus-19-api.herokuapp.com/countries

Inililista nito ang mga istatistika para sa bawat bansa. Malinaw na ito ay magiging isang bangungot na sinusubukang hilahin ang data ng API mula sa pahinang ito. Kaya pinakamahusay na buksan ang pahina para sa iyong tukoy na bansa. Ang aming mga kaibigan sa Canada ay kailangang i-edit ang script sa URL na ito:

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

Napakahalagang tala dito. Ang URL sa API ay kailangang maging tiyak … nangangahulugang walang mga puwang sa isang URL. Sa pagba-browse sa web, ang mga puwang sa isang web address ay pinalitan ng "% 20" at sa nasabing, ang aming mga kaibigan sa mga bansa na may 2 bahagi ng pangalan, tulad ng New Zealand halimbawa, ay kailangang palitan ang URL sa script na ito ng:

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

Hakbang 6: Pangwakas na Mga Saloobin

Nagawa ko ang maraming bagay sa Raspberry Pi at Arduino sa mga nakaraang taon, ngunit ang karamihan sa itinayo ko ay mga pagtutuon lamang ng mga ideya ng iba. Ang isang ito ay halos pareho maliban sa pinagsama-sama kong mga piraso mula sa maraming mga mapagkukunan sa setup na ito. Kahit na ang pag-set up na ito ay hindi ka mapanatiling ligtas at malusog sa panahon ng matigas na oras na ito, tiyak na panatilihin kang abala habang itinatakda mo ito at mananatiling alam ka pagkatapos.

Kung wala ka ng mga bahaging ito, huwag i-stress ang iyong sarili sa pagbili ng mga ito maliban kung seryoso ka sa pagbuo nito. Tulad ng sinabi ko dati, ang mga oras ng pagpapadala ay mas tumatagal ngayon dahil ang mga pagsisikap na iyon ay inilalagay patungo sa mahahalagang item. Nagawa ko lang ang mga bahaging ito para sa pag-aaral at pag-eksperimento. Ang display na naka-mount sa kahon ay orihinal na na-set up upang matingnan ang mga istatistika ng real time ng isa pang Raspberry Pi sa aking network na nagpapatakbo ng Pi-Hole. Matapos ang Covid-19 na kaganapan na ito ay tapos na, maaari ko itong gawing isang display ng panahon.

Para sa sinumang nagbabasa, nais kong magbigay ng isang sigaw sa itinuturo na ito:

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

Hindi ko pa ito nasubukan, ngunit mayroon akong eksaktong mga sangkap, at maaari kong subukan ito ilang oras.

Inirerekumendang: