Нередко мы сильно увлекаемся написанием кода настолько, что забываем подышать свежим воздухом, особенно когда нельзя держать окно постоянно открытым (ну, бывают причины). В результате этого в помещении повышается концентрация СО₂ и впоследствии начинаются неприятные побочные эффекты в виде сонливости, заторможенности и головной боли. Для решения этой проблемы существуют датчики СО₂, которые при достижении определённой концентрации скажут, что пора открыть окно. Готовые варианты конечно хорошо, но это слишком просто — сделаем своё хост-устройство для измерения и разомнём извилины.
▍ Введение
Притормозим с открытием САПР для проектирования печатных плат и IDE. Зададим несколько вопросов и соберём нужную нам информацию.
Негативные эффекты от воздействия СО₂ начинают проявляться, когда уже всё — приплыли. Даже если после их проявления проветрить помещение, то они сразу не уйдут и будут о себе напоминать ещё некоторое время (в моём случае это минут 20-30). Чтобы этого избежать нужно измерять уровень СО₂ и сигнализировать о повышенном уровне заранее.
Концентрация СО₂ измеряется в PPM. По сути, PPM это количество молекул СО₂ на миллион молекул другого газа, в нашем случае воздуха. Например, если концентрация равна 400ppm, то это значит, что в измеряемом объёме на каждый 1млн молекул приходится 400 молекул измеряемого газа.
Раз уж мы заговорили о концентрации, то нужно понять, при какой концентрации начинают наступать негативные эффекты. И тут нам поможет вот такая красивая картинка:
Концентрация СО₂ vs последствия
Как видно из шкалы уже при 1000 PPM начитают проявляться первые негативные эффекты, соответственно при этом значении нужно начинать наводить панику. При достижении 2500 PPM начинаются уже более серьёзные последствия, а 5000 ppm гарантировано заставят вас покинуть помещение и сходить за очередной кружкой чая.
▍ Требования
Хорошо, у нас теперь есть концентрация, от которой мы можем отталкиваться при разработке. Теперь определимся с требованиями к устройству:
- Компактность. Я думаю никто не хочет видеть у себя на полке огромную коробку.
- Работа от встроенного АКБ, не люблю батарейки.
- Автономность. Зарядил и поставил на полку, никаких проводов.
- Пищалки зло, будем использовать мигающие светодиоды для индикации.
- Светодиоды должны иметь достаточную яркость, чтобы их заметить, но не освещать всю комнату по ночам.
- Два уровня индикации: нежелательная и опасная концентрации.
- Дисплей. Хорошо бы знать текущую концентрацию в помещении.
- Возможность установки на стену или просто поставить на полку.
В целом достаточно стандартные требования.
▍ Датчик СО₂
Начнём с самого основного — измерительного модуля. Разумеется, мы возьмём готовый OEM вариант, т.к. разрабатывать свой ну это крайне сложная задача и требует наличия людей намного умнее меня. Мой выбор пал на NDIR датчик MH-Z19B, т.к. его проще всего достать:
MH-Z19B
Относительно остальных компонентов это будет самая дорогая часть устройства не только в плане цены, но и в плане потребления. Давайте глянем его характеристики:
- Измеряемый диапазон 0-5000 PPM. Нам это подходит.
- Период измерения 1 секунда и он не настраивается. Это очень плохо, т.к. мы не можем снизить потребление датчика путём уменьшения частоты измерений.
- Напряжение питания 5В. Тут нужен будет повышающий DC-DC, т.к. работать мы будем от Li-ion АКБ (3.7В).
- Интерфейс коммуникации UART.
- Среднее потребление 30мА. Главный пик тока приходится на вспышку лампочки во время измерения концентрации. Это на самом деле очень печально, хотелось бы меньше, но других бюджетных вариантов нет, которые можно пойти в магазин и купить.
Остальные характеристики нас особо не интересуют. Т.к. датчик китайский, то разумеется там погрешность измерений 0% (сарказм).
Давайте немного поговорим о том, как он работает. Упрощённая схема выглядит так:
Схема работы датчика газов
Молекулы газа имеют свойство поглощать определённую длину волны. Разумеется, для каждого газа поглощаемая длина волны разная, это позволяет исключить влияние других газов на результат измерения.
В измеряемый объём помещается газ, и делается вспышка источником света. Свет проходит через измеряемый газ, и излучение поглощается молекулами по пути к детектору. Перед детектором стоит фильтр, который пропускает только нужную нам длину волны. В данном случае это длина волны, поглощаемая молекулами СО₂, и, если я не ошибаюсь, это 4.26мкм (поправьте, пожалуйста, если я неправ). Чем больше молекул СО₂ в измеряемом объёме, тем больше поглощение — мы получаем зависимость поглощения от концентрации.
Выглядит всё достаточно просто, но на самом деле это очень сложное устройство не только в плане обработки данных, но и в плане изготовления. По пути до детектора излучение должно поглощаться только молекулами газа, соответственно требуется обеспечить максимальное отражение нужного нам излучения от внутренних стенок ёмкости с газом. Это одна из многих проблем при производстве подобных устройств.
Продолжим ковырять наше устройство дальше.
▍ Выбор железа
Я решил использовать STM32F030 в качестве микроконтроллера для обработки данных с датчика. Да, у STM есть L версии микроконтроллеров, которые в разы меньше потребляют, но и цена у них в разы выше. На самом деле у меня их целая коробка и нужно их куда-то определять.
В качестве DC-DC для питания устройства возьмём L6920DTR. Не очень дорогой и требует минимум обвязки, да и эффективность заявлена неплохая — порядка 95%. С питанием тут не всё просто. Для питания датчика нужно 5В, а для питания МК 3.3В. Соответственно проще всего будет поднять напряжение до 5В при помощи DC-DC, а для питания МК опустить напряжение обычным линейным стабилизатором. При токах питания МК потери на стабилизаторе будут минимальные.
Для зарядки АКБ используем микросхему STC4054GR. Она имеет все необходимые нам плюшки в виде установки тока заряда и индикации. Сам аккумулятор выберем позже после разработки ПП, чтобы это всё дело влезло в корпус с максимальным использованием свободного места.
Дисплей возьмём 0.96 дюйма на базе SSD1306:
Дисплей на базе SSD1306
▍ Разработка железа
Вжух и схема готова.
Местами есть конденсаторы на 25В, которые стоят в цепи 3.3В — это нормально. Дело в том, что при разработке схем я сначала отталкиваюсь от своих запасов и только потом иду в магазин.Схема (часть 1)
Схема (часть 2)
В целом тут ничего особенного. Самая печатная плата получилась достаточно компактной и имеет размеры 55х45. Около 50% занимает сам датчик СО₂:
3D модель печатной платы
▍ Разработка корпуса
Тут уже интереснее — нужно всё это уместить в компактном виде. В качестве материала будем использовать PLA пластик и FDM печать. Размеры в сборе 51х64х30 (ШхВхГ). Корпус получился достаточно толстым, но в целом приемлемо и на полке смотрится неплохо:
3D модель корпуса
На лицевой части имеются 3 отверстия для светодиодов. Два верхних для индикации концентрации: жёлтый и красный. Жёлтый означает, что пора открыть окно, красный — пора бежать :) Третье отверстие для светодиода индикации процесса заряда АКБ.
Также спереди и снизу имеются отверстия для циркуляции воздуха. Изначально я хотел сделать принудительную циркуляцию при помощи вентилятора. Микроконтроллер периодически запускал бы его и продувал датчик, но впоследствии отказался от этого. Не хочу, чтобы ночью он внезапно начал шуршать вентилятором, да и механические детали не очень надёжны (скрипят, шумят, в них постоянно что-то попадает).
Сзади имеется паз под саморез\винт\болт\гвоздь, на который его можно повесить на стену где-нибудь в офисе, например.
Устройство собирается как бутерброд. Сначала ставятся светодиоды и дисплей. Дисплей крепится за направляющие путём их оплавления, т.е. снять его без разрушения элементов корпуса не получится. Не очень хорошее решение, но если подумать «А зачем его вообще снимать оттуда?»
Крепление дисплея к корпусу
Дальше устанавливается основная плата. Она уже крепится на саморезы, т.к. в процессе отладки приходилось её часто снимать.
Установка ПП в корпус
Дальше ставится АКБ на плату и прижимается задней крышкой. Кстати, АКБ я выбрал на 1200мА — это самый толстый АКБ, который влез в этот корпус.
АКБ
Задняя крышка устройства
▍ Код, код, код
Я не буду описывать весь код (драйвер USART, работа с дисплеем и т.п.), расскажу о работе с MH-Z19B. Весь код можно глянуть на моём Github: github.com/NeoProg2013/CO2_sensor
static uint16_t concentration = 0;
static bool is_data_ready = false;
// ***************************************************************************
/// @brief Initialize CO2 sensor driver
/// @param none
/// @return none
// ***************************************************************************
void co2_sensor_init(void) {
usart1_callbacks_t callback;
callback.frame_received_callback = frame_received_callback;
usart1_init(9600, &callback);
// Disable ABC
const uint8_t disable_abc_cmd[9] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
uint8_t* tx_buffer = usart1_get_tx_buffer();
memcpy(tx_buffer, disable_abc_cmd, sizeof(disable_abc_cmd));
usart1_start_tx(sizeof(disable_abc_cmd));
// Delay for send command
uint64_t start_time = get_time_ms();
while (get_time_ms() - start_time < 1000);
}
// ***************************************************************************
/// @brief Read concentration from CO2 sensor
/// @param none
/// @return true - success, false - error
// ***************************************************************************
bool co2_sensor_read_concentration(void) {
const uint8_t meas_cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
uint8_t* tx_buffer = usart1_get_tx_buffer();
uint8_t* rx_buffer = usart1_get_rx_buffer();
is_data_ready = false;
// Send measurement command
memcpy(tx_buffer, meas_cmd, sizeof(meas_cmd));
usart1_start_rx();
usart1_start_tx(sizeof(meas_cmd));
// Wait response
uint64_t start_time = get_time_ms();
while (!is_data_ready) {
if (get_time_ms() - start_time > 5000) {
return false;
}
}
// Process response
concentration = (uint16_t)(rx_buffer[2] << 8) | (rx_buffer[3] << 0);
if (concentration > 9999) {
concentration = 9999;
}
return true;
}
// ***************************************************************************
/// @brief Get concentration value
/// @param none
/// @return concentration valuenone
// ***************************************************************************
uint16_t co2_sensor_get_concentration(void) {
return concentration;
}
// ***************************************************************************
/// @brief USART frame received callback
/// @param frame_size: received frame size
/// @return none
// ***************************************************************************
static void frame_received_callback(uint32_t frame_size) {
is_data_ready = true;
}
Я выкинул из кода всё лишнее для краткости. Давайте по порядку. Первым делом мы выключаем ABC (Auto background calibration), зачем это нужно и что это такое? ABC это и полезная вещь и ружьё, которое обязательно стрельнёт вам в ногу. Принцип её работы (ABC, не ноги) заключается в нахождении минимальной концентрации за определённый период и установки её в качестве «фона» — 400 PPM. Т.е. если вы надышали в пакет и положили туда датчик, то через неделю на датчике можно будет увидеть 400 PPM, вместо 10 000. ABC предполагает, что измеряемый объём проветривается и как бы запоминает значение концентрации уличного воздуха. Нам не нужна эта недокументированная магия, поэтому вырубаем это дело.
В будущем нужно будет предусмотреть принудительную калибровку, т.к. качество воздуха везде разное. Где-то может 1000 PPM быть на улице (надеюсь нет) и ниже этого значения концентрация никогда не упадёт. Всё относительно.Дальше в коде имеется функция co2_sensor_read_concentration, которая дёргается каждые 3 секунды. Команда для чтения концентрации имеет следующий вид: 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79. На неё датчик отвечает 0xFF, 0x01, CONC, CONC. В последних двух байтах содержится нужное нам значение концентрации. В главном цикле это значение отображается на дисплей и принимается решение о включении нужных светодиодов. В целом всё достаточно просто.
▍ Результаты
Устройство получилось достаточно компактным, вполне можно брать с собой и носить в кармане. По потреблению немного скудно — 3 дня без подзарядки. Очень хотелось бы уменьшить частоту измерений до 0.1Гц, это позволило бы снизить потребление в разы, но увы. Ток заряда 300мА и заряжается до 100% за несколько часов.
Итоговая стоимость без учёта моего времени порядка 2000р (2021 год), из которых 60% это стоимость датчика СО₂.
В целом устройство выполняет свою функцию — напоминает о необходимости проветрить помещение и ситуаций вида «тут уже дышать нечем» стало намного меньше. Почему они не исчезли вовсе? «Вот сейчас допишу этот кусок функционала и прервусь», «Да-да ещё чуть-чуть» и.т.п (чтобы меня выгнать из-за компа, это нужно постараться) :)
Всем спасибо за внимание и дышите свежим воздухом.
Комментарии (71)
iliasam
15.11.2021 12:49Тоже делал аналогичное устройство: https://github.com/iliasam/MH_Z19_CO2_monitor
Только у себя еще реализовал построение графиков.Neoprog Автор
15.11.2021 13:00С потреблением я смотрю у вас тоже трудности. Почему бы не вывести настройку или отдельную команду -- "Измерь концентрацию и дай данные". В общем MH-Z19 не самый хороший сенсор
iliasam
15.11.2021 13:32Да, есть такое, хоть свою прошивку под STM32 датчика пиши)
Есть такие датчики: SCD40: https://aliexpress.ru/item/1005002906374739.html
В них вроде бы можно добиться меньшего потребления тока.
FenixFly
15.11.2021 12:53Если не хочется колхозить самому, то можно купить) https://dadget.ru/catalog/datchiki_kachestva_vozdukha/detektor_uglekislogo_gaza/
iliasam
15.11.2021 13:34Питание там, если не ошибаюсь, от USB, встроенного аккумулятора нет.
Иногда автономности хочется.SGordon123
16.11.2021 11:24Повербумк на 1 1850 не прокатит?
telpos
17.11.2021 11:50От пауэрбанка работает, но в моём случае работает только, если отключить Power Delivery
boojum
15.11.2021 14:03Дороговато.
У китайцев дешевле тысячи встречаются: https://aliexpress.com/item/1005003268843575.html
С автономным питанием. Правда, неизвестно как там с точностью..
PjPj
16.11.2021 11:27Там стоит не датчик СО2 а так сказать "интегральный датчик загрязненности воздуха" который арифметически покажет вам какие-то цифры СО2. Он не замеряет непосредственно СО2.
Iv38
16.11.2021 17:35Я тоже так сначала подумал, но посмотрел обзоры на mysku, в том числе и с разборкой - там какой-то инфракрасный CO2 датчик. Немного похожий на MH Z19, но не он. Видимо какая-то новая китайская разработка.
kahi4
15.11.2021 13:39+2Я как-то озадачился измерением со2 и купил за 40 евро готовый прибор. Он показал 2500 ppm. В лесу. После дождя.
Это я к тому, что подобные устройства очень требовательны к калибровке и подвержены жуткому вранью. Интересно, есть ли уход у вашего устройства и сверялили по заведомо рабочему устройству?
Avael23
15.11.2021 15:54Когда я искал себе прибор то видел что стоимость нормальных откалиброванных датчиков начинается от 200 евро, 40 евро это генератор случайных чисел.
Neoprog Автор
15.11.2021 15:56Я его калибровал просто на свежем воздухе на улице. Датчик в этом случае берет это за 400ppm и уже дальше относительно этого измеряет. Т.е. по факту он показывает не абсолютную концентрацию, а относительно воздуха на улице
CAJAX
16.11.2021 10:03За такие деньги на Али продаются в основном с датчиками TVOC, которые CO2 выдумывают вообще как угодно. И об этом о датчике могут врать в описании. Надо смотреть отзывы с фотками вскрытия.
Vsevo10d
15.11.2021 14:26+4Уж сколько раз обсуждали это на Хабре.
Все эти модули-датчики сильно зависят от влажности, и требуют датчика влажности и построения номограмм по даташитам, а не просто включил-радуйся.
Еще они в большинстве случаев самокалибруются, и требуют для этого регулярного вынесения на свежий воздух (им еще надо об этом сказать, что он свежий). Иначе - дрифт нуля.
Конкретно про упомянутый не помню.
FlashHaos
15.11.2021 14:58+2Друзья, подскажите адекватный датчик из-коробки с ZigBee? Готов даже регулярно носить на улицу его…
ColdSUN
16.11.2021 00:23https://modkam.ru/2020/09/28/datchik-co2-zigbee/
Или https://wirenboard.com/ru/product/wb-msw-zigbee-v3/, но тут цена уже на мой вкус высоковата, и плюсом к тому устанавливать лучше в подрозетник и питание нужно где-то там же взять. Ну в общем лучше co2 измерять выделенным датчиком на мой взгляд.
gnomeby
15.11.2021 16:09Датчик MH-Z19B мне не понравился тем, что его надо калибровать. Да ещё и регулярно калибровать.
Для калибровки предлагается выносить датчик на балкон, но на улице не всегда 400 ppm. Иногда там 380 ppm, а иногда 500.
Сам использую этот прибор, https://habr.com/ru/post/390607/ он в калибровке не нуждается. Как они это сделали не знаю, но не ощущения что врёт. Напротив самоделка MH-Z19B сразу говорит о том, что врёт, а значит просит калибровки. Если кто знает как это решить, пишите.
gnomeby
15.11.2021 16:31+1Тут меня знающие люди поправляют, что концентрация меняется не сильно, дельта составляет порядка 6 пунктов между разными временами года. https://ru.wikipedia.org/wiki/График_Килинга
SignallerK
15.11.2021 17:02Среднее потребление 30мА. Главный пик тока приходится на вспышку светодиода во время измерения концентрации.
Там не светодиод, там как раз натуральная микроминиатюрная лампочка накаливания (любители ТЛЗ радуются :))) ), от того у датчика такое конское потребление.
Кстати насчет черной магии, вроде как одна из недокументированных функций позволяет увеличить время опроса сенсора (обычно это раз в 10 сек, что сообственно видно по вспышкам лампочки). Но реализации этой функции я не встречал, возможно потому что она влияет на точность или что-то в этом роде.
Lucky007
15.11.2021 20:24Если светодиоды подключены через ключи, значит светодиоды достаточно мощные, а они питаются от 3.3В. Тогда не ясен ход с линейным решулятором 5В -> 3.3В. Аккумулятор просто его греет. Надо использовать импульсный DC-DC.
Buzzzzer
15.11.2021 23:44Вместо mh-z19 лучше использовать SenseAir S8. У него с калибровкой получше дела обстоят.
Neoprog Автор
15.11.2021 23:56Несомненно, но на момент разработки на него были не самые приемлемые цены. Сейчас да, я бы взял S8
Neoprog Автор
15.11.2021 23:58На самом деле датчик можно поменять не меняя железа. Там и питание и форм-фактор одинаковый. FW разве что подкорректировать нужно, но это так -- мелочи.
Buzzzzer
16.11.2021 08:27Да. Я знаю. У меня похожее решение года два уже работает.
Сначала было на esp8266, сейчас в Zigbee сети работает.
Но mh-z19 откровенно разочаровал. Показания уплывают что со включенной калибровкой, что с отключенной.
MrRitm
16.11.2021 14:55Когда начал читать статью, сразу решил загуглить используемый датчик (где продаётся, сколько стоит) и тут-же по маркировке датчика натыкаюсь на готовое устройство 3 в 1 (CO2, качество воздуха и влажность) которое стоит 1900р. с доставкой. Решились на разработку из любопытства или есть какие-то уникальные функции о которых в статье не упомянули?
Neoprog Автор
16.11.2021 15:02Нет. Устройство из разряда "померил - показал". Делал исключительно из интереса к измерению концентрации, т.е. никакой экономии денег, никаких супер фич -- просто пощупать это самому.
По результатам могу сказать, что я не сильно доволен. Если делать реальное устройство для продажи -- нужно половину переделывать :)
Anton-V-K
16.11.2021 15:29готовое устройство 3 в 1 (CO2, качество воздуха и влажность) которое стоит 1900р. с доставкой
Поделитесь ссылкой или названием, а? :)
Простым поиском удалось найти только девайс от Даджет, который только CO2 и температуру измеряет за 3990 руб. (без учёта доставки)
soci0pat
16.11.2021 16:32Aliexpress же https://aliexpress.ru/item/1005002592911864.html. И аналог изделия из статьи тоже есть https://aliexpress.ru/item/32668664886.html.
Neoprog Автор
16.11.2021 16:33И аналог изделия из статьи тоже есть
По ссылке датчик СО, а не СО2. Аналоги разумеется есть, я не претендую на уникальность :)
soci0pat
17.11.2021 15:09Моя ошибка, невнимательно смотрел на тип датчика. Помимо конструкционных различий, уникальность вашего проекта в открытости. За это отдельное спасибо )
Anton-V-K
16.11.2021 17:10+3Вторая ссылка - это сигнализатор CO (совсем другой газ).
А прибор по первой ссылке выглядит годным, но в других местах ( например, https://www.aliexpress.com/item/4001342074070.html ) , где отзывов побольше, пишут, что показывает отсебятину, например:
Я, конечно, умельцев с AliExpress уважаю, но тамошние дельцы умеют считать деньги, т.е. продавать в розницу работоспособный прибор (с немаленьким цветным дисплеем при этом) по цене, сравнимой с ценой типового датчика CO2, там не будут.
Кстати, есть отзыв и о внутренностях:
В приборе установлен комплексный датчик качества воздуха TPM-300a-v2.2, который не измеряет CO2.
Такие дела :)
MrRitm
17.11.2021 00:11Гуглится по названию датчика: MH-Z19B причём готовое устройство прямо в гугловом рекламном модуле показывают. Подозреваю, что на алике ещё дешевле будет, но там ждать надо.
Anton-V-K
17.11.2021 10:19Доставка из-за рубежа
Это тот же девайс, что и на "алиэкспрессах", только в профиль :)
Если кратко - показометр 80-го уровня (см. мой комментарий выше).
Iv38
17.11.2021 14:02И всё же там, судя по обзорам, настоящий ИК-датчик CO2, но не MH-Z19, а какой-то другой.
Anton-V-K
17.11.2021 15:02Спасибо за ссылку.
В комментариях пишут, что там QC102, но самого датчика на AliExpress вообще (пока?) нет. Впрочем текущие разновидности MH-Z19 выглядят похожим образом.
Не исключено, что в одном и том же корпусе приборчика может быть разная начинка.
В комментариях к обзору, кстати, есть подсказка:
Если рядом с СО2 в приборе есть tvoc и при этом цена «20 долларов(хотя скорее даже 30), то сенсора СО2 там нет. А показания берутся с датчика ЛОС(tvoc) из них считают СО2а. Метод крайне не точный, если сравнивать с датчиком.
Iv38
17.11.2021 17:43Да, я всегда смотрю на наличие tvoc при низкой цене. В этом приборе именно его отсутствие заставило пойти искать что там внутри.
Anton-V-K
17.11.2021 15:39Кстати, сам обзор указывает на прибор, под которым есть всего 3 (три!) формальных отзыва, и при этом сам отзыв от обзорщика отстуствует.
Скорее всего, автор обзора покупал прибор (или же он вообще достался ему в "рекламных целях") в другом магазине и, возможно, по другой цене, а не за условные $30.
Iv38
17.11.2021 17:49В этом обзоре есть ссылка на обзор Алексея Надежина @AlexeyNadezhin
Цена у Алексея указана примерно та же. Там нет разборки, но есть сравнение с другими приборами. И это похоже на настроящий датчик, хоть и несколько глючный.
Mike-M
17.11.2021 03:01Простой вопрос: как рассчитывали номиналы R2 и R3?
Neoprog Автор
17.11.2021 10:50+1R2 выбирал на основе максимального тока GPIO микроконтроллера, чтобы не превысить его. R3 не считал вообще, это просто подтяжка на момент запуска МК. Взял его из соображения "много больше резистора затвора". Не считаю нужным запариваться с емкостью и прочими параметрами для расчета правильного номинала резистора затвора, мы тут светодиодом мигаем :)
У Вас есть сомнения?
Mike-M
17.11.2021 15:25Не столько сомнения, сколько интерес к методике расчета.
Можете привести расчет R2?
По поводу R3 в принципе понятно, но хотелось бы узнать, почему номинал, например, не 10 кОм, ведь это тоже «много больше резистора затвора»?Neoprog Автор
17.11.2021 22:36+2Расчет там очень простой:
Ищем в даташите максимальное значение тока GPIO и не забываем про максимальный ток VDD пинов (т.е. ограничение самого МК). В моем случае суммарный ток 120 мА, а ток GPIO 25 мА.
Т.к. транзистор мы дергаем с низкой частотой, то быстро заряжать\разряжать затвор нам не нужно. Значит возьмем ток с большим запасом, зачем лишний раз насиловать GPIO. Далее любимый закон Ома: I = 3.3 / 1000 = 3.3 мА -- 1 кОм резистор подходит.
В идеале нужно брать 120 мА и делить на количество используемых GPIO. Внезапно вместо 25 мА на пин у нас получается сильно меньше: 120 / 12 = 10 мА. Тут можно и балансировать, т.е. на одном пине делать ток больше, на другом меньше. Очень много НО и всё зависит от задачи.
В качестве подтяжки 10 кОм тоже подходит. Я обычно 10к и меньше использую в Open-Drain цепях, для push-pull использую 100к. По сути 100к резисторы нужны чтобы транзистор наводками не открылся, пока МК запускается. В 80% случаях связка 1к - 100к работает отлично.
В случае 100к подтяжки будет утекать меньше электронов в пустую, соответсвенно при 10к в 10 раз больше :)
Это всё работает только для низких частот. При высоких начинаются веселья с емкостью затвора, его индуктивностью и сопротивлением. Эти паразиты уже при 100 кГц начинают оказывать ощутимое влияние. В этом случае уже расчеты сложнее. Про СВЧ даже говорить не буду :)
Надеюсь я смог ответить на вопрос
Mike-M
17.11.2021 23:37Отлично, спасибо!
Поставил бы плюс и в карму, но уже сделал это ранее.
Осталось загадкой, почему бы вместо 100к не поставить, скажем, 220к? Электронов меньше бы утекало впустую… )
Часто встречаю 100к в подобных схемах. Но никак не могу найти источник, откуда это пошло. Не может быть, чтобы данный номинал взялся с потолка, только на основании того, что «работает». Наверняка в каком-нибудь Application Note есть расчет. Если встретите, киньте в меня ссылкой пожалуйста )Iv38
18.11.2021 04:11Чем больше сопротивление подтяжки, тем меньшую наводку такая подтяжка сможет скомпенсировать. В данном случае ток через этот резистор не будет превышать 33 мкА, он просто ничтожен по сравнению с током, потребляемым остальными компонентами. И он будет только тогда, когда горит светодиод. Даже если бы в этом девайсе использовался глубокий сон, этот ток ни на что бы не влиял, так как оставлять светодиоды включенными при глубоком сне как-то глупо, а значит и тока бы не было. Оптимизация здесь не нужна.
Iv38
18.11.2021 04:31+2По поводу автокалибровки базовой линии. Часто говорят, что её нужно отключать, но мой опыт использования MH-Z19 и SenseAir S8 показывает, что лучше этого не делать, по крайней мере, если помещение хоть иногда проветривается. Без калибровки показания плывут неконтролируемо. С ней же датчик может до следующей калибровки сдвинуть базовую линию до минимального зафиксированного с прошлой калибровки значения, и в нормальной жизни это более чем приемлемо. Даже если показания временно сместятся на пару сотен ppm, это не особо страшно. Если помещение не герметично и люди его иногда покидают, уровень CO2 довольно быстро падает. Так что существенных проблем у меня не возникало. А в офисе, из которого все люди уходят вечером, у меня показания каждую ночь падали до наружных.
gmini
а нельзя сам модуль не держать включенным постоянно, а запускать раз в 10 секунд? Кажется, для этого нужна одна нога контроллера и полевой ключ.
Neoprog Автор
Не, с ним не все так просто. В этом случае у него сбрасывается внутренний фильтр. После старта ему нужно около минуты, чтобы выйти на режим. В целом конечно можно раз в минуту выводить показания...ну да, оптимизировать можно
edmus
Чаще одной минуты и нет смысла измерять. Непонятно, экран гаснет со времем или нет. Если да, то как его включать; если нет, то зачем отдельные светодиоды, когда все предупреждения можно показывать на экране?
Neoprog Автор
Нет
Мигания на экране не сильно бросаются в глаза в отличии от светодиодов
mehos
Вот что происходит с этим экраном через 6-9 месяцев непрерывной работы.
Neoprog Автор
100% воспроизведение или просто 1 экземпляр такой?
Iv38
Есть вот такой ресурсный тест OLED-дисплеев:
https://www.youtube.com/watch?v=GWOFF5tMv_A
dolphik
Плюсую. Есть несколько девайсов что работают 24/7 с такими экранами. За несколько месяцев уже "проседают" пиксели - те, которые постоянно включены. У этих экранов есть функция отключения. У себя делаю обычно таймаут 120секунд и тушу. Дальше если нужно что-то увеломить-включаем и заново считаем тайм аут. Также экран пробуждается по любой кнопке управления(если они есть)
Neoprog Автор
Спасибо всем за информацию, я не ожидал что с ними всё так плохо :(
mehos
LED экраны все выгарают, даже на Самсунговских флагманах.
mehos
Моя статистика - три из трех.
vladikas
При стандартных настройках MH-Z19B самокалибруется раз в сутки. Кто знает, как на него повлияет такой режим, когда он включается раз в минуту?..
Buzzzzer
Будет показывать сферических коней в вакууме.
При включении он вообще сначала бред показывает и калибруется довольно долго. Причём желательно, чтобы помещение проветривалось.
При желании калибровка отключается.