vishal soni
Created August 31, 2025 © MIT

The Wio-pad

A peripheral (physical Key pad) that connects Wio modules to communicate either Wio node-to-node or Wio-to-phone (through Meshtastic).

IntermediateWork in progress4 days34

Things used in this project

Hardware components

Wio Tracker L1 Meshtastic Node
×1
Li-Ion Battery 1000mAh
Li-Ion Battery 1000mAh
×1
Grove Female Connectors
×1
WS2812B-2020 Addressable RGB pixel LED
×4
Tact Switch-TK-023-2 Pins 3*4 mm
×41
5P Magnetic Spring Loaded Pogo Pin Male Female Connector Socket
×1
5Pin Male Right Angle Berg Header Connector 6mm - 2.54mm Pitch
×1

Software apps and online services

Meshtastic
Meshtastic
Fusion
Autodesk Fusion
VS Code
Microsoft VS Code
PlatformIO IDE
PlatformIO IDE
Arduino IDE
Arduino IDE
Meshtastic web flasher

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Paste, Rework
Solder Paste, Rework
Multitool, Screwdriver
Multitool, Screwdriver
Vernier scale

Story

Read more

Custom parts and enclosures

Wio tracker enclosure with pogo magnetic connector

while all the files for wio tracker l1 reamain same

Enclosure for The Wio-pad

step file

Schematics

schmatic diagram

The Wio-pad

Layout diagram

The Wio-pad

The gerber file for pcb

Code

Code for Wio-pad

C/C++
comment
#include <Wire.h>
#include <Keypad.h>
#include <Adafruit_NeoPixel.h>

// Keypad configuration (your original setup)
const byte ROWS = 4;
const byte COLS = 10;

char keys[ROWS][COLS] = {
  {'1','2','3','4','5','6','7','8','9','0'},
  {'q','w','e','r','t','y','u','i','o','p'},
  {'a','s','d','f','g','h','j','k','l','!'},
  {'*','-','z','x','c','v','b','n','m',','}
};

byte rowPins[ROWS] = {12, 13, A0, A1};
byte colPins[COLS] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

// Keypad library instance
Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// WS2812B LED setup
#define LED_PIN A3
#define NUM_LEDS 1
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

// Send button
const int send_pin = A2;
bool send_pin_state = false;

// Last key to send over I2C
char lastKey = 0;

void setup() {
  Wire.begin(8);               // I2C slave address
  Wire.onRequest(requestEvent);

  pinMode(send_pin, INPUT_PULLUP);

  strip.begin();
  strip.show();

  // Simple startup animation (red fade-in)
  for (int i = 0; i < 256; i += 5) {
    strip.setPixelColor(0, strip.Color(i, 0, 0));  // Red brightness increases
    strip.show();
    delay(10);
  }
  delay(500);

  strip.setPixelColor(0, 0);  // Turn off LED after animation
  strip.show();
}

void loop() {
  char customKey = customKeypad.getKey();

  // Detect send button press
  if (!digitalRead(send_pin) && !send_pin_state) {
    lastKey = '{';    // Special send indicator
    send_pin_state = true;
  }

  if (digitalRead(send_pin) && send_pin_state) {
    send_pin_state = false;
  }

  // Capture keypad keypress
  if (customKey) {
    lastKey = customKey;
  }

  delay(1);
}

// I2C request event: send the last key and reset it
void requestEvent() {
  Wire.write(lastKey);
  lastKey = 0;
}

Credits

vishal soni
10 projects • 12 followers
Engineer ,Electronic Enthusiast

Comments