+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)
интернет-магазин
доставка по России и СНГ
работаем с 2010 года

Светодиод, который можно задуть как свечу!

ГлавнаяИнформацияСтатьи

Светодиод, который можно задуть как свечу!

Светодиоды разработаны чтобы излучать свет, но с помощью них можно создавать и удивительные датчики. Используя простую схему на Arduino, а светодиод как датчик, мы сделаем очень простой анемометр. Для измерения скорости воздуха такой датчик подходит не очень, но с помощью него можно определять изменения скорости движения воздуха.

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




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

Для создания понадобятся следующие компоненты:


Принцип работы





Когда через светодиод проходит ток, он светится, а его температура немного повышается. Степень повышения температуры зависит от того, насколько эффективно вы его охладите.

Охлаждение светодиода происходит через корпус и выводы. Влияет материал, размер и форма корпуса, температура окружающей среды, а также к чему подключены выводы. Если корпус будет большой, к примеру, как у выводного 3мм или 5мм светодиода, достаточно быстро охладить, дуя на светодиод не получится. Также если SMD светодиод будет запаян на плату, светодиод может слишком быстро охлаждаться через медные дорожки или полигоны на плате. Для нормальной работы желательно взять SMD светодиод типоразмера 0402 (c 0603, 0806 и т.д. нужно экспериментировать, может не заработать) и запаять его на не очень толстые провода.

Когда температура светодиода повышается или понижается, также происходит и изменение падения напряжения на светодиоде, которое уже и можно обнаружить.

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

Изменения напряжения, которые мы будем пытаться определить, составляют всего лишь милливольты – это почти предел того, что может быть надежно обнаружено с помощью аналоговых выводов UNO. Если корпус или выводы светодиода касаются чего-то, что хорошо отводит тепло, светодиод может не нагреться достаточно. Поэтому старайтесь чтобы светодиод был в воздухе или не касался хорошо теплопроводящих предметов или деталей корпуса устройства («свечи» и т.д.).

Подготовка









Пайка тонких проводов к маленьким SMD светодиодам требует некоторых навыков. Если у вас с этим трудности, потренируйтесь, попросите кого-нибудь (знакомого, на сервисе по ремонту) запаять или поищите в продаже готовые (как на первом фото выше).

Провода слишком тонкие и недостаточно жесткие, чтобы их можно было втыкать в разъём Arduino, поэтому нам нужно припаять их к чему-то более толстому. Можно откусить кусочек толстого одножильного провода, ножку выводного резистора, светодиода и т.д. Я использовал штыри PLS разъёма.

Катод светодиода (чёрный провод на фото выше) припаян к одному контакту. Красным проводом с одной стороны к аноду светодиода, с другой к изогнутому резистору.

Для теста сначала можно использовать и макетную плату:





Подключение







Подключите светодиод и резистор, как показано на рисунках. Сторона резистора, подключенного к красному проводу, подключается к выводу A0. Это будет то место, где мы измеряем напряжение на светодиоде, используя возможности аналогового входа. Другая сторона резистора идет к выводу A1, который используется в режиме цифрового выхода для включения и выключения светодиода. Черный провод подключается к любому выводу GND на Arduino.

Код



// Blow Out LED Ave creates an LED that you can blow out. It automatically relights after 2 seconds
//
// Copyright 2018, Paul H. Dietz

// LED Connections
#define PLUS A1               // High side of the resistor
#define MEASURE A0            // Low side of resistor and anode of LED
// Cathode of LED goes to ground

#define NUMSAMPLES 10         // Number of samples to keep
#define MINJUMP 200           // Minimum jump for blow out

long int sensedata[NUMSAMPLES];
int dataptr = 0;
int buffull = 0;

void setup() {
  Serial.begin(115200);                     // Initialize serial communication
  pinMode(MEASURE, INPUT);
  pinMode(PLUS, OUTPUT);
  digitalWrite(PLUS, HIGH);                 // Turn on the LED
}

void loop() {
  int cnt;
  long int sum = 0;

  // Sum 256 adc readings (to reduce adc noise)
  for (cnt = 0; cnt < 256; cnt++) {
    sum = sum + analogRead(MEASURE);
  }
  
  Serial.println(sum);                      // Output sum so we can watch with Serial Plotter

  // Compare current measurement to oldest if buffer full
  if (buffull && (sum > (sensedata[dataptr] + MINJUMP))) {
    // Temperature drop exceeded minimum - turn off
    digitalWrite(PLUS, LOW);
    dataptr = 0;                            // Reinitialize the buffer
    buffull = 0;
    delay(2000);                            // off time for LED
    digitalWrite(PLUS, HIGH);
  }
  else {
    sensedata[dataptr] = sum;               // Store the latest data in the buffer
    dataptr++;                              // Update buffer pointer
    if (dataptr == NUMSAMPLES) {            // Check if dataptr went past end
      dataptr = 0;                          // Reset the dataptr to beginning
      buffull = 1;                          // Mark that buffer is full
    }
  }
}


В функции setup происходит первоначальная настройка и включается светодиод. Затем выполнение программы продолжается в бесконечном цикле loop.

В нём сначала производится 255 измерений напряжения на выводе A0 и получаемые данные суммируются в переменной sum. Так много измерений используется для повышения точности измерений (снижение влияния шумов).

Затем в условии проверяется, если буфер данных sensedata[] заполнен. Также мы сравниваем последнюю сумму с самой старой из имеющихся у нас хранится в буфере, чтобы увидеть, увеличилось ли напряжение из-за охлаждения светодиода, хотя бы на значение MINJUMP.

Когда условие выполняется, мы выключаем светодиод на 2 секунды, сбрасываем буфер и затем снова запускаем процесс. В противном случае, мы сохраняем сумму в буфере, обновляем индекс буфера и начинаем следующие измерения.

После подсчёта суммы, данные выводятся в последовательный порт. Чтобы лучше понять, что происходит, в Arduino IDE можно открыть «Плоттер по последовательному соединению» (вызываются в меню «Инструменты»). Для удобства, в функции loop можно закомментировать вызов delay(2000), без которой сможете наблюдать, как возрастает и падает напряжение, когда меняется его температура.





Заключение





В ходе экспериментов я обнаружил, что могу погасить свой светодиод с расстояния более 1 метра. В некоторых комнатах воздушные потоки могут вызывать ложные срабатывания. Если это проблема, вы можете снизить чувствительность вашей системы, увеличив MINJUMP. График «плоттера» может помочь понять, какое значение лучше подходит.

Вы можете использовать светодиод другого цвета или поэкспериментировать со светодиодами других типоразмеров. Белые светодиоды работают особенно хорошо, поскольку у них более высокое падение напряжения. У различных светодиодов параметры могут отличаться, при необходимости пересчитайте необходимый номинал (в интернете много онлайн калькуляторов для расчёта номинала резистора для светодиода). Также не забывайте, что у выводов микроконтроллера есть лимит на максимальный ток и его не нужно превышать.

Вместо Arduino Uno можно использовать другие Arduino совместимые платы. Не на всех платах приведенный ранее код будет работать стабильно. Если не получается настроить с помощью изменения MINJUMP, можно попробовать немного изменённый вариант скетча:



// Blow Out LED Ave creates an LED that you can blow out. It automatically relights after 2 seconds
//
// Copyright 2018, Paul H. Dietz

// LED Connections
#define PLUS A1               // High side of the resistor
#define MEASURE A0            // Low side of resistor and anode of LED
// Cathode of LED goes to ground

#define NUMSAMPLES 10         // Number of samples to keep
#define MINJUMP 100           // Minimum jump for blow out

long int sensedata[NUMSAMPLES];
int dataptr = 0;
int buffull = 0;
int count = 0;
long last = 0;

void setup() {
  Serial.begin(115200);                     // Initialize serial communication
  pinMode(MEASURE, INPUT);
  pinMode(PLUS, OUTPUT);
  digitalWrite(PLUS, HIGH);                 // Turn on the LED
}

void loop()
{
  int cnt;
  long int sum = 0;

  // Sum 256 adc readings (to reduce adc noise)
  for (cnt = 0; cnt < 1024; cnt++) {
    sum = sum + analogRead(MEASURE);
  }

  //Serial.println(sum);                      // Output sum so we can watch with Serial Plotter

  // Compare current measurement to oldest if buffer full
  if (buffull && (sum > (sensedata[dataptr] + MINJUMP))) {
    if (millis() < last + 500) {
      Serial.print("sum: ");
      Serial.println(sum);
      count++;
      Serial.print("count: ");
      Serial.println(count);
      last = millis();
    } else {
      last = millis();
      count = 0;
    }
  } else {
    sensedata[dataptr] = sum;               // Store the latest data in the buffer
    dataptr++;                              // Update buffer pointer
    if (dataptr == NUMSAMPLES) {            // Check if dataptr went past end
      dataptr = 0;                          // Reset the dataptr to beginning
      buffull = 1;                          // Mark that buffer is full
    }
  }
  if (count > 4) {
    // Temperature drop exceeded minimum - turn off
    Serial.println(sensedata[dataptr]);
    digitalWrite(PLUS, LOW);
    dataptr = 0;                            // Reinitialize the buffer
    buffull = 0;
    count = 0;
    delay(2000);                            // off time for LED
    digitalWrite(PLUS, HIGH);
  }
}


В нём выключение светодиода производится не при первом срабатывании, а на пятом (в последнем условии можно изменить, на каком срабатывании выключать светодиод).

На платах UNO, NANO и т.д., аналоговых входов более одного. Т.е. без использования микросхем стандартной логики, мультиплексоров и т.д., можно реализовать работу с несколькими светодиодами.

Используя несколько светодиодов можно сделать несколько независимых предметов («свечи» и т.д.) или несколько элементов одного предмета (несколько светлячков в одной декорации, веток дерева из проволоки и т.д.). Также можно определять и направление, к примеру, разместив светодиоды вокруг трубки или ещё как (что бы поток воздуха попадал не на все сразу, а в основном на один или несколько светодиодов).


Автор: Paul Dietz
Перевод и адаптация: RobotoTehnika.ru