Arduino 与 NeoPixel 光耦合器控制多个继电器
组件和用品
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
|
关于这个项目
该项目是关于从单个 Arduino 输出引脚控制多个继电器或其他执行器。
该解决方案可用于Arduino可用输出引脚数量不足且需要从单个输出引脚并行控制更多执行器(例如继电器)的典型情况。
工作原理基于使用多个 NeoPixel 的 LED 灯条(带有 WS2812B 控制器芯片的 SMD5050 LED)。每个像素都与一个 LDR(光敏电阻)组合在一起,从而创建一个 DIY 光耦合器(任意数量,仅受 LED 灯带长度的限制,例如 300 像素,以及可用的 5V 电源)。这样就创建了一个串行到并行的转换(从 1 到许多)
每个单独的 LED 都来自同一个 Arduino 输出引脚。每个 LDR(与 27kOhm 电阻串联)连接到 5V 继电器。通过这种方式,可以使用 Adafruit NeoPixel 库从 1 个 Arduino 输出 PIN 控制许多 NeoPixel/LDR 组合。也可以连接其他执行器设备而不是继电器,使用 LDR 作为任何电路的输入。
这个项目是更大计划的一部分,使用了 ESP32(NodeMCU);然而,普通的 Arduino Uno(或几乎任何其他型号)都可以完成这项工作。
第 1 步:制作 NeoPixel 光耦合器
DIY光耦由以下材料制成:
- 一块由 10 个 WS2812 LED 组成的 LED 灯带(从较长的灯带上剪下来),项目中实际使用了 4 个
- 一块深灰色泡沫
- 一块面包板
- 黑鸭胶带
注:点的间距等于LED的间距。
将每个 LED 的光与其他 LED 的 LDR 分开很重要,以避免“光串扰 .” 事实证明,这在实践中几乎是不可能的,因此在软件中将每个处于“开启”状态的 LED 发出的光量设置为低水平。
使用的 LED 灯条是 10 个 LED 长,但在这个项目中只使用了 4 个像素与 4 个 LDR(为了简单起见)
第 2 步:电子设置
在面包板设置中,我使用了 ESP32s (NodeMCU),但是任何 Arduino 都可以完成这项工作。
电路图(用Fritzing制作)如下:
在实践中,这看起来如下:
如您所见,只有 1 个输出引脚用于并行控制 4 个继电器。这个数字可以高达300! (在 5 m 长的条带中提供尽可能多的 LED)。
ESP32 设备的工作电压为 3.3 伏(板载 3.3V 稳压器),而带有 5050 个 LED 的 LED 灯条以 5V 供电。ESP32 由 5V 供电(通过来自 5V 适配器的 USB 端口或 5V移动电源)。 NeoPixel LED 直接从 ESP32 的 5 伏引脚获得 5V 电源,所使用的继电器也是 5V 类型。
本例中使用4个光耦电路控制4个继电器,每个继电器连接到一个230V灯。
使用的输出引脚是 GPIO 引脚 21,继电器通过像素编号 1、2、3、4 进行控制。
第 3 步:制作软件
Arduino Sketch 中的循环函数很简单,由许多“for”循环组成,通过控制每个继电器来显示不同的灯开关模式。
为了控制特定的继电器,从循环代码中调用以下函数:
void ControlRelais (int RelaisNo, bool RelaisState) { strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15); // 打开/关闭属于 RelaisNo 的 LED strip.show(); Serial.print(" RelaisNo "); Serial.print(RelaisNo); Serial.print(" ="); Serial.println(RelaisState); }
事实上,这个功能所做的只是打开特定的 LED 或关闭。
LED 地址与相应的继电器编号相对应。 LED 以低亮度点亮,刚好足以通过 LDR 触发继电器,从而避免光污染(上文也称为“光串扰”。
所有努力的结果和特定的草图,显示在以下电影中:
代码
- 通过自制的 NeoPixel 光电耦合器控制多个继电器的草图
通过自制的 NeoPixel 光电耦合器控制多个继电器的草图Arduino
此草图显示了如何通过由 NeoPixels 制成的多个光耦控制多个继电器,这些光耦由 1 个 ARDUINO 输出引脚控制/* 此代码用于从单个 Arduino 输出引脚控制多个 Relais 或其他执行器,由 Pierre 开发和制作Pennings(2018 年 12 月) 该方案可用于 Arduino 可用输出引脚数量不足且需要并行控制更多 Relais 等执行器的典型情况 工作原理基于使用多个 Neopixels 的条带(带有 WS2812B 控制器芯片的 SMD5050 LED)每个像素都与一个 LDR(光相关电阻器)放在一起,从而创建一个 DIY 光耦合器每个单独的 LED 都从一个相同的 ARDUINO 输出引脚和 LDR(与 27kOhm 电阻器串联)寻址),连接到 5V Relais 这样,可以使用 Adafruit Neopixel 库从 1 个 Arduino 输出 PIN 控制许多 Neopixel/LDR 组合。对于这个项目,它是更大计划的一部分,使用了 ESP 32 (NodeMCU),但是普通的 ARDUINO UNO(或几乎任何其他型号)将完成这项工作(当然,代码中的设置需要调整,例如由于不同的引脚分配)ESP 32 设备在 3.3 伏电平(板载 3.3V 稳压器)下工作,而带有 5050 个 LED 的 LED 灯条在 5 V 上运行 ESP 32 由 5 V 电源供电(通过来自 5V 适配器或 5v 移动电源的 USB 端口) Neopixel LED 直接从 ESP 32 的 5 伏引脚获得 5V 电源,使用的 Relais 也是 5V 类型。在这个例子中,使用了一个由 10 个 LED 组成的 LED 灯条,为简单起见,只制作了 4 个光耦合器电路来控制 4 个连接到一个 230V LEDLamp 的 Relais。使用的输出引脚是 GPIO PIN 21,RELAIS 通过像素编号 1、2、3、4 控制此代码根据 GPL3+ 许可证获得许可。*/#include#define NUM_LEDS 10////// ///////////////////////////////////////// 初始化GPIO pinconst int RelaisPin =21; // 引脚 21 将控制数据 (0 -3.3 V) 发送到 Relaisint RelaisNo =0; // 控制适用 Relais 的变量bool RelaisState =false;int r =0;Adafruit_NeoPixel strip =Adafruit_NeoPixel(NUM_LEDS, RelaisPin, NEO_RGB + NEO_KHZ800);///////////////// /////////////////////////////// 后面的设置代码将在“开机”后或之后运行一次一个 RESETvoid setup() { Serial.begin(115200); pinMode(RelaisPin,输出); // 将 RelaisPin 初始化为输出 strip.begin(); // 将所有 LED 初始化为“关闭” for (int t =0; t <10; t++) { strip.setPixelColor(t, 15, 15, 15); // 通电后测试条的所有 LED 一次 strip.show(); // 注意WS2812 LED灯条的颜色顺序是R,G,B delay (500); strip.setPixelColor(t, 0, 0, 0); // 然后返回关闭 }}//////////////////////////////////////// ///////// 接下来的循环代码将重复运行,直到“断电”或 RESETvoid loop(){ for (int r =1; r <5; r++) // 打开 4 Relais一个接一个计数形式 1 到 4 { delay (500); ControlRelais (r , true);延迟(500); ControlRelais (r, false); }for (int k =4; k> 0; k--) // 依次开启 4 Relais 计数形式 4 到 1 { delay (500); ControlRelais (k , true);延迟(500); ControlRelais (k , false); } for (int r =1; r <5; r++) // 在一个模式中打开 4 个 Relais { for (int k =4; k> 0; k--) { delay (500); ControlRelais (r , true); ControlRelais (k , true);延迟(500); ControlRelais (r, false); ControlRelais (k , false); } }//////////////// 循环结束////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////// 后面跟着控制Relais的Function(从循环内调用) void ControlRelais (int RelaisNo, bool RelaisState) { strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15); // 打开/关闭属于 RelaisNo 的 LED strip.show(); Serial.print(" RelaisNo "); Serial.print(RelaisNo); Serial.print(" ="); Serial.println(RelaisState); }
示意图
设置用于从单个 Arduino 引脚控制多个继电器或其他执行器 neopixel_optocoupler_relais__hNIrhGIMtD.fzz制造工艺