İçindekiler:

Covid-19 İstatistikleri + Raspberry Pi + I2C LCD: 6 Adım
Covid-19 İstatistikleri + Raspberry Pi + I2C LCD: 6 Adım

Video: Covid-19 İstatistikleri + Raspberry Pi + I2C LCD: 6 Adım

Video: Covid-19 İstatistikleri + Raspberry Pi + I2C LCD: 6 Adım
Video: Use a Raspberry Pi to Fight COVID-19 with Rosetta@Home 2024, Temmuz
Anonim
Covid-19 İstatistikleri + Raspberry Pi + I2C LCD
Covid-19 İstatistikleri + Raspberry Pi + I2C LCD

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

Donanım Kurulumu
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

Pi Yazılım Kurulumu
Pi Yazılım Kurulumu
Pi Yazılım Kurulumu
Pi Yazılım Kurulumu
Pi Yazılım Kurulumu
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

Python'u çalıştırın
Python'u çalıştırın
Python'u çalıştırın
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: