Оглавление:
- Шаг 1. Настройка оборудования
- Шаг 2: Настройка программного обеспечения Pi
- Шаг 3: установка Python
- Шаг 4: запустите Python
- Шаг 5: Что делать, если я не живу в США?
- Шаг 6: Заключительные мысли
Видео: Статистика Covid-19 + Raspberry Pi + I2C LCD: 6 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-31 10:24
Однажды случайно, совершенно неожиданно, я решил получить несколько деталей, которые у меня лежали, и сделать что-то, что будет предоставлять мне статистику по 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
Как я уже сказал во вступлении, не имеет значения, какую модель 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 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…
Я еще не пробовал, но у меня есть именно те ингредиенты, и я мог бы попробовать когда-нибудь.
Рекомендуемые:
Raspberry Pi - Учебное пособие по Python для датчика влажности и температуры HIH6130 I2C: 4 шага
Raspberry Pi - HIH6130 I2C Humidity & Temperature Sensor Python Tutorial: HIH6130 - датчик влажности и температуры с цифровым выходом. Эти датчики обеспечивают уровень точности ± 4% относительной влажности. С лучшей в отрасли долговременной стабильностью, истинной температурной компенсацией цифрового I2C, лучшей в отрасли надежностью, энергоэффективностью
Raspberry Pi - HIH6130 I2C Датчик влажности и температуры Руководство по Java: 4 шага
Raspberry Pi - Датчик влажности и температуры HIH6130 I2C Руководство по Java: HIH6130 - датчик влажности и температуры с цифровым выходом. Эти датчики обеспечивают уровень точности ± 4% относительной влажности. С лучшей в отрасли долговременной стабильностью, истинной температурной компенсацией цифрового I2C, лучшей в отрасли надежностью, энергоэффективностью
Raspberry PI Multiple I2C Devices: 3 шага
Raspberry PI Multiple I2C Devices: разочарование, потому что вы не можете использовать в своем проекте несколько одинаковых устройств I2C. Нет необходимости использовать медленные мультиплексоры. Последнее ядро raspbian поддерживает создание нескольких шин I2C с использованием контактов GPIO. Это решение очень быстрое