아두이노로 65,280개 릴레이 제어: 확장 가능한 IO & 릴레이 솔루션
부품 및 소모품
부품 비고 수량
아두이노 나노 R3 1
IO 익스팬더 IO 익스팬더 1
릴레이 익스팬더 1
IO 익스텐더 1
아두이노 16 릴레이 보드 1
앱 및 온라인 서비스
프로젝트 소개
IO 익스팬더와 릴레이 익스팬더를 사용하여 최대 65,280개의 릴레이를 제어합니다.
프로젝트에 많은 릴레이를 추가해야 하나요? 그럼 IO 익스팬더와 릴레이 익스팬더가 필요합니다. 각 IO 익스팬더는 최대 16개의 데이지 체인 릴레이 익스팬더를 제어하여 총 256개의 릴레이를 관리합니다. 255개의 IO 익스팬더를 연결하면 최대 65,280개의 릴레이를 선택적으로 제어할 수 있습니다.
단일 IO 익스팬더로 릴레이 제어
https://www.zevendevelopment.com/videos/Control64Relays.mp4
기능 목록
저렴한 $15 미만 아두이노 16 릴레이 보드 사용
사용하기 쉬운 릴레이 제어 명령
개별 릴레이 또는 뱅크 단위 제어
드라이버 불필요, 코드 공간 절약
릴레이 상태 유지를 위한 데이터 공간 불필요
별도 전원 공급 장치 불필요
릴레이 뱅크 구축에 필요한 부품
IO 익스팬더
IO 익스텐더
릴레이 익스팬더
아두이노 16 릴레이 보드
배선도
참고: 위 배선도에서 IO 익스팬더와 아두이노 나노는 첫 번째 릴레이 보드로부터 전원을 공급받습니다. 모든 릴레이 익스팬더는 연결된 릴레이 보드로부터 전원을 공급받습니다.
/* IO Expander
* Control 64 Relays
*/
#include <SoftwareSerial.h>
#include "IOExpander.h"
#include <avr/wdt.h>
//#define SERIAL_DEBUG
#define MAX_RELAYS 64
#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif
char cmd[10];
void setup() {
Serial.begin(115200);
#ifdef SERIAL_DEBUG
swSerial.begin(115200);
swSerialEcho = &swSerial;
#endif
wdt_enable(WDTO_8S);
sprintf(cmd, "eb%d", MAX_RELAYS / 16);
SerialCmdDone(cmd);
}
void loop() {
static int i = 1;
sprintf(cmd, "e%df", i);
SerialCmdDone(cmd);
if (i++ >= MAX_RELAYS) i = 1;
sprintf(cmd, "e%do", i);
SerialCmdDone(cmd);
delay(100);
wdt_reset();
}
다중 IO 익스팬더로 릴레이 제어
또 다른 방법은 여러 IO 익스팬더를 사용하는 것입니다. 이를 통해 센서와 릴레이를 중앙 또는 스타 네트워크로 분산시키면서도 모든 IO 익스팬더를 단일 시리얼 버스로 상호 연결할 수 있습니다. IO 익스팬더를 최대 4000ft(약 1.2km)까지 분리해야 한다면 표준 파란색 Cat5 네트워크 케이블과 함께 IO 익스텐더를 사용하세요.
https://www.zevendevelopment.com/videos/Control64RelaysExpander.mp4
배선도
참고: 위 배선도에서 모든 IO 익스팬더와 아두이노 나노는 첫 번째 릴레이 보드를 통해 시리얼 버스로 전원을 공급받습니다. 모든 릴레이 익스팬더는 연결된 릴레이 보드로부터 전원을 공급받습니다.
/* IO Expander
* Relay Bonnaza with IO Expanders!
*/
#include <HardwareSerial9Bit.h>
#include "IOExpander9Bit.h"
#include <avr/wdt.h>
#define MAX_BOARDS 4
char cmd[10];
void setup() {
Serial9Bit.begin(115200, SERIAL_9N1);
Serial9Bit.write(0); // IO 익스팬더를 9비트 모드로 설정
wdt_enable(WDTO_8S);
for (int board = 1; board <= 4; board++)
SerialCmdDone(board, "eb1");
}
void loop() {
static int board = 1;
static int relay = 1;
sprintf(cmd, "e%df", relay);
SerialCmdDone(board, cmd);
if (++relay > 16) {
relay = 1;
if (++board > MAX_BOARDS) board = 1;
}
sprintf(cmd, "e%do", relay);
SerialCmdDone(board, cmd);
delay(100);
wdt_reset();
}
왜 그렇게 많은 릴레이를 제어해야 할까?
아쿠아포닉스나 수경 재배 같은 분야가 한 예입니다. 각 재배 베드나 개별 식물 단위까지 센서와 장치를 자동화해야 하므로 극한의 IO가 필요하며, IO 익스팬더가 이를 제공합니다.
지금 IO 익스팬더를 구입하여 시스템을 구축하세요!
코드
단일 익스팬더로 64 릴레이 제어 (C/C++)
/* IO Expander * Control 64 Relays */
#include <SoftwareSerial.h>
#include "IOExpander.h"
#include <avr/wdt.h>
//#define SERIAL_DEBUG
#define MAX_RELAYS 64
#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif
char cmd[10];
void setup() {
Serial.begin(115200);
#ifdef SERIAL_DEBUG
swSerial.begin(115200);
swSerialEcho = &swSerial;
#endif
wdt_enable(WDTO_8S);
sprintf(cmd, "eb%d", MAX_RELAYS / 16);
SerialCmdDone(cmd);
}
void loop() {
static int i = 1;
sprintf(cmd, "e%df", i);
SerialCmdDone(cmd);
if (i++ >= MAX_RELAYS) i = 1;
sprintf(cmd, "e%do", i);
SerialCmdDone(cmd);
delay(100);
wdt_reset();
}
다중 익스팬더로 64 릴레이 제어 (C/C++)
/* IO Expander * Relay Bonnaza with IO Expanders! */
#include <HardwareSerial9Bit.h>
#include "IOExpander9Bit.h"
#include <avr/wdt.h>
#define MAX_BOARDS 4
char cmd[10];
void setup() {
Serial9Bit.begin(115200, SERIAL_9N1);
Serial9Bit.write(0); // Set IO Expanders to 9-bit
wdt_enable(WDTO_8S);
for (int board = 1; board <= 4; board++)
SerialCmdDone(board, "eb1");
}
void loop() {
static int board = 1;
static int relay = 1;
sprintf(cmd, "e%df", relay);
SerialCmdDone(board, cmd);
if (++relay > 16) {
relay = 1;
if (++board > MAX_BOARDS) board = 1;
}
sprintf(cmd, "e%do", relay);
SerialCmdDone(board, cmd);
delay(100);
wdt_reset();
}
회로도