# execute only one function between an interval

Hi,

I'm trying to control the volume of my Macbook with a potentiometer hooked up to the Arduino. Every time the potentiometer get between a certain interval, the Arduino should send a volume control message to my mac. It should send ONE volume message per interval, for example between the values 0-64, 65-124 and so on.

The problem: The Arduino sends multiple messages per interval. What can I do to make sure it only sends one volume message per interval?

``````  a = analogRead(A5);
void loop() {
for (int i=0; i <16; i++) {
if (a>= i*0 && a <=i*64   && (a-value) > 5) {   //if pot is turned left, send volume up
//UP();
Serial.print("UP");
Serial.println(i);
value = a;
}
if (a>= i*0 && a <=i*64  && (a-value) < -5) {   //if pot is turned right, send volume down
//DOWN();
Serial.print("DOWN");
Serial.println(i);
value = a;
}
}
}
``````

with kind regards,
Bas

You need a variable to record the fact that the data has been sent so that your code will know not to send it twice.

...R

I have tried that (I think..) I've tried it with a boolean for every interval, but this doesn't work either. I think I am doing something wrong with this variable/boolean but I don't know what.

``````for( int i=0; i> 16; i++) {

if (a>= i*0 && a <=i*64   && (a-value) > 5 && boolean[i]) {
//UP();
value = a;
boolean[i] = false;
}
if (a>= i*0 && a <=i*64  && (a-value) < -5 && !boolean[i]) {
//DOWN();
value = a;
boolean[i] = false;
}}
``````

with kind regards,
Bas

I just noticed in the snippet in your original post that the potentiometer is only read once - that will not be much good.

What about this pseudo code

``````void loop() {
newPotVal = analogRead(potPin);
if (newPotVal != prevPotVal) {
// code here to send value to Mac
prevPotVal = newPotVal;
delay(100); // so as not to send too often
}
}
``````

...R

Well, he's breaking it up into ranges 64/1024ths of the analog range each (ie, 16 blocks).

``````int prevPotValRange;

void loop() {
int newPotVal = analogRead(potPin);
int newPotValRange=newPotVal>>6 //drop the low 6 bits, dividing it by 64; could also divide by 64 directly
if (newPotValRange != prevPotValRange) {
// code here to send value to Mac
prevPotValRange = newPotValRange;
delay(100); // so as not to send too often
}
}
``````

it's working, thanks guys!

``````void loop() {
int a = analogRead(A5);
int b = a/64;
for (int i=0; i <16; i++) {
if ( b == i && (a-value) > 5 && b != c) {
UP();
value = a;
c = b;
}
if ( b == i && (a-value) < -5 && b!= c) {
DOWN();
value = a;
c = b;
}
}
}
``````