hi,
I was trying to read the number of on/off pulses from a rotary dialer. I found some script from Tom Igoe, and it almost works...as I can count the number of reads from serial to corresponds with the number I dial on the rotary dialer. I have no idea how this code is exactly working...can someone help?
/*
/*
Pulse_in
by Tom Igoe
Reads the values from a Memsic 2125 2-axis accelerometer.
In order to do so, uses a function called pulseIn, which reads
the width of a pulse on a pin.
Created 11 Feb. 2006
*/
int ledPin = 13; // choose the pin for the LED
int inPin = 7; // choose the input pin (for a pushbutton)
int val = 0; // variable for reading the pin status
int p;
// Function prototypes:
int pulseIn(int inPin, int desiredState);
void setup() {
beginSerial(9600);
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inPin, INPUT); // declare pushbutton as input
printString("Starting\r\n");
}
void loop() {
p = pulseIn(inPin, HIGH); // read pulsewidth
printString("got a roll\n");
printInteger(p); // print p value
printString("\r\n"); // print return character and newline character
val = digitalRead(inPin); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(ledPin, HIGH); // turn LED on
} else {
digitalWrite(ledPin, LOW); // turn LED off
}
}
/////////////////////////////////////////
/*
pulseIn function. reads the width of a pulse on a pin.
Takes a pin number and the desired state, HIGH or LOW.
Watches for the pin to change from the non-desired state to
the desired state, then counts loops until the pin changes
back again.
*/
int pulseIn(int inPin, int desiredState) {
int count = 0; // local counter
int finalCount = 0; // final number of loops the pulse takes
int pinState; // state of the pin you're watching
int lastState = desiredState; // place to store the previous state of the pin
int difference = 0;
while (finalCount <= 0) {
pinState = digitalRead(inPin);
difference = pinState - lastState;
if ((difference > 0) &&(desiredState == HIGH)) {
// start counting pulses
count++;
}
if ((difference < 0) &&(desiredState == HIGH)) {
// stop counting pulses
finalCount = count;
count = 0;
}
if ((difference < 0) &&(desiredState == LOW)) {
// start counting pulses
count++;
}
if ((difference > 0) &&(desiredState == LOW)) {
// stop counting pulses
finalCount = count;
count = 0;
}
// save the state of the pin as the old state,
// so we can get a new state to compare it to:
lastState = pinState;
}
// you're done. Return the final count:
return finalCount;
}
http://www.tigoe.net/pcomp/code/archives/arduino/000748.shtml