What breaks this code?

Hi Folks,

I'm testing the following code which is nothing more than a slight variation on the AnalogRead code. I added the while loop which I also tried as a for loop with the same results... my tone does not stop and my serial monitor freezes. Any thoughts?

int pinSpeaker = 11;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(pinSpeaker, OUTPUT); //declare speaker as output
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);

  while (voltage > 0){
    tone(pinSpeaker, 500, 200);
  }
  
}

Thanks in advance!

The while loop is an infinite loop.

Voltage will almost never be zero, and there is nothing in the while loop to change the voltage.

Not the actual problem, that's already pointed out but:

Tourless:

  float voltage = sensorValue * (5.0 / 1023.0);

This line should have 1024, not 1023 :wink: And besides, first going to a voltage might be a bit simpler for us, it is a waste of resources. If you know at which voltage you want to do what you also know at what value that is :wink:

jremington:
The while loop is an infinite loop.

Voltage will almost never be zero, and there is nothing in the while loop to change the voltage.

I see, said the blind man.

if voltage >=1 makes quick work of that problem. Thank you very much for your help!

Uh, no it doesn't. There is still no way for voltage to change inside the loop. Once it enters, it never leaves.

Hi,
Use if... else...

Tom... :slight_smile: