需要使用键盘控制继电器?那么您需要带继电器扩展器的IO 扩展器。每个 IO 扩展器最多可以控制 16 个菊花链式继电器扩展器,总共 256 个继电器。然后使用连接到 IO 扩展器的键盘手动控制每个继电器。
使用FCB Maker将 7 或 8 个数字引脚转换为 1 个模拟引脚。然后连接 3x4 或 4x4 数字键盘。
注意:在上面的接线图中,IO Expander 和 Arduino Nano 由第一个继电器板供电。所有继电器扩展器都由它们所连接的继电器板供电。
输入继电器编号,然后按“#”键打开继电器。要关闭继电器,请使用“*”键。
/* IO Expander
*
* Relay Keypad
*
*/
#include
#include "IOExpander.h"
#include
//#define SERIAL_DEBUG
#define MAX_RELAYS 64
#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif
char cmd[16];
char key[16] = {};
#define KEYPAD_4x3
//#define KEYPAD_4x4
#ifdef KEYPAD_4x3
#define MAX_KEYS 12
int thresholds[MAX_KEYS] = {18,329,598,1000,1183,1346,1603,1723,1833,2009,2093,2172};
char keypad[MAX_KEYS] = {'1','2','3','4','5','6','7','8','9','*','0','#'};
#endif
#ifdef KEYPAD_4x4
#define MAX_KEYS 16
int thresholds[MAX_KEYS] = {105,394,617,847,1049,1220,1357,1502,1634,1748,1840,1939,2031,2110,2177,2249};
char keypad[MAX_KEYS[ = {'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
#endif
void setup()
{
int i;
Serial.begin(115200);
#ifdef SERIAL_DEBUG
swSerial.begin(115200);
swSerialEcho = &swSerial;
swSerial.println("DEBUG");
#endif
wdt_enable(WDTO_8S);
delay(100); // Wait 100 ms for IO Expander Title
while (Serial.available()) Serial.read(); // Flush RX buffer
sprintf(cmd, "eb%d", MAX_RELAYS / 16);
SerialCmdDone(cmd);
// Configure keypad
SerialCmdDone("s2t1d;sc0,0");
Serial.print("sc");
for (i = 0; i < MAX_KEYS; i++)
{
if (i) Serial.print(",");
Serial.print(thresholds[i]);
Serial.print(",\"");
Serial.print(keypad[i]);
Serial.print("\"");
}
SerialCmdDone(";sd100"); // Keypad debounce 100ms
}
void loop()
{
int i,relay;
char ch;
SerialCmd("s2r");
int len = strlen(key);
SerialReadString(key+len, sizeof(key)-len); // Concatinate keypad characters
SerialReadUntilDone();
for (i = 0; i < strlen(key); i++) {
ch = key[i];
if (!isdigit(ch)) {
key[i] = NULL;
if (ch == '*' || ch == '#') {
relay = atoi(key);
if (relay > 0 && relay <= MAX_RELAYS) {
Serial.print("e");
Serial.print(relay);
if (ch == '#') Serial.println("o"); // Turn on relay
else Serial.println('f'); // Turn off relay
SerialReadUntilDone(); // Wait for the '>' prompt
}
}
strcpy(key, key+i+1);
break;
}
}
wdt_reset();
delay(100);
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !