phantomshuttle 博客
无需添加传感器即可吹灭的 LED

led控制可以通过按钮、开关、手势、电容式触摸和红外遥控器完成的,但从未像现在这样。 这里制作了一种 可以像蜡烛一样吹灭的 LED,令人惊讶的是它不需要添加传感器。该项目使用 Arduino 来演示如何打开和关闭微型 LED 以响应被吹灭的情况,唯一的组件是 LED 和电阻器。

https://phantomshuttle.com/wp-content/uploads/2024/05/像蜡烛一样吹灭的-LED-1024x507.gif
可以像蜡烛一样吹灭的 LED

过去我们见过 LED 可以像蜡烛一样以不同的方式吹灭;一种 使用麦克风来检测吹气另一种使用热敏电阻来检测吹气引起的温度变化。 这个项目之所以引人注目,不仅因为没有使用任何添加的部件,而且还因为以几乎任何人都可以启动和运行的方式进行记录,这是我们总是希望看到的。

这是如何运作的?

这是怎么做到的? 利用二极管(即 LED 中的“D”)的一个有趣特性,将 LED 本身用作温度传感器。二极管的压降取决于两个因素:流过二极管的电流和温度。如果电流保持恒定,则正向压降会根据温度可靠地变化。打开 LED 可以使其升温,吹气则可以使其冷却,从而导致设备上的压降发生可测量的变化。变化不大——只有几毫伏——但效果是一致的并且可以测量。这个原理可以见这篇文章: 使用二极管作为温度传感器

https://phantomshuttle.com/wp-content/uploads/2024/05/Snipaste_2024-05-07_11-08-58.png

当电流通过 LED 时,其温度会升高。上升的幅度取决于冷却的效率。当您吹热 LED 时,额外的冷却会降低运行温度。我们可以检测到这一点,因为 LED 的正向压降随着温度的降低而增加。

该电路非常简单,看起来很像驱动 LED。唯一的区别是我们将添加一根额外的电线来测量 LED 点亮时的压降。为了正常工作,您需要使用一个非常小的 LED(我建议使用 0402 表面贴装 LED),并通过最细的电线连接。这将使 LED 能够非常快速地加热和冷却,并最大限度地减少通过电线损失的热量。我们正在寻找的电压变化仅为毫伏 – 处于可以通过 UNO 模拟引脚可靠检测到的最边缘。如果 LED 放置在导热的物体上,它可能无法变得足够热,因此如果将 LED 放置在空中,效果最佳。

这是一个巧妙的演示,有两个重要的细节使其发挥作用。首先是LED本身; [电子管道工] 使用安装在两根电线上的微型 0402 LED,以最大限度地提高吹气引起的温度变化。第二种是更可靠地检测仅几毫伏变化的方法。通过对 Arduino 的 ADC 进行过采样,无需添加任何硬件或改变电压参考即可获得有效的更高分辨率。该代码不是读取 ADC 一次,而是读取 ADC 256 次并对读数求和。通过处理更大的数字,可以捕获在单次读取中无法可靠记录的累积变化并采取行动。更多详细信息可从 [ Electron_plumber] 的GitHub 存储库获取 LED 作为传感器

准备好 LED 和电阻以连接到 Arduino UNO

将极细的电线焊接到非常小的表面贴装 LED 上需要相当高的技巧。幸运的是,您只需购买预接线的 0402 LED。它们通常配有一个尺寸适合 12V 操作的电阻器(图中被热缩管覆盖)。如果这是你得到的,你将需要切断电阻。如果您切断电阻凸起旁边的热缩管,您可能能够拉下剩余的管子,留下一些裸露的引线用于焊接。如果您只是切断电线,则需要剥去少量绝缘层以便进行焊接,并且考虑到电线的厚度,这可能会很棘手。

这些电线太细,无法在 Arduino 接头中建立良好的连接,因此我们需要将它们焊接到更粗的东西上。我使用分离接头上的引脚进行连接,但您可以使用任何适当规格的电线废料。 LED 的背面(阴极)线焊接到单个分离接头引脚上。红色(阳极)线应焊接到弯曲的电阻器上,如图所示。将电阻器上的引线修剪为相等长度,并将它们焊接到两个相邻的插头引脚上,如图所示。

连接

https://phantomshuttle.com/wp-content/uploads/2024/05/Snipaste_2024-05-07_11-44-45.png
https://phantomshuttle.com/wp-content/uploads/2024/05/FFPV2CRJKWUTO4F.jpg

如图所示连接 LED/电阻器。连接到红色 LED 线的电阻一侧连接至 A0。我们将在此处使用模拟输入功能测量 LED 上的电压。电阻的另一端连接到 A1,我们将其用作数字输出,将其设置为高电平以打开 LED。黑线必须连接至 GND。任何 Arduino GND 引脚都可以使用

代码

下载代码并在 Arduino IDE 中打开它。然后您可以将其上传到您的 Arduino。

该程序首先设置引脚方向并点亮 LED。然后,它通过引脚 A0 上的模拟读取来测量 LED 的正向压降。为了提高测量精度,我们快速连续读取电压 256 次,并对结果求和。 (像这样的过采样可以提高转换的有效分辨率,以便我们可以看到小于转换器上最小步长的变化。)如果数据缓冲区 sensedata[] 已满,我们将最新的总和与最旧的总和进行比较存储在缓冲区中,以查看最近的冷却是否使 LED 电压升高至少 MINJUMP。如果没有,我们将总和存储在缓冲区中,更新缓冲区指针,然后开始下一次测量。如果有,我们将 LED 关闭 2 秒,重置缓冲区,然后重新开始该过程。

为了更好地了解发生的情况,我们将每个总和写为串行数据,并使用 Arduino IDE 的串行绘图仪(在“工具”菜单下)绘制 LED 电压随时间变化的图表。记得将波特率设置为250000以匹配程序。然后,您将能够看到 LED 在打开后预热时电压如何下降。这也将显示系统的敏感程度。 LED 被触发关闭后,当它重新打开时,它会稍微冷却下来,您将在图表上看到这一点。

// 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 150           // Minimum jump for blow out

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

void setup() {
  Serial.begin(250000);                     // 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
    }
  }
}
https://phantomshuttle.com/wp-content/uploads/2024/05/Snipaste_2024-05-07_11-51-16.png

当代码运行时,您应该能够快速吹气吹灭 LED。我发现我可以在 1 米多远的地方吹灭 LED!在某些房间中,气流可能会导致误触发。如果这是一个问题,您可以通过增加 MINJUMP 来降低系统的灵敏度。串行绘图仪可以帮助您直观地了解适合您的应用程序的正确值。

您可以将 LED 更换为不同颜色的 LED。白光 LED 效果特别好。由于它们具有较高的压降,因此您需要更改电阻值才能获得正确的电流。考虑到 UNO 的驱动能力,电流应在 10-15mA 范围内。对于白光 LED,100 欧姆是一个很好的起点。

由于 UNO 有 6 个模拟输入引脚,因此您可以轻松修改此代码以支持 6 个独立的热门 LED 风速计!这使得构建简单的界面成为可能,该界面可以识别您何时向不同方向吹气。当为残疾人构建界面、为音乐家构建富有表现力的控制器、甚至为带有许多电子蜡烛的生日蛋糕时,这非常有用!

发表回复

textsms
account_circle
email

phantomshuttle 博客

无需添加传感器即可吹灭的 LED
led控制可以通过按钮、开关、手势、电容式触摸和红外遥控器完成的,但从未像现在这样。 这里制作了一种 可以像蜡烛一样吹灭的 LED,令人惊讶的是它不需要添加传感器。该项目使用 Arduino …
扫描二维码继续阅读
2024-05-07