From 1e72f3c44b21631c5a31f11bdc6aab32020134e0 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 19 Oct 2025 15:07:21 +0900 Subject: [PATCH 01/10] init copied from Unit_Encoder_M5Core2 rename cleanup comment --- .../Unit_Encoder_M5Unified.ino | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino new file mode 100644 index 0000000..9a048a8 --- /dev/null +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -0,0 +1,45 @@ +/* + Display of rotary encoder values and key status on the screen +*/ +#include +#include +#include "Unit_Encoder.h" + +M5GFX display; +M5Canvas canvas(&display); +Unit_Encoder sensor; + +void setup() { + M5.begin(true, false, true, true); // Init M5Core2. 初始化M5Core2 + sensor.begin(); + display.begin(); + display.setRotation(1); + canvas.setTextSize(2); + canvas.createSprite(160, 80); +} + +signed short int last_value = 0; + +void loop() { + signed short int encoder_value = sensor.getEncoderValue(); + bool btn_status = sensor.getButtonStatus(); + Serial.println(encoder_value); + if (last_value != encoder_value) { + if (last_value > encoder_value) { + sensor.setLEDColor(1, 0x000011); + } else { + sensor.setLEDColor(2, 0x111100); + } + last_value = encoder_value; + } else { + sensor.setLEDColor(0, 0x001100); + } + if (!btn_status) { + sensor.setLEDColor(0, 0xC800FF); + } + canvas.fillSprite(BLACK); + canvas.drawString("BTN:" + String(btn_status), 10, 10); + canvas.drawString("ENCODER:" + String(encoder_value), 10, 40); + canvas.pushSprite(0, 0); + delay(20); +} From 535389cfaaefb2fd34f72b08814b69cff1129236 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 19 Oct 2025 15:31:34 +0900 Subject: [PATCH 02/10] Replaced the M5Core2.h library with M5Unified.h --- .../Unit_Encoder_M5Unified.ino | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index 9a048a8..e42bffa 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -1,21 +1,20 @@ /* Display of rotary encoder values and key status on the screen */ -#include -#include +#include #include "Unit_Encoder.h" -M5GFX display; -M5Canvas canvas(&display); +M5Canvas canvas(&M5.Display); Unit_Encoder sensor; void setup() { - M5.begin(true, false, true, true); // Init M5Core2. 初始化M5Core2 + auto cfg = M5.config(); + cfg.clear_display = true; + cfg.serial_baudrate = 115200; + M5.begin(cfg); sensor.begin(); - display.begin(); - display.setRotation(1); - canvas.setTextSize(2); canvas.createSprite(160, 80); + canvas.setTextSize(2); } signed short int last_value = 0; From 9b3185b5b01b4ccf2bb3f3b7766ee3d283e77034 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 19 Oct 2025 15:39:55 +0900 Subject: [PATCH 03/10] Move Serial.println(encoder_value) Place Serial.println(encoder_value) inside the conditional block (if statement) to print the value only when a change occurs. This prevents continuous output and prints the encoder value only when it has been updated. --- examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index e42bffa..a00921f 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -22,8 +22,8 @@ signed short int last_value = 0; void loop() { signed short int encoder_value = sensor.getEncoderValue(); bool btn_status = sensor.getButtonStatus(); - Serial.println(encoder_value); if (last_value != encoder_value) { + Serial.println(encoder_value); if (last_value > encoder_value) { sensor.setLEDColor(1, 0x000011); } else { From 7f494978fc33ed557056958c414a631b9648fb32 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 19 Oct 2025 15:44:32 +0900 Subject: [PATCH 04/10] modified canvas width Fix: Display cutoff for values over 4 digits. --- examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index a00921f..6d7bc15 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -13,7 +13,7 @@ void setup() { cfg.serial_baudrate = 115200; M5.begin(cfg); sensor.begin(); - canvas.createSprite(160, 80); + canvas.createSprite(M5.Display.width(), 80); canvas.setTextSize(2); } From 97781b31458f06256ebf9ddc588d6003b189c081 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 19 Oct 2025 19:18:18 +0900 Subject: [PATCH 05/10] config: Update metadata for M5Unified example release (v0.0.3) --- library.json | 2 +- library.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index 8026c6b..6f93d17 100644 --- a/library.json +++ b/library.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/m5stack/M5Unit-Encoder.git" }, - "version": "0.0.2", + "version": "0.0.3", "frameworks": "arduino", "platforms": "espressif32" } \ No newline at end of file diff --git a/library.properties b/library.properties index 1b5ce21..4cc01cf 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=M5Unit-Encoder -version=0.0.2 +version=0.0.3 author=M5Stack maintainer=M5Stack sentence=Library for M5Stack Unit Encoder From c248961f1942cfc6bff14acf0cae895c0b3aac6d Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 26 Oct 2025 21:41:53 +0900 Subject: [PATCH 06/10] feat: Improve display flexibility and cross-device compatibility Replaced canvas.drawString with canvas.println/print for display output. This removes fixed coordinate dependencies, allowing for automatic text wrapping and easier porting to M5 controllers with different screen sizes. --- .../Unit_Encoder_M5Unified.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index 6d7bc15..d1546d0 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -1,8 +1,5 @@ -/* - Display of rotary encoder values and key status on the screen -*/ #include -#include "Unit_Encoder.h" +#include M5Canvas canvas(&M5.Display); Unit_Encoder sensor; @@ -37,8 +34,11 @@ void loop() { sensor.setLEDColor(0, 0xC800FF); } canvas.fillSprite(BLACK); - canvas.drawString("BTN:" + String(btn_status), 10, 10); - canvas.drawString("ENCODER:" + String(encoder_value), 10, 40); + canvas.setCursor(0, 0); + canvas.print("BTN: "); + canvas.println(btn_status); + canvas.print("ENC: "); + canvas.println(encoder_value); canvas.pushSprite(0, 0); delay(20); -} +} \ No newline at end of file From a0eb37bdb6a0f4ba807219cfdfe304e8f9cb2c8c Mon Sep 17 00:00:00 2001 From: ito55 Date: Sat, 1 Nov 2025 21:46:34 +0900 Subject: [PATCH 07/10] feat(example): Improve I2C initialization compatibility Enhance the sample sketch to improve compatibility across M5Unified devices, specifically addressing the I2C initialization behavior on ATOMS3. By ensuring the proper I2C context is available before `sensor.begin()`, the example now runs reliably on ATOMS3 and maintains compatibility with other controllers without device-specific pin declarations. --- .../Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index d1546d0..3b9557c 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -9,7 +9,15 @@ void setup() { cfg.clear_display = true; cfg.serial_baudrate = 115200; M5.begin(cfg); - sensor.begin(); + int ex_sda = M5.getPin(m5::ex_i2c_sda); + int ex_scl = M5.getPin(m5::ex_i2c_scl); + Wire.begin(ex_sda, ex_scl); + if (ex_sda >= 0 && ex_scl >= 0) { + Serial.println("Wire.begin(ex_sda, ex_scl) called"); + sensor.begin(&Wire, ENCODER_ADDR, (uint8_t)ex_sda, (uint8_t)ex_scl); // I2C address for encoder: 0x40 (ENCODER_ADDR defined in Unit_Encoder.h) + } else { + sensor.begin(&Wire); + } canvas.createSprite(M5.Display.width(), 80); canvas.setTextSize(2); } From 2b591a5976e13703beb97a1cfe607734a471efec Mon Sep 17 00:00:00 2001 From: ito55 Date: Sun, 2 Nov 2025 12:26:32 +0900 Subject: [PATCH 08/10] refactor: simplify I2C initialization and remove explicit casts for readability --- examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index 3b9557c..625a595 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -11,11 +11,11 @@ void setup() { M5.begin(cfg); int ex_sda = M5.getPin(m5::ex_i2c_sda); int ex_scl = M5.getPin(m5::ex_i2c_scl); - Wire.begin(ex_sda, ex_scl); if (ex_sda >= 0 && ex_scl >= 0) { - Serial.println("Wire.begin(ex_sda, ex_scl) called"); - sensor.begin(&Wire, ENCODER_ADDR, (uint8_t)ex_sda, (uint8_t)ex_scl); // I2C address for encoder: 0x40 (ENCODER_ADDR defined in Unit_Encoder.h) + Wire.begin(ex_sda, ex_scl); + sensor.begin(&Wire, ENCODER_ADDR, ex_sda, ex_scl); // I2C address for encoder: 0x40 (ENCODER_ADDR defined in Unit_Encoder.h) } else { + Wire.begin(); sensor.begin(&Wire); } canvas.createSprite(M5.Display.width(), 80); From f21e60bc55699a020573e766de00dec1ddec5dd9 Mon Sep 17 00:00:00 2001 From: ito55 Date: Tue, 4 Nov 2025 03:20:23 +0900 Subject: [PATCH 09/10] refactor: Simplify I2C initialization for Unit_Encoder Move Wire.begin() into the conditional block to correctly initialize either external or default I2C pins. Simplify the sensor.begin() call to only take the Wire instance, removing redundant pin parameters. This improves code clarity and maintains device compatibility. --- examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index 625a595..1dd33f0 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -13,11 +13,10 @@ void setup() { int ex_scl = M5.getPin(m5::ex_i2c_scl); if (ex_sda >= 0 && ex_scl >= 0) { Wire.begin(ex_sda, ex_scl); - sensor.begin(&Wire, ENCODER_ADDR, ex_sda, ex_scl); // I2C address for encoder: 0x40 (ENCODER_ADDR defined in Unit_Encoder.h) } else { Wire.begin(); - sensor.begin(&Wire); } + sensor.begin(&Wire); canvas.createSprite(M5.Display.width(), 80); canvas.setTextSize(2); } From f282b60405a11b4035c11333941f56fd176c73e7 Mon Sep 17 00:00:00 2001 From: ito55 Date: Sat, 8 Nov 2025 09:00:30 +0900 Subject: [PATCH 10/10] fix(i2c): Remove duplicated I2C initialization --- examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino index 1dd33f0..4aaaf74 100644 --- a/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino +++ b/examples/Unit_Encoder_M5Unified/Unit_Encoder_M5Unified.ino @@ -12,11 +12,10 @@ void setup() { int ex_sda = M5.getPin(m5::ex_i2c_sda); int ex_scl = M5.getPin(m5::ex_i2c_scl); if (ex_sda >= 0 && ex_scl >= 0) { - Wire.begin(ex_sda, ex_scl); + sensor.begin(&Wire, ENCODER_ADDR, ex_sda, ex_scl); // I2C address for encoder: 0x40 (ENCODER_ADDR defined in Unit_Encoder.h) } else { - Wire.begin(); + sensor.begin(&Wire); } - sensor.begin(&Wire); canvas.createSprite(M5.Display.width(), 80); canvas.setTextSize(2); }