Open Google map, input starting point and destination then the distance will display in your screen. Compared to traditional maps, the current electronic maps are of vast information and better distance calculation. However, how could it counts the distance? Is it uses satellite, tape or other tools? Satellite can explore topography and land resource but lack of precision; tape is inflexible and distance limited. Except these tools, is there anything else? Couple of days before, I was suddenly to find a man who holds a wheel rolling along the road. I was incontinent of curiosity, I came to talk with the man and knew he is a map worker and used the wheel to measure distance then draw routes. The distance measure wheel is convenient to take, flexible and precise. How could I resist its temptation to make a measuring wheel?

1.jpg图2.jpg图3.jpgRelative to old tape, the wheel can slip freely and detect positive and negative (slip to left is positive, slip to right is negative). Let us see the working process. 

ImageHardware Diagram

配件图.jpgMain Hardware

DFRduino UNO R3 that fully compatible with Arduino UNO R3 

Incremental Photoelectric Rotary Encoder - 400P/R 

Gravity: I2C 16x2 Arduino LCD with RGB Backlight Display
Cable Adapter Module 4
Gravity: IO Expansion Shield for Arduino V7.1
Digital Push Button (.NET Gadgeteer Compatible)
7.4V Lipo 2500mAh Battery (Arduino Power Jack)
D80mm Silicone Wheel For TT Motor

Circuit Diagram

Real Connected Picture3.jpgRendering
Reset: you could clear up data and make a restart measurement more convenient in this mode.

2.jpgDetection: You can measure distance freely, up to down, right to left in this mode. Slipping to left, the value is positive; slipping to right, the result is negative (when the value is a positive one, rolling right and the result is decreasing).

1.jpgDSC_4781.jpgLock: when the measurement finished, you need to keep data. In this mode, all data is locked and would not change that helps you record results. It works with simply three presses.

I have print a crust by 3D printer to make it convenient to take and more beautiful. Is it looks a little unnatural? The crust is too square. I am sorry but I have tried my best. I believe your ideas must better than mine. The 3D printing file is in the end page.
*Caution: I have make a 80mm hub with 3D printer to suit the wheel.Tires of quality enviromentally friendly D80mm Silicone Wheel For TT Motor is still in use.

2.jpg1.jpg2.jpgCode

#include <Wire.h>
#include "DFRobot_RGBLCD.h"
DFRobot_RGBLCD lcd(0x7c >> 1, 0xc0 >> 1, 16, 2);
//rgb_lcd lcd;
#define A 3
#define B 4
#define Key  12//key
#define D 79 //Diameter 79mm
float C = 0; //perimeter
unsigned int Distance;
int VA = 0;
int VB = 0;
unsigned long Count = 0;//count
unsigned int Count_1 = 0; //Negative count
unsigned char flag = 1, Mark = 0;
unsigned long lasttime = 0, Modetime = 0;
//Length measurement range is ± 6 M
void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.setRGB(255, 255,0);
  lcd.setCursor(2, 0 );
  lcd.print("M:");
  lcd.setCursor(2, 1 );
  lcd.print("D:");
  lcd.setCursor(12, 1 );
  lcd.print("cm");
  pinMode(A, INPUT_PULLUP); //Pull-up input
  pinMode(B, INPUT_PULLUP);
  pinMode(Key, INPUT);
  attachInterrupt(1, interrupt, RISING);
  C = D * PI;
}
void loop()
{
  if (millis() - 150 > lasttime)//Detect keys once every 150ms
  {
    if (digitalRead(Key) == HIGH)
      if (digitalRead(Key) == HIGH)
        Mark += 1;
    if (Mark > 2)
      Mark = 0;
    while (digitalRead(Key) == HIGH);
    lasttime = millis();
  }
  if (millis() - 100 > Modetime)//Refresh the data every 100ms
  {
    if (Mark == 0) //Cleared
    {
      lcd.setCursor(6, 0 );
      lcd.print("Reset    ");
      Distance = C * Count / 40;
      flag = 3;
      lcd.setCursor(11, 0 );
      lcd.print("     ");
    }
    if (Mark == 1) //Calculate the measured value
    {
      lcd.setCursor(6, 0 );
      lcd.print("Detection");//
      lcd.setCursor(4, 1 );
      if (Count > 0 && Count < 0xffff)//Determine whether the length is positive
      {
        lcd.print('-');//The length is negative
        Distance = C * Count / 40;
      }
      else if (Count == 0 && Count_1 == 0 )//Determine whether the length is zero...
Read more »