Char problem (air quality project)

I'm programming a code that will receive an input from the user (a number) and should turn on one of six lights depending on the value the user sent. But I've been facing this problem with reading the number, this is my code:

char data;
int led1 = 1;
int led2 = 2;
int led3 = 3;
int led4 = 4;
int led5 = 5;
int led6 = 6;

void setup()
{
Serial.begin(9600);
Serial.println("enter the value");
}

void loop()
{
if (Serial.available())
{
data = Serial.readBytes(char, 3);
//data.trim();  
}
if ((data>=0) && (data<=50))
    {
     Serial.println("Good") ;
	 digitalWrite(led1, HIGH);
     delay(500);
    }
    else if ((data>=51) && (data<=100))
    {
     Serial.println("Moderate") ;
 	 digitalWrite(led2, HIGH);
     delay(500);
    }
    else if ((data>=101) && (data<=150))
    {
     Serial.println("Unhealthy for sensitive groups") ;
	 digitalWrite(led3, HIGH);
     delay(500);
    }
    else if ((data>=151) && (data<=200))
    {
     Serial.println("Unhealthy") ;
 	 digitalWrite(led4, HIGH);
     delay(500);
    }
    else if ((data>=201) && (data<=300))
    {
     Serial.println("Very unhealthy") ;
	 digitalWrite(led5, HIGH);
     delay(500);
    }
    else if ((data>=301) && (data<=500))
    {
     Serial.println("Hazardous") ;
	 digitalWrite(led6, HIGH);
     delay(500);
    }
//}
}

help?

You need an integer, not characters. Try Serial.parseInt() - Arduino Reference

That worked, but my code is stuck on loop, the serial port keeps outputting "good" and the first led is constantly on before I even send a value.
Do you have any idea why?

Don't use pins 0 or 1 if you are using serial. Those are the USB pins.

That did not work unfortunately

Where do you turn the LEDs off?

The way I intend for it to work is:

  • asking user for a number
  • if number is within a certain range, (eg: 20, first led turns on)
  • then user can input another number
  • the first led should turn off, then the other should turn on

I figured.
Start a new file.
In this file figure out how to ask the question and when the answer is given, print that answer to the serial monitor and ask the question again.
Bring that back and we can make the next change.

Serial.parseInt() looks for numeric characters and stops whenever it doesn't find one.

Make sure in the Serial Monitor you are using "Newline" or "Carriage return" as the line ending, NOT "Both NL & CR".

If you use "Both NL & CR" then it will interpret your input as 123\n\r... and will treat as 2 integers 123 & 0, because it finds 2 characters that are not numeric.

1 Like
int num;

void setup()
{
  Serial.begin(9600);
  Serial.println("enter the value");
}

void loop()
{
  while (Serial.available()== 0)
  {
  }
  num = Serial.parseInt();
  Serial.println(num);
}

this worked but in the serial monitor it outputs a 0 after my number

Did you read post #9? What line ending are you using?

int data;
int led1 = 1;
int led2 = 2;
int led3 = 3;
int led4 = 4;
int led5 = 5;
int led6 = 6;

void setup(){
  Serial.begin(9600);
  Serial.println("enter the value");
}

void loop(){
  if (Serial.available()>0)  {
    data = Serial.parseInt();
    while (Serial.available()>0)Serial.read();
  }
  if ((data >= 0) && (data <= 50))  {
    Serial.println("Good") ;
    digitalWrite(led1, HIGH);
    delay(500);
  }
  else if ((data >= 51) && (data <= 100))  {
    Serial.println("Moderate") ;
    digitalWrite(led2, HIGH);
    delay(500);
  }
  else if ((data >= 101) && (data <= 150))  {
    Serial.println("Unhealthy for sensitive groups") ;
    digitalWrite(led3, HIGH);
    delay(500);
  }
  else if ((data >= 151) && (data <= 200))  {
    Serial.println("Unhealthy") ;
    digitalWrite(led4, HIGH);
    delay(500);
  }
  else if ((data >= 201) && (data <= 300))  {
    Serial.println("Very unhealthy") ;
    digitalWrite(led5, HIGH);
    delay(500);
  }
  else if ((data >= 301) && (data <= 500))  {
    Serial.println("Hazardous") ;
    digitalWrite(led6, HIGH);
    delay(500);
  }
}

I modified the code and it works perfectly now, thank you to those who have replied and assisted me!
Updated code:

int data;
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led5 = 6;
int led6 = 7;

void setup()
{
  Serial.begin(9600);
  Serial.println("enter the value");
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  /*digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);*/
}

void loop(){
    if (! Serial.available())
{
    // no serial data, do nothing
    return;
}
else if (Serial.available()>0)
{
data = Serial.parseInt();
while (Serial.available()>0)Serial.read();
// rest of loop() code
 
  }
  if ((data >= 0) && (data <= 50))  {
    Serial.println("Good") ;
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
  	digitalWrite(led3, LOW);
  	digitalWrite(led4, LOW);
  	digitalWrite(led5, LOW);
  	digitalWrite(led6, LOW);
  }
  else if ((data >= 51) && (data <= 100))  {
    Serial.println("Moderate") ;
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, LOW);
  	digitalWrite(led4, LOW);
  	digitalWrite(led5, LOW);
  	digitalWrite(led6, LOW);
  }
  else if ((data >= 101) && (data <= 150))  {
    Serial.println("Unhealthy for sensitive groups") ;
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
  	digitalWrite(led4, LOW);
  	digitalWrite(led5, LOW);
  	digitalWrite(led6, LOW);
  }
  else if ((data >= 151) && (data <= 200))  {
    Serial.println("Unhealthy") ;
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  	digitalWrite(led4, HIGH);
  	digitalWrite(led5, LOW);
  	digitalWrite(led6, LOW);
  }
  else if ((data >= 201) && (data <= 300))  {
    Serial.println("Very unhealthy") ;
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  	digitalWrite(led4, LOW);
  	digitalWrite(led5, HIGH);
  	digitalWrite(led6, LOW);
  }
  else if ((data >= 301) /*&& (data > 500)*/)  {
    Serial.println("Hazardous") ;
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
  	digitalWrite(led4, LOW);
  	digitalWrite(led5, LOW);
  	digitalWrite(led6, HIGH);
  }
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.