İçindekiler:
- Adım 1: Donanım Kurulumu
- Adım 2: Pi Yazılım Kurulumu
- Adım 3: Python Kurulumu
- Adım 4: Python'u Çalıştırın
- Adım 5: Ya ABD'de Yaşamıyorsam?
- 6. Adım: Son Düşünceler
Video: Covid-19 İstatistikleri + Raspberry Pi + I2C LCD: 6 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-31 10:26
Bir gün birdenbire ortalıkta dolaşan birkaç parçayı alıp bana Kovid-19 hakkında gerçek zamanlı istatistikler sunacak bir şey yapmaya karar verdim. Güzel görünmesi için fazla zaman ayırmadım çünkü bu etkinlik olmayacakken neden kalıcı bir şey olsun ki? Bu nedenle, ekranım küçük bir karton kutuya monte edildi.
Gerekli parçalar:
- Ahududu Pi - herhangi bir model. Raspberry Pi 3A+ kullandım
- 20x4 I2C LCD Ekran - belirli bir marka yok…ama I2C sırt çantasına ihtiyacı var
- Dişiden dişiye jumper kablolar - I2C'yi Pi'ye bağlamak için sadece 4 tanesi
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 doğrudan satın aldığım kaynaklara gidiyor. Adafruit'in şu anda teslimat yapmadığını söylediğim için üzgünüm, ama Amazon… ana odakları, bunlar olmayan temel öğelere odaklandığı için yavaş. Hepsi Amazon ve eBay'de başka bir yerde bulunabilir.
Tüm bunlarla birlikte gitmek için bir AC adaptörüne, USB kablosuna ve microSD karta ihtiyacınız olacak.
Adım 1: Donanım Kurulumu
Ekli pin çıkışı resmine bakın. B+ yazıyor, ancak ondan sonra gelen diğer tüm Raspberry Pi modelleri için de geçerli.
LCD ekrana takılı bir I2C sırt çantası ile bu bağlantının çalışması için sadece 4 kablo gerekir.
GND'yi Raspberry Pi üzerindeki topraklama pinlerinden herhangi birine bağlayın: Pin 6, 9, 14, 20, 25, 30, 34, 39. Pin 6'ya bağladım.
VCC'yi Raspberry Pi'deki 5 voltluk pinlerden birine bağlayın: Pin 2, 4. Pin 4'ü kullandım.
SDA'yı pim 3'e bağlayın.
SCL'yi Pin 5'e bağlayın.
Kurulumumu takip ettiyseniz, GPIO başlıklarında 2x2 düzeninde 4 kablonun tümüne sahip olacaksınız.
Montaj yönteminiz hayal edebileceğiniz herhangi bir şey olabilir… veya hiçbir şey olmayabilir. Girişte söylediğim gibi, koronavirüsün bu türü sonsuza kadar sürmeyecek, bu yüzden kurulumuma da ihtiyacım yok. Bu olay bittikten sonra bu kurulumu devam ettirmeye karar verirsem, bunu bir hava durumu göstergesine veya başka bir şeye dönüştürebilirim.
Pi 3A+ cihazımın 4 köşesine de naylon ara parçalarla birlikte bir somun ve cıvata taktım. Bu kesinlikle isteğe bağlıdır. Bunu yaptım çünkü bazen bunu metal bir yüzeyde yaşıyorum, geçici kurulumlarımı bir kasanın içindeki bir Pi üzerinde yapmaktan hoşlanmadım ve onu metalden çıkarmayı unuttuğum için onu mahvetme riskini almak istemiyorum. Açmadan önce yüzeye
Adım 2: Pi Yazılım Kurulumu
Girişte de söylediğim gibi hangi Raspberry Pi modelini kullandığınızın bir önemi yok. Bunu WiFi üzerinden bir Raspberry Pi 3A+ üzerinde kullanıyorum, ancak bunu ethernet kablosu üzerindeki Raspberry Pi 2 ve bir USB WiFi dongle ile Raspberry Pi Zero sürüm 1.3 (seri kamera konektörlü ilk Pi Zero) üzerinde de test ettim.
Raspbian'ın bir MicroSD karta nasıl kurulacağını yazmayacağım çünkü bunun nasıl yapılacağına dair milyonlarca talimat var. Raspbian Buster Lite çalıştıran bir 16GB microSD'm var. Bir yandan not olarak, neredeyse her zaman Raspbian Lite kullanıyorum çünkü hiçbir projemde diğer işe yaramaz yazılım paketlerine ihtiyacım yok. Apt-get kullanarak yazılım yüklersem, eksik önkoşulları yükleyecektir.
İnternete bağlan. Yine, bunun nasıl yapılacağına dair milyonlarca talimat var, bu yüzden burada derinlemesine gitmeyeceğim. Kablolu veya kablosuz gidebilirsiniz, ancak bunun için bir internet bağlantısı gerekir.
İsteğe bağlı, ancak SSH'nin PuTTY kullanarak bağlanmasını sağlayabilirsiniz. Yaptım.
Her şeyi güncelleyin ve ardından yeniden başlatın:
sudo uygun güncelleme
sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo yeniden başlatma
Bu, burada geçeceğim bir kurulum. Yine, bunu yapmanın milyonlarca yolu var, ancak bulduğum en iyi referans tam burada:
İşte öne çıkanlar:
sudo apt i2c araçlarını kurun
sudo apt python-smbus yükleyin
Ayrıca I2C'yi etkinleştirmeniz gerekecek
sudo raspi yapılandırması
- 5 Arayüz Seçeneği
- P5 I2C
Değişiklikleri uygulamak için yeniden başlatın
sudo yeniden başlatma
Şimdi tüm bunları şimdiye kadar doğru yapıp yapmadığınızı görme zamanı
i2cdetect -y 1
Ekranınız açıksa ve Raspberry Pi'niz tarafından görülebiliyorsa, karşınıza bir grafik çıkacaktır. Amazon'dan aldığım ve bu proje için kullandığım 20x4'ün adresi 27. Teknik olarak daha sonra gelecek olan python scriptleri için bu 0x27 olarak tanımlanacak. Amazon'dan satın aldığım 2 adet 16x2 ekran ve eBay'de bulduğum bir adet 40x2 ekran için aynı adres gösterisini gördüm.
Adım 3: Python Kurulumu
Şimdi karmaşık şeyler için. Elimden geldiğince basit tutmaya çalışacağım. Yeni başlayanlar için sadece ana dizine dosya yazacağım.
I2C_LCD_driver.py'ye dokunun
nano I2C_LCD_driver.py
Aşağıdaki içeriği yeni oluşturduğunuz python betiğinize yapıştırın.
# -*- kodlama: utf-8 -*-# Orijinal kod şurada bulundu: #
"""
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 betiğin oldukça dağınık olduğunu biliyorum ama etkili. Amerika Birleşik Devletleri'ndeki Covid-19 vakaları için mevcut istatistikleri gösterecek. Ana veritabanı her 5 dakikada bir güncellenir. Komut dosyamın 3 sayfa arasında tamamen geçiş yapması 1 dakika sürüyor ve döngü her yeniden başladığında güncellenen sayıları çekecek.
Adım 4: Python'u Çalıştırın
Hadi başlayalım:
piton covid19.py
İlk sayfa, koronavirüsün ülkeyi ilk kez vurmasından bu yana toplam vaka ve ölüm sayısını gösteriyor. İkinci sayfa, yalnızca içinde bulunulan günde meydana gelen vaka ve ölümlerin bu sayılarını gösterir. Üçüncüsü, kritik durumdaki insanları, ardından bir milyon kişi başına vakaları ve ölümleri gösterir. Üçüncü sayfadaki ikinci satır, ülkedeki ilk vakanın tarihini gösteriyordu, ancak onu kaldırmak zorunda kaldım çünkü komut dosyası bazen hata veriyor ve bu satırı bir hatayla alıntılayarak çöküyordu.
Bu betiği otomatik olarak çalıştırmanın yolları var, ancak bununla ilgili ayrıntılara burada girmeyeceğim. PuTTY aracılığıyla SSH'ye bağlandıktan sonra benimkini komutla çalıştırıyorum. Çalışırken, Ctrl+C'ye basana kadar başka komutları yürütemezsiniz.
Adım 5: Ya ABD'de Yaşamıyorsam?
Bu komut dosyası, diğer ülkeler için istatistikleri gösterecek şekilde değiştirilebilir. Gördüğünüz gibi, betiğimdeki URL burada bir API'den alıyor: (bu sayfaları görüntülemek için Internet Explorer'ı kullanmayın. Bir.json dosyası indirmeye çalışacak. Chrome kullandım)
coronavirus-19-api.herokuapp.com/countries/usa
Şimdi aynı adresi ziyaret edin, ancak bir klasör daha yüksek
coronavirus-19-api.herokuapp.com/countries
Bu, her ülke için istatistikleri listeler. Açıkçası bu sayfadan API verilerini çekmeye çalışmak bir kabus olacak. Bu nedenle, kendi ülkeniz için sayfayı açmak en iyisidir. Kanada'daki arkadaşlarımızın komut dosyasını şu URL'ye düzenlemeleri gerekir:
coronavirus-19-api.herokuapp.com/countries/canada
Burada çok önemli not. API'nin URL'sinin spesifik olması gerekir… yani bir URL'de boşluk olmamalıdır. Web'de gezinmede, bir web adresindeki boşluklar "%20" ile değiştirilir ve bununla birlikte, örneğin Yeni Zelanda gibi 2 parça adına sahip ülkelerdeki arkadaşlarımızın bu komut dosyasındaki URL'yi şu şekilde değiştirmesi gerekir:
coronavirus-19-api.herokuapp.com/countries/new%20zealand
6. Adım: Son Düşünceler
Yıllar boyunca Raspberry Pi ve Arduino ile pek çok şey yaptım ama inşa ettiklerimin çoğu sadece başkalarının fikirlerinin kopyaları. Bu kurulumda birçok kaynaktan parçalar derlemem dışında neredeyse aynı. Bu kurulum, bu zorlu dönemde sizi güvende ve sağlıklı tutmayacak olsa da, kurarken kesinlikle sizi meşgul edecek ve sonrasında sizi bilgilendirecektir.
Bu parçalara zaten sahip değilseniz, inşa etme konusunda ciddi olmadığınız sürece onları satın almak için kendinizi strese sokmayın. Daha önce de söylediğim gibi, nakliye süreleri şu anda daha uzun sürüyor çünkü bu çabalar temel öğelere doğru atılıyor. Bu parçalara zaten sadece öğrenmek ve denemek için sahiptim. Kutuya monte edilen ekran orijinal olarak ağımdaki Pi-Hole çalıştıran başka bir Raspberry Pi'nin gerçek zamanlı istatistiklerini görüntülemek için ayarlandı. Bu Covid-19 olayı bittikten sonra hava durumu göstergesine çevirebilirim.
Okuyan herkes için, bu talimata bir not vermek istiyorum:
www.instructables.com/id/DIY-Hand-Sanitize…
Henüz denemedim ama tam olarak bu malzemelere sahibim ve bir ara deneyebilirim.
Önerilen:
Raspberry Pi - HIH6130 I2C Nem ve Sıcaklık Sensörü Python Eğitimi: 4 Adım
Raspberry Pi - HIH6130 I2C Nem ve Sıcaklık Sensörü Python Eğitimi: HIH6130, dijital çıkışlı bir nem ve sıcaklık sensörüdür. Bu sensörler, ±%4 RH doğruluk seviyesi sağlar. Endüstri lideri uzun vadeli kararlılık, gerçek sıcaklık kompanzasyonlu dijital I2C, Endüstri lideri güvenilirlik, Enerji verimliliği ile
Raspberry Pi - HIH6130 I2C Nem ve Sıcaklık Sensörü Java Eğitimi: 4 Adım
Raspberry Pi - HIH6130 I2C Nem ve Sıcaklık Sensörü Java Eğitimi: HIH6130, dijital çıkışlı bir nem ve sıcaklık sensörüdür. Bu sensörler, ±%4 RH doğruluk seviyesi sağlar. Endüstri lideri uzun vadeli kararlılık, gerçek sıcaklık kompanzasyonlu dijital I2C, Endüstri lideri güvenilirlik, Enerji verimliliği ile
Raspberry PI Çoklu I2C Cihazları: 3 Adım
Raspberry PI Çoklu I2C Cihazları: Hayal kırıklığına uğradınız çünkü projenizde aynı I2C cihazlarının katlarını kullanamazsınız. Yavaş çoklayıcı kullanmaya gerek yok. En son raspbian çekirdeği, GPIO pinlerini kullanarak birden fazla I2C veriyolu oluşturulmasını destekler. Bu çözüm süper hızlı