I am not sure if this is a hardware issue or a coding issue at the moment.
Basically, my code is supposed to take a temperature each time I press a button and the RGB LED is supposed to change color depending on the temperature recorded.
The program works fine, however after the 3 second delay, instead of all pins returning to low, the red pin will go to high for three seconds, then return to low.
I am currently using an Arduino UNO with a breadboard. I have pin 9 assigned to the red pin, pin 10 assigned to the green pin, and pin 11 assigned to the blue pin. Pin 2 is associated with my button and my temperature probe is assigned to analog pin 0. The whole thing is grounded and powered with 5V.
My program is included below.
Is this a hardware or software issue?
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
int DISPLAY_TIME = 3000;
const int temperaturePin = 0;
const int button1Pin = 2;
void setup()
{
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop()
{
colorCode();
pinMode(button1Pin, INPUT);
Serial.begin(9600);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void colorCode()
{
int button1State;
button1State = digitalRead(button1Pin);
if(button1State == HIGH)
return (analogRead(temperaturePin) * 0.004882814);
float voltage, degreesC, degreesF, degreesK;
voltage = (analogRead(temperaturePin) * 0.004882814);
degreesC = (voltage - 0.5) * 100.0;
degreesF = degreesC * (9.0/5.0) + 32.0;
degreesK = degreesC + 273.15;
Serial.print("volt: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.print(degreesC);
Serial.print(" deg F: ");
Serial.print(degreesF);
Serial.print(" deg K: ");
Serial.println(degreesK);
if(degreesF <= 70 & degreesF >= 60 )
{
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 70 & degreesF <= 73)
{
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 73 & degreesF <= 76)
{
digitalWrite(RED_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 76 & degreesF <= 79);
{
digitalWrite(RED_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
}
Both the schematic and the Fritzing are now attached.
Solution:
The issue was that the code was defaulting the final ‘else if’ function as a default. Adding a default ‘else’ program solved the problem.
const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
const int temperaturePin = 0;
const int button1Pin = 2;
void setup()
{
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(button1Pin, INPUT);
Serial.begin(9600);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop()
{
colorCode();
}
void colorCode()
{
int button1State;
button1State = digitalRead(button1Pin);
if(button1State == HIGH)
(analogRead(temperaturePin) * 0.004882814);
float voltage, degreesC, degreesF, degreesK;
voltage = (analogRead(temperaturePin) * 0.004882814);
degreesC = (voltage - 0.5) * 100.0;
degreesF = degreesC * (9.0/5.0) + 32.0;
degreesK = degreesC + 273.15;
Serial.print("volt: ");
Serial.print(voltage);
Serial.print(" deg C: ");
Serial.print(degreesC);
Serial.print(" deg F: ");
Serial.print(degreesF);
Serial.print(" deg K: ");
Serial.println(degreesK);
if(degreesF <= 70 & degreesF >= 60 )
{
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, HIGH);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 70 & degreesF <= 73)
{
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 73 & degreesF <= 76)
{
digitalWrite(RED_PIN, HIGH);
digitalWrite(BLUE_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else if(degreesF > 76 & degreesF <= 79)
{
digitalWrite(RED_PIN, HIGH);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
delay(3000);
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
else
{
digitalWrite(RED_PIN, LOW);
digitalWrite(BLUE_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
}
}