Мы уже умеем определять уровень освещённости с помощью , но, оказывается, в этом нам может помочь и наш старый знакомый — светодиод.
Идея по двойному использованию светодиода такова:
если приложить к светодиоду обратное напряжение,
т.е. к катоду подключить – плюс (HIGH), а к аноду – минус (LOW))
на принципиальной схеме: pin 2 -> 1, а pin 3 -> 0
то тем самым мы зарядим собственную паразитную емкость ножек микроконтроллера и светодиода.
Чтобы не путаться с катодом и анодом у светодиода – нужно просто запомнить, что у светодиода ножка катода расположена со стороны плоского спила корпуса (так же ножка катода – короче)
Схема включения:
Если теперь переключить pin 2 на вход и отключить внутренний подтягивающий резистор,
чтобы этого добиться – нужно для порта, сконфигурированного, как ВХОД
командой
то паразитная ёмкость будет разряжаться обратным током светодиода, который зависит от его освещенности. Через некоторое время нога переключится в логический 0.
Вот это время разряда, зависящее от освещённости светодиода мы и должны измерить ;)
Паразитная ёмкость, разумеется, мала, но и обратный ток светодиода тоже —
поэтому время разряда можно успешно измерить :)
Соберём эту простую схему:
Код скетча:
//
// Фотосенсор на светодиоде
//
// Пример исползования светодиода в качестве фотодатчика
// Схема подключения:
//
// + digital2
// |
// <
// > 100 ohm resistor
// <
// |
// |
// -----
// / \ LED, maybe a 5mm, clear plastic is good
// -----
// |
// |
// + digital3
//
// мы будем подавать положительное напряжение на digital2 и
// низкое напряжение в digital3. Т.о. на светодиод будет подано обратное напряжение.
// Разумеется, светодиод светиться не будет, но будет заряжаться паразитная ёмкость
// соединения светодиода и ног микроконтроллера Arduino.
//
// Потом мы отключаем выход с digital2 и считаем
// за какой промежуток времени заряд разрядится через светодиод.
// Причём скорость разряда зависит от освещённости светодиода.
// Чем ярче свет, тем быстрее паразитная ёмкость будет разряжаться на Digital3.
//
// Т.о. сразу виден недостаток идеи - в темноте время разряда может быть довольно большим.
//
//
#define LED_N_SIDE 2
#define LED_P_SIDE 3
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned int j;
// обеспечиваем обратное включение светодиода, заряжая паразитную ёмкость
// ног микроконтроллера и светодиода
pinMode(LED_N_SIDE,OUTPUT);
pinMode(LED_P_SIDE,OUTPUT);
digitalWrite(LED_N_SIDE,HIGH);
digitalWrite(LED_P_SIDE,LOW);
// изолируем pin 2 от светодиода
pinMode(LED_N_SIDE,INPUT);
digitalWrite(LED_N_SIDE,LOW); // отключаем втроенный в МК подтягивающий резистор
// считаем сколько требуется времени на разряд до логического нуля
for ( j = 0; j < 100000; j++)
{
if ( digitalRead(LED_N_SIDE)==0)
break;
}
Serial.println(j, DEC); // Выводим значение счетчика в COM-порт
delay(100); // Пауза, чтобы не переполнять буфер COM-порта
}
Т.о. получаем данные о времени разряда в виде данных на COM-порт:
Достоинством метода является то, что никто не мешает использовать тот же самый светодиод по своему прямому назначению :)
Для этого после строчки
Serial.println(j, DEC);
добавим код:
// а теперь зажгём светодиод :)
digitalWrite(LED_P_SIDE,HIGH);
digitalWrite(LED_N_SIDE,LOW);
pinMode(LED_P_SIDE,OUTPUT);
pinMode(LED_N_SIDE,OUTPUT);
так же можно изменить кусок считывая времени разряда на:
j=0;
while(digitalRead(LED_N_SIDE)!=0)
j++;
Т.о. получим:
#define LED_N_SIDE 2
#define LED_P_SIDE 3
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned int j;
// обеспечиваем обратное включение светодиода, заряжая паразитную ёмкость
// ног микроконтроллера и светодиода
pinMode(LED_N_SIDE,OUTPUT);
pinMode(LED_P_SIDE,OUTPUT);
digitalWrite(LED_N_SIDE,HIGH);
digitalWrite(LED_P_SIDE,LOW);
// изолируем pin 2 от светодиода
pinMode(LED_N_SIDE,INPUT);
digitalWrite(LED_N_SIDE,LOW); // отключаем втроенный в МК подтягивающий резистор
// считаем сколько требуется времени на разряд до логического нуля
j=0;
while(digitalRead(LED_N_SIDE)!=0)
j++;
Serial.println(j, DEC); // Выводим значение счетчика в COM-порт
// а теперь зажгём светодиод :)
digitalWrite(LED_P_SIDE,HIGH);
digitalWrite(LED_N_SIDE,LOW);
pinMode(LED_P_SIDE,OUTPUT);
pinMode(LED_N_SIDE,OUTPUT);
delay(50); // Пауза, чтобы не переполнять буфер COM-порта
}
Есть заметка про использование обычного светодиода в качестве датчика и на
, а применять можно, например, как :)
Комментарии (1)
RSS свернуть / развернутьadmin
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.