AS7341 — 11-канальный спектральный датчик
Спектральный датчик Adafruit AS7341: 11 каналов вместо привычных RGB-триплета, раскладывает падающий свет по спектру от фиолетового до инфракрасного.
AS7341 STEM-Лаборатория — Полное руководство
Платформа: ESP32 DEVKIT V1 + Adafruit AS7341
Прошивка: src/main.cpp (Ядро), src/As7341Lab.cpp (Драйвер)
Визуализация: monitor.py (Python 3 + Matplotlib)
Содержание
- Что такое AS7341
- Подключение и запуск
- Параметры датчика — как менять и трактовать
- Режим S — Спектр (Физика)
- Режим A — Поглощение (Химия)
- Режим P — PAR (Биология / Гидропоника)
- Режим C — Цветовая температура (Физика / Умный дом)
- Режим I — ИК-детектор (Физика)
- Лабораторные сценарии по предметам
- Гидропоника — практическое применение
- Глоссарий
1. Что такое AS7341
AS7341 — 11-канальный спектрофотометр на одном чипе размером 3×2 мм. Это не RGB-датчик. Он независимо измеряет интенсивность в каждом спектральном диапазоне.
| Канал | Длина волны | Цвет | Физический смысл |
|---|---|---|---|
| F1 | 415 нм | Фиолетовый | Граница видимого / UVA |
| F2 | 445 нм | Синий | Пик поглощения хлорофилла A |
| F3 | 480 нм | Голубой | Синяя компонента неба, мониторы |
| F4 | 515 нм | Зелено-голубой | Переход к зелёному |
| F5 | 555 нм | Зелёный | Максимум чувствительности глаза |
| F6 | 590 нм | Жёлтый | Натриевые лампы, закат |
| F7 | 630 нм | Оранжево-красный | Фотосинтетически активный диапазон |
| F8 | 680 нм | Красный | Пик поглощения хлорофилла B |
| NIR | ~910 нм | Ближний ИК | Невидимый диапазон, пульты ДУ, нагрев |
| Clear | широкополосный | Белый | Суммарная освещённость (аналог люксметра) |
2. Подключение и запуск
Схема подключения (I2C)
AS7341 ESP32 DEVKIT V1
VCC ──────► 3.3V (или 5V если модуль со стабилизатором)
GND ──────► GND
SDA ──────► GPIO 21
SCL ──────► GPIO 22Совет: Положи поверх датчика кусочек белого матового пластика (диффузор) — иначе датчик видит только узкую точку источника и даёт систематическую погрешность при рассеянном свете.
Сборка и загрузка прошивки
# В PlatformIO (VS Code) — нажми Upload
# или в терминале:
pio run --target uploadУстановка зависимостей Python (один раз)
python3 -m pip install -r requirements.txt
# или вручную: python3 -m pip install pyserial matplotlibЗапуск визуализации (закрой Serial Monitor перед этим!)
python3 monitor.py /dev/ttyUSB0
# Порт определяется автоматически если не указатьУправление кнопками прямо в окне Python: режимы S/A/P/C/I, Ref/B (сохранить reference для поглощения) и Gain -/Gain + — это единственный способ менять усиление, пока открыт monitor.py (Serial Monitor PlatformIO в это время должен быть закрыт, оба не могут держать порт одновременно). Если физическая связь с датчиком по I2C оборвётся, строка статуса в окне мигнёт красным !! СВЯЗЬ С AS7341 ПОТЕРЯНА !! — это As7341Lab::isAlive() из прошивки, а не сбой самого скрипта.
3. Параметры датчика
Gain (Усиление)
Gain управляет чувствительностью сенсора. Все значения на выходе умножаются на коэффициент усиления.
| Gain | Когда применять |
|---|---|
| 0.5x–2x | Прямой солнечный свет, яркие прожекторы |
| 4x–32x | Стандартное помещение, офис, класс |
| 64x | По умолчанию. Нормальное искусственное освещение |
| 128x–256x | Слабое освещение, сумерки, тёмные растворы |
| 512x | Почти темнота, люминесценция, слабые источники |
Всего доступно 11 ступеней (0.5x, 1x, 2x, 4x, 8x, 16x, 32x, 64x, 128x, 256x, 512x) — полный список из даташита AS7341, регистр AGAIN.
Признаки неверного Gain:
- Канал показывает
65535— перегруз, нажми-(уменьшить Gain) - Все значения < 100 — недостаточно, нажми
+(увеличить Gain)
Команды в режиме прошивки: + / - (через Serial Monitor или кнопкой +/- если добавить в Python).
ATIME и ASTEP — время интегрирования
Общее время одного замера вычисляется по формуле:
T_int = (ATIME + 1) × (ASTEP + 1) × 2.78 мксПри значениях по умолчанию (ATIME=100, ASTEP=999):
T_int = 101 × 1000 × 2.78 мкс ≈ 280 мс| Параметр | Увеличить → | Уменьшить → |
|---|---|---|
| ATIME | точнее, медленнее | быстрее, шумнее |
| ASTEP | точнее, медленнее | быстрее, шумнее |
Для экспериментов с быстрыми событиями (мигающий пульт ДУ) уменьши ATIME до 10–20. Для точной спектрофотометрии растворов увеличь до 200+.
4. Режим S — Спектр (Физика)
Команда: S
График: столбчатая диаграмма, каждый столбик на своей длине волны, закрашен физическим цветом.
Что показывает
Спектральный «отпечаток» источника света — распределение энергии по длинам волн.
Как читать
| Форма спектра | Источник |
|---|---|
| Плавная колоколообразная кривая, максимум ~600–700 нм | Лампа накаливания / солнце |
| Острый пик на 445–480 нм + малый «хвост» | Дешёвый белый LED (холодный) |
| Два пика: 445 нм и 590–630 нм, провал в середине | Качественный тёплый LED |
| Один высокий пик на 555 нм | Монохроматический зелёный лазер |
| Равномерно высокие все каналы | Прямой солнечный свет (ясный день) |
Эксперименты
«Анатомия белого света»
Направь датчик на разные источники по очереди: свечу, лампу накаливания, холодный LED, тёплый LED, монитор ноутбука. Ученики видят, что «белый» у каждого разный.
«Сравнение ламп»
Купи в магазине 3 лампочки с надписями “2700K”, “4000K”, “6500K”. Сделай снимок спектра каждой. Видно как смещается баланс 445/680 нм.
5. Режим A — Поглощение (Химия)
Команда: A, затем B (сохранить reference)
График: столбчатая диаграмма оптической плотности по 8 каналам.
Физический закон
Закон Бугера–Ламберта–Бера:
- — оптическая плотность (безразмерная)
- — интенсивность до вещества (reference, сохраняется кнопкой
B) - — интенсивность после прохождения через вещество
- — молярный коэффициент поглощения (константа вещества)
- — концентрация раствора
- — длина оптического пути (толщина кюветы)
Практический вывод: чем больше , тем более концентрированный раствор или тем гуще окраска.
Протокол эксперимента
- Поставь пустой стакан с чистой водой перед датчиком
- Включи режим A, нажми
B→ reference сохранён - Добавляй в воду краситель по каплям и наблюдай рост на нужных длинах волн
- Записывай количество капель и значение — получишь калибровочную кривую
Вещества и их спектры поглощения
| Вещество | Пик поглощения | Канал AS7341 |
|---|---|---|
| Марганцовка (KMnO₄) | 525–550 нм | F5 (555 нм) |
| Хлорофилл (листья) | 445 + 680 нм | F2 + F8 |
| Йод (I₂ в воде) | 450–490 нм | F2–F3 |
| Синие чернила | 590–630 нм | F6–F7 |
| Красный краситель | 480–515 нм | F3–F4 |
| Медный купорос CuSO₄ | 600–700 нм | F7–F8 |
Важно: Освещение во время опыта должно быть стабильным. Используй светодиодный фонарик сбоку от кюветы, направленный строго на датчик. Флуоресцентные лампы мерцают (50 Гц) и создают шум.
6. Режим P — PAR (Биология / Гидропоника)
Команда: P
График: линия PAR-индекса с историей, цветные зоны, крупное текущее значение по центру.
Что такое PAR
PAR (Photosynthetically Active Radiation) — фотосинтетически активная радиация. Диапазон 400–700 нм, который растения используют для фотосинтеза.
Хлорофилл A поглощает максимально на 445 нм (синий) и 680 нм (красный). Зелёный (~555 нм) в основном отражается — отсюда зелёный цвет листьев.
Формула (AS7341)
PAR = (F2×1.0 + F1×0.3 + F3×0.6) × Blue_weight
+ (F8×1.0 + F7×0.8) × Red_weight
+ (F4×0.2 + F5×0.1 + F6×0.05) × Green_weight
/ 3000 (нормировочный коэффициент)Интерпретация значений
| PAR-индекс | Зона (цвет) | Что это значит | Для каких растений |
|---|---|---|---|
| < 0.10 | Красная | Глубокая тень | Мхи, папоротники |
| 0.10–0.30 | Жёлтая | Слабое освещение | Монстера, сансевиерия |
| 0.30–0.70 | Светло-зелёная | Нормальный рассеянный свет | Большинство комнатных |
| > 0.70 | Ярко-зелёная | Полное освещение | Томаты, базилик, огурцы, гидропоника |
Почему показывает низкий PAR в помещении
Обычная лампа накаливания 60W даёт слабый синий компонент (445 нм) — PAR будет занижен даже при высоком Clear. Специальная фитолампа имеет усиленные пики именно в синем и красном, и PAR резко вырастет.
7. Режим C — Цветовая температура
Команда: C
График: линия CCT в Кельвинах с историей, горизонтальные пунктиры-ориентиры.
Физика цветовой температуры
Цветовая температура — это температура «абсолютно чёрного тела», излучение которого на вид совпадает с данным источником света. Измеряется в Кельвинах (K).
| CCT | Источник | Ощущение |
|---|---|---|
| 1800–2200 K | Свеча, огонь | Очень тёплый, оранжевый |
| 2700 K | Лампа накаливания | Тёплый, жёлтый |
| 3000–3500 K | Галоген, тёплый LED | Уютный |
| 4000–4500 K | Нейтральный белый LED | Офис, класс |
| 5000–5500 K | Прямой солнечный свет | Дневной |
| 6000–6500 K | Пасмурное небо | Холодный белый |
| > 7000 K | Синее ясное небо, HMI | Холодный голубой |
Метод расчёта (McCamy)
Сначала из 8 спектральных каналов вычисляются координаты CIE XYZ через веса функций согласования цвета, затем хроматические координаты , затем:
Применение для умного отеля / класса
- CCT > 5000 K после 20:00 → автоматически переключить лампы на 2700 K (подавление мелатонина)
- CCT < 4000 K утром → включить холодный белый (бодрящий эффект)
- Мониторинг деградации LED: со временем CCT смещается в синюю сторону
«Светофор здоровья» в monitor.py
Панель справа в окне визуализации — не отдельный график, а живая реализация правила выше: circadian_health(), monitor.py:367 сочетает CCT, отношение синего к общей яркости (F2+F3)/Clear и текущее время суток (datetime.now().hour) в один из четырёх статусов:
| Время суток | Условие (код) | Статус | Смысл |
|---|---|---|---|
| Ночь 22:00–6:00 | CCT > 3200 K или синего > 25% | 🔴 ОПАСНО | синий свет ночью подавляет мелатонин |
| Ночь 22:00–6:00 | иначе | 🟢 ХОРОШО | тёплый свет, мелатонину не мешает |
| Вечер 20:00–22:00 | CCT > 4500 K или синего > 30% | 🔴 ОПАСНО | пора выключать холодный свет |
| Вечер 20:00–22:00 | CCT > 3200 K | 🟡 ВНИМАНИЕ | лучше переключить на тёплый (~2700 K) |
| День 6:00–20:00 | CCT > 3000 K | 🟢 ХОРОШО/ОТЛИЧНО | нейтральный/холодный свет уместен днём |
| Любое время | Clear < 150 | ⚪ ТЕМНО | света мало, оценка ненадёжна |
Панель отвечает на вопрос «правильный ли сейчас свет для организма» — прямое практическое следствие теории цветовой температуры из раздела 7 THEORY.md, а не просто число в Кельвинах.
8. Режим I — ИК-детектор (Физика)
Команда: I
График: две линии (NIR и VIS) + пунктирная линия коэффициента NIR/VIS на второй оси.
Что измеряет
| Канал | Что видит |
|---|---|
| NIR (~910 нм) | Ближний инфракрасный: пульты ДУ, нагретые тела, солнечный ИК |
| VIS (сумма F1–F8) | Весь видимый диапазон 415–680 нм |
| NIR/VIS | Отношение: «насколько ИК больше видимого» |
Интерпретация коэффициента NIR/VIS
| Значение | Интерпретация |
|---|---|
| > 2.0 | Пульт ДУ направлен прямо (мощный ИК-импульс) |
| 0.8–2.0 | Прямой солнечный свет (содержит ~50% ИК) |
| 0.3–0.8 | Тёплый LED или галоген |
| < 0.3 | Холодный LED, монитор (почти нет ИК) |
Эксперименты
«Невидимый мир» — направь пульт ДУ телевизора на датчик. NIR всплёскивает при каждом нажатии кнопки, VIS стоит неподвижно. Идеальная демонстрация существования ИК-излучения.
«Нагретые тела» — поднеси к датчику горячую кружку. NIR медленно растёт по мере нагрева поверхности.
«Солнце vs LED» — выйди на улицу, сравни NIR/VIS уличного солнца и комнатной лампы. Разница принципиальная.
9. Лабораторные сценарии
Физика
| Тема урока | Режим | Опыт | Ожидаемый результат |
|---|---|---|---|
| Дисперсия света | S | Призма перед датчиком | Пики смещаются в зависимости от угла |
| Электромагнитный спектр | I | Пульт ДУ | NIR растёт, VIS = const |
| Излучение чёрного тела | C + S | 3 лампы с разной CCT | Сдвиг спектра с температурой |
| Поглощение света | A | Стакан с водой + краситель | Рост A в определённых каналах |
| Закон Кирхгофа | S | Натриевая лампа | Острый пик на 590 нм |
Химия
| Тема урока | Режим | Вещество | Что измеряем |
|---|---|---|---|
| Концентрация раствора | A | Марганцовка | A пропорционально концентрации |
| Качественный анализ | A | Неизвестный раствор | Идентификация по пику поглощения |
| Фотометрия | A | Медный купорос | Калибровочная кривая A(c) |
| Окислительно-восстановительные | A | KMnO₄ → MnO₂ | Пик 555 нм исчезает при реакции |
Биология
| Тема урока | Режим | Опыт | Что наблюдаем |
|---|---|---|---|
| Фотосинтез | P | Фитолампа vs обычная лампа | Разница PAR в разы |
| Пигменты хлорофилла | A | Вытяжка из листьев | Пики F2 (445) и F8 (680) |
| Влияние спектра на рост | P | Разные лампы над растением | PAR-индекс как критерий выбора лампы |
| Хроматография | A | Разделённые пигменты | Каждая фракция — свой пик |
Гидропоника / Агро-STEM
| Задача | Режим | Критерий |
|---|---|---|
| Подобрать лампу для рассады | P | PAR > 0.70 |
| Контролировать световой день | C + P | CCT + PAR каждые N часов |
| Детектировать деградацию лампы | S | Смещение пика 445/680 со временем |
| Сравнить натуральный и искусственный свет | S + P | Снять спектр у окна и под лампой |
10. Гидропоника
Что важно для растений по спектру
Вегетация (рост листьев): Синий 415–480 нм → высокий F1, F2, F3
Цветение и плодоношение: Красный 630–680 нм → высокий F7, F8
Ингибирование вытягивания: Синий > Красного → F2/F8 > 1.0
Максимальный фотосинтез: PAR > 0.70Практический регламент замеров
- Ежедневно в одно время (например, 12:00) фиксировать PAR и CCT над каждой грядкой
- Если PAR < 0.3 → добавить фитолампу или поднять (мощность)
- Если спектр сместился (445 нм растёт относительно 680 нм) → лампа выгорает, менять
- Для рассады томатов/перца: добавь синего (445 нм) — стебли будут короче и крепче
- За 2 недели до уборки: увеличь красный (680 нм) — ускорит созревание
Формула отношения Blue:Red (B/R)
| B/R | Эффект на растение |
|---|---|
| > 2.0 | Компактный рост, тёмно-зелёные листья |
| 1.0–2.0 | Сбалансированный рост |
| < 1.0 | Вытягивание, светло-зелёный цвет (нехватка синего) |
11. Глоссарий
ATIME — параметр времени интегрирования (0–255). Вместе с ASTEP определяет длительность одного замера. Увеличить = точнее и медленнее.
ASTEP — шаг времени интегрирования (0–65534). Умножается на ATIME + 1. Смотри формулу в разделе 3.
Beer-Lambert / Бугер–Ламберт–Бер — закон, связывающий поглощение света с концентрацией вещества: . Основа количественного анализа в химии.
B/R ratio — отношение синего (445 нм) к красному (680 нм) в спектре лампы. Критерий для агрономии.
CCT (Correlated Color Temperature) — коррелированная цветовая температура. Кельвины. Тёплый = низкий, холодный = высокий.
Clear channel — широкополосный канал без спектрального фильтра. Аналог люксметра. Не заменяет специализированный люксметр, но пригоден для сравнительных измерений.
Counts — единица измерения AS7341. Целое число от 0 до 65535. Зависит от Gain и ATIME. Для сравнения источников нужно фиксировать одинаковые настройки.
Gain (усиление) — коэффициент усиления аналогового сигнала перед АЦП. Диапазон 0.5x–512x. Не влияет на физическую реальность — только на чувствительность схемы.
NIR (Near Infrared) — ближний инфракрасный диапазон. Канал AS7341 центрирован около 910 нм. Невидим для глаза. Присутствует в солнечном свете, пультах ДУ, нагретых телах.
PAR (Photosynthetically Active Radiation) — фотосинтетически активная радиация. Диапазон 400–700 нм, взвешенный по поглощению хлорофилла. Единица PPFD = мкмоль фотонов/(м²·с). Индекс в прошивке — безразмерное нормированное число.
PAR-индекс — собственная нормированная величина данной прошивки (не PPFD). Используется для сравнения источников между собой. Значение 1.0 соответствует примерно полному дневному освещению при Gain=64x.
Спектр поглощения — зависимость оптической плотности вещества от длины волны. Уникален для каждого вещества — «отпечаток пальца» молекулы.
Спектр излучения — распределение мощности источника по длинам волн. У лампы накаливания — непрерывный (тепловой), у LED — с пиками.
CIE XYZ — стандартное трёхстимульное цветовое пространство. Используется для расчёта CCT из спектральных данных.
Хроматические координаты x, y — нормированные проекции XYZ на плоскость. Определяют «цветность» без учёта яркости. На их основе работает формула McCamy для CCT.
I2C — двупроводной последовательный протокол связи. SDA = данные, SCL = тактирование. Адрес AS7341 по умолчанию 0x39.
Диффузор — рассеивающее стекло / матовый пластик перед датчиком. Усредняет освещение по площади датчика. Обязателен для точных абсолютных измерений.
Быстрая шпаргалка — что делать если…
| Симптом | Действие |
|---|---|
| Все каналы = 65535 | Нажми - несколько раз (уменьшить Gain) |
| Все каналы < 50 | Нажми + несколько раз (увеличить Gain) |
| PAR всегда 0 | Закрой PlatformIO Serial Monitor, запусти только monitor.py |
| Жёлтый график остаётся на всех режимах | Перезапусти monitor.py |
| CCT = 0 или отрицательный | Слишком темно, увеличь Gain или добавь света |
| Режим A не показывает поглощение | Нажми B сначала при пустой кювете |
| monitor.py не видит порт | Проверь ls /dev/ttyUSB* или /dev/ttyACM* |
12. Программная архитектура
Код проекта переведен на модульную объектно-ориентированную структуру для удобства интеграции в Sensor Hub.
include/As7341Lab.h: Интерфейс класса лаборатории. СтруктураData(10 каналов датчика), режимы, doxygen-описание каждого публичного метода.src/As7341Lab.cpp: Реализация всей математической логики (PAR, CCT, Beer-Lambert) и методов визуализации. Все авторские расчеты и комментарии вынесены сюда.src/main.cpp: Главный файл управления. Обрабатывает Serial-команды и дирижирует работой датчика через объект классаAs7341Lab.
Такой подход позволяет использовать спектрометр в больших проектах одной строчкой кода: As7341Lab lab;.
Чтение данных и вотчдог связи
Драйвер хранит последний снимок внутри себя — снаружи данные не передаются напрямую:
if (lab.read()) { // As7341Lab.cpp:29 — обновляет внутренний буфер
const As7341Lab::Data &d = lab.getData(); // As7341Lab.h — const-ссылка на снимок
...
}
if (!lab.isAlive()) { // As7341Lab.h — true, если было успешное read() за последние 2000 мс
Serial.println("Связь потеряна");
}isAlive() не про “датчик исправен”, а про “физический канал связи жив прямо сейчас” — обрыв провода I2C сразу виден в main.cpp, а не тихо застывает на последних показаниях.
13. Работа через CLI (PlatformIO)
Для управления проектом через терминал используйте следующие команды:
Сборка и прошивка
cd Components/AS734x
pio run -t uploadМониторинг данных (Текст)
pio device monitorГрафическая визуализация (Python)
Убедитесь, что закрыт pio device monitor, затем:
python3 monitor.py