state change detection for counting pulses

Hello,
asi my name is David.Sorry for my english,I hope you can understand.
I'm using the "state chane detection" project as it is, for detecting the rpm of a wheel, transforming these rpm after into Speed.
I'm using a Bicycle sensor (inductive sensor with a magnet).Apparently it works but I have 2 problems:

  1. when the magnet, fixed to the wheel, passes in front of the sensor it counts sometimes 2 times, like it had detected twice...
    I think I could resolve this by introducing a delay on "State change detection" project.Could It be?

  2. I connect my Arduino UNO to the computer.When I supply DC Voltage through the car to the laptop ,the Arduino project works very unstable counting on a crazy way multiple "pushes".
    The only way to solve this problem is with the laptop not connected to any external supply.
    What could be the cause? How can solve it?

Thank you in advance for your help!!!

Best regards

David

  1. when the magnet, fixed to the wheel, passes in front of the sensor it counts sometimes 2 times, like it had detected twice...
    I think I could resolve this by introducing a delay on "State change detection" project.Could It be?

The technique is referred to as debouncing. Better than delay(), though, is to record when the pulse occurs, and ignore any new pulse that follows too closely.

When I supply DC Voltage through the car to the laptop ,the Arduino project works very unstable counting on a crazy way multiple "pushes".
The only way to solve this problem is with the laptop not connected to any external supply.
What could be the cause? How can solve it?

The laptop should be filtering the power well enough to handle this. However, automotive electrical systems are VERY noisy, and not a good source of power for things that need stable power.

"The technique is referred to as debouncing. Better than delay(), though, is to record when the pulse occurs, and ignore any new pulse that follows too closely."

Cold you please explain a little bit more how can I do it?
If it won't be too much could yoy write the line on the project...

I'm quite new on Arduino and it's not so easy for me.

Greeting s from Spain!

If it won't be too much could yoy write the line on the project...

Show your code. I'll show you how to modify it.

thanks...
the code...

/*
State change detection (edge detection)

Often, you don't need to know the state of a digital input all the time,
but you just need to know when the input changes from one state to another.
For example, you want to know when a button goes from OFF to ON. This is called
state change detection, or edge detection.

This example shows how to detect when a button or button changes from off to on
and on to off.

The circuit:

  • pushbutton attached to pin 2 from +5V
  • 10K resistor attached to pin 2 from ground
  • LED attached from pin 13 to ground (or use the built-in LED on
    most Arduino boards)

created 27 Sep 2005
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

*/

// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 13; // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(19200);
}

void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
// Serial.println("on");
// Serial.print("n pulsos: ");
Serial.println(buttonPushCounter);
}
else {
// if the current state is LOW then the button
// wend from on to off:
// Serial.println("off");
}
}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;

// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}

}

Add a global variable, lastEvent, of type unsigned long.
Add a global variable, interval, of type unsigned long. Assign it a debounce time. Maybe 10 milliseconds.

// compare the buttonState to its previous state
  if (buttonState != lastButtonState)
  {
    // if the state has changed, increment the counter
    if (buttonState == HIGH && millis() - lastEvent > interval) // <-- Ignore this press if it is too close to the last one
    {
      lastEvent = millis(); // <-- record when the last good event occurred

Thank you Paul!!!
Finally it works.At first I tried with 10 ms, but it wasn't enough.After calcualting it , I tried with 20 ms and it works fine!Taking in account the wheel diameter I can use up to 200 km/h speed without problems.

MAy I put another question?...
I have my arduino project connect through usb to the computer to an excel file using netcomm.
I'm worried if I have a problem , for example ,if I lose the connection ( power failure of the laptop,mementary disconnection of the usb cable).I'm thinking to add additional DC current to Arduino if this happens, but....
when I run the excel file again, how can I recover the counted pulses of the arduino project?

here, the code:

/*
State change detection (edge detection)

Often, you don't need to know the state of a digital input all the time,
but you just need to know when the input changes from one state to another.
For example, you want to know when a button goes from OFF to ON. This is called
state change detection, or edge detection.

This example shows how to detect when a button or button changes from off to on
and on to off.

The circuit:

  • pushbutton attached to pin 2 from +5V
  • 10K resistor attached to pin 2 from ground
  • LED attached from pin 13 to ground (or use the built-in LED on
    most Arduino boards)

created 27 Sep 2005
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.

*/

// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 13; // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastEvent = 0; // the last time the output pin was toggled
long interval = 20; // the debounce time; increase if the output flickers

void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
// initialize serial communication:
Serial.begin(19200);
}

void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState)
{
// if the state has changed, increment the counter
if (buttonState == HIGH && millis() - lastEvent > interval) // <-- Ignore this press if it is too close to the last one
{
lastEvent = millis(); // <-- record when the last good event occurred

buttonPushCounter++;
// Serial.println("on");
// Serial.print("n pulsos: ");
Serial.println(buttonPushCounter);
}
else {
// if the current state is LOW then the button
// wend from on to off:
// Serial.println("off");
}
}
// save the current state as the last state,
//for next time through the loop
lastButtonState = buttonState;

// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (buttonPushCounter % 4 == 0) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}

}

I'm thinking to add additional DC current to Arduino if this happens, but....
when I run the excel file again, how can I recover the counted pulses of the arduino project?

Adding more current to the Arduino will not stop the PC from crashing/disconnecting/etc.

Adding an SD card/shield would give you an alternate place to store data.