values for 'case' must be integer or character constants
the order of the 'case' statements is unimportant
the default clause may occur first (convention places it last)
you cannot use expressions or ranges
Your are not. Strings (null terminated arrays of characters) are not characters.
You can not use a switch statement in the way you are trying to.
This is also a problem:
void ledColor(char color) {
ledColor("blue");
"blue" is not a character. It is an array of characters.
"blue" is not a character. It is an array of characters.
Yeah, that's why I was wondering what I could do to make the strings work. Should I just change it to r/g/b/c instead or is there something else entirely that I should do?
EDIT:
Okay, I changed it to just r/g/b/c. However, I'm still getting
error: case label does not reduce to an integer constant
and
error: invalid conversion from 'const char*' to 'char'
error: initializing argument 1 of 'void ledColor(char)'
EDIT 2:
If I put "char color = 'c';" in the variable section of my code, it doesn't complain as much. However, I still get this error:
error: variable or field 'ledColor' declared void
error: 'color' was not declared in this scope
error: invalid conversion from 'const char*' to 'char'
// physical mailbox checker (PMC)
// ------------------------
// 1. photoresistor detects "box open" state. blue activity LED is enabled.
// 2. if pressure sensor detects mail, green "mail present" LED is enabled.
// 3. if pressure is REMOVED, red "mail retrieved" LED is enabled.
// 4. LED is disabled 5 minutes after mail has been removed if
// no more mail is placed into box (accounts for outgoing mail).
const int photoPin = 11; // use pin 11 for photoresistor
const int pressurePin = 12; // use pin 12 for pressure sensor
// rgb led requires 1 pin for each color
const int redPin = 7; // use higher resistor on red!
const int greenPin = 8; //use regular resistor on green
const int bluePin = 9; // use regular resistor on blue
int photoState = 0; // variable for photoresistor state
int pressureState = 0; // variable for pressure sensor state
int mailPresent = 0; // variable for mail presence
char color = "c"; // variable for color code for rgb led
void setup() { // pin setup (hardware)
pinMode(photoPin, INPUT); // photoresistor is input
pinMode(pressurePin, INPUT); // pressure sensor is input
pinMode(redPin, OUTPUT); // led pins are all output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600); // enable serial output for debugging
}
void ledColor(color) {
switch (color) {
case "c":
digitalWrite(redPin, 0);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 0);
break;
case "r":
digitalWrite(redPin, 255);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 0);
break;
case "g":
digitalWrite(redPin, 0);
digitalWrite(greenPin, 255);
digitalWrite(bluePin, 0);
break;
case "b":
digitalWrite(redPin, 0);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 255);
break;
}
}
void loop() {
photoState = digitalRead(photoPin); // box open?
if (photoState > 0) { // box is open
Serial.println("Mailbox has been opened");
ledColor("b");
delay(30000); // wait 30 seconds for mail
pressureState = digitalRead(pressurePin);
if (pressureState > 0) { // mail is present
ledColor("g");
mailPresent = 1;
delay(30000); // wait 30 seconds for box to be closed
}
else {
ledColor("r");
delay(300000); // stay red for 5 minutes
ledColor("c");
}
photoState = 0;
}
else if (mailPresent = 0) {
ledColor("c");
}
}
Again, I'm very new at this. I'm much more comfortable with Python and BASH than C/Wiring.
EDIT: Oh, and be sure to read "color" as "colour" =-)
I just tried that, but it doesn't seem to fit what I'm trying to do -- but I could just be reading your example incorrectly.
I want to send output to the pins to change the color of the rgb led. I figured that a function would be the best way to avoid duplicating code (thus keeping the sketch size low).
Is the setup() function the correct place for what I'm trying to do?
Ah yeah, I could do that for logging and logic purposes. Something like
current state: blue
previous state: red
which would show that it did not have mail before, so it's likely to have it now. That or someone is just checking it to see if there is any mail even though the led says otherwise =-)
It didn't like when I used "void" even though it doesn't return anything.
Why? There is no reason not to declare the return type as void if it doesn't return anything. In fact, if warnings were not turned off, you would see the compiler complain that the function does not return anything if its type is not void.
That's what was puzzling about it! Even though it did not return anything, the compiler would complain if I used void. It works with char, though, so I'm just going to leave it as it is.
// physical mailbox checker (PMC)
// ------------------------
// 1. photoresistor detects "box open" state. blue activity LED is enabled.
// 2. if pressure sensor detects mail, green "mail present" LED is enabled.
// 3. if pressure is REMOVED, red "mail retrieved" LED is enabled.
// 4. LED is disabled 5 minutes after mail has been removed if
// no more mail is placed into box (accounts for outgoing mail).
const int photoPin = 11; // use pin 11 for photoresistor
const int pressurePin = 12; // use pin 12 for pressure sensor
// rgb led requires 1 pin for each color
const int redPin = 7; // use higher resistor on red!
const int greenPin = 8; //use regular resistor on green
const int bluePin = 9; // use regular resistor on blue
int photoState = 0; // variable for photoresistor state
int pressureState = 0; // variable for pressure sensor state
int mailPresent = 0; // variable for mail presence
char color = 'c'; // variable for color code for rgb led
void setup() { // pin setup (hardware)
pinMode(photoPin, INPUT); // photoresistor is input
pinMode(pressurePin, INPUT); // pressure sensor is input
pinMode(redPin, OUTPUT); // led pins are all output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600); // enable serial output for debugging
}
char ledColor(char color) {
switch (color) {
case 'c':
digitalWrite(redPin, 0);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 0);
break;
case 'r':
digitalWrite(redPin, 255);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 0);
break;
case 'g':
digitalWrite(redPin, 0);
digitalWrite(greenPin, 255);
digitalWrite(bluePin, 0);
break;
case 'b':
digitalWrite(redPin, 0);
digitalWrite(greenPin, 0);
digitalWrite(bluePin, 255);
break;
}
}
void loop() {
photoState = digitalRead(photoPin); // box open?
if (photoState > 0) { // box is open
Serial.println("Mailbox has been opened");
ledColor('b');
delay(30000); // wait 30 seconds for mail
pressureState = digitalRead(pressurePin);
if (pressureState > 0) { // mail is present
ledColor('g');
mailPresent = 1;
delay(30000); // wait 30 seconds for box to be closed
}
else {
ledColor('r');
delay(300000); // stay red for 5 minutes
ledColor('c');
}
photoState = 0;
}
else if (mailPresent = 0) {
ledColor('c'); // clear the led
}
}
As you can see, the ledColor function does not return anything. Maybe your compiler won't complain?
That's very strange... I'm currently running on OS X. Which OS are you using? Maybe it'll work without complaint if I paste the code into a new sketch. I'll try that now and post the results when I get the chance.