Core2 with 4 Relay UNIT, example code crashes
-
Hi there,
Using the Arduino example sketch for the 4 Relay UNIT (not the MODULE) my Core2 constantly crashes / reboots on an endless loop. It does appear to get through most of the setup code before rebooting. ie the LCD will display until I'm guessing it hits the 'relay.Init(0);' line and this brings everything to a halt.
The stranger thing is though that this happens IF I'm lucky enough to get the compiled code to the Core2 - if I compile/upload again there's a 50/50 chance the compiler will error on:...\AppData\Local\Temp\.arduinoIDE-unsaved20231020-21796-14ea59g.a188\Unit_4RELAY_M5Core2\Unit_4RELAY_M5Core2.ino: In function 'void loop()': ...\AppData\Local\Temp\.arduinoIDE-unsaved20231020-21796-14ea59g.a188\Unit_4RELAY_M5Core2\Unit_4RELAY_M5Core2.ino:100:23: error: 'class UNIT_4RELAY' has no member named 'LED_ALL' relay.LED_ALL(1); // Turn on all the lights. 打开所有的灯 ^~~~~~~ ...\AppData\Local\Temp\.arduinoIDE-unsaved20231020-21796-14ea59g.a188\Unit_4RELAY_M5Core2\Unit_4RELAY_M5Core2.ino:106:23: error: 'class UNIT_4RELAY' has no member named 'LED_ALL' relay.LED_ALL(0); // Turn off all the lights. 关闭所有的灯 Compilation error: 'class UNIT_4RELAY' has no member named 'LED_ALL'
If I continue to compile after a time it will finish & upload, but then crash as above.
I'm only here after running into problems with the same 4 Relay UNIT with the Cardputer - the same happened there so I thought hang on, I'll try with my Core2 lying around and see how that works, and bring it back to the Cardputer from there... no luck!
/* ******************************************************************************* * Copyright (c) 2021 by M5Stack * Equipped with M5Core2 sample source code * 配套 M5Core2 示例源代码 * Visit for more information: https://docs.m5stack.com/en/unit/4relay * 获取更多资料请访问: https://docs.m5stack.com/zh_CN/unit/4relay * * Product: Unit 4RELAY. * Date: 2022/7/22 ******************************************************************************* Please connect to port A,Control 4 relays and demonstrate the asynchronous control relay LED 请连接A端口,控制4继电器,并演示异步控制继电器LED ------------------------------------------------------------------------------- RELAY control reg | 0x10 ----------------------------------------------------------------------------- Relay_ctrl_mode_reg[0] | R/W | System control | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | R | R | R | R | R | R | R | Sync Mode | | -Sync Mode:0 LED&Relay Async | -Sync Mode:1 LED&Relay Sync --------------------------------------------------------------------------------- Relay_ctrl_mode_reg[1] | R/W | Relay & LED control | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | LED1| LED2| LED3| LED4| RLY1| RLY2| RLY3| RLY4| -------------------------------------------------------------------------------*/ // Note: The relay can only be controlled in synchronous mode, if the relay is // controlled in asynchronous mode, it will be invalid. // 注意:只能在同步模式下控制继电器,如果在异步模式下对继电器进行控制将无效,. #include <M5Core2.h> #include "Unit_4RELAY.h" UNIT_4RELAY relay; void setup() { M5.begin(true, false, true, true); // Init M5Core2 And the I2C port(21,22). // 初始化 M5Core2 和I2C(21,22)端口 M5.Lcd.setCursor( 80, 0, 4); // Set the cursor position to (80,0). 将光标位置设置为(80,0) M5.Lcd.print("4-RELAY UNIT\n\n"); M5.Lcd.print(" Relay State: \n Sync Mode: "); M5.Lcd.setCursor(0, 220, 2); M5.Lcd.print("Independent switch Sync/Async ALL relay"); relay.Init(0); // Set the lamp and relay to asynchronous mode(Async = // 0,Sync = 1). 将灯和继电器设为非同步模式 } char count_i = 0; bool sync_flag = 0, all_flag = 0; void loop() { M5.update(); // Check button down state. 检测按键按下状态 if (M5.BtnA.wasPressed()) { // If button A is pressed. 如果按键A按下 M5.Lcd.fillRect(160, 50, 100, 20, BLACK); M5.Lcd.setCursor(160, 50, 4); if (count_i < 4) { M5.Lcd.printf("%d ON", count_i + 1); if (sync_flag) { relay.relayWrite( count_i, 1); // Open the relay at Count_i. 打开count_i处的继电器 } else relay.ledWrite(count_i, 1); // Turn on count_I to get led lights. // 打开count_i出得led灯 } else { M5.Lcd.printf("%d OFF", (count_i - 3)); if (sync_flag) { relay.relayWrite( (count_i - 4), 0); // Close the relay at Count_i. 关闭count_i处的继电器 } else relay.ledWrite( (count_i - 4), 0); // Turn off the COUNt_I leds. 关闭count_i出得led灯 } count_i++; if (count_i >= 8) count_i = 0; } else if (M5.BtnB.wasPressed()) { sync_flag = !sync_flag; relay.switchMode(sync_flag); M5.Lcd.fillRect(160, 80, 100, 20, BLACK); M5.Lcd.setCursor(160, 80, 4); if (!sync_flag) { M5.Lcd.print("Async"); } else { M5.Lcd.print("Sync"); } } if (M5.BtnC.wasPressed()) { all_flag = !all_flag; M5.Lcd.fillRect(160, 50, 100, 20, BLACK); M5.Lcd.setCursor(160, 50, 4); if (all_flag) { M5.Lcd.printf("ALL.ON "); if (sync_flag) relay.relayAll(1); // Open all the relays. 打开所有的继电器 else relay.LED_ALL(1); // Turn on all the lights. 打开所有的灯 } else { M5.Lcd.printf("ALL.OFF"); if (sync_flag) relay.relayAll(0); // Close all relays. 关闭所有的继电器 else relay.LED_ALL(0); // Turn off all the lights. 关闭所有的灯 } } }
Any ideas would be much appreciated.
-
Hello @Pugmartin
you are correct, the example is broken in at least two ways. Firstly it doesn't compile and secondly a statement is missing.
I had success compiling using the example here.
To fix the crash it needs a small fix in
setup()
- add this line beforerelay.init(0)
:relay.begin(); // new line relay.init(0); // existing line
Thanks
Felix