תוכן עניינים:
- שלב 1: התקנת חומרה
- שלב 2: התקנת תוכנת Pi
- שלב 3: הגדרת פייתון
- שלב 4: הפעל את פייתון
- שלב 5: מה אם אני לא גר בארה"ב?
- שלב 6: מחשבות אחרונות
וִידֵאוֹ: סטטיסטיקות Covid-19 + פטל פי + I2C LCD: 6 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-31 10:19
אז ביום מן הימים, באופן אקראי, החלטתי להביא כמה חלקים שהיו לי לשכב ולעשות משהו שיספק לי נתונים סטטיסטיים בזמן אמת על 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…
עדיין לא ניסיתי את זה, אבל יש לי את המרכיבים המדויקים האלה, ואולי אנסה זאת מתישהו.
מוּמלָץ:
פטל פאי - HIH6130 I2C חיישן לחות וטמפרטורה חיישן פייתון הדרכה: 4 שלבים
Raspberry Pi - HIH6130 I2C חיישן לחות וטמפרטורה Python הדרכה: HIH6130 הוא חיישן לחות וטמפרטורה עם פלט דיגיטלי. חיישנים אלה מספקים רמת דיוק של ± 4% לחות יחסית. עם יציבות ארוכת טווח מובילה בתעשייה, I2C דיגיטלי פיצוי טמפרטורה אמיתי, אמינות מובילה בתעשייה, יעילות אנרגטית
פטל PI מכשירי I2C מרובים: 3 שלבים
פטל PI מכשירי I2C מרובים: מתוסכל מכיוון שלא ניתן להשתמש בכפלים של אותם התקני I2C בפרויקט שלך. אין צורך להשתמש במכפילים איטיים. גרעין ה- raspbian העדכני ביותר תומך ביצירת מספר אוטובוסים I2C באמצעות סיכות GPIO. פתרון זה הוא סופר מהיר