תוכן עניינים:

סטטיסטיקות Covid-19 + פטל פי + I2C LCD: 6 שלבים
סטטיסטיקות Covid-19 + פטל פי + I2C LCD: 6 שלבים

וִידֵאוֹ: סטטיסטיקות Covid-19 + פטל פי + I2C LCD: 6 שלבים

וִידֵאוֹ: סטטיסטיקות Covid-19 + פטל פי + I2C LCD: 6 שלבים
וִידֵאוֹ: How about getting vaccinated again against coronavirus? | COVID-19 Special 2024, יולי
Anonim
נתוני Covid-19 + פטל פי + I2C LCD
נתוני Covid-19 + פטל פי + I2C LCD

אז ביום מן הימים, באופן אקראי, החלטתי להביא כמה חלקים שהיו לי לשכב ולעשות משהו שיספק לי נתונים סטטיסטיים בזמן אמת על Covid-19. לא השקעתי הרבה זמן בכדי שזה ייראה נחמד כי למה לעשות משהו קבוע כשהאירוע הזה לא הולך להיות? לכן הצג שלי מותקן רק על קופסת קרטון קטנה.

דרושים חלקים:

  • פטל פטל - כל דגם. השתמשתי ב- Raspberry Pi 3A+
  • תצוגת LCD 20x4 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 לא מספקת כרגע, אבל אמזון … רק לאט לאט בגלל ההתמקדות העיקרית שלהם בפריטים חיוניים, מה שלא. הכל ניתן למצוא במקומות אחרים באמזון ובאיביי.

ברור שתצטרך מתאם AC, כבל USB וכרטיס microSD כדי להתמודד עם כל זה.

שלב 1: התקנת חומרה

התקנת חומרה
התקנת חומרה

עיין בתמונת הסיכה המצורפת. זה אומר B+, אבל זה חל על כל דגם פטל פטל אחר שהגיע גם אחרי זה.

עם תרמיל I2C המחובר לתצוגת LCD, חיבור זה דורש רק 4 חוטים כדי לעבוד.

חבר את GND לכל אחד מסיכות הקרקע ב- Raspberry Pi: פין 6, 9, 14, 20, 25, 30, 34, 39. חיברתי אותו לסיכה 6.

חבר את VCC לאחד מפיני ה -5 וולט ב- Raspberry Pi: פין 2, 4. השתמשתי בסיכה 4

חבר SDA לפין 3.

חבר SCL לפין 5.

אם עקבת אחר ההתקנה שלי, בסופו של דבר תקבל את כל 4 החוטים בתבנית 2x2 בכותרות GPIO.

שיטת ההרכבה שלך יכולה להיות כל דבר שאתה יכול לדמיין … או שום דבר בכלל. כפי שאמרתי במבוא, זן זה של נגיף הקורונה לא יימשך לנצח, כך שאני גם לא צריך את ההתקנה שלי. אם אחליט להשאיר את ההתקנה הזו לאחר סיום האירוע, אני עלול להפוך אותו לתצוגת מזג אוויר או משהו.

חיברתי אגוז ובורג יחד עם מרווחי ניילון לכל 4 פינות ה- Pi 3A+שלי. זה בהחלט אופציונלי. עשיתי את זה כי לפעמים יש לי את זה על משטח מתכת, לא אהבתי את ההגדרות הזמניות שלי על פי שנמצא בתוך מארז, ואני לא רוצה להסתכן בלבלגן כי שכחתי להסיר אותו מהמתכת משטח לפני הפעלתו.

שלב 2: התקנת תוכנת Pi

התקנת תוכנת פי
התקנת תוכנת פי
התקנת תוכנת פי
התקנת תוכנת פי
התקנת תוכנת פי
התקנת תוכנת פי

כפי שאמרתי בהקדמה, לא משנה באיזה דגם Raspberry Pi אתה משתמש. אני משתמש בזה ב- Raspberry Pi 3A+ באמצעות WiFi אבל בדקתי את זה גם ב- Raspberry Pi 2 בכבל Ethernet ובגרסת 1.3 של Raspberry Pi Zero (ה- Pi Zero הראשון עם מחבר המצלמה הסדרתית) עם פונגל USB WiFi.

אני לא הולך לכתוב כיצד להתקין Raspbian על כרטיס MicroSD מכיוון שיש מיליוני הוראות כיצד לעשות זאת. יש לי microSD בנפח 16 גיגה -בתים שמריץ Raspbian Buster Lite. הערה צדדית, אני כמעט תמיד משתמש ב- 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 להתקין python-smbus

יהיה עליך גם להפעיל את I2C

sudo raspi-config

- 5 אפשרויות ממשק

- P5 I2C

הפעל מחדש כדי להחיל את השינויים

sudo אתחול מחדש

עכשיו הגיע הזמן לבדוק אם ביצעת את כל זה נכון עד כה

i2cdetect -y 1

אם המסך שלך מופעל וניתן לראות אותו ב- Raspberry Pi, יהיה לך תרשים שיעלה. כתובת ה- 20x4 שקניתי באמזון והשימוש בפרויקט זה היא 27. טכנית זה יזוהה כ- 0x27 עבור סקריפטים של פייתון שיגיעו מאוחר יותר. הייתה לי אותה תצוגת כתובת עבור 2 תצוגות 16x2 שקניתי גם באמזון ואחת 40x2 שמצאתי ב- eBay.

שלב 3: הגדרת פייתון

אז עכשיו לדברים המורכבים. אני אנסה לשמור על זה כמה שיותר פשוט. בתור התחלה, אני רק אכתוב קבצים לספריית הבית.

גע ב- I2C_LCD_driver.py

nano I2C_LCD_driver.py

הדבק את התוכן שלהלן בסקריפט הפיתון החדש שלך.

#-*-קידוד: 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: מה אם אני לא גר בארה"ב?

ניתן לשנות סקריפט זה כך שיציג נתונים סטטיסטיים עבור מדינות אחרות. כפי שאתה עשוי לראות, כתובת האתר בסקריפט שלי נמשכת ממשק API כאן: (אל תשתמש ב- Internet Explorer כדי לצפות בדפים אלה. הוא ינסה להוריד קובץ.json. השתמשתי ב- Chrome)

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

כעת בקר באותה כתובת, אך תיקייה אחת גבוהה יותר

coronavirus-19-api.herokuapp.com/countries

זה מפרט את הנתונים הסטטיסטיים של כל מדינה. ברור שזה יהיה סיוט שמנסה למשוך נתוני API מהעמוד הזה. אז עדיף לפתוח את הדף עבור המדינה הספציפית שלך. החברים שלנו בקנדה יצטרכו לערוך את הסקריפט לכתובת האתר הבאה:

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

הערה חשובה מאוד כאן. כתובת ה- URL לממשק ה- API צריכה להיות ספציפית … כלומר אין רווחים בכתובת אתר. בגלישה באינטרנט, רווחים בכתובת אינטרנט מוחלפים ב"%20 "ובאמור, חברינו במדינות עם 2 שמות חלקים, כמו ניו זילנד למשל, יצטרכו להחליף את כתובת האתר בסקריפט זה ב:

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

שלב 6: מחשבות אחרונות

עשיתי דברים רבים עם פטל פי וארדואינו לאורך השנים, אבל רוב מה שבניתי הם רק העתקים של רעיונות של אחרים. זה כמעט זהה למעט ריכזתי חלקים ממקורות רבים לתוך ההתקנה הזו. למרות שהתקנה זו לא תשמור אותך בטוח ובריא בתקופה הקשה הזו, היא בוודאי תעסיק אותך בזמן שתגדיר אותה ותעדכן אותך לאחר מכן.

אם עדיין אין לך את החלקים האלה, אל תדגיש את עצמך לקנות אותם אלא אם אתה רציני בבנייתם. כפי שאמרתי קודם, זמני המשלוח לוקחים זמן רב יותר מכיוון שהמאמצים האלה מושקעים לקראת פריטים חיוניים. היו לי רק החלקים האלה כבר ללמידה והתנסות. המסך הרכוב על הקופסה הוקם במקור כדי להציג נתונים סטטיסטיים בזמן אמת של פטל פטל אחר ברשת שלי שמריץ את Pi-Hole. אחרי שאירוע הקוביד -19 הזה יסתיים, אני עשוי להפוך אותו לתצוגת מזג אוויר.

לכל מי שקורא, אני רוצה לזעוק את ההוראה הזו:

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

עדיין לא ניסיתי את זה, אבל יש לי את המרכיבים המדויקים האלה, ואולי אנסה זאת מתישהו.

מוּמלָץ: