جدول المحتويات:

إحصائيات 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 خطوات
فيديو: Environment Monitoring Station: Part 1: Hardware build 2024, شهر نوفمبر
Anonim
إحصائيات Covid-19 + Raspberry Pi + I2C LCD
إحصائيات Covid-19 + Raspberry Pi + I2C LCD

بشكل عشوائي في أحد الأيام ، قررت أن أحصل على بعض الأجزاء التي كنت أرقدها وأصنع شيئًا من شأنه أن يقدم لي إحصاءات في الوقت الفعلي عن Covid-19. لم أخصص الكثير من الوقت لأجعلها تبدو جميلة ، فلماذا نجعل شيئًا دائمًا بينما هذا الحدث لن يكون كذلك؟ لذلك ، شاشتي مثبتة للتو على صندوق كرتون صغير.

الأجزاء المطلوبة:

  • Raspberry Pi - أي نموذج. لقد استخدمت Raspberry Pi 3A +
  • شاشة عرض LCD مقاس 20 × 4 I2C - لا توجد علامة تجارية معينة … ولكنها تحتاج إلى حقيبة ظهر I2C
  • أسلاك توصيل من أنثى إلى أنثى - فقط 4 منها لتوصيل I2C بـ Pi

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: إعداد الجهاز

إعداد الأجهزة
إعداد الأجهزة

الرجوع إلى صورة pinout المرفقة. تقول B + ، لكنها تنطبق على كل طراز Raspberry Pi الآخر الذي ظهر بعد ذلك أيضًا.

مع حقيبة ظهر I2C متصلة بشاشة LCD ، لا يتطلب هذا الاتصال سوى 4 أسلاك للعمل.

قم بتوصيل GND بأي من المسامير الأرضية في Raspberry Pi: Pin 6 ، 9 ، 14 ، 20 ، 25 ، 30 ، 34 ، 39. لقد قمت بتوصيله بالدبوس 6.

قم بتوصيل VCC بأي من دبابيس 5 فولت على Raspberry Pi: Pin 2 ، 4. لقد استخدمت الدبوس 4

قم بتوصيل SDA بالدبوس 3.

قم بتوصيل SCL بـ Pin 5.

إذا اتبعت الإعداد الخاص بي ، فسوف ينتهي بك الأمر مع جميع الأسلاك الأربعة في نمط 2x2 على رؤوس GPIO.

يمكن أن تكون طريقة التركيب الخاصة بك أي شيء يمكنك تخيله … أو لا شيء على الإطلاق. كما قلت في المقدمة ، هذه السلالة من الفيروس التاجي لن تستمر إلى الأبد ، لذلك لست بحاجة إلى الإعداد الخاص بي لأي منهما. إذا قررت الاحتفاظ بهذا الإعداد بعد انتهاء هذا الحدث ، فقد أقوم بتحويله إلى عرض للطقس أو شيء من هذا القبيل.

لقد قمت بإرفاق صامولة ومسامير مع فواصل من النايلون بجميع الزوايا الأربع لـ Pi 3A +. هذا اختياري تمامًا. لقد فعلت هذا لأنني أحيانًا يكون لدي هذا على سطح معدني ، ولا أحب أن يكون لدي إعدادات مؤقتة على Pi الموجود داخل علبة ، ولا أريد المخاطرة بإفسادها لأنني نسيت إزالتها من المعدن السطح قبل تشغيله.

الخطوة 2: إعداد برنامج Pi

إعداد برنامج Pi
إعداد برنامج Pi
إعداد برنامج Pi
إعداد برنامج Pi
إعداد برنامج Pi
إعداد برنامج Pi

كما قلت في المقدمة ، لا يهم نموذج Raspberry Pi الذي تستخدمه. أنا أستخدم هذا على Raspberry Pi 3A + عبر WiFi ولكني اختبرت ذلك أيضًا على Raspberry Pi 2 على كابل إيثرنت ، و Raspberry Pi Zero الإصدار 1.3 (أول Pi Zero مع موصل الكاميرا التسلسلي) مع USB WiFi dongle.

لن أكتب كيفية تثبيت Raspbian على بطاقة MicroSD لأن هناك ملايين التعليمات حول كيفية القيام بذلك. لدي بطاقة microSD بسعة 16 جيجا بايت تعمل بنظام Raspbian Buster Lite. في ملاحظة جانبية ، دائمًا ما أستخدم Raspbian Lite لأنني لست بحاجة إلى حزم البرامج الأخرى عديمة الفائدة في أي من مشاريعي. إذا قمت بتثبيت برنامج باستخدام apt-get ، فسيتم تثبيت المتطلبات الأساسية المفقودة.

إتصل بالشبكة. مرة أخرى ، هناك الملايين من التعليمات حول كيفية القيام بذلك ، لذلك لن أتعمق هنا. يمكنك الاتصال سلكيًا أو لاسلكيًا ، لكن هذا سيتطلب اتصالاً بالإنترنت.

اختياري ، ولكن يمكنك تمكين SSH للاتصال باستخدام PuTTY. فعلت.

قم بتحديث كل شيء ثم أعد التشغيل:

sudo apt التحديث

تحديث sudo apt -y sudo apt dist-Upgrade sudo rpi-update sudo reboot

هذا أحد الإعدادات التي سأمر بها هنا. مرة أخرى ، هناك الملايين من الطرق للقيام بذلك ، ولكن أفضل مرجع وجدته موجود هنا:

فيما يلي النقاط البارزة:

sudo apt تثبيت i2c-tools

sudo apt تثبيت python-smbus

ستحتاج أيضًا إلى تمكين I2C

sudo raspi-config

- 5 خيارات للتواصل

- P5 I2C

أعد التشغيل لتطبيق التغييرات

sudo إعادة التشغيل

حان الوقت الآن لمعرفة ما إذا كنت قد فعلت كل هذا بشكل صحيح حتى الآن

i2cdetect -y 1

إذا تم تشغيل شاشتك ويمكن لـ Raspberry Pi رؤيتها ، فسيظهر لديك مخطط. عنوان 20x4 الذي اشتريته من Amazon وأستخدمه لهذا المشروع هو 27. من الناحية الفنية ، سيتم تحديد هذا على أنه 0x27 لنصوص Python التي ستأتي لاحقًا. لقد تلقيت نفس عرض العنوان لشاشتي عرض 16 × 2 اشتريتها أيضًا على أمازون وواحدة 40 × 2 وجدتها على موقع eBay.

الخطوة 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),="">

أعلم أن هذا البرنامج النصي فوضوي للغاية ، لكنه فعال. سيعرض الإحصائيات الحالية لحالات Covid-19 في الولايات المتحدة. يتم تحديث قاعدة البيانات الرئيسية كل 5 دقائق. يستغرق البرنامج النصي دقيقة واحدة للتنقل عبر 3 صفحات بالكامل وسيسحب الأرقام المحدثة في كل مرة تبدأ فيها الدورة مرة أخرى.

الخطوة 4: قم بتشغيل Python

قم بتشغيل بايثون
قم بتشغيل بايثون
قم بتشغيل بايثون
قم بتشغيل بايثون

هيا نبدأ:

بيثون covid19.py

تظهر الصفحة الأولى إجمالي عدد الإصابات والوفيات منذ أن ضرب فيروس كورونا البلاد لأول مرة. تُظهر الصفحة الثانية تلك الأرقام للحالات والوفيات التي حدثت فقط في اليوم الحالي. والثالث يظهر الأشخاص في حالة حرجة ، ثم الحالات والوفيات لكل مليون شخص. تم استخدام السطر الثاني في الصفحة الثالثة لإظهار تاريخ الحالة الأولى في البلد ، لكن كان عليّ إزالته لأن النص قد يحدث خطأ أحيانًا ويتعطل عند الاستشهاد بهذا السطر مع وجود خطأ.

توجد طرق لتشغيل هذا البرنامج النصي تلقائيًا ، لكنني لن أخوض في تفاصيل حول ذلك هنا. أنا فقط أقوم بتشغيل المنجم بناءً على الأمر بعد أن اتصلت به عبر بروتوكول PuTTY. أثناء تشغيله ، لن تتمكن من تنفيذ أي أوامر أخرى حتى تضغط على Ctrl + C.

الخطوة 5: ماذا لو لم أعيش في الولايات المتحدة؟

يمكن تعديل هذا البرنامج النصي لعرض الإحصائيات الخاصة بالدول الأخرى. كما ترى ، يتم سحب عنوان URL الموجود في النص البرمجي من واجهة برمجة التطبيقات هنا: (لا تستخدم 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

ملاحظة مهمة جدا هنا. يجب أن يكون عنوان URL لواجهة برمجة التطبيقات محددًا … بمعنى عدم وجود مسافات في عنوان URL. في تصفح الويب ، يتم استبدال المسافات في عنوان الويب بـ "٪ 20" ومع ذلك ، سيحتاج أصدقاؤنا في البلدان ذات الأسماء المكونة من جزأين ، مثل نيوزيلندا على سبيل المثال ، إلى استبدال عنوان URL في هذا البرنامج النصي بـ:

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

الخطوة السادسة: الأفكار النهائية

لقد قمت بالعديد من الأشياء مع Raspberry Pi و Arduino على مر السنين ، ولكن معظم ما قمت ببنائه هو مجرد نسخ مكررة لأفكار الآخرين. هذا هو نفسه تقريبًا باستثناء أنني جمعت قطعًا من العديد من المصادر في هذا الإعداد. على الرغم من أن هذا الإعداد لن يحافظ على سلامتك وصحتك خلال هذا الوقت العصيب ، إلا أنه بالتأكيد سيبقيك مشغولاً أثناء إعداده وسيبقيك على اطلاع بعد ذلك.

إذا لم يكن لديك هذه الأجزاء بالفعل ، فلا تشدد على شرائها إلا إذا كنت جادًا في بنائها. كما قلت من قبل ، تستغرق أوقات الشحن وقتًا أطول في الوقت الحالي لأن هذه الجهود تُبذل تجاه العناصر الأساسية. كان لدي فقط هذه الأجزاء بالفعل للتعلم والتجريب. تم إعداد الشاشة المُثبتة على الصندوق في الأصل لعرض إحصائيات الوقت الفعلي لـ Raspberry Pi آخر على شبكتي التي تقوم بتشغيل Pi-Hole. بعد انتهاء حدث Covid-19 ، قد أقوم بتحويله إلى عرض للطقس.

لأي شخص يقرأ ، أريد أن أعطي صيحة لهذه التعليمات:

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

لم أجربها بعد ، لكن لدي تلك المكونات بالضبط ، وقد أجربها بعض الوقت.

موصى به: