YellowOrange
YellowOrange

Reputation: 3

How to store & call multiple letters in arduino?

Im new to programming, and I'm trying to make a program that adjusts LEDs according to the serial input.

#define Bathroom 13  //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
char *myStrings[] = {"bathdim","bathbright","livingdim","livingbright","beddim","bedbright"};
void setup(){
 pinMode(Bathroom, OUTPUT);
 pinMode(Livingroom, OUTPUT);
 Serial.begin(9600);
}
void loop() {
if(Serial.read() == *myStrings[0]){
    Serial.println(*myStrings[0]);  // prints "bathdim" on the serial monitor
    digitalWrite(Bathroom,0);       // turns lights off
    delay(100);
  }
  if(Serial.read() == *myStrings[1]){ // prints "bathbright" on the serial monitor
    Serial.println(*myStrings[1]); // turns lights on
    digitalWrite(Bathroom,1);
    delay(100);
  }
  if(Serial.read() == *myStrings[2]){
    Serial.println(*myStrings[2]);
    digitalWrite(Livingroom,0);
    delay(100);
  }
  if(Serial.read() == *myStrings[3]){
    Serial.println(*myStrings[3]);
    digitalWrite(Livingroom,1);
    delay(100);
  }
}

When running the code, I typed in "bathbright" which should have turned the lights on, but I didn't work, and the Serial.println(*myStrings[1]) only prints letter "b", not "bathbright"

can anyone help?

EDIT

ok, I removed the * and now the code is as follows:

#define Bathroom 13  //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
char *myStrings[] = {"bathdim","bathbright","livingdim","livingbright","beddim","bedbright"};
void setup(){
 pinMode(Bathroom, OUTPUT);
 pinMode(Livingroom, OUTPUT);
 Serial.begin(9600);
}
void loop() {
if(Serial.read() == *myStrings[0]){
    Serial.println(myStrings[0]);
    digitalWrite(Bathroom,0);
    delay(100);
  }
  if(Serial.read() == *myStrings[1]){
    Serial.println(myStrings[1]);
    digitalWrite(Bathroom,1);
    delay(100);
  }
  if(Serial.read() == *myStrings[2]){
    Serial.println(myStrings[2]);
    digitalWrite(Livingroom,0);
    delay(100);
  }
  if(Serial.read() == *myStrings[3]){
    Serial.println(myStrings[3]);
    digitalWrite(Livingroom,1);
    delay(100);
  }
}

The code works well initially but after a few inputs of bathbright and bathdim, he serial print does not print the correct words and the LEDs does not always respond...

FINAL CODE:

#define Bathroom 13  //LED connected to pin13 named bathroom
#define Livingroom 9 //LED connected to pin9 named livingroom
void setup(){
 Serial.begin(9600);
 pinMode(Bathroom, OUTPUT);
 pinMode(Livingroom, OUTPUT);
}

void loop(){
    String str = Serial.readString();
    if(str.indexOf("bathdim") > -1){
      Serial.println("dimming bathroom");
      digitalWrite(Bathroom,0);
    } 
    if(str.indexOf("bathbright") > -1){
      Serial.println("lighting up bathroom");
      digitalWrite(Bathroom,1);
    }
    if(str.indexOf("livingdim") > -1){
      Serial.println("dimming Livingroom");
      digitalWrite(Livingroom,0);
    } 
    if(str.indexOf("livingbright") > -1){
      Serial.println("lighting up Livingroom");
      digitalWrite(Livingroom,1);
    } 
}

Upvotes: 0

Views: 344

Answers (3)

Danny_ds
Danny_ds

Reputation: 11406

Serial.read() will only read the first byte. You'll have to read the whole string in a loop (and a large enough buffer) and use a compare function to compare the strings.

As an alternative for testing you could use a single byte code - for example 'a', 'b', 'c' and 'd'.

To print the second string in the aray, you can use Serial.println(myStrings[1]).


Here is an example using single chars:

void loop() {

    if (Serial.available()) {

        int value = Serial.read();

        switch (value) {
            case 'a':
                digitalWrite(Bathroom, 0);
                break;
            case 'b':
                digitalWrite(Bathroom, 1);
                break;
            case 'c':
                digitalWrite(Livingroom, 0);
                break;
            case 'd':
                digitalWrite(Livingroom, 1);
                break;
            default :
                break;
        }

        if (value >= 'a') {   // avoid delaying on newlines
            delay(100); 
        }
    }
}

Upvotes: 0

srv236
srv236

Reputation: 519

*(myStrings[0]) will get the first (char *) in the array, which points to starting memory location containing bathdim, then you dereference that, using the * which prints the first character, so you get letter b.

Just remove the dereferencing, remove that *

Edit- saw your updated question, the star is not gone, but anyway try using Serial.readString() to read in a string, you are reading in 1 byte at a time

Upvotes: 0

Firas Chebbi
Firas Chebbi

Reputation: 31

Just remove * ! because *string refers to the first case in the string ! so *string[0] refers to the first letter in the first case in the string array !

Upvotes: 1

Related Questions