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 lineThanks
Felix
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login