Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 29 additions & 78 deletions examples/Modules/StamPLC_IO/GetStatus/GetStatus.ino
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@

M5Canvas canvas(&M5StamPLC.Display);
M5StamPLC_IO stamplc_io;
uint8_t expected_address = 0;
uint8_t last_expected_address = 0;

void setup()
{
/* Init M5StamPLC */
M5StamPLC.begin();
canvas.createSprite(M5StamPLC.Display.width(), M5StamPLC.Display.height());
canvas.setTextScroll(true);
Expand All @@ -22,52 +19,30 @@ void setup()
canvas.setFont(&fonts::efontCN_16);
canvas.println("Try to find M5StamPLC IO");

/* Init M5StamPLC IO */
while (!stamplc_io.begin()) {
canvas.println("M5StamPLC_IO not found, retry in 1s...");
canvas.pushSprite(0, 0);
delay(1000);
}

last_expected_address = expected_address = stamplc_io.getExpectedAddress();
canvas.printf("M5StamPLC IO found in 0x%02X\n", stamplc_io.getCurrentAddress());
canvas.printf("Firmware Version: 0x%02X\n", stamplc_io.getFirmwareVersion());
canvas.printf("Found: 0x%02X FW: 0x%02X\n", stamplc_io.getCurrentAddress(), stamplc_io.getFirmwareVersion());

uint8_t sys_status = stamplc_io.getSystemStatus();
if (sys_status == 0) {
canvas.setTextColor(TFT_GREEN);
canvas.println("System status: Normal");
} else {
canvas.setTextColor(TFT_RED);
canvas.printf("System status: 0x%02X\n", sys_status);
if (sys_status & (1 << M5StamPLC_IO::SYS_CH1_INA226_ERROR)) {
canvas.println("- CH1 INA226 Error");
}
if (sys_status & (1 << M5StamPLC_IO::SYS_CH2_INA226_ERROR)) {
canvas.println("- CH2 INA226 Error");
}
}
canvas.setTextColor(sys_status == 0 ? TFT_GREEN : TFT_RED);
canvas.printf("System: %s\n", sys_status == 0 ? "Normal" : "Error");
if (sys_status & (1 << M5StamPLC_IO::SYS_CH1_INA226_ERROR)) canvas.println("- CH1 INA226 Error");
if (sys_status & (1 << M5StamPLC_IO::SYS_CH2_INA226_ERROR)) canvas.println("- CH2 INA226 Error");

canvas.setTextColor(TFT_CYAN);
canvas.println("INA226 Configuration:");

uint16_t config_ch1, config_ch2;
if (stamplc_io.readINA226Config(1, &config_ch1) == ESP_OK) {
canvas.printf("CH1: 0x%04X", config_ch1);

uint8_t vshct, vbusct, avg;
stamplc_io.getINA226ConversionTime(1, &vshct, &vbusct);
stamplc_io.getINA226Averaging(1, &avg);
canvas.printf(" VS=%d VB=%d AVG=%d\n", vshct, vbusct, avg);
}

if (stamplc_io.readINA226Config(2, &config_ch2) == ESP_OK) {
canvas.printf("CH2: 0x%04X", config_ch2);

uint8_t vshct, vbusct, avg;
stamplc_io.getINA226ConversionTime(2, &vshct, &vbusct);
stamplc_io.getINA226Averaging(2, &avg);
canvas.printf(" VS=%d VB=%d AVG=%d\n", vshct, vbusct, avg);
canvas.println("INA226 Config:");
for (uint8_t ch = 1; ch <= 2; ch++) {
uint16_t cfg;
if (stamplc_io.readINA226Config(ch, &cfg) == ESP_OK) {
uint8_t vs, vb, avg;
stamplc_io.getINA226ConversionTime(ch, &vs, &vb);
stamplc_io.getINA226Averaging(ch, &avg);
canvas.printf("CH%d: 0x%04X VS=%d VB=%d AVG=%d\n", ch, cfg, vs, vb, avg);
}
}

canvas.setTextColor(TFT_YELLOW);
Expand All @@ -88,62 +63,38 @@ void loop()
if (millis() - last_update > 1000) {
last_update = millis();

// Batch read all channels data
int16_t v1, v2;
int32_t i1, i2;
stamplc_io.readAllChannelsData(&v1, &i1, &v2, &i2);

// Read IO control state
uint8_t io_control = stamplc_io.readRegister(M5StamPLC_IO::REG_IO_CONTROL);
uint8_t io_ctrl = stamplc_io.readRegister(M5StamPLC_IO::REG_IO_CONTROL);
uint8_t sys_status = stamplc_io.getSystemStatus();

// Display data
canvas.fillScreen(TFT_BLACK);
canvas.setCursor(0, 0);

// CH1 status
if (sys_status & (1 << M5StamPLC_IO::SYS_CH1_INA226_ERROR)) {
canvas.setTextColor(TFT_RED);
} else {
canvas.setTextColor(TFT_GREEN);
}
canvas.printf("CH1: %d.%02dV %duA \n", v1 / 1000, abs((v1 % 1000)) / 10, i1);
canvas.setTextColor(sys_status & (1 << M5StamPLC_IO::SYS_CH1_INA226_ERROR) ? TFT_RED : TFT_GREEN);
canvas.printf("CH1: %d.%02dV %duA\n", v1 / 1000, abs(v1 % 1000) / 10, i1);

// CH2 status
if (sys_status & (1 << M5StamPLC_IO::SYS_CH2_INA226_ERROR)) {
canvas.setTextColor(TFT_RED);
} else {
canvas.setTextColor(TFT_GREEN);
}
canvas.printf("CH2: %d.%02dV %duA \n", v2 / 1000, abs((v2 % 1000)) / 10, i2);
canvas.setTextColor(sys_status & (1 << M5StamPLC_IO::SYS_CH2_INA226_ERROR) ? TFT_RED : TFT_GREEN);
canvas.printf("CH2: %d.%02dV %duA\n", v2 / 1000, abs(v2 % 1000) / 10, i2);

canvas.setTextColor(TFT_YELLOW);
canvas.printf("Pull-up: CH1=%s CH2=%s \n",
(io_control & (1 << M5StamPLC_IO::BIT_CH1_PU_EN)) ? "ON" : "OFF",
(io_control & (1 << M5StamPLC_IO::BIT_CH2_PU_EN)) ? "ON" : "OFF");
canvas.printf("Pull-up: CH1=%s CH2=%s\n", (io_ctrl & (1 << M5StamPLC_IO::BIT_CH1_PU_EN)) ? "ON" : "OFF",
(io_ctrl & (1 << M5StamPLC_IO::BIT_CH2_PU_EN)) ? "ON" : "OFF");

canvas.setTextColor(TFT_MAGENTA);
canvas.printf("Address: 0x%02X->0x%02X \n", stamplc_io.getCurrentAddress(),
stamplc_io.getExpectedAddress());

// System status
if (sys_status == 0) {
canvas.setTextColor(TFT_GREEN);
canvas.println("System: Normal ");
} else {
canvas.setTextColor(TFT_RED);
canvas.printf("System: Error(0x%02X) \n", sys_status);
}
}
canvas.printf("Addr: 0x%02X DIP: 0x%02X\n", stamplc_io.getCurrentAddress(), stamplc_io.getExpectedAddress());

// Button A: Toggle CH1 pull-up
if (M5StamPLC.BtnA.wasClicked()) {
stamplc_io.toggleIOBit(M5StamPLC_IO::BIT_CH1_PU_EN);
canvas.setTextColor(sys_status == 0 ? TFT_GREEN : TFT_RED);
canvas.printf("System: %s\n", sys_status == 0 ? "Normal" : "Error");
}

// Button B: Toggle CH2 pull-up
if (M5StamPLC.BtnB.wasClicked()) {
stamplc_io.toggleIOBit(M5StamPLC_IO::BIT_CH2_PU_EN);
if (M5StamPLC.BtnA.wasClicked()) stamplc_io.toggleIOBit(M5StamPLC_IO::BIT_CH1_PU_EN);
if (M5StamPLC.BtnB.wasClicked()) stamplc_io.toggleIOBit(M5StamPLC_IO::BIT_CH2_PU_EN);

if (stamplc_io.syncAddress()) {
canvas.printf("Address changed to 0x%02X\n", stamplc_io.getCurrentAddress());
}

canvas.pushSprite(0, 0);
Expand Down
128 changes: 0 additions & 128 deletions examples/Modules/StamPLC_IO/HotPlugDetection/HotPlugDetection.ino

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*
* M5StamPLC IO Multi-Device Hot-Plug Example
*
* Demonstrates hot-plug and DIP-switch address change detection
* for up to 16 M5StamPLC IO modules (I2C address 0x20-0x2F).
*/
#include <Arduino.h>
#include <M5StamPLC.h>

M5StamPLC_IO_Manager io_mgr;

void onConnect(M5StamPLC_IO& dev, uint8_t addr)
{
Serial.printf("[+] 0x%02X online FW=0x%02X DIP=0x%02X\n", addr, dev.getFirmwareVersion(),
dev.getExpectedAddress());
}

void onDisconnect(uint8_t addr)
{
Serial.printf("[-] 0x%02X offline\n", addr);
}

void onAddrChange(uint8_t old_addr, uint8_t new_addr)
{
Serial.printf("[~] DIP change: 0x%02X -> 0x%02X, address applied\n", old_addr, new_addr);
}

void updateDisplay()
{
M5StamPLC.Display.fillScreen(TFT_BLACK);
M5StamPLC.Display.setCursor(0, 0);

M5StamPLC.Display.setTextColor(TFT_GREENYELLOW);
M5StamPLC.Display.println("== Multi IO HotPlug ==");

M5StamPLC.Display.setTextColor(TFT_CYAN);
M5StamPLC.Display.printf("Online: %d\n\n", io_mgr.count());

for (uint8_t i = 0; i < io_mgr.count() && i < 6; i++) {
M5StamPLC_IO* dev = io_mgr.get(i);
uint8_t addr = dev->getCurrentAddress();
M5StamPLC.Display.setTextColor(TFT_GREEN);
M5StamPLC.Display.printf("0x%02X FW:0x%02X", addr, dev->getFirmwareVersion());
M5StamPLC.Display.setTextColor(TFT_YELLOW);
M5StamPLC.Display.printf(" DIP:0x%02X\n", dev->getExpectedAddress());
}
}

void setup()
{
M5StamPLC.begin();
M5StamPLC.Display.setTextScroll(false);
M5StamPLC.Display.setTextSize(1);
M5StamPLC.Display.setFont(&fonts::efontCN_16);

Serial.begin(115200);
Serial.println("\n=== M5StamPLC IO Multi-Device Hot-Plug ===");

io_mgr.onConnect(onConnect);
io_mgr.onDisconnect(onDisconnect);
io_mgr.onAddrChange(onAddrChange);
io_mgr.begin();

updateDisplay();
}

void loop()
{
M5StamPLC.update();
io_mgr.update();
updateDisplay();
delay(1000);
}
Loading
Loading