Заметки серии:
DevKit на ESP32 и сборка TEMP6000 на основе фототранзистора
Продолжение образовательно-самообразовательного курса по основам программирования контроллеров ESP на MicroPython.
В этом уроке подключим другой датчик, теперь аналоговый. Это будет датчик освещенности
TEMT6000 на основе фототранзистора. Датчик подключается через вход АЦП. Подключается три провода - питание от 3 до 5,5 В, земля и данные (АЦП). Подключать будем немного по другому, чем на изображении. В нашем случае данные будут сливаться на контакт ADC00 (A0).
Сборка на основе фототранзистора включает в себя SMD-резистор на 10 кОм. Это будет важно для второго варианта исполнения, чуть более развернутого.
Подача в два варианта. Совсем короткий и чуть более развернутый. Второй нужен как для нового конструктивного элемента программирования - ветвлений, так и для поверхностного знакомства с технической спецификацией датчика.
Вариант первый, краткий.
from machine import ADC
from time import sleep
def outputADCData(analogSensor):
try:
analogValue = analogSensor.read()
print(' Сырое значение: %d' %analogValue)
print(' Освещенность: %3.1f%%' %((analogValue * 100)/1023)
print('-----')
except OSError as e:
print(' Ошибка чтения датчика:', e)
while True:
sleep(2)
outputADCData(ADC(0))
Строки 1-2: Импорт модулей в формате from модуль import переменная или функция/метод, или пакет. Новый пакет ADC. Он обеспечивает работу с АЦП.
Строка 5: Определение функции с помощью ключевого слова def.
Строки 6 и 11: Конструкция try: ... except Error as variable: ... позволяет перехватить ошибку и обработать ее.
Строка 7: Чтение показаний с АЦП. В NodeMCU он 10-битный. Это значит, что минимальное значение будет 0 при входном напряжении 0 В, при 3.3 В значение будет 1023.
Строки 8-10: Вывод сырого значения с АЦП и преобразование его в %, где 100% примерно соответствует значению 1023.
Строка 14: Бесконечный цикл While.
Строка 15: Ожидание.
Строка 16: Вызов определенной нами функции и передача ей объекта работы с входом АЦП A0.
Вариант второй, с приведением освещенности к люксам (приблизительно).
Из технической спецификации датчика нам важны два графика.
Слева воспринимаемый датчиком спектр, справа - зависимость освещенности от тока.
Как видно из левого графика, пик воспринимаемого спектра приходится приблизительно на 560 нм. При этом датчик почти не чувствителен к ИК-излучению.
Правый график сообщает, что измерения имеют смысл в диапазоне от 10 до 1000 лк. Причем зависимость здесь от тока, а не от напряжения.
Эти немногочисленные знания вместе с информацией о применяемом резисторе 10 кОм дают нам возможность рассчитать ток в микроамперах, а из него - примерное значение освещенности в люксах (лк).
from machine import ADC
from time import sleep
def outputADCData(analogSensor):
try:
analogValue = analogSensor.read()
print(' Сырое значение: %d' %analogValue)
volts = (analogValue * 3.3) / 1024
print(' volts: %3.1f' %volts)
ldrVoltage = 3.3 - volts + 0.001;
print(' ldrVoltage: %3.1f' %ldrVoltage)
print(' ldrVoltage: %3.1f' %ldrVoltage)
print(' ldrResistance: %d' %ldrResistance)
ldrAmp = (ldrVoltage / ldrResistance) * 1000000
print(' ldrAmp: %3.1f µA' %ldrAmp)
if ldrAmp <= 8:
ldrLux = 10
else:
ldrLux = ldrAmp * 1.517
print(' lux: %d' %ldrLux)
print('-----')
except OSError as e:
print(' Ошибка чтения датчика:', e)
while True:
sleep(2)
outputADCData(ADC(0))
Расчеты сделаны максимально поэтапными, чтобы было понятнее.
Для начала нужно узнать падение напряжения на участке. Это разница входного напряжения (3.3 В) и напряжения на входе АЦП.
Строка 8: Получение напряжения из значения АЦП.
Строка 11: Падение напряжения на датчике. Добавляется небольшая положительная величина, чтобы в дальнейшем не было ситуации деления на ноль.
Строка 14: Сопротивление резистора TEMP6000 - 10 кОм. Сопротивление датчика считаем по формуле сопротивление датчика = падение/напряжение на выходе * сопротивление резистора.
Строка 16: Сила тока по закону Ома I = U/R. Поскольку зависимость в мкА, сразу умножим на 1 млн.
Строки 20-23: Ветвление if условие: ... else: ... В принципе, оно тут не обязательно, поскольку точность и так низкая. Но для примера подойдет. Согласно спецификации минимальное значение показаний - это 10 лк при токе примерно 8 мкА (µA). Поэтому все, что меньше или равно 8 мкА можно считать за 10 лк или за 0 лк - как удобнее. В ином случае ток нужно умножить примерно на 1.5 - 2. Опытным путем получил 1.517, но это не точно.
Дополнительно можно сделать третий вариант - оптимизацию второго. Датчик освещенности специально выбран на основе фототранзистора. Он точнее, тем дешевый фоторезистор, но дает сырые показания и можно посчитать. Есть готовые сборки, выдающие значения в люксах, например, под интерфейс I2C.