Трекер COVID-19 в реальном времени на Arduino + Bolt IoT (WiFi) с LCD и звуковой тревогой
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Bolt WiFi Module (ESP8266-based, платформа Bolt IoT) | 1 |
| LCD-дисплей 16x2 с RGB-подсветкой (Adafruit) | 1 |
| Пьезо-зуммер (бузер) — на пине D0 Bolt | 1 |
| Перемычки, макетная плата | 1 набор |
Архитектура системы
Проект состоит из двух частей:
- Python-скрипт (на ПК/облаке/Colab) — каждые 100 секунд (в коде) скрапит сайт worldometers.info, получает общее число заражённых, сравнивает с предыдущим значением. Если прирост > 10 (в коде) за интервал — отправляет команду на Bolt включить buzzer на 5 сек. Данные (число) отправляются на Bolt по UART (Serial).
- Arduino UNO — принимает данные по UART (пины Rx/Tx к Tx/Rx Bolt) и выводит на LCD.
Настройка Bolt IoT
- Зарегистрируйтесь на boltiot.com.
- Добавьте устройство, запишите Device ID и **API Key** (включите API в настройках).
- Установите Python-библиотеку:
pip install boltiot(или из GitHub).
Python-код (упрощённый и исправленный)
from bs4 import BeautifulSoup
import requests
import time
from boltiot import Bolt
import ssl
# Отключение проверки SSL (если нужно)
ssl._create_default_https_context = ssl._create_unverified_context
# Буфер для сравнения
history = []
def get_covid_total():
url = "https://www.worldometers.info/coronavirus/"
try:
resp = requests.get(url, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
# Главный счетчик обычно в div#maincounter-wrap > span
counters = soup.find_all('div', class_='maincounter-number')
if counters:
total_str = counters[0].find('span').text.strip()
return int(total_str.replace(',', ''))
except Exception as e:
print("Error scraping:", e)
return None
def check_increase(current, history_list, threshold=500):
"""Возвращает True, если прирост > threshold за последние 2 замерa (20 мин)"""
history_list.append(current)
if len(history_list) > 2:
history_list.pop(0)
if len(history_list) == 2:
return (history_list[1] - history_list[0]) > threshold
return False
# Ввод ключей
API_KEY = input("Enter Bolt API Key: ")
DEVICE_ID = input("Enter Bolt Device ID: ")
bolt = Bolt(API_KEY, DEVICE_ID)
# Инициализация Serial на Bolt (9600)
print("Bolt online:", bolt.isOnline())
bolt.serialBegin(9600)
try:
while True:
total = get_covid_total()
if total is not None:
print(f"Total cases: {total}")
# Отправка на Arduino через Bolt UART
bolt.serialWrite(str(total))
# Проверка роста
if check_increase(total, history, threshold=500):
print("ALERT: Cases increased > 500!")
bolt.digitalWrite('0', 'HIGH') # Buzzer ON (пин 0 Bolt)
time.sleep(5)
bolt.digitalWrite('0', 'LOW') # Buzzer OFF
time.sleep(100) # Интервал 100 сек (в оригинале было 100, коммент сказал 10 мин)
except KeyboardInterrupt:
print("Stopped.")
Arduino-скетч
Принимает строку по Serial (Hardware Serial, пины 0/1) и выводит на LCD.
#include
// LCD пины: RS, E, D4, D5, D6, D7
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.home();
lcd.print("Total affected:");
}
void loop() {
lcd.setCursor(0, 1); // Вторая строка
if (Serial.available() > 0) {
String data = Serial.readStringUntil('\n');
data.trim();
if (data.length() > 0) {
lcd.print(" "); // Очистка строки
lcd.setCursor(0, 1);
lcd.print(data);
}
}
}
Схема подключения
- Bolt -> Arduino: Bolt TX -> Arduino RX (D0), Bolt RX -> Arduino TX (D1). **Важно:** Bolt работает на 3.3V логике! Arduino Uno — 5V. Нужен делитель напряжения на линии Bolt RX (Arduino TX -> 1к/2к -> Bolt RX). TX Bolt -> RX Arduino можно напрямую (3.3V высокий уровень читается как HIGH).
- LCD: стандартная схема 4-битная. Пин контраста (VO) -> потенциометр 10к. Подсветка RGB — по схеме Adafruit (PWM пины для цвета).
- Buzzer: подключён к пину 0 (GPIO0) Bolt Module. В коде Python: `bolt.digitalWrite('0', 'HIGH/LOW')`.
- Питание: Bolt и Arduino от USB / 5V. Общая земля.
Важные замечания и улучшения
- Источник данных: Worldometers меняет вёрстку. Парсер может сломаться. Лучше использовать официальное API (например, disease.sh или COVID19 API) — стабильный JSON.
- Интервал опроса: 100 секунд в коде, в тексте написано "10 минут". Для 10 минут поставьте `time.sleep(600)`.
- Порог тревоги: в Python коде `threshold=500`, в тексте проекта "100 за 10 мин". Настройте под актуальную динамику.
- Bolt UART: функция `serialWrite` отправляет строку. Arduino читает `readStringUntil('\n')`. Добавьте `\n` в Python: `bolt.serialWrite(str(total) + '\n')`.
- Безопасность: не оставляйте API Key в коде. Используйте переменные окружения или конфиг-файл.
- Автономность: Python-скрипт можно запустить на Raspberry Pi, VPS или в GitHub Actions / Google Colab (с keep-alive).
Файлы проекта
- Схема подключения: фото в разделе Schematics.
- Код: Python и Arduino в разделе Code.
Производственный процесс
- Построение надёжного Temperature & Sensor API на Raspberry Pi с модулем GY‑91
- Настройка живой IP-камеры на Raspberry Pi с Motion — пошаговое руководство
- Java 9 (JDK 9): ключевые возможности и преимущества
- Java 9 Multi-Resolution Image API: адаптивная графика
- Java 9 CompletableFuture API: таймауты, субклассинг, фабричные методы
- Накидные ключи (box wrenches): конструкция, применение и преимущества
- Строительные болты (machine bolts): виды, марки прочности, монтаж и крутящий момент
- Защелкивающиеся защелки: функция, виды и преимущества для безопасности
- Виды винтов и болтов: полное руководство для правильного выбора
- Винт или болт: ключевые отличия, виды и сферы применения