Mündəricat:
- Addım 1: Hardware Setup
- Addım 2: Pi Proqram Quraşdırması
- Addım 3: Python Quraşdırması
- Addım 4: Python'u işə salın
- Addım 5: ABŞ -da yaşamasam nə edim?
- Addım 6: Son Düşüncələr
Video: Covid-19 Statistikası + Moruq Pi + I2C LCD: 6 addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-31 10:16
Bir gün təsadüfi olaraq gözümün qabağında yatdığım bir neçə hissəni almaq və mənə Covid-19 haqqında real vaxt statistikası verəcək bir şey etmək qərarına gəldim. Gözəl görünməsi üçün çox vaxt sərf etmədim, çünki bu hadisə olmayanda niyə daimi bir şey etmək lazımdır? Buna görə ekranım kiçik bir karton qutuya quraşdırılmışdır.
Lazım olan hissələr:
- Raspberry Pi - istənilən model. Raspberry Pi 3A+ istifadə etdim
- 20x4 I2C LCD Ekran - xüsusi bir marka deyil … ancaq I2C sırt çantasına ehtiyacı var
- Dişi -qadın tullanan telləri - I2C -ni Pi -yə bağlamaq üçün onlardan yalnız 4 -ü
www.adafruit.com/product/4027
www.amazon.com/gp/product/B01GPUMP9C/ref=p…
www.amazon.com/gp/product/B01L5ULRUA/ref=p…
Bu bağlantılar birbaşa aldığım mənbələrə gedir. Adafruit -in hazırda çatdırılmadığını söyləmək üzr istəyirik, amma Amazon… əsas diqqəti yavaş -yavaş əsas məhsullara yönəltdiyinə görədir. Hamısını Amazon və eBay -da başqa yerdə tapa bilərsiniz.
Aydındır ki, bütün bunlarla məşğul olmaq üçün bir AC adapterinə, USB kabelinə və microSD kartına ehtiyacınız olacaq.
Addım 1: Hardware Setup
Əlavə edilmiş pinout şəklinə baxın. B+deyir, ancaq bundan sonra gələn hər bir Raspberry Pi modelinə aiddir.
LCD ekrana qoşulmuş I2C sırt çantası ilə bu əlaqənin işləməsi üçün yalnız 4 tel lazımdır.
GND -ni Raspberry Pi -dəki hər hansı bir torpaq pininə bağlayın: Pin 6, 9, 14, 20, 25, 30, 34, 39. Mən onu 6 -cı pinlə bağladım.
VCC -ni Raspberry Pi -dəki 5 voltlu pinlərdən birinə bağlayın: Pin 2, 4. Pin 4 -dən istifadə etdim
SDA -nı pin 3 -ə qoşun.
SCL -i Pin 5 -ə qoşun.
Quraşdırmaımı izləsəniz, GPIO başlıqlarında 2x2 formada olan bütün 4 teldən ibarət olacaqsınız.
Montaj üsulunuz təsəvvür edə biləcəyiniz bir şey ola bilər … və ya heç bir şey. Girişdə dediyim kimi, koronavirusun bu gərginliyi sonsuza qədər davam etməyəcək, buna görə də mənim quruluşuma ehtiyacım yoxdur. Bu tədbir bitdikdən sonra bu quruluşu saxlamağa qərar verərəmsə, onu hava ekranına və ya başqa bir şeyə çevirə bilərəm.
Pi 3A+cihazımın bütün 4 küncünə neylon boşluqlar ilə birlikdə bir qoz və bolt bağladım. Bu ciddi şəkildə isteğe bağlıdır. Bəzən bunu metal bir səthdə etdiyim üçün, korpusun içərisində olan Pi üzərində müvəqqəti qurğular saxlamağı xoşlamadığım üçün və metaldan çıxarmağı unutduğum üçün onu qarışdırmaq istəmədiyim üçün etdim. işə salmadan əvvəl səthə qoyun.
Addım 2: Pi Proqram Quraşdırması
Girişdə dediyim kimi, istifadə etdiyiniz Raspberry Pi modelinin heç bir əhəmiyyəti yoxdur. Bunu WiFi üzərindən bir Raspberry Pi 3A+ -da istifadə edirəm, eyni zamanda bunu Ethernet kabelində Raspberry Pi 2 -də və USB WiFi dongle ilə Raspberry Pi Zero 1.3 versiyasında (serial kamera konnektoru olan ilk Pi Zero) sınadım.
Raspbian -ı MicroSD kartına necə quracağımı yazmayacağam, çünki bunu necə etmək barədə milyonlarla təlimat var. Raspbian Buster Lite ilə işləyən 16 GB microSD var. Əlavə olaraq demək olar ki, həmişə Raspbian Lite -dən istifadə edirəm, çünki heç bir layihəmdə digər yararsız proqram paketlərinə ehtiyacım yoxdur. Proqramı apt-get istifadə edərək quraşdırsam, çatışmayan ilkin şərtləri quraşdırar.
Bir şəbəkəyə qoşulun. Yenə də bunun necə ediləcəyinə dair milyonlarla təlimat var, buna görə də bura dərindən getməyəcəyəm. Kabelli və ya simsiz gedə bilərsiniz, ancaq bunun üçün internet bağlantısı lazımdır.
İsteğe bağlı, ancaq SSH -in PuTTY istifadə edərək bağlanmasını təmin edə bilərsiniz. Etdim.
Hər şeyi yeniləyin, sonra yenidən başladın:
sudo apt yeniləmə
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo reboot
Burada keçəcəyim bir quruluşdur. Yenə bunu etməyin milyonlarla yolu var, amma tapdığım ən yaxşı istinad burada:
İşdə məqamlar:
sudo apt i2c alətlərini quraşdırın
sudo apt install python-smbus
I2C -ni də aktiv etməlisiniz
sudo raspi-config
- 5 İnterfeys Seçimləri
- P5 I2C
Dəyişiklikləri tətbiq etmək üçün yenidən başladın
sudo yenidən başladın
İndiyə qədər bütün bunları düzgün etdiyinizi görməyin vaxtı gəldi
i2cdetect -y 1
Ekranınız güclənirsə və onu Raspberry Pi ilə görə bilsəniz, ortaya çıxan bir cədvəliniz olacaq. Amazon -dan aldığım və bu layihə üçün istifadə etdiyim 20x4 üçün ünvan 27 -dir. Texniki cəhətdən bu, daha sonra gələcək python skriptləri üçün 0x27 olaraq təyin ediləcək. Eyni ünvan şousunu Amazon -da aldığım 2 ədəd 16x2 ekran və eBay -də tapdığım bir 40x2 ekran üçün keçirdim.
Addım 3: Python Quraşdırması
İndi mürəkkəb şeylər üçün. Bacardığım qədər sadə saxlamağa çalışacağam. Yeni başlayanlar üçün yalnız ev qovluğuna fayllar yazacam.
I2C_LCD_driver.py -ə toxunun
nano I2C_LCD_driver.py
Aşağıdakı məzmunu yeni yaradılmış python skriptinizə yapışdırın.
#-*-kodlaşdırma: utf-8-*- # Orjinal kod tapıldı: #
"""
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),="">
Bu skriptin olduqca qarışıq olduğunu bilirəm, amma təsirlidir. ABŞ-da Covid-19 hadisələrinə dair mövcud statistikanı göstərəcək. Əsas məlumat bazası hər 5 dəqiqədən bir yenilənir. Ssenarim, 3 səhifəni tamamilə keçmək üçün 1 dəqiqə çəkir və dövr yenidən başladıqda yenilənmiş nömrələri çəkəcək.
Addım 4: Python'u işə salın
Başlayaq:
python covid19.py
İlk səhifə, koronavirusun ölkəyə ilk dəfə vurulmasından bu yana yoluxma və ölümlərin ümumi sayını göstərir. İkinci səhifə, yalnız bu gün baş verən hadisələr və ölümlər üçün bu rəqəmləri göstərir. Üçüncüsü, ağır vəziyyətdə olan insanları, sonra milyon insana düşən hadisələri və ölümləri göstərir. Üçüncü səhifədəki ikinci sətir, ölkədə ilk işin tarixini göstərirdi, amma ssenari bəzən xətaya səbəb olaraq xətanı göstərərək qəzaya uğrayacağı üçün onu silməli oldum.
Bu skriptin avtomatik işlədilməsinin yolları var, amma burada bu barədə ətraflı məlumat verməyəcəyəm. SSH PuTTY vasitəsi ilə ona qoşulduqdan sonra öz əmrimi işə salıram. Çalışarkən Ctrl+C düymələrini basana qədər başqa əmrləri yerinə yetirə bilməyəcəksiniz.
Addım 5: ABŞ -da yaşamasam nə edim?
Bu skript digər ölkələrin statistikasını göstərmək üçün dəyişdirilə bilər. Gördüyünüz kimi, skriptimdəki URL burada bir API -dən götürülür: (bu səhifələrə baxmaq üçün Internet Explorer -dən istifadə etməyin.. Json faylını yükləməyə çalışacaq. Chrome -dan istifadə etdim)
coronavirus-19-api.herokuapp.com/countries/usa
İndi eyni ünvanı ziyarət edin, ancaq bir qovluq daha yüksəkdir
coronavirus-19-api.herokuapp.com/countries
Bu, hər bir ölkənin statistikasını göstərir. Aydındır ki, bu səhifədən API məlumatlarını çəkməyə çalışan bir kabus olacaq. Səhifəni öz ölkəniz üçün açmaq daha yaxşıdır. Kanadadakı dostlarımızın ssenarini bu URL -yə düzəltmələri lazım olacaq:
coronavirus-19-api.herokuapp.com/countries/canada
Burada çox vacib bir qeyd. API -nin URL -i xüsusi olmalıdır … URL -də boşluq yoxdur. Veb tarama zamanı, bir veb ünvanındakı boşluqlar "%20" ilə əvəz olunur və bununla da, məsələn, Yeni Zelandiya kimi 2 hissəli adları olan ölkələrdəki dostlarımızın bu skriptdəki URL -i aşağıdakılarla əvəz etmələri lazım olacaq:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
Addım 6: Son Düşüncələr
İllər ərzində Raspberry Pi və Arduino ilə bir çox işlər gördüm, amma qurduqlarımın çoxu başqalarının fikirlərinin təkrarıdır. Bu qurğuda bir çox mənbədən parçalar toplamağım istisna olmaqla, demək olar ki, eynidir. Bu quruluş bu çətin dövrdə sizi təhlükəsiz və sağlam saxlamasa da, qurduğunuz müddətdə sizi məşğul edəcək və bundan sonra da sizi məlumatlandıracaq.
Əgər sizdə bu hissələr hələ yoxdursa, onu tikməklə ciddi məşğul olmadığınız müddətcə özünüzü satın almağa tələsməyin. Daha əvvəl dediyim kimi, bu səylər əsas əşyalara yönəldildiyi üçün hazırda çatdırılma vaxtları uzanır. Artıq öyrənmək və sınamaq üçün bu hissələrim var idi. Qutuya quraşdırılmış ekran, əvvəlcə şəbəkəmdə Pi-Hole işləyən başqa bir Raspberry Pi-nin statistikasını görmək üçün qurulmuşdu. Bu Covid-19 tədbiri bitdikdən sonra onu hava görüntüsünə çevirə bilərəm.
Oxuyan hər kəs üçün bu təlimatçını səsləndirmək istəyirəm:
www.instructables.com/id/DIY-Hand-Sanitize…
Hələ sınamamışam, amma dəqiq maddələrim var və bir müddət sınaya bilərəm.