# Теоретические основы спектрофотометрии на базе AS7341

## 1. Спектральные каналы AS7341
Датчик AS7341 измеряет интенсивность света в 11 независимых каналах. В отличие от RGB-сенсоров, он дает узкополосную информацию о составе света.

| Канал | Длина волны | Цвет       | Биологическое/Физическое значение |
|-------|-------------|------------|-----------------------------------|
| F1    | 415 нм      | Фиолетовый | Граница UVA, ближний ультрафиолет |
| F2    | 445 нм      | Синий      | Пик поглощения хлорофилла A       |
| F3    | 480 нм      | Голубой    | Синяя компонента неба             |
| F4    | 515 нм      | Зелено-голубой | Переходный диапазон           |
| F5    | 555 нм      | Зелёный    | Максимум чувствительности глаза   |
| F6    | 590 нм      | Жёлтый     | Натриевые лампы                   |
| F7    | 630 нм      | Оранжево-красный | Фотосинтез (длинноволновый) |
| F8    | 680 нм      | Красный    | Пик поглощения хлорофилла B       |
| NIR   | ~910 нм     | Ближний ИК | ИК-пульты, тепловое излучение     |
| Clear | -           | Белый      | Суммарный поток фотонов           |

---

## 2. Физические и биологические расчеты

### 2.1 Закон Бугера–Ламберта–Бера (Поглощение)
Оптическая плотность ($A$) раствора пропорциональна концентрации вещества:
$$A_\lambda = \log_{10}\frac{I_0}{I}$$
- $I_0$ — интенсивность света через чистый растворитель (reference).
- $I$ — интенсивность через исследуемый раствор.

Реализация: [`As7341Lab::absorbance()`, src/As7341Lab.cpp:99](src/As7341Lab.cpp#L99). Ниже порогов `kAbsMinI0`/`kAbsMinI` (сигнал в шуме АЦП) метод возвращает 0 вместо мусорного значения.

### 2.2 PAR (Photosynthetically Active Radiation)
Фотосинтетически активная радиация (400–700 нм) — диапазон, используемый растениями. 
В данной прошивке используется взвешенная формула, учитывающая пики поглощения хлорофилла:
- **Синий пик:** ~445 нм (F2)
- **Красный пик:** ~680 нм (F8)
- **Зеленый провал:** растения отражают зеленый, поэтому его вес в фотосинтезе ниже.

Реализация: [`As7341Lab::calcPAR()`, src/As7341Lab.cpp:91](src/As7341Lab.cpp#L91). Это собственный нормированный индекс прошивки (не физическая единица PPFD) — см. глоссарий в README.md.

### 2.3 Цветовая температура (CCT) по методу McCamy
Расчет производится через аппроксимацию координат цветности CIE 1931:
1. Вычисление XYZ координат на основе 8 каналов видимого спектра.
2. Переход к координатам $x$ и $y$.
3. Вычисление фактора $n = (x - 0.3320) / (0.1858 - y)$.
4. Финальная формула: $CCT = -449n^3 + 3525n^2 - 6823.3n + 5520.33$.

Реализация: [`As7341Lab::calcCCT()`, src/As7341Lab.cpp:73](src/As7341Lab.cpp#L73). При суммарном XYZ ниже `kCctDarkSum` (слишком темно, координаты цветности ненадёжны) метод возвращает -1.

### 2.4 Инфракрасный индекс (NIR/VIS)
Отношение ближнего ИК-излучения к видимому свету позволяет идентифицировать тип источника:
- **Солнце/Лампа накаливания:** высокий ИК-компонент.
- **LED/Монитор:** крайне низкий ИК-компонент.

---

## 3. Время интегрирования (ATIME и ASTEP)
Общее время замера ($T_{int}$) определяется настройками АЦП:
$$T_{int} = (ATIME + 1) \times (ASTEP + 1) \times 2.78\,\text{мкс}$$
Увеличение времени интегрирования снижает шум, но замедляет работу датчика.

Значения по умолчанию `kDefaultAtime=100`, `kDefaultAstep=999` (≈280 мс) заданы в [src/As7341Lab.h](include/As7341Lab.h) и применяются в [`As7341Lab::begin()`, src/As7341Lab.cpp:20](src/As7341Lab.cpp#L20).

## 4. Вотчдог связи (isAlive)
Каждое успешное чтение по I2C обновляет внутреннюю метку времени; [`isAlive()`, include/As7341Lab.h](include/As7341Lab.h) сравнивает её с `millis()`. Это отличает «датчик молчит из-за обрыва провода» от «в кадре просто темно» — оба случая иначе выглядели бы как нулевые показания.
