Датчик освещения (аналоговый). Понятие резисторного делителя, пример с авто выбором питания на Arduino, разбор работы делителя с фототранзистором

Опубликовано Опубликовано в рубрике Arduino

Датчик освещения, аналоговый интерфейс

Данный датчик представляет из себя ни что иное, как делитель напряжения из фоторезистора и обычного резистора, собранный на миниатюрной платке для удобного крепежа. Его можно легко собрать и самому на макетной плате, пользуясь принципиальной схемой прикрепленной ниже. В данной статье я постараюсь с примерами объяснить принцип работы датчика исходя из свойства резистивного делителя.

Датчик освещения аналоговый схематика

Про резистивный делитель хорошо расказанно в википедии. Из этой статьи нам нужна будет формула

 U_2 = \frac {U} {R_2 + R_1} R_2 = U \frac {R_2} {R_2 + R_1}


Немного отойду от темы фоторезистора, но приведу пример использования делителя напряжения также в тематике Arduino. Как известно, платы Arduino UNO, Mega автоматически переходят на внешнее питание, если оное выше чем 6.6В. Отчего именно 6.6? Сейчас объясню. Для этого приведу схему на которой изображен резисторный делитель, операционный усилитель LM358D и мосфет транзистор, от состояния которого и зависит источник питания.

Схема автоматического выбора питания на плате Arduino

Не буду сильно углубляться в тему операционных усилителей, да и не к чему здесь это. На схеме операционник изображен в виде треугольника, у него 3 вывода: + (прямой вход), — (инверсный вход) и выход. Значение на выходе будет зависеть от состояния входов. Если напряжение на прямом входе больше чем на инверсном, то на выходе появляется положительный сигнал и на оборот, если на инверсном больше чем на прямом, то на выходе отрицательный сигнал. В схеме используется P-канальный мосфет т.е. для его открытия нужен отрицательный потенциал (в отличии от биполярников у мосфетов не совпадает название канала и открывающего сигнала).

Для того чтобы на выходе опереционника появился минус, на инверсном  входе напряжение должно быть выше чем на прямом, иными словами выше чем 3.3 Вольта.

Подставляем известные нам значения в формулу

3.3 = U * 10000/10000+10000

3.3 = U * 0.5

U = 6.6

Вот и получаем 6.6В указанные в технической документации. После наглядного примера использования резисторного делителя напряжения, возвращаемся к фотортанзисторам.


Фоторезистор это такая радиодеталь, которая изменяет свое сопротивление в зависимости от освещения.

В наших датчиках используется отличный фоторезистор GL5528. Далее я приведу иллюстрацию значений его сопротивления в зависимости от освещения.

Значения сопротивления GL5528 в зависимости от освещения.

1) значение при дневном освещении (2.97 кОм)

2) значение при очень ярком излучении (47 Ом)

3) значение во тьме (1.956 МОм)

4) значение в полной тьме (> 2 MOм)


 U_2 = \frac {U} {R_2 + R_1} R_2 = U \frac {R_2} {R_2 + R_1}

Подставим значения для трех вариантов в формулу

1) U2= 5 * 10000 / 2970 + 10000.           U2= 3.85В

2) U2= 5 * 10000 / 47 + 10000.               U2= 4.97В

3) U2= 5 * 10000 / 1956000 + 10000.      U2= 0.0254В


А теперь переведем наши вольты в аналоговое значение исходя из того что разрешение АЦП Arduino составляет 10 бит, т.е. позволяет на выходе получать значения от 0 до 1023 (опорное напряжение для АЦП берем стандартным — 5V)

1) 1023 / 5 * 3.85 = 788

2) 1023 / 5 * 4.97 = 1017

3) 1023 / 5 * 0.0254 = 5

4) К сожалению не можем дать информацию при освещении в кромешной тьме, т.к. у нас зашкалил мультиметр со значением > 2 МОм. Но отсюда можно сделать вывод, что значение на АЦП будет еще меньше 5ти.


Как мы видим, благодаря характеристикам фоторезистора GL5528 можно добиться от датчика практически полного покрытия значений от 0 до 1023.

В реальных испытаниях датчик показывал значения от 0 в кромешной тьме до 1019 при ультраярком излучении от фонарика.

Ну что, совместим теорию с практикой и посмотрим на реальные показания датчика.

Можно выводить значения в монитор IDE’шки (код 1) либо, как в нашем случае, вывести показания датчика на LCD I2C 1602 модуль (код 2).

пример программного кода 1

const int analogPin = 0;

void setup()
{
Serial.begin(9600);
}

void loop()
{
int analogValue = analogRead(analogPin);
Serial.println(analogValue);
delay(500);
}

пример программного кода 2

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Добавляем нужные либы
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем размерность дисплея
const int analogPin = 0;

void setup()
{
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
}

void loop()
{
int analogValue = analogRead(analogPin);
lcd.clear(); // Очищаем дисплей
delay(400); 
lcd.setCursor(0, 0); // Устанавливаем курсор в начало первой строки 
lcd.print(analogValue); // Выводим значение
delay(500);
}

Источник: http://zelectro.com.ua/