Контроллеры ESP и обучение ч.6 - Урок третий

Jan 02, 2022 00:47


Заметки серии:





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.

электроника, it, esp32, программирование, обучение, esp8266

Previous post Next post
Up