

COM 和 NO,请根据实际负载和电源规格接线。接线、拆线或更换负载前必须断开电源。
本教程使用 CoreS3 搭配 Module13.2 4Relay v1.1。模块通过 I2C 通信,默认地址为 0x26,CoreS3 连接后的 I2C 引脚为 G12 (SDA) 和 G11 (SCL)。程序使用 CoreS3 触摸屏控制继电器:点击 STEP 切换当前通道,点击 ALL ON 打开全部通道,点击 ALL OFF 关闭全部通道。
#include <M5Unified.h>
#include "Module_4RELAY.h"
MODULE_4RELAY relay;
TwoWire *relayWire = &Wire1;
uint8_t currentChannel = 0;
constexpr uint8_t RELAY_SDA = 12;
constexpr uint8_t RELAY_SCL = 11;
constexpr int16_t TOUCH_BUTTON_Y = 176;
constexpr int16_t TOUCH_BUTTON_HEIGHT = 58;
constexpr int16_t TOUCH_BUTTON_WIDTH = 100;
constexpr int16_t TOUCH_BUTTON_GAP = 6;
int16_t getButtonX(uint8_t index)
{
return TOUCH_BUTTON_GAP + index * (TOUCH_BUTTON_WIDTH + TOUCH_BUTTON_GAP);
}
int8_t getTouchedButton(int16_t x, int16_t y)
{
if (y < TOUCH_BUTTON_Y || y >= TOUCH_BUTTON_Y + TOUCH_BUTTON_HEIGHT) {
return -1;
}
for (uint8_t index = 0; index < 3; ++index) {
const int16_t buttonX = getButtonX(index);
if (x >= buttonX && x < buttonX + TOUCH_BUTTON_WIDTH) {
return index;
}
}
return -1;
}
void drawTouchButton(uint8_t index, const char *label)
{
const int16_t x = getButtonX(index);
M5.Display.fillRoundRect(x, TOUCH_BUTTON_Y, TOUCH_BUTTON_WIDTH,
TOUCH_BUTTON_HEIGHT, 5, TFT_DARKGREY);
M5.Display.drawRoundRect(x, TOUCH_BUTTON_Y, TOUCH_BUTTON_WIDTH,
TOUCH_BUTTON_HEIGHT, 5, TFT_ORANGE);
M5.Display.setTextDatum(MC_DATUM);
M5.Display.setTextColor(TFT_WHITE, TFT_DARKGREY);
M5.Display.drawString(label, x + TOUCH_BUTTON_WIDTH / 2,
TOUCH_BUTTON_Y + TOUCH_BUTTON_HEIGHT / 2);
}
void showStatus(const char *action)
{
const uint8_t state = relay.getAllRelayState();
M5.Display.fillScreen(TFT_BLACK);
M5.Display.setTextColor(TFT_WHITE, TFT_BLACK);
M5.Display.setTextSize(2);
M5.Display.setTextDatum(TL_DATUM);
M5.Display.drawString("Module13.2 4Relay", 8, 8);
M5.Display.drawString(action, 8, 32);
for (uint8_t index = 0; index < 4; ++index) {
const bool isOn = (state >> index) & 0x01;
M5.Display.setCursor(8, 60 + index * 26);
M5.Display.printf("CH%u: %s%s", index + 1, isOn ? "ON" : "OFF",
index == currentChannel ? " <" : "");
}
Serial.printf("%s | relay state: 0x%02X\n", action, state);
drawTouchButton(0, "STEP");
drawTouchButton(1, "ALL ON");
drawTouchButton(2, "ALL OFF");
}
void setup()
{
M5.begin();
Serial.begin(115200);
while (!relay.begin(relayWire, MODULE_4RELAY_ADDR, RELAY_SDA, RELAY_SCL,
200000L)) {
Serial.println("4RELAY INIT ERROR");
M5.Display.fillScreen(TFT_BLACK);
M5.Display.setTextColor(TFT_RED, TFT_BLACK);
M5.Display.setTextSize(2);
M5.Display.setTextDatum(TL_DATUM);
M5.Display.drawString("4RELAY INIT ERROR", 8, 8);
delay(1000);
}
Serial.println("4RELAY INIT SUCCESS");
relay.setAllRelay(false);
showStatus("Ready");
}
void loop()
{
M5.update();
const auto touch = M5.Touch.getDetail();
if (touch.wasClicked()) {
switch (getTouchedButton(touch.x, touch.y)) {
case 0: {
const bool nextState = !relay.getRelayState(currentChannel);
const bool success = relay.setRelay(currentChannel, nextState);
currentChannel = (currentChannel + 1) % 4;
showStatus(success ? "Channel updated" : "Channel update error");
break;
}
case 1: {
const bool success = relay.setAllRelay(true);
showStatus(success ? "All ON" : "All ON error");
break;
}
case 2: {
const bool success = relay.setAllRelay(false);
showStatus(success ? "All OFF" : "All OFF error");
break;
}
default:
break;
}
}
delay(20);
}
程序启动后,CoreS3 屏幕会显示 4 路继电器状态,< 表示当前待切换的通道。
STEP:切换当前通道,随后自动选择下一通道。ALL ON:打开 4 路继电器。ALL OFF:关闭 4 路继电器。请先使用万用表或符合规格的低压直流负载验证 COM 和 NO 端子的通断状态,再接入实际负载。
