Wio Tracker - GPS, BT3.0, GSM, Arduino Compatible

Wio Tracker - GPS, BT3.0, GSM, Arduino Compatible

SKU 102990824
1 Available
Ships on


Dear Customer,

Thank you for supporting us !

We are deeply sorry that the shipping date of the Wio Tracker is postponed to Jun.22nd due to the late arrival of  raw material. We will push our suppliers to acceletate the delivery and keep updating the shipping status. Really appreciate your support and understanding.

Best Ragards

Seeed Wio Tracker Team

“I like how easy it is to use with the Arduino IDE and Grove ecosystem.” – Lisa Li, Product Manager

The Wio Tracker (Wireless Input Output) is an open source gateway based on the ARM Cortex-M0+ and Arduino M0 MCU which enable faster IoT GPS solutions. This Arduino and Grove compatible development board helps you track nearly any moving thing on the planet and then upload that data wirelessly. By integrating Bluetooth 3.0 and GPRS (an LTE solution is planned for release in Q3), the Wio Tracker allows for flexible communication solutions. While there are GPS/GPRS shields available for Arduino and other development boards, Seeed believes that having a single board solution is the best approach to your project. 

The Arduino and Grove compatibility allows for quicker development through numerous libraries and a supportive community. The GPS library which will be available with the board is not just limited to Arduino – it can function just as well if you chose to develop in C/C++. With 6 Grove connections available developers can plug in any combination of out 180+ sensors and actuators to make any project and solve any problem. Simplifying the prototyping and development phase is our goal.

The Wio Tracker is well suited for outdoor projects where the device can connect to the GPS satellites and provide a real-time location of the item it is attached to. The GPRS provides a moderate bandwidth which allows immediate interaction between the user and device. Some example projects could be a bicycle sharing service, tracking pets or livestock, locating a vehicle, or even keeping track of a child.

We mentioned earlier the Wio Tracker is a gateway to faster IoT solutions — and we meant it! Does your project need a few extra sensors, say a temperature sensor and maybe an accelerometer to tell the object's orientation? Our Grove sensors easily plug into our boards and allow you to quickly prototype and provide your project with a proof of concept. Next we can help you go from a prototype to an engineering sample, working with you to customize your own version of the Wio Tracker. Finally, if you decide to take your project to market we can help you with manufacturing, and even selling your product through our website and channels!

From making a fun GPS based project at home, to manufacturing and selling a GPS product to consumers, Seeed is here to help you succeed.

Key Features

  • Connects with GPS + BeiDou + QZSS – Allowing for Higher Precision Location Around the Globe

  • 99 Channels Allows for Quicker Lock Times

  • GLP Mode - 40% Power Consumption for Normal Mode

  • LOCUS Technology – Records Navigation Data Automatically

  • GPS, GSM, and BT Antennas Included

  • GSM AT Commands: GSM 07.07, 07.05 and enhanced AT Command

  • Bluetooth 3.0 with SPP Profile and HFP-AG Profile

  • 6 Grove Connectors (2x Digital, 2x Analog, 1x UART, 1 I2C)

  • Arduino IDE Compatibility

  • Small Form Factor (54.7mm x 48.2mm)

  • Nano SIM and microSD 2-in-1 Socket

Hardware Overview










ARM Cortex-M0+



256K Bytes Flash
32K Bytes SRAM




Class 4 (2W @850/900MHz)

Class 1 (1W @1800/1900MHz)

AT Command:

GSM 07.07, 07.05 and enhanced AT Command

Low Power Consumption:



GPRS Multi-slot Class 12:

Down to 85.6kbps

Up to 85.6kbps




Peer to Peer Message

SMS broadcast

Text and PDU mode


Echo cancellation

Noise elimination


Bluetooth 3.0:





GPS L1 1575.42MHz

BeiDou B1 1561.10MHz


<2.5 m CEP (2.5m radius)
Time To   First Lock

EPOTM turns on

Cold Start: <15s

Warm Start: <5s





2 x Grove Digital Port

2 x Analog Port
1 x UART
1 x I2C


GSM Antenna
Bluetooth Antenna
GNSS Antenna


USB: Power Supply/Firmware Upload
JST 1.0 Battery Connector
3.5mm Audio Jack (Mic and Sound)

2 Buttons:

GSM Power Button (MC20)

Reset Button (M0)

Speaker Interface
Nano SIM and microSD 2 in 1 Socket







Board (No Battery): 45g

Antennas: 9g


  • For libraries and documents, please visit our Wiki  page.

  • For technical discussion, please come to our Forum.

  • For projects that you would like to share with the community, please visit Recipe.

Additional Quotes from the Team

  • “I am excited to offer a development board with GPS, GPRS, and Bluetooth 3.0 solutions in such a small footprint.” – Ye Xiaobo, Product Manager.

Technical Details

Dimensions54.7mm x 48.2mm x 6mm
WeightG.W 45g    

Questions and Answers

Can you share the full code for the application shown in the demo video?
on Jun 06,2017
Replyupvote ()
#include <Wire.h>#include <ADXL345.h>#include"MC20_Arduino_Interface.h"#include"MC20_Common.h"#include"MC20_GNSS.h"#include <Adafruit_NeoPixel.h>#define RGB_LED_NUM 1#define GROVE_BUTTON_PIN 2#define RGB_LED_PIN 10#define GROVE_POWER_PIN 12unsigned long lastRecordTime = 0;unsigned long nowRecordTime = 0;int ledState = 0;// SMSchar phone[32];// replace"***********"with the phone number of your emergency contactchar preSetPhoneNum[12] ="***********"; char dateTime[32];char buffer[64];char *s = NULL;int inComing = 0;char mymessage[128];int help = 0;GPSTracker gpsTracker = GPSTracker();GNSS gnss = GNSS();Adafruit_NeoPixel pixels = Adafruit_NeoPixel(RGB_LED_NUM, RGB_LED_PIN, NEO_GRB + NEO_KHZ800);ADXL345 adxl; //variable adxl is an instance of the ADXL345 librarybool is_where_message();void send_message(char *_phone, char *_message);void show_led();bool is_dropping();bool is_button_press();void adxl_setting();void get_coordinate(char *_message);void setup(){ SerialUSB.begin(115200); // write high to grove power pin to enable all the Grove ports, // or only Grove D2 port is usable. pinMode(GROVE_POWER_PIN, OUTPUT); digitalWrite(GROVE_POWER_PIN, HIGH); gnss.Power_On(); SerialUSB.println("Power On!"); adxl.powerOn(); adxl_setting(); pixels.begin(); if(!gpsTracker.waitForNetworkRegister()) { SerialUSB.println("Network error!"); return; } while(!gnss.open_GNSS(EPO_RL_MODE)){ delay(1000); } SerialUSB.println("Open GNSS OK.");}void loop(){ show_led(); if (is_dropping()) { SerialUSB.println("dropping"); get_coordinate(mymessage); send_message(preSetPhoneNum, mymessage); MC20_clean_buffer(mymessage, 128); ledState = 2; help = 1; } if (is_button_press()) { SerialUSB.println("pressing"); get_coordinate(mymessage); send_message(preSetPhoneNum, mymessage); MC20_clean_buffer(mymessage, 128); ledState=3; } if (1 == inComing) { if(is_where_message()) { get_coordinate(mymessage); send_message(phone, mymessage); MC20_clean_buffer(mymessage, 128); } } if (MC20_check_readable()) { ledState=3; inComing = 1; }}void get_coordinate(char *_message) { gnss.getCoordinate(); if (help == 0) sprintf(_message,"My coordinates are: Latitude %s, Longitude %s", gnss.str_latitude, gnss.str_longitude); if (help == 1) { sprintf(_message,"Help! I am in danger! My coordinates are: Latitude %s, Longitude %s", gnss.str_latitude, gnss.str_longitude); help = 0; } SerialUSB.println(_message); }bool is_where_message() { MC20_read_buffer(buffer, 64); SerialUSB.println(buffer); if(NULL != (s = strstr(buffer,"+CMTI: \"SM\""))) { //SMS: $$+CMTI:"SM",24$$ char message[128]; int messageIndex = atoi(s+12); gpsTracker.readSMS(messageIndex, message, 128, phone, dateTime); SerialUSB.print("Recv SMS:"); SerialUSB.println(message); SerialUSB.println(phone); if (NULL != (s = strstr(message,"where"))) { MC20_clean_buffer(buffer,64); inComing = 0; return true; } } MC20_clean_buffer(buffer,64); inComing = 0; return false;}void send_message(char *_phone, char *_message) { gpsTracker.sendSMS(_phone, _message); return;}bool is_button_press() { if (digitalRead(GROVE_BUTTON_PIN)) { for (int j=0;j<5;j++) { if (digitalRead(GROVE_BUTTON_PIN) == 0) return false; delay(10); } return true; }}void show_led() { nowRecordTime = millis(); if ((nowRecordTime > lastRecordTime) && (nowRecordTime - lastRecordTime > 300)) { lastRecordTime = nowRecordTime + 1000; // ledState = 0, led turns dark; // ledState = 1, led turns blue, which means idle; // ledState = 2, led turns cyan, which means detected dropping; // ledState = 3, led turns green, which means button is pressed // ledState = 4, led turns red, which means got message if (ledState == 0) { pixels.setPixelColor(0, pixels.Color(0,0,0)); // Moderately bright blue color. pixels.show(); // This sends the updated pixel color to the hardware. ledState = 1; return; } if (ledState == 1) { pixels.setPixelColor(0, pixels.Color(0,0,255)); // Moderately bright blue color. pixels.show(); // This sends the updated pixel color to the hardware. ledState = 0; return; } if (ledState == 2) { pixels.setPixelColor(0, pixels.Color(0,255,255)); pixels.show(); lastRecordTime += 1000; ledState = 0; return; } if (ledState == 3) { pixels.setPixelColor(0, pixels.Color(0,255,0)); pixels.show(); lastRecordTime += 1000; ledState = 0; return; } }}bool is_dropping() { double xyz[3]; double ax,ay,az,a; for (int i=0;i<20;i++) { adxl.getAcceleration(xyz); ax = xyz[0]; ay = xyz[1]; az = xyz[2]; a = ax*ax + ay*ay +az*az; if (a > 0.20) { return false; } delay(15); } return true;}void adxl_setting() { //set activity/ inactivity thresholds (0-255) adxl.setActivityThreshold(75); //62.5mg per increment adxl.setInactivityThreshold(75); //62.5mg per increment adxl.setTimeInactivity(10); // how many seconds of no activity is inactive? //look of activity movement on this axes - 1 == on; 0 == off adxl.setActivityX(1); adxl.setActivityY(1); adxl.setActivityZ(1); //look of inactivity movement on this axes - 1 == on; 0 == off adxl.setInactivityX(1); adxl.setInactivityY(1); adxl.setInactivityZ(1); //look of tap movement on this axes - 1 == on; 0 == off adxl.setTapDetectionOnX(0); adxl.setTapDetectionOnY(0); adxl.setTapDetectionOnZ(1); //set values for what is a tap, and what is a double tap (0-255) adxl.setTapThreshold(50); //62.5mg per increment adxl.setTapDuration(15); //625us per increment adxl.setDoubleTapLatency(80); //1.25ms per increment adxl.setDoubleTapWindow(200); //1.25ms per increment //set values for what is considered freefall (0-255) adxl.setFreeFallThreshold(7); //(5 - 9) recommended - 62.5mg per increment adxl.setFreeFallDuration(45); //(20 - 70) recommended - 5ms per increment //setting all interrupts to take place on int pin 1 //I had issues with int pin 2, was unable to reset it adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT1_PIN ); adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT1_PIN ); adxl.setInterruptMapping( ADXL345_INT_FREE_FALL_BIT, ADXL345_INT1_PIN ); adxl.setInterruptMapping( ADXL345_INT_ACTIVITY_BIT, ADXL345_INT1_PIN ); adxl.setInterruptMapping( ADXL345_INT_INACTIVITY_BIT, ADXL345_INT1_PIN ); //register interrupt actions - 1 == on; 0 == off adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1); adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1); adxl.setInterrupt( ADXL345_INT_FREE_FALL_BIT, 1); adxl.setInterrupt( ADXL345_INT_ACTIVITY_BIT, 1); adxl.setInterrupt( ADXL345_INT_INACTIVITY_BIT, 1);}
on Jun 13,2017 21:46 PM
Replyupvote ()
Thanks, looking forward to the 4G model!  :-)
on Jun 14,2017 04:26 AM
Replyupvote ()
Is this GPRS for 2G, 3G, or 4G LTE?
on Apr 27,2017
Replyupvote ()

Hello, 2G for this version.

And 4G LTE is coming soon.


on Apr 27,2017 09:19 AM
Replyupvote ()
Can you also offer external power option on the LTE model?
on May 09,2017 10:12 AM
Replyupvote ()
Will battery be charged if WIO is connected to the power supply (via mini-USB)?
on Jun 07,2017
Replyupvote ()



on Jun 13,2017 14:30 PM
Replyupvote ()
is that 4G LTE version work in Europe?
on Jun 02,2017
Replyupvote ()

Hello, 4G LTE version is coming soon and yes, I think it works well in Europe. 


on Jun 05,2017 15:23 PM
Replyupvote ()

    View History

    Wio Tracker - GPS, BT3.0, GSM, Arduino Compatible

    SKU 102990824
    1 Available
    Ships on
    • Description
    • Best-sellers
    • Technical Details
    • Questions and Answers
    • View History
    Notify me when it's back in stock

    Free shipping on your first order over $50 or more. Discounted items included!

    Invalid email address.
    * Discount applys on orders over $50, exclueding shipping fee. Fusion service is excluded from this offer