Светодиод как источник и как сенсор света

На дворе в разгаре лето, а у меня в разгаре ремонт. Делаю ремонт в ванной. Выложил кафелем стены, на пол плитку положил. Заменил умывальник, сантехнику и т.д. Пока в тесной ванной работал, потел и пыхтел «как паровоз». А все потому, что вентиляции не было принудительной, а той, что была — обычная вытяжная — не хватало. Пришлось мне купить вытяжной вентилятор и поставить его в вентиляцию. Работа пошла бодрее.

Когда я посетил магазин, что бы купить вентилятор я просто выпал в осадок от цен. А-б-а-л-деть! Ни хрена себе цены! И если за просто  вентилятор с выключателем-веревочкой требовали около полутора тысяч деревянных, то за автоматические вентиляторы (с простым таймером) там цены были выше в несколько раз. Не, у меня как бы были деньги на ремонт, я мог себе позволить купить такие вентиляторы. Но маленькое квакающее зеленое земноводное внутри сказало мне, что ну ка нахер таких продавцов с таким товаром и такими ценами на него. Пришлось искать. И вот слоняясь по магазинам нашел более менее приемлемый вариант. Обычный 125мм вентилятор без всяких таймеров и выключателей за 400 «дров». От мотора отходило два провода на клемник и все.

Вот его и поставил в ванную. А что б можно было включать и выключать его, прицепил к нему временно обычный выключатель. Зашел в ванную, включил вентилятор, поработал, выключил, вышел. Пару раз забывал выключить. Уходил из дома на несколько часов, а вентилятор маслал впустую. И вот тут меня посетила гениальная мысль: надо это дело  автоматизировать!

Начал думать, что можно сделать, как должно работать. В голову пришли несколько вариантов подключения вытяжного вентилятора. Один из вариантов, подключить вентилятор параллельно лампочке, и теперь, пока горит свет в ванной, вентилятор вращается.

Плюсы: никакого геморроя с подключением
Минусы: если нужно просто проветрить ванную комнату, то что бы работал вентилятор, должен быть включен свет.
Вывод: не наш метод.

Второй вариант тоже простой. Сделать отдельный выключатель на вентилятор.
Плюсы: простое подключение. Вентилировать ванную можно при выключенном свете.
Минусы: придется приходить через какое-то время и выключать вентилятор, а это можно забыть сделать, соответственно, вентилятор будет работать до победного конца.
Вывод: не наш метод.

Хотелось автоматизации, руки чесались попаять, а пальцы — попрограммировать. Поэтому было принято решение — автоматизировать! По принципу: открыл дверь, зашел в ванную, вентилятор через какое-то время сам включился. Вышел из ванной, закрыл дверь, вентилятор какое-то время поработал, а потом сам выключился. Примерно так. Вообще можно много разных алгоритмов использования придумать. Но это уже потом буду экспериментальным способом подбирать. А сейчас надо продумать структуру автомата.

Итак, задача определить момент, когда человек открыл и закрыл дверь. Путей решения несколько. Как один из вариантов, поставить геркон (или датчик Холла) и магнит на дверь. Но придется тащить дополнительные провода, а этого делать не хочется. Еще можно подключится к лампочке и определять наличие напряжение на ней. Есть напряжение на лампочке — дверь открыта, человек вошел в ванную. Нет напряжения — человек вышел из ванной, закрыл дверь и выключил свет. Минусы в таком варианте тоже есть.

Тут опять промелькнула мысль, что можно использовать фотодатчик для определения наличия света в ванной. Но, к сожалению, у меня нет в наличии ни фоторезистора, ни фототранзистора, ни фото еще чего-нибудь. И снова промелькнула мысль, что многие физические процессы обратимы. Например, мотор можно использовать и как мотор, и как генератор. Пьезодатчик можно использовать и как датчик, и как излучатель. Наушник можно использовать как наушник, и как микрофон. И так далее. Когда то я мельком видел в интернетах статью, в которой говорилось, что явление излучения света светодиодом тоже обратимо. Где та статья не помню, в закладках не сохранил. Но идеей загорелся. Пособирал информацию. Решил попробовать потестировать, как это все работает.

Но, как назло, все макетные платы были заняты собранными какими-то устройствами. Разбирать и освобождать макетную плату не хотелось и было лень. И вот на досуге пролистывая свой блог, натолкнулся на статью про Лаунчпад и среду программирования Energia. Эта макетка как раз лежала без дела. Поэтому я решил поэкспериментировать на ней.

Схема всего этого дела простейшая — макетка, резистор, светодиод. Все соединить последовательно. Вот фото:

Launchpad - Детектор света из светодиода

Launchpad — Детектор света из светодиода

Вот и вся схема. Светодиод — обычный красный нонейм светодиод, выковырянный фиг знает откуда. Резистор 68 Ом. Для удобства припаял резистор к ноге светодиода и к разъему PBS . Подключил к пинам: анод на резистор и на P1.3 (PIN1), катод на  P1.4 (PIN2). Опередить, где у светодиода катод/анод можно двумя способами: у новых, свежекупленных светодиодов у анода («плюс») более длинный вывод. Если выводы светодиода укорочены, то определить можно по срезанной грани на боку светодиода, там где срезано, там катод («минус») (подробнее про светодиоды).

Светодиод будет светится только в том случае, если на светодиод подано прямое напряжение, т.е. на катод подан «минус» (земля), а на анод подан «плюс» (положительное питание). Если подать наоборот, то никакого свечения не будет, а если превысить допустимое обратное напряжение, то светодиод вообще сгорит. Мы будем подавать положительное напряжение на PIN2 и низкое напряжение в PIN1. Таким образом на светодиод будет подано допустимое обратное напряжение. Разумеется, светодиод светиться не будет, но будет заряжаться паразитная ёмкость соединения светодиода и ног микроконтроллера LaunchPad.

Макетная схема на LaunchPad MSP430

Макетная схема на LaunchPad MSP430

Потом мы переключим ногу контроллера на вход и посчитаем, за какое время емкость разрядится до уровня логической единицы. Это время зависит от освещенности. Чем темнее, тем дольше будет разряжаться емкость.

Далее я открыл среду программирования Energia и набросал вот такой скетч:

//***************************************************************************
//  Author(s)...: Chiper
//  URL(s)......: digitalchip.ru
//  Device(s)...: MSP430 LaunchPad
//  Description.: Фотосенсор на светодиоде
//  Data........: 22.06.2013
//***************************************************************************
//  Notice: 
//***************************************************************************
//
// Настройки 
#define LED_N_SIDE P1_3
#define LED_P_SIDE P1_4

#define LED_NIGHT   RED_LED  
#define LED_DAY     GREEN_LED  

#define BLINK_SPEED     15
#define LIGHT_THRESHOLD 1500

//***************************************************************************

#define STATUS_NIGHT 0
#define STATUS_DAY   1

unsigned int STATUS = 0;
unsigned int i=0;

void setup()
{
  Serial.begin(9600);
  Serial.println("LIGHT SENSOR TEST TIMING"); 
  Serial.println("http://digitalchip.ru");
  Serial.println("-------------------------");

  pinMode(LED_NIGHT,OUTPUT);
  pinMode(LED_DAY,OUTPUT);
}

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++;

  // Определяем, превысило ли время указанный порог и принимаем решение, какой
  // светодиод зажечь
  if (j < LIGHT_THRESHOLD) STATUS=STATUS_DAY; else STATUS=STATUS_NIGHT;

  // Выводим результат измерения на UART
  Serial.println(j);

  // Гасим светодиоды, которые обозначают превысил уровень освещенности порог
  digitalWrite(LED_NIGHT,LOW);
  digitalWrite(LED_DAY,LOW);
  // Если превысили порог, зажигаем зеленый светодиод, иначе - красный
  if (STATUS) digitalWrite(LED_DAY,HIGH); else digitalWrite(LED_NIGHT,HIGH);

  // Мигаем светодиодом-сенсором
  // Выводы на выход
  pinMode(LED_N_SIDE,OUTPUT);
  pinMode(LED_P_SIDE,OUTPUT);
  digitalWrite(LED_N_SIDE,LOW);
  digitalWrite(LED_P_SIDE,LOW);

  // Сичитаем задержку и подаем на светодиод прямое напрядение
  i++;
  if (i > BLINK_SPEED) i=0;
  if (i == BLINK_SPEED) digitalWrite(LED_P_SIDE,HIGH);

  delay(100);      // Пауза
}

Смысл сего прост. Постоянно определяем уровень освещенности. Если уровень превысил заданный порог, зажигаем зеленый светодиод, иначе зажигаем красный. Ну и параллельно этому мигаем светодиодом-сенсором, показывая, что мы работаем. Уровень освещенности, который мы определили, выводится в UART. Вот собственно и все.

Видео:

10 комментариев на “Светодиод как источник и как сенсор света”

  1. Непонятна связка — освещённость+вентилятор, хотя и у меня тоже такое было, что б не заморачиваться, но ведь это неправильно. На всех плёночных видеомагнитофонах и камерах существует датчик росы, установленный где-то рядом с БВГ на станине, т.е. сейчас задаром в любом металлоломе, вот его и по прямому назначению… а вентилятор я тоже сначала купить хотел:-(, но нашёл от старой СССРовской ЭВМ, тож 125мм, судя по дате изготовления — вот уже 25лет метёт так, что холодно становится, но тихо и тоже абсолютно бесплатно…

  2. я, конечно, извиняюсь, но управление вытяжным вентилятором санузла я сделал давным-давно на attiny13: http://arv.radioliga.com/content/view/218/44/

    • Я тоже делал, но возникло кучка проблем на пути. Я даже статейку написал по этому поводу, но так и не опубликовал, до сих пор висит в черновиках.

      Основная проблема — нестабильность срабатывания светодиода как датчика освещения. Параметры датчика очень сильно зависят от длины проводов между светодиодом и микроконтроллером, от разводки, положения проводов и т.д. То есть устройство то собрать не проблема — проблема его настроить и добиться стабильности работы. Пока экспериментировал на макетке — все работало довольно стабильно, но стоило перейти на печатную плату — стабильности достичь не удалось. (<задумчиво>Хм… может все таки статью опубликовать…).

      • Уже лет 8-10 у меня стоит АНАМовский выключатель. Включил свет — загорелась лампа и заработал вентилятор. Выключил — лампа погасла, вентилятор продолжает работать время Х. Внутри выключателя маленький переключатель на три положения разной длительности. Все давно придумано и очень аккуратно, надежно и компактно сделано.
        С уважением.

        • Ну и у меня задумка была не такая, как то, что получилось. Так сложилось. Хотел одного, а работает совсем другое. Все времени нет переделать. Как говорится, нет ничего более постоянного, чем временное.

  3. А зачем мигать в конце?

  4. Ну, там последние несколько строчек

    // Мигаем светодиодом-сенсором
    // Выводы на выход

    Для индикации, что работает?

  5. Еще, кстати, по теме. Я тут сотворил нечто подобное, игрался со светиками. Пока что на макетке, но тем не менее. Выяснилась такая вещь, что 8-битной переменной для счета времени разрядки до нуля не хватит, она успевает переполниться несколько раз, особенно, если процессор работает на высоких частотах. У меня сейчас это дело работает на ATMega8A, на 4МГц, при комнатной освещенности успевает переполниться минимум один, а то и два раза. А если накрыть колпачком от флешки, сымитировать «ночь», то 30 с лишним раз. Другой переполняет переменную 15 и 93 раза соответственно. Так что лучше и точнее было бы, наверное, считать именно переполнения, а не просто тики. Ну, либо брать более вместительные переменные 🙂

Добавить комментарий

Поля, помеченные знаком звездочка (*) обязательны для заполнения.