Съдържание:

Статистика за 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 стъпки
Видео: 🦠 Мониторинг Covid-19 на ESP8266 (😷 Статистика по коронавирусу на Arduino) 2024, Юли
Anonim
Статистика за Covid-19 + Raspberry Pi + I2C LCD
Статистика за Covid-19 + Raspberry Pi + I2C LCD

Така че случайно изведнъж един ден реших да си взема няколко части, които имах да лежа, и да направя нещо, което да ми достави статистика в реално време за Covid-19. Не отделих много време да изглежда добре, защото защо да направя нещо постоянно, когато това събитие няма да бъде? Следователно дисплеят ми е просто монтиран на малка картонена кутия.

Необходими части:

  • Raspberry Pi - всеки модел. Използвах Raspberry Pi 3A+
  • 20x4 I2C LCD дисплей - няма конкретна марка … но се нуждае от раница 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 е … просто бавно, тъй като основният им фокус е към основни продукти, които те не са. Всичко може да се намери другаде в Amazon и eBay.

Очевидно ще ви трябва променливотоков адаптер, USB кабел и microSD карта, за да се справите с всичко това.

Стъпка 1: Настройка на хардуера

Хардуерна настройка
Хардуерна настройка

Позовавайте се на прикрепената снимка на разпечатване. Той казва B+, но се отнася за всеки друг модел Raspberry Pi, който е дошъл след него.

С раница I2C, прикрепена към LCD дисплея, за тази връзка са необходими само 4 проводника.

Свържете GND към някой от заземяващите щифтове на Raspberry Pi: Pin 6, 9, 14, 20, 25, 30, 34, 39. Свързах го към пин 6.

Свържете VCC към някой от 5 -волтовите щифтове на Raspberry Pi: Пин 2, 4. Използвах щифт 4

Свържете SDA към пин 3.

Свържете SCL към Pin 5.

Ако следвате моята настройка, ще получите всичките 4 проводника в 2x2 модел на заглавията на GPIO.

Вашият метод за монтаж може да бъде всичко, което можете да си представите … или изобщо нищо. Както казах в началото, този щам на коронавируса няма да продължи вечно, така че не се нуждая от настройката си за нито едното, нито другото. Ако реша да запазя тази настройка след приключване на това събитие, може да я превърна в дисплей за времето или нещо подобно.

Прикрепих гайка и болт заедно с найлонови дистанционни елементи към всичките 4 ъгъла на моя Pi 3A+. Това е строго по избор. Направих това, защото понякога имам това на метална повърхност, не ми хареса да имам временни настройки на Pi, което е вътре в кутия, и не искам да рискувам да го объркам, защото забравих да го премахна от метала повърхност, преди да го включите.

Стъпка 2: Настройка на софтуера на Pi

Настройка на софтуера на Pi
Настройка на софтуера на Pi
Настройка на софтуера на Pi
Настройка на софтуера на Pi
Настройка на софтуера на Pi
Настройка на софтуера на Pi

Както казах в интрото, няма значение какъв модел Raspberry Pi използвате. Използвам това на Raspberry Pi 3A+ през WiFi, но също така съм тествал това на Raspberry Pi 2 на Ethernet кабел и Raspberry Pi Zero версия 1.3 (първият Pi Zero с конектор за серийна камера) с USB WiFi ключ.

Няма да напиша как да инсталирам Raspbian на MicroSD карта, защото има милиони инструкции как да направите това. Имам 16GB microSD, работещ с Raspbian Buster Lite. От друга страна, почти винаги използвам Raspbian Lite, защото не се нуждая от другите безполезни софтуерни пакети в нито един от моите проекти. Ако инсталирам софтуер с помощта на apt-get, той ще инсталира липсващи предпоставки.

Свържете се с мрежа. Отново има милиони инструкции как да направите това, така че няма да навлизам подробно тук. Можете да използвате кабелна или безжична връзка, но това ще изисква интернет връзка.

По избор, но можете да активирате SSH за свързване с помощта на PuTTY. Направих.

Актуализирайте всичко, след което рестартирайте:

sudo apt актуализация

sudo apt upgrade -y sudo apt dist-upgrade sudo rpi-update sudo рестартиране

Това е една настройка, която ще разгледам тук. Отново има милиони начини да направите това, но най-добрата справка, която открих, е точно тук:

Ето акцентите:

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, които ще дойдат по -късно. Имал съм същото адресно шоу за 2 16x2 дисплея, които също купих на Amazon и един 40x2, който намерих в eBay.

Стъпка 3: Настройка на Python

Така че сега за сложните неща. Ще се опитам да го направя възможно най -просто. За начало просто ще пиша файлове в домашната директория.

докоснете I2C_LCD_driver.py

nano 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 минути. Моят скрипт отнема 1 минута, за да премине напълно през 3 страници и ще изтегля актуализирани числа всеки път, когато цикълът започне отново.

Стъпка 4: Стартирайте Python

Стартирайте Python
Стартирайте Python
Стартирайте Python
Стартирайте Python

Нека да започнем:

python covid19.py

Първата страница показва общия брой на случаите и смъртните случаи, откакто коронавирусът засегна страната. Втората страница показва тези числа за случаи и смъртни случаи, настъпили само в текущия ден. Третият показва хора в критично състояние, след това случаи и смъртни случаи на един милион души. Вторият ред на третата страница показваше датата на първия случай в страната, но трябваше да го премахна, защото понякога скриптът щеше да греши и да се срине, цитирайки този ред с грешка.

Има начини да накарате този скрипт да работи автоматично, но няма да навлизам в подробности за това тук. Просто изпълнявам моя по команда, след като SSH се свържа с него чрез PuTTY. Докато работи, няма да можете да изпълнявате други команди, докато не натиснете Ctrl+C.

Стъпка 5: Ами ако не живея в САЩ?

Този скрипт може да бъде променен, за да показва статистика за други държави. Както можете да видите, URL адресът в моя скрипт се изтегля от API тук: (не използвайте 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 адресът на приложния програмен интерфейс (API) трябва да бъде конкретен … което означава, че няма интервали в URL адреса. При сърфиране в интернет пространствата в уеб адрес се заменят с „%20“и с това казано, нашите приятели в държави с 2 имена на части, като Нова Зеландия например, ще трябва да заменят URL адреса в този скрипт с:

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

Стъпка 6: Заключителни мисли

Правил съм много неща с Raspberry Pi и Arduino през годините, но повечето от това, което съм изградил, са само копия на чужди идеи. Този е почти същият, освен че компилирах парчета от много източници в тази настройка. Въпреки че тази настройка няма да ви пази в безопасност и здраве през този труден период, тя със сигурност ще ви държи заети, докато я настройвате, и ще ви държи в течение след това.

Ако все още нямате тези части, не се стресирайте да ги купувате, освен ако не мислите сериозно да го изградите. Както казах по -рано, времето за доставка отнема повече време в момента, защото тези усилия се полагат за основни елементи. Вече имах само тези части за учене и експериментиране. Дисплеят, монтиран в кутия, първоначално е настроен да преглежда статистика в реално време на друга Raspberry Pi в моята мрежа, която работи с Pi-Hole. След като това събитие Covid-19 приключи, може да го превърна в дисплей за времето.

За всеки, който чете, искам да викам на тази инструкция:

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

Още не съм го пробвал, но имам точно тези съставки и може би ще го опитам някой път.

Препоръчано: