Мазмұны:

Covid-19 статистикасы + Raspberry Pi + I2C LCD: 6 қадам
Covid-19 статистикасы + Raspberry Pi + I2C LCD: 6 қадам

Бейне: Covid-19 статистикасы + Raspberry Pi + I2C LCD: 6 қадам

Бейне: Covid-19 статистикасы + Raspberry Pi + I2C LCD: 6 қадам
Бейне: 🦠 Мониторинг Covid-19 на ESP8266 (😷 Статистика по коронавирусу на Arduino) 2024, Шілде
Anonim
Covid-19 статистикасы + Raspberry Pi + I2C LCD
Covid-19 статистикасы + Raspberry Pi + I2C LCD

Бір күні кездейсоқ кездейсоқ, мен бірнеше бөлікті алып, маған Ковид-19 туралы нақты уақыт статистикасын беретін нәрсе жасауды шештім. Мен оны әдемі етіп көрсетуге көп уақыт жұмсамадым, себебі бұл оқиға болмайтын кезде неге тұрақты нәрсе жасау керек? Сондықтан менің дисплейім кішкене картон қорапқа бекітілген.

Қажетті бөлшектер:

  • Raspberry Pi - кез келген модель. Мен Raspberry Pi 3A+ қолдандым
  • 20x4 I2C СК дисплейі - арнайы бренд жоқ … бірақ I2C рюкзагы қажет
  • Әйелден әйелге секіргіш сымдар - олардың 4 -і I2C -ді Пи -ге қосу үшін

www.adafruit.com/product/4027

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

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

Бұл сілтемелер тікелей мен сатып алған көздерге сілтеме жасайды. Adafruit дәл қазір жеткізілмейді деп айтуға кешірім сұраймын, бірақ Амазон баяу, өйткені олар негізгі заттарға емес, негізгі заттарға бағытталған. Барлығын Amazon мен eBay -ден басқа жерден табуға болады.

Осының барлығымен айналысу үшін сізге айнымалы ток адаптері, USB кабелі және microSD картасы қажет болады.

1 -қадам: Жабдықты орнату

Жабдықты орнату
Жабдықты орнату

Қосылған түйреуіш суретке сілтеме жасаңыз. Онда B+жазылған, бірақ ол Raspberry Pi -дің барлық модельдеріне қатысты.

СКД дисплейге бекітілген I2C рюкзагы бар, бұл байланыс жұмыс істеу үшін тек 4 сымды қажет етеді.

GND -ді Raspberry Pi -дегі түйреуіштердің кез келгеніне қосыңыз: 6, 9, 14, 20, 25, 30, 34, 39 -түйреуіш. Мен оны 6 -істікке жалғадым.

VCC -ді Raspberry Pi -дегі 5 вольтты түйреуіштердің біріне қосыңыз: 2 -түйреуіш, 4. Мен 4 -істікті қолдандым.

SDA -ны 3 -ші пинге қосыңыз.

SCL -ді 5 -ші пинге қосыңыз.

Егер сіз менің параметрлерімді орындасаңыз, сіз GPIO тақырыптарындағы 2x2 үлгісіндегі барлық 4 сымды аласыз.

Сіздің монтаждау әдісі сіз ойлағанның бәрі болуы мүмкін … немесе мүлде жоқ. Кіріспеде айтқанымдай, бұл коронавирустың штаммы мәңгілікке созылмайды, сондықтан маған менің баптауым да қажет емес. Егер мен бұл оқиға аяқталғаннан кейін бұл параметрді сақтауды шешсем, мен оны ауа райы дисплейіне немесе басқа нәрсеге айналдыра аламын.

Мен гайка мен болтты нейлон аралықтармен бірге Pi 3A+барлық 4 бұрышына бекіттім. Бұл қатаң қосымша. Мен мұны істедім, себебі менде кейде металл бетінде болады, корпустың ішіндегі Pi -ге уақытша қондырғыларды ұнатпайтынмын және оны шатастырғым келмейді, себебі мен оны металдан алып тастауды ұмытып кеттім. оны қоспас бұрын бетіне жағыңыз.

2 -қадам: Pi бағдарламалық жасақтамасын орнату

Pi бағдарламалық қамтамасыз етуді орнату
Pi бағдарламалық қамтамасыз етуді орнату
Pi бағдарламалық қамтамасыз етуді орнату
Pi бағдарламалық қамтамасыз етуді орнату
Pi бағдарламалық қамтамасыз етуді орнату
Pi бағдарламалық қамтамасыз етуді орнату

Кіріспеде айтқанымдай, сіз Raspberry Pi қандай үлгісін қолданғаныңыз маңызды емес. Мен мұны WiFi арқылы Raspberry Pi 3A+ -де қолданамын, бірақ оны Raspberry Pi 2 -де Ethernet кабелінде және Raspberry Pi Zero 1.3 нұсқасында (сериялық камера қосқышы бар ең бірінші Pi Zero) USB WiFi кілтімен тексердім.

Мен Raspbian -ды MicroSD картасына қалай орнату керектігін жазбаймын, себебі мұны қалай жасау керектігі туралы миллиондаған нұсқаулар бар. Менде Raspbian Buster Lite жұмыс істейтін 16 ГБ microSD бар. Ескерту бойынша, мен әрқашан Raspbian Lite қолданамын, себебі маған кез келген жобада басқа пайдасыз бағдарламалық пакеттер қажет емес. Егер мен apt-get арқылы бағдарламалық қамтамасыз етуді орнатсам, ол жетіспейтін алғышарттарды орнатады.

Желіге қосылыңыз. Тағы да, мұны қалай жасау керектігі туралы миллиондаған нұсқаулар бар, сондықтан мен мұнда тереңірек айтпаймын. Сіз сымды немесе сымсыз қосыла аласыз, бірақ бұл үшін интернет байланысы қажет.

Қосымша, бірақ сіз SSH -ке PuTTY көмегімен қосылуды қосуға болады. Мен істедім.

Барлығын жаңартыңыз, содан кейін қайта жүктеңіз:

sudo apt жаңарту

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

Бұл мен мұнда өтетін қондырғылардың бірі. Тағы да, мұны істеудің миллиондаған әдістері бар, бірақ мен тапқан ең жақсы сілтеме дәл осы жерде:

Міне, маңызды сәттер:

sudo apt i2c-tools орнатыңыз

sudo apt install python-smbus

Сондай -ақ, I2C қосу қажет болады

sudo raspi-config

- 5 интерфейс опциясы

- P5 I2C

Өзгерістерді қолдану үшін қайта жүктеңіз

sudo қайта жүктеу

Енді сіз мұның бәрін осы уақытқа дейін дұрыс жасағаныңызды көрудің уақыты келді

i2cdetect -y 1

Егер сіздің дисплейіңіз қосылған болса және оны Raspberry Pi арқылы көруге болатын болса, сізде диаграмма пайда болады. Мен Amazon -дан сатып алған және осы жобаны қолданатын 20x4 мекенжайы - 27. Техникалық тұрғыдан бұл кейінірек келетін питон сценарийлері үшін 0x27 деп анықталады. Менде Amazon -да сатып алған 16x2 дисплейі мен eBay -де табылған 40x2 бір дисплей үшін сол мекен -жай шоуы болды.

3 -қадам: Python орнату

Енді күрделі заттарға. Мен оны мүмкіндігінше қарапайым ұстауға тырысамын. Бастау үшін мен файлдарды үй каталогына жазамын.

I2C_LCD_driver.py пәрменін түртіңіз

нано I2C_LCD_driver.py

Төмендегі мазмұнды жаңадан құрылған python сценарийіне қойыңыз.

#-*-кодтау: utf-8-*- # Бастапқы код табылды: #

"""

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

Мен бұл сценарий өте нашар екенін білемін, бірақ ол тиімді. Ол АҚШ-тағы Ковид-19 жағдайының ағымдағы статистикасын көрсетеді. Негізгі мәліметтер базасы әр 5 минут сайын жаңартылып отырады. Менің сценарийім 3 бетті толық айналдыру үшін 1 минутты алады және цикл қайта басталған сайын жаңартылған нөмірлерді алады.

4 -қадам: Python іске қосыңыз

Python іске қосыңыз
Python іске қосыңыз
Python іске қосыңыз
Python іске қосыңыз

Бастайық:

питон covid19.py

Бірінші бетте коронавирустың елге алғаш түскен кезінен бастап өлім мен өлім -жітімнің жалпы саны көрсетілген. Екінші бетте тек осы күні болған жағдайлар мен өлім -жітімнің сандары көрсетілген. Үшіншісі ауыр халдегі адамдарды көрсетеді, содан кейін миллион адамға шаққандағы жағдай мен өлім. Үшінші беттегі екінші жол елдегі бірінші істің күнін көрсетеді, бірақ мен оны алып тастауға мәжбүр болдым, себебі сценарий кейде қате жіберіп, қатені көрсете отырып бұзылады.

Бұл сценарийді автоматты түрде іске қосудың жолдары бар, бірақ мен бұл жерде егжей -тегжейлі айтпаймын. Мен SSH оған PuTTY арқылы қосылғаннан кейін команданы іске қосамын. Ол жұмыс істеп тұрған кезде Ctrl+C пернелерін баспайынша басқа командаларды орындай алмайсыз.

5 -қадам: Егер мен АҚШ -та тұрмасам не істеуім керек?

Бұл сценарийді басқа елдердің статистикасын көрсету үшін өзгертуге болады. Көріп отырғаныңыздай, менің сценарийдегі URL мекенжайы API -ден мына жерден алынады: (бұл беттерді қарау үшін Internet Explorer қолданбаңыз. Ол.json файлын жүктеуге тырысады. Мен Chrome қолдандым)

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

Енді сол мекенжайға кіріңіз, бірақ бір қалта жоғары

coronavirus-19-api.herokuapp.com/countries

Бұл әр елдің статистикасын көрсетеді. Әлбетте, бұл беттен API деректерін алуға тырысатын кошмар болады. Сондықтан сіздің елге арналған бетті ашқан дұрыс. Канададағы достарымызға осы URL мекенжайындағы сценарийді өңдеу қажет болады:

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

Бұл жерде өте маңызды ескерту. API мекенжайы нақты болуы керек … URL мекенжайында бос орын жоқ. Веб -шолуда веб -адрестегі бос орындар «%20» -мен ауыстырылады, осылайша, Жаңа Зеландия сияқты 2 бөліктен тұратын елдердегі біздің достарымыз бұл сценарийдегі URL мекен -жайын келесіге ауыстыруы қажет:

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

6 -қадам: Қорытынды ойлар

Мен көптеген жылдар бойы Raspberry Pi және Arduino -мен көптеген нәрселер жасадым, бірақ мен жасаған нәрселердің көпшілігі тек басқалардың идеяларын қайталайды. Мен бұл қондырғыға көптеген дереккөздерден жинақтар қоспағанда, бұл шамамен бірдей. Бұл қондырғы сіздің денсаулығыңызды сақтап қалмайтынына қарамастан, ол сіз орнатқан кезде сізді бос қалдырмайды және сізге бұл туралы хабарлайды.

Егер сізде бұл бөлшектер жоқ болса, егер сіз оны құрастыруға шындап кіріспесеңіз, оларды сатып алуға қиналмаңыз. Мен бұрын айтқанымдай, дәл қазір жеткізу уақыты ұзарып бара жатыр, себебі бұл күштер маңызды заттарға жұмсалады. Менде бұл бөліктер тек үйренуге және тәжірибе жасауға арналған. Қорапқа орнатылған дисплей бастапқыда менің желімдегі Pi-Hole жұмыс істейтін басқа Raspberry Pi туралы нақты уақыт статистикасын қарау үшін орнатылған. Осы Ковид-19 оқиғасы аяқталғаннан кейін мен оны ауа райы дисплейіне айналдыруым мүмкін.

Кім оқыса, мен бұл нұсқаулыққа айқайлағым келеді:

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

Мен оны әлі сынап көрмедім, бірақ менде дәл ингредиенттер бар, мен оны біраз уақыт сынап көруім мүмкін.

Ұсынылған: