Оглавление:

Статистика 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
Статистика Covid-19 + Raspberry Pi + ЖК-дисплей I2C

Однажды случайно, совершенно неожиданно, я решил получить несколько деталей, которые у меня лежали, и сделать что-то, что будет предоставлять мне статистику по Covid-19 в реальном времени. Я не тратил много времени на то, чтобы это выглядело красиво, потому что зачем делать что-то постоянным, когда этого события не будет? Поэтому мой дисплей просто прикреплен к небольшой картонной коробке.

Необходимые детали:

  • Raspberry Pi - любая модель. Я использовал Raspberry Pi 3A +
  • ЖК-дисплей 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 не занимается доставкой прямо сейчас, но Amazon … просто медленно из-за того, что их основной упор делается на предметы первой необходимости, а это не так. Все это можно найти на Amazon и eBay.

Для всего этого вам, очевидно, понадобится адаптер переменного тока, USB-кабель и карта microSD.

Шаг 1. Настройка оборудования

Настройка оборудования
Настройка оборудования

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

С рюкзаком I2C, прикрепленным к ЖК-дисплею, для работы этого соединения требуется всего 4 провода.

Подключите GND к любому из контактов заземления на Raspberry Pi: Pin 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 +. Это не обязательно. Я сделал это, потому что иногда у меня это бывает на металлической поверхности, мне не нравились мои временные настройки на Pi, который находится внутри корпуса, и я не хочу рисковать испортить его, потому что я забыл удалить его с металла. поверхность перед включением.

Шаг 2: Настройка программного обеспечения Pi

Настройка программного обеспечения Pi
Настройка программного обеспечения Pi
Настройка программного обеспечения Pi
Настройка программного обеспечения Pi
Настройка программного обеспечения Pi
Настройка программного обеспечения Pi

Как я уже сказал во вступлении, не имеет значения, какую модель Raspberry Pi вы используете. Я использую это на Raspberry Pi 3A + через Wi-Fi, но также тестировал это на Raspberry Pi 2 по кабелю Ethernet и Raspberry Pi Zero версии 1.3 (самый первый Pi Zero с последовательным разъемом камеры) с USB-ключом WiFi.

Я не собираюсь печатать, как установить Raspbian на карту MicroSD, потому что есть миллионы инструкций о том, как это сделать. У меня есть карта памяти microSD объемом 16 ГБ, на которой работает Raspbian Buster Lite. Кстати, я почти всегда использую Raspbian Lite, потому что мне не нужны другие бесполезные программные пакеты ни в одном из моих проектов. Если я устанавливаю программное обеспечение с помощью apt-get, оно установит недостающие компоненты.

Подключитесь к сети. Опять же, существуют миллионы инструкций о том, как это сделать, поэтому я не буду здесь вдаваться в подробности. Вы можете использовать проводное или беспроводное соединение, но для этого потребуется подключение к Интернету.

Необязательно, но вы можете включить SSH для подключения с помощью PuTTY. Я сделал.

Обновите все, затем перезагрузитесь:

sudo apt update

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

нано I2C_LCD_driver.py

Вставьте приведенный ниже контент во вновь созданный скрипт Python.

# - * - coding: 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 страницы за 1 минуту и будет получать обновленные числа каждый раз, когда цикл начинается снова.

Шаг 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", и с учетом сказанного нашим друзьям в странах с двумя частями имен, например, в Новой Зеландии, потребуется заменить 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…

Я еще не пробовал, но у меня есть именно те ингредиенты, и я мог бы попробовать когда-нибудь.

Рекомендуемые: