Автор оригинала: Bert Carremans.
С помощью Raspberry Pi, недорогими газовыми датчиками и удаленным управляемым выключателем, вы можете управлять качеством воздуха в вашем доме.
Воздух мы дышим в помещении, не всегда здоровее, чем воздух снаружи.
Согласно изучению ЕВРОСОЮЗ. Совместный научно-исследовательский центр Вы можете найти широкий ассортимент загрязнителей воздуха в помещении. Некоторые из них токсичны или могут вызывать генетические мутации или рак. Факторы, которые влияют на качество воздуха в помещении:
- окружающий воздух или воздух на открытом воздухе
- Воздушная герметичность и вентиляция здания
- Внутренние источники, такие как табачный дым, нагревательные газы, потребительские товары и т. Д.
Вы знаете, сколько времени вы проводите в помещении? Согласно агентству по охране окружающей среды, американцы тратят 87% их времени в помещении Отказ В Европе этот средний процент составляет 90%, согласно JRC. И чем больше времени мы потратили в помещении, тем больше загрязняющих веществ мы вдыхаем.
Так что было бы интересно, если отследите качество воздуха в помещении. В этой статье я объясню, как я сделал это с Raspberry Pi , а Гровепи и некоторые датчики. Мы загрузим данные датчика на Firebase База данных и визуализация тенденций с Dash Отказ
Когда уровни загрязняющих веществ достигают нездорового уровня, мы можем отправить уведомление о предупреждении, чтобы предупредить нас.
Более того, было бы здорово, если бы мы могли автоматически запустить вентиляцию, чтобы очистить воздух. Это можно сделать с Управляемый удаленный выключатель от Energenie Отказ
Raspberry Pi и Grovepi
В этом проекте я буду использовать модель Raspberry Pi 2B. Raspberry Pi – недорогой маленький компьютер. Это позволяет программистам и производителям построить все, что они могут себе представить.
Grovepi – это электронная доска, которую мы прилагаем к Raspberry Pi. Это облегчает подключение широкого спектра датчиков. Таким образом, вам не нужно беспокоить о макете, резисторах, пайках или перемычных проводах. Вы можете подключить разъем и начать работать с ним.
Поток данных
На рисунке ниже вы видите, как данные датчика будут течь от датчиков к графикам на веб-странице. Мы будем использовать Python, чтобы сделать все это.
Первый шаг – тянуть данные из датчиков Grove. Затем мы обрабатываем данные на Raspberry Pi и отправить их в базу данных FireBase. Эти данные также используются для включения или выключения вентиляционного устройства через пульт дистанционного управления.
Мы можем получить хранимые данные со сценарием, работающим на Pythonanyewhere.com. С помощью пакета Dash мы можем построить приборную панель, чтобы следить за качеством воздуха в помещении.
Газовые датчики
Мы будем использовать набор из трех различных газовых датчиков для этого проекта. Я использую датчики Grove Gaz и подключите их к Гровепи.
Не нужно использовать все три датчика в вашем собственном проекте. Не стесняйтесь выбирать датчики, которые соответствуют вашим потребностям. Вы можете сделать это в config.py
Файл, сохраняя датчики, которые вам нужны в словаре Python Mq_sensors.
Каждый датчик обнаруживает определенный набор газов. Существует довольно много перекрытия между датчиками в отношении газов, которые они обнаруживают. Но диапазон, в котором датчики обнаруживают газ, может отличаться. Вы можете найти диапазоны на Сайт weeedstudio Отказ
Датчик температуры и влажности
Температура и влажность влияют на показания от газовых датчиков. Итак, интересно измерить температуру и влажность также. Мы используем датчик Grove BME680 для этого.
Работа с данными датчика
Короче говоря, датчик газа выкроет более высокое напряжение, когда концентрация газа выше. Это связано с тем, что встроенный резистор зависит от его сопротивления (RS) в зависимости от концентрации газа.
Значение датчика отражает только приближение тенденции в концентрации газа. Это означает, что вы можете использовать его, чтобы показать, увеличивается ли концентрация газа или уменьшается. Это не дает точной концентрации газа. Если вы хотите измерить фактическую концентрацию, вам понадобится более дорогой датчик.
Для обучения мы будем использовать значение датчика для приближения концентрации газа. Вы должны иметь это в виду. Вы не должны использовать эти сценарии в реальных ситуациях, чтобы предотвратить интоксикацию этими газами!
На таблицах данных, перечисленных ниже, вы найдете график с соотношением между значениями концентрации газа и датчика. Концентрация газа выражена в частях на миллион (PPM). Значения резистора как соотношение RS/R0.
Кривые ниже соответствуют стандартным условиям:
- температура 20 ° C
- влажность 65%
- концентрация кислорода 21%
- Устойчивость к грузоперевозом 5 килоомма. Сопротивление нагрузки – это полное сопротивление электронной цепи.
Мы можем предположить, что сопротивление нагрузки и концентрация кислорода со временем стабильны. Тем не менее, температура и влажность в помещении могут варьироваться. Оба фактора влияют на показания датчика, как вы можете видеть на графике ниже.
Чтобы получить точные показания, у вас должен быть таблица графа или поиска для различных комбинаций влажности температуры. К сожалению, эти графики не предоставляются производителем.
Другой подход состоит в том, чтобы исправить показания датчика для воздействия температуры влажности.
Мы можем сделать это с искусственными нейронными сетями, как предложено в Бумага Ненована и Демчева Отказ Этот подход требует измерений наземной истины концентрации газа. Это не имеет возможности для этой статьи.
Определение значения R0
Во-первых, нам нужно вычислить значение R0. R0 обозначает значение сопротивления датчика 100 000 ч/млн водорода (H2) в чистом воздухе. Соотношение для чистого воздуха (черная линия с синими крестами) постоянна. Он остается в 9,8 независимо от концентрации чистого воздуха. Итак, мы можем вычислить R0, прочитав значение датчика (RS) в чистом воздухе и делением его на 9,8.
Значение, которое мы получаем от датчика, представляет собой значение от 0 до 1,023 и не имеет единицы измерения. Итак, чтобы получить выходное напряжение, которое мы разделим значение датчика на 1,023. Мы умножим это значение с напряжением схемы, которое обычно 5V.
Из напряжения датчика мы можем получить сопротивление датчика, применяя Закон о Ом Отказ Сопротивление датчика равно
Давайте посмотрим, как мы это делаем с Python. Полный код и дополнительная документация можно найти на Github В скрипте get_r0_values.py
Отказ
import config as cfg import grovepi import time
Во-первых, мы импортируем некоторые пакеты. config
. Пакет – это скрипт Python, который я сделал для хранения всех параметров конфигурации.
На протяжении всего кода вы заметите, что я иногда называю cfg.parameter_name
Отказ Мы устанавливаем Параметр_name
ценность в этом config.py
файл. Он также содержит несколько паролей и токенов API.
По соображениям безопасности я не сохраню этот файл на Github Отказ Вместо этого я предоставлю чистый шаблон config_template.py
. что вы можете использовать для вашего собственного проекта.
Далее мы импортируем Гровепи
упаковка. Вы можете установить его из Страница GitHub Hexter Industries На вашей малине PI. Это позволяет нам работать с Grovepi и подключенными датчиками.
Наконец, мы используем время
Пакет, чтобы приостановить программу во время показаний датчика.
mq_values = {} for sensor, data in cfg.MQ_SENSORS.items(): grovepi.pinMode(data['pin'],"INPUT") mq_values[sensor] = 0
Мы храним значения датчика для различных датчиков в словаре mq_values
Отказ Но сначала мы инициализируем значения до нуля в контуре по датчикам, определенным в Mq_sensors
Отказ
С PinMode
Метод, вы можете определить PIN-код AS Вход
или ВЫХОД.
В нашем случае мы будем использовать его как Вход
Отказ
PIN-код
говорит нам, к какому контакту на Grovepi датчик подключен. Мы используем аналоговые контакты (или порты), которые маркируются как A0, A1 и A2 на Grovepi. Убедитесь, что вы подключаете правильный датчик к порту, описанному в config.py
файл.
for i in range(cfg.NB_R0_READ): for sensor, value in mq_values.items(): mq_values[sensor] += grovepi.analogRead(cfg.MQ_SENSORS[sensor]['pin']) time.sleep(cfg.R0_INTERVAL)
Затем мы прочитаем значение датчика в цикле для cfg.nb_r0_read
раз и суммируйте его в mq_value [датчик]
Отказ Мы читаем значение датчика с аналогичный
Метод Гровепи
упаковка.
Как описано в Документация , это вернет значение между 0 и 1,023. Фактически, он преобразует значение аналогового датчика в цифровое значение.
После одного чтения для всех датчиков мы приостановим программу на CFG.R0_INTERVAL
секунды. Чтобы получить среднее значение, мы разделяем накопленное значение по cfg.nb_ro_read.
for sensor, value in mq_values.items(): mq_values[sensor] = mq_values[sensor]/cfg.NB_R0_READ mq_values[sensor] = mq_values[sensor]/cfg.AR_MAX * cfg.VC mq_values[sensor] = (cfg.VC - mq_values[sensor])/mq_values[sensor] mq_values[sensor] = mq_values[sensor]/cfg.MQ_SENSORS[sensor]['r0_rs_air']
Мы вычисляем напряжение датчика, разделив усредненное значение датчика по cfg.ar_max
Отказ Тогда мы умножим это по напряжению цепи cfg.vc
Отказ
Из этого напряжения мы можем применить закон Ом и вычислить значение сопротивления датчика. Разделение этого соотношением для чистого воздуха cfg.mq_sensors [датчик] ['r0_rs_air']
дает нам r0.
Лучше иметь датчик работать, по крайней мере, за 24 часа, прежде чем измерить значение R0. Это даст более стабильные показания датчика.
Линейная интерполяция концентрации газа
Теперь, когда мы знаем значение R0, мы можем вычислить соотношение RS/R0 с помощью значения датчика. С этим соотношением мы можем получить концентрацию газа с Линейная интерполяция Отказ
Для этого мы предполагаем, что мы работаем в стандартных условиях, описанных для первого графика. В этом случае кривые почти линейны.
Для линейной интерполяции нам нужны две известные точки каждой кривой, чтобы рассчитать его наклон. Предположим, у нас есть две точки с координатами (x1, y1) и (x2, y2). Значения Y поддаются значениям RS/R0 и X-значения для концентрации газа. Для линейной кривой наклон затем рассчитывается как:
Когда мы знаем наклон, мы можем найти концентрацию газа (X) для любого данного значения RS/R0 (Y). Формула для этого:
Ниже приведены фрагменты кода из скрипта get_sensor_values.py
на что вы можете найти на Github Отказ
Мы поставили формулу в функцию get_ppm.
Кривая ['y']
и Кривая ['x']
Известные точки на кривой для газа. кривая [«склон»]
Это то, что мы рассчитали с предыдущей формулой.
Вы можете найти эти значения в config_template.py
. файл. Я получает эти ценности с WebPlotDigitizer от графиков на листах данных. В результате эти значения не совсем точны. Используйте их с осторожностью.
Обратите внимание на использование np.log10
и NP.POWER.
По этой причине для этого оси на графике находятся в шкале журнала.
def get_ppm(Rs_R0_ratio, curve): x_val = (np.log10(Rs_R0_ratio) - curve['y'])/curve['slope'] + curve['x'] ppm_val = np.power(x_val, 10) return ppm_val
Мы рассчитываем RS_R0_RATIO
таким же образом, как при расчете значения R0. Так что я не буду повторять это. Чтобы рассчитать это соотношение, мы верете все газы и датчики и храните это в ppm_values [mq_sensor] [газ].
for gas, curve in cfg.CURVES[mq_sensor].items(): ppm_values[mq_sensor][gas] = get_ppm(mq_values[mq_sensor], curve)
Температура, влажность и давление
Помимо газовых датчиков, мы читаем температуру, влажность и давление с датчиком BME680. Датчик BME680 подключен к Grovepi через порт I2C. Чтобы использовать датчик, мы импортируем пакет, который можно установить из Пиморони репо на github.
import bme680
Установите _..._ Reptamle
Методы Укажите, сколько образцов мы принимаем, чтобы рассчитать среднее значение. Мы также сделали это для газов. С get_sensor_data
Мы читаем значения датчика.
bme680_sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) bme680_sensor.set_humidity_oversample(bme680.OS_2X) bme680_sensor.set_pressure_oversample(bme680.OS_4X) bme680_sensor.set_temperature_oversample(bme680.OS_8X) bme680_sensor.get_sensor_data()
bme680_sensor.get_sensor_data()
Хранение и извлечение данных датчика в облачном огнестрельном
Некоторые датчики обеспечивают новые показания очень быстро. Другие (менее дорогие) датчики займут больше времени. Для этого проекта мы будем читать данные каждую минуту. Это установлено в файле конфигурации с помощью Firebase_Interval
Отказ
В свободном зажигании Firebase, Cloud Firestore квота Разрешить за 20к пишет в день. С одноминутом интервалом мы будем ниже этой квоты. Предел для чтения документов в FireStore составляет 50 к в день.
Вам нужно будет создать проект FireBase и Создайте облако огнестрельное Отказ После этого убедитесь, что генерировать учетные данные аутентифицировать ваше приложение. Сохраните файл учетных данных в безопасном месте.
Чтобы работать с Firebase через Python, нам нужно импортировать Firebase_admin
упаковка. Этот пакет должен быть установлен на вашей Raspberry Pi First, если это необходимо.
import firebase_admin from firebase_admin import credentials from firebase_admin import firestore
После этого мы можем инициализировать приложение FireBase с учетными данными. Я храним местоположение в файл учетных данных в cfg.firebase_creds_json
Отказ Когда приложение инициализируется, мы создаем объект FireStore дБ
Отказ
firebase_path = Path.cwd() / cfg.FIREBASE_CREDS_JSON cred = credentials.Certificate(str(firebase_path)) firebase_admin.initialize_app(cred)
После обработки ценностей газа пришло время хранить их в облаке Firestore. Мы создадим словарь firebase_values
собрать все данные. С пониманием Dict мы добавляем значения для всех газов для всех датчиков MQ. Значения BME680 и Timestamp также добавляются.
С Добавить
Метод объекта Firestore дБ
, легко хранить данные в FireStore.
Название коллекции в FireStore является cfg.firebase_db_name
Отказ Узнайте больше о Модель данных Firestore На веб-сайте Firebase.
firebase_values = {mq_sensor + '_' + gas + '_ppm': ppm for mq_sensor, gases in ppm_values.items() for gas, ppm in gases.items() } firebase_values['temperature'] = bme680_sensor.data.temperature firebase_values['pressure'] = bme680_sensor.data.pressure firebase_values['humidity'] = bme680_sensor.data.humidity firebase_values['date'] = datetime.now() db.collection(cfg.FIREBASE_DB_NAME).add(firebase_values)
После хранения данных мы ждем минуту, чтобы начать со следующей строкой кода.
time.sleep(cfg.FIREBASE_INTERVAL)
Улучшение качества воздуха
Если качество воздуха в помещении не хорошо, мы должны принять меры для его улучшения. Прежде чем мы сможем сделать это, мы должны быть уведомлены о критических концентрациях газа.
Одной из возможностей является отправка уведомления о предупреждении по электронной почте, который мы обсудим ниже.
Иногда источник загрязнения воздуха в помещении происходит с наружного воздуха. Например, когда ваши соседи имеют сжигание древесины или когда вы живете рядом с заводом.
В этом случае вы можете установить вашу измерительную станцию снаружи и отключить вентиляционный блок в вашем доме, если качество воздуха на открытом воздухе плохой. С помощью удаленного контролируемого выключателя это можно сделать легко.
Вся код для этого раздела находится в Улучшено_air_quality.py
на github.
Отправка уведомлений, когда качество воздуха достигает критического уровня
Мы не хотим отправлять электронное письмо каждый раз, когда датчик выводит критические значения (здесь, каждую минуту).
Допустим, мы хотим проверить каждый час, были ли критические значения в последний час. Для этого нам нужно отслеживать Справочник.
Мы инициализируем это, когда начинается программа для чтения значений датчиков. Интервал, при котором мы снова проверяем для критических концентраций газа, определено в cfg.alert_interval
Отказ
reference_time = datetime.now()
Когда час прошел с Reefer_Time
, мы можем начать проверять, были ли критически важные значения загрязнителей воздуха. Мы обновляем Reefer_Time
с текущим временем.
С Пыта
Пакет, мы можем учитывать наш часовой пояс. В моем случае это Европа/Брюссель.
Мы вычисляем one_hour_ago
вычитая 60 минут от текущего времени.
if datetime.now() > reference_time + timedelta(minutes=cfg.ALERT_INTERVAL): reference_time = datetime.now() brussels_tz = pytz.timezone('Europe/Brussels') prev_check_time = brussels_tz.localize(datetime.now()) - timedelta(minutes=cfg.ALERT_INTERVAL)
С prev_check_time
Мы извлекаем показания датчика из Firebase последнего часа. Мы делаем это, применяя где
пункт на данные, которые мы получить
от облако огненного.
В этом скрипте мы будем использовать только один газовый датчик и ограниченный набор газов. Датчик выбран в cfg.alert_sensor.
Газы выбраны в cfg.alert_gases.
Данные на газ добавляются в PPM_VALS
а также метки времени.
timestamps = [] ppm_vals = {} for gas in cfg.ALERT_GASES: ppm_vals[gas] = [] docs = db.collection(cfg.FIREBASE_DB_NAME).order_by(u'date').where(u'date', '>=', one_hour_ago).get() for doc in docs: data = doc.to_dict() for gas in cfg.ALERT_GASES: ppm_vals[gas].append(data[cfg.ALERT_SENSOR + gas + '_ppm']) timestamps.append(data['date'].strftime('%H:%M:%S'))
Мы ищем критические значения с функцией find_crit_val.
Мы проверим только, превзойдет ли значение верхней границы ubound
Отказ Эти верхние границы должны быть указаны в файле конфигурации.
Данные в восходящем хронологическом порядке. Таким образом, мы можем использовать Следующий
Способ найти первый меток времени для которого v> ubound
Отказ Мы возвращаем кортеж, содержащую временную метку критического значения и сам критическое значение.
Если нет критического значения, мы возвращаем кортеж (Нет, нет).
def find_crit_val(timestamps, val_list, ubound): try: (crit_time, crit_value) = next(((i,v) for i, v in zip(timestamps, val_list) if v > ubound)) except: (crit_time, crit_value) = (None,None) return (crit_time, crit_value)
Критические кортежи хранятся в словаре CRIT_DICT.
В качестве ключа мы используем имя газа. Затем мы проверяем комбинации газа-датчиков с критическим временем и критическим значением. В этом случае мы добавляем сообщение о предупреждении на crictic_msg.
crit_dict = {} for gas in cfg.ALERT_GASES: (crit_time, crit_value) = find_crit_val(timestamps, ppm_vals[gas], cfg.UPPERBOUNDS[gas]) crit_dict[gas] = (crit_time, crit_value) critical_msg = '' for k, v in crit_dict.items(): if v[0] is not None and v[1] is not None: critical_msg += '\nCritical value for ' + k + ' of ' + str(v[1]) + cfg.UNITS[k] + ' at ' + str(v[0])
Если crictic_msg
не пусто, мы отправляем электронное письмо. Отправка электронного письма сделано с smtplib
упаковка. Как отправить электронное письмо с Python, объясняется на Automateeee BoringStuff.com Отказ
Вам нужно создать Специфический пароль для приложения Для вашего электронного письма, если вы используете двухфакторную аутентификацию Google.
if critical_msg != '': try: msg = MIMEText(critical_msg, _charset='utf-8') msg['Subject'] = Header('Air Quality Alert', 'utf-8') smtpObj = smtplib.SMTP('smtp.gmail.com', 587) smtpObj.ehlo() smtpObj.starttls() smtpObj.login(cfg.EMAIL, cfg.EMAIL_PW) smtpObj.sendmail(cfg.EMAIL, cfg.EMAIL, msg.as_string()) smtpObj.quit() except smtplib.SMTPException: print('Something went wrong while sending the email')
Автоматически контролировать свой вентиляционный блок
С помощью удаленного удаленного выключателя мы можем включить или выключить любое устройство, которое подключено к нему. Таким образом, также вентиляционный блок. Энергения Создает добавку Pimote специально для Raspberry Pi. Чтобы контролировать выключатель Energenie, вам нужно установить Энергения
Пакет и импортировать его.
Обратите внимание, что вы не можете прикрепить Pimote на вершине Grovepi. Таким образом, вам понадобится вторая Raspberry Pi.
При запуске скрипта первое, что мы делаем, это определить логическую переменную Ventilation_on.
Мы установили это на Ложь
Потому что это первый раз, когда мы запускаем скрипт.
import energenie ventilation_on = False
Если crictic_msg
Не пусто, в последнем интервале оповещения имелась критическая концентрация газа. В этом случае мы включаем вентиляцию с Switch_on
Способ пакета Energenie.
Если не было никакой критической концентрации газа, и вентиляция была включена в последнем интервале оповещения, мы можем отключить его.
Вам может потребоваться установить еще один интервал, прежде чем выключить вентиляцию. Это зависит от скорости потока вашего вентиляционного устройства, измеряемое газами, и является ли источник загрязнения отключен.
if critical_msg != '': if not ventilation_on: energenie.switch_on(1) ventilation_on = True else: if ventilation_on: energenie.switch_off(1) ventilation_on = False
Визуализация качества воздуха с тире
Уведомление с критическими концентрациями газа может помочь принять немедленные действия. Но также интересно отслеживать концентрации газа со временем. Визуализируя значения датчика в приборной панели, мы можем посмотреть на тенденцию концентрации газа. Это можно сделать с помощью тире. На сайте тире вы можете найти Отличное учебное пособие о том, как начать.
В этом проекте мы построим приборную панель и размещаем ее на Pythonanyewhere.com Отказ Чтобы использовать тире на Pythonanywhere, вам нужно создать Виртуальная среда Отказ Вы можете следовать шагам Это демонстрация О том, как настроить приложение Dash на Pythonanyway.
Ниже я покажу, как я построил приборную панель для нашей цены качества авиации. Полный скрипт можно найти в Plot_sensor_values.py на Github Отказ
Прежде всего, вам нужно импортировать Dash
упаковка.
import dash import dash_core_components as dcc import dash_html_components as html
В демонстрации на сайте Dash они используют ссылку на каскадную таблицу стилей (CSS), чтобы обеспечить хороший дизайн страницы. Если вы хотите Используйте локальные CSS На вашем ноутбуке или веб-сервере вы можете добавить папку активов. В этой папке вы можете добавить свои CSS и приборов заберут его оттуда.
Тогда вам нужно получить данные из Firebase. Это может быть сделано так же, как мы сделали для отправки уведомлений о предупреждении. Таким образом, мы не будем проходить через это снова.
С помощью данных, собранных из Firebase, мы можем заполнить графики на нашей панели приборной панели. Сначала мы создаем Tash Object Object приложение
и дать ему заглавие.
app = dash.Dash(__name__) app.title = 'Indoor Air Quality Dashboard'
Тогда мы создаем Макет
приборной панели. А H1
Компонент заголовка, A Контейнер
div и div, содержащий Графики.
app.layout = html.Div([ html.H1(style={'textAlign':'center'}, children='Indoor Air Quality Dashboard'), html.Div(id='container'), html.Div(graphs) ])
Графики
это список, который содержит информацию на график. Ниже вы можете увидеть, как настроен график для температуры. Вы можете добавить dcc.graph
для влажности и давления, добавив их в Графики.
graphs = [ dcc.Graph( id='temperature', figure={ 'data':[{ 'x':timestamps, 'y':temperatures, 'type':'line', 'name': 'Temperature', 'line': {'width':2, 'color': '#542788'} }], 'layout':{ 'title': 'Temperature', 'yaxis': {'title': 'Celsius'}, 'xaxis': {'title': 'Timestamp', 'tickvals':timestamps} } } ) ]
Графики для датчиков MQ могут быть добавлены в контуре для цикла.
for mq_sensor in cfg.MQ_SENSORS.keys(): for gas in cfg.CURVES[mq_sensor].keys(): sensor_gas_key = mq_sensor + '_' + gas + '_ppm' title = gas + ' concentration on '+ mq_sensor + ' sensor' data = ppm_values[mq_sensor][gas] data.reverse() graphs.append(dcc.Graph( id=sensor_gas_key, figure={ 'data': [{ 'x': timestamps, 'y': data, 'type':'line', 'name': title, 'line': {'width':2} }], 'layout': { 'title': title, 'yaxis': {'title': 'ppm'}, 'xaxis': {'title': 'Timestamp', 'tickvals':timestamps} } } ))
В результате у вас будет приборная панель с графиками, такими же приведенными ниже.
Заключение
С несколькими недорогими газовыми датчиками и Raspberry Pi (и Grovepi) легко построить измеритель качества воздуха. Затем вы можете действовать на данные, отправив уведомления о предупреждении, когда качество воздуха плохое или включите вентиляцию. С помощью Dash вы можете построить красивые визуализации для контроля качества воздуха со временем.
Ниже я отметил некоторые идеи, чтобы сделать этот проект дальше.
- Сделайте мобильное приложение для визуализации и получения уведомлений
- Добавьте светодиоды, зуммер и отображение OLED в Raspberry Pi, чтобы получить мгновенную обратную связь по качеству воздуха
- Установите измерительные станции в месте своих семейных и друзей и Визуализируйте это на интерактивной карте Отказ
- Как только у вас достаточно данных, Построить модель временной серии предсказать качество воздуха в помещении
Надеюсь, эта история мотивирует вас начать строить собственную станцию измерения. Если у вас есть вопросы или предложения, дайте мне знать.