Use of hall effect sensor to measure close proximity

Hello,

I'm planning on using SS495B hall effect sensor to measure close proximity of o8x5 magnet which will be moving back and forth by about 1mm. Magnet will be 4-5mm away from sensor, but I can put it closer.

There is drawing of sensor I'm going to make:

http://scr.hu/0a3o/n78e8

Hall effect sensor - black,
Magnet - grey,
Piston which will be moving back and forth - green,
Alloy casing - red and yellow.

Now, the question is:
Will it work, and will I be able to measure it with arduino? I want some nice analog changes, not like 10 steps.

It's possible with a careful choice of the magnet or hall sensor, and possibly with an amplifier for signal conditioning. Check yourself, whether your magnet is too strong for such a small distance.

The sensor is digital. It will switch on/off only, well suited to be used for interrupt control

Example with a similar sensor. It will print out time since 'last passing'
(your sensor may have different connections !!)

/* Eksempelprogram for magnetsensor 
 * Hall-elementet (sensoren)  A3144 er brukt 
 * Tilkopling: -------
 *             ||   ||
 *             ||   ||
 *             ||   ||
 *             -------
 *              | | |
 *              1 2 3
 * Sensor Pin 1(Ucc) -> 5V
 * Sensor Pin 2(Gnd) -> 0V (Gnd)
 * Sensor Pin 3(Out) -> digital pin 2 (som er interrupt 0)
 * utganen er 'open-collector' og må derfor ha pullup-resistor
 * se databladet :https://www.mpja.com/download/a3144eul.pdf
 * (som også ligger tå its..)
 * 
 * Tanken bak:    Hver gang sensoren trigges, setter den
 * et 'flagg'.  Det er hovedprogrammet som hele tiden må sjekke om 
 * flagget er satt.
 * Dersom flagget er satt vil hovedprogrammet resette det, samt notere
 * tidspunktet.  For å kunne beregne tiden siden 'forrige' gang, må
 * også 'forrige' tidspunkt lagres..
 */
 
unsigned long forrige, nu, tid; // skal lagre 'millisekunder'
volatile boolean harPassert;  // volatile fordi den brukes av interruptrutinen
float sekPerRunde; // 'rundetid'(som er 1/tid)

void setup()
{
  pinMode(2,INPUT_PULLUP); // OBS MÅ kople inn 30k resistor
  Serial.begin(115200); // kun for testingen
  attachInterrupt(0, tick, FALLING); // pinne 2 interrupt
}

void loop()
{
  if (harPassert) // HVIS der har vært et interrupt.:
  {
    forrige = nu;  // husk 'forrige' tid
    nu = millis();  // notér ny tid
    tid = nu - forrige; // finn differansen - altså tid fir én runde
    sekPerRunde = tid/1000.0; // sek/runde (1000 fordi det er millisek)
    Serial.println(sekPerRunde);
    harPassert=false; // tilbakestill interruptflagget
  }
  // her er resten av programmet
  // Du ser at seksjonen over blir utført KUN når magnetsensoren
  // har varslet 'passert' (flagget er satt)
}

void tick() // interruptrutine.. slike rutiner SKAL være korte!
{
  harPassert = true; 
  // sett 'flagget' for å vise at et intr. har skjedd
}