Round Display with Xiao C3, C6, S3 & S3-Plus Test Examples

Hi there

And Welcome Here..

So, the Round with an S3 Plus gives You all you need. You can connect anything to it, check out my 6 Sensor Node demo, video, or the Breakdown video of how its connected to the B2B connector with more_I/O board attached,

best viewed Full screen :grin:

HTH
GL :slight_smile: PJ :v:

The Grow R558S is a round, ring-mount capacitive fingerprint module with an integrated RGB ring indicator light. Internally, it uses the Synochip/Grow protocol compatible with standard R502 / R503 / AS608 command sets over TTL UART.

Hardware Pinout & Wiring

The R558S uses a 6-pin 1.0mm pitch harness (colors are typical for Grow modules; check your cable labeling):

  • Pin 1 (Red): VCC (3.3V power)

  • Pin 2 (Yellow): TXD $\rightarrow$ Connects to MCU RX (3.3V TTL)

  • Pin 3 (White): RXD $\rightarrow$ Connects to MCU TX (3.3V TTL)

  • Pin 4 (Black): GND (Ground)

  • Pin 5 (Blue): WAKEUP / TOUCH_OUT (Active HIGH pulse when finger touches sensor; tie to an ESP32 wake pin to keep the MCU in deep sleep until touched)

  • Pin 6 (Green): 3.3V_TOUCH (Powers the capacitive touch detection circuit; typically tied together with Pin 1 VCC)

You need to enroll the print first , FYI…
Here is a test code, you can try.

#include <Adafruit_Fingerprint.h>

// Set to your hardware serial pins
#define SENSOR_RX_PIN 44  // Connects to R558S Yellow (TX)
#define SENSOR_TX_PIN 43  // Connects to R558S White (RX)

HardwareSerial mySerial(1);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);
  Serial.println("\n--- Grow R558S Test ---");

  // R558S default UART: 57600 baud, 8N1
  mySerial.begin(57600, SERIAL_8N1, SENSOR_RX_PIN, SENSOR_TX_PIN);
  finger.begin(57600);
  delay(150);

  if (finger.verifyPassword()) {
    Serial.println("Found R558S sensor!");
  } else {
    Serial.println("Sensor not found. Check power, swapped RX/TX, or baud rate.");
    while (1) { delay(10); }
  }

  finger.getParameters();
  Serial.print("Sensor capacity: "); Serial.println(finger.capacity);
  Serial.print("Device address: 0x"); Serial.println(finger.device_addr, HEX);
}

void loop() {
  uint8_t p = finger.getImage();
  if (p == FINGERPRINT_NOFINGER) {
    delay(50);
    return;
  }

  if (p == FINGERPRINT_OK) {
    Serial.println("Finger detected!");
    p = finger.image2Tz();
    if (p == FINGERPRINT_OK) {
      p = finger.fingerSearch();
      if (p == FINGERPRINT_OK) {
        Serial.print("Match found! ID #"); Serial.print(finger.fingerID);
        Serial.print(" (Confidence: "); Serial.print(finger.confidence); Serial.println(")");
      } else {
        Serial.println("No match in database.");
      }
    }
  }
  delay(500);
}

Controlling the RGB Ring LED

// Modes: 1 = Breathing, 2 = Flashing, 3 = Always ON, 4 = Always OFF
// Colors: 1 = Red, 2 = Blue, 3 = Purple (Combine red+blue)
// Speed: 0x00 to 0xFF; Count: 0 = infinite, 1-255 = cycle count

// Example: Flash Blue 2 times quickly (successful match)
finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 2);

// Example: Solid Red for 1 second (access denied)
finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED, 0);

The R558S ring light can be driven using the LEDcontrol command provided in the Adafruit library:
:wink: GL :v: