DigitalWrite Bluetooth command

Hi, Im trying to send a command via Bluetooth to turn on and off a relay set. It only seems to work if I send a single number. I would like to send a piece of text in a variable. Am I using the wrong Variable?

#include <SoftwareSerial.h>
SoftwareSerial bt(13,12); /* (Rx,Tx) */  

char Incoming_value = 0;
char RelayOn = LOW;
char RelayOff = HIGH;

                
void setup() 
{
  bt.begin(9600); 
  Serial.begin(9600);    
  Serial.print("Set up start");
   //pinMode(relay1Pin, INPUT_PULLUP); // first enable pull up
   //digitalWrite(2, HIGH);
  // pinMode(2, OUTPUT); // then set pin to output
  //pinMode(2, INPUT_PULLUP);     
  pinMode(2, OUTPUT); 
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
  
}

void loop()
{

  

  if(bt.available()) 
  {
    Incoming_value = bt.read();      
    Serial.print(Incoming_value);        
    //Serial.print("\n");        
    if(Incoming_value == '1-On')             
      digitalWrite(2, RelayOn);  
      ////////////////////////
      else if(Incoming_value == '1-Off')       
      digitalWrite(2, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '2-On')       
      digitalWrite(3, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '2-Off')       
      digitalWrite(3, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '3-On')       
      digitalWrite(4, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '3-Off')       
      digitalWrite(4, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '4-On')       
      digitalWrite(5, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '4-Off')       
      digitalWrite(5, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '5-On')       
      digitalWrite(6, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '5-Off')       
      digitalWrite(6, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '6-On')       
      digitalWrite(7, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '6-Off')       
      digitalWrite(7, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == 'Go-On')       
      digitalWrite(8, RelayOn);  
      /////////////////////////
      else if(Incoming_value == 'Go-Off')       
      digitalWrite(8, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
  }                            
} 

bt.read reads one character.
Take a look into Arduino/referense/Serial. Lots of useful stuff there.

Hi Thanks for the info. It makes sense. I read https://forum.arduino.cc/t/serial-input-basics-updated/382007
but I'm having issues integrating example 2 into my sketch.

Please post the code you have written based on the tutorial.
Is your issue with configuring the message to send, or the reading and working with the message when received?

Hi,
Its with reading and working with the message. My msgs come through okay on the console. I'm using an app built with MIT App Inventor to control a set of relays. At the moment 7 relays, but more going forward.
I'm getting this error when compiling..
ISO C++ forbids comparison between pointer and integer [-fpermissive]
I'm using an UNO R4 MINIMA. This is just a project to test a concept.
Thanks for your time and help.

include <SoftwareSerial.h>
SoftwareSerial bt(13,12); /* (Rx,Tx) */  

const byte numChars = 32;
char Incoming_value[numChars];   // an array to store the received data
//char Incoming_value;
char RelayOn = LOW;
char RelayOff = HIGH;


boolean newData = false;

void setup() {
    bt.begin(9600); 
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
    pinMode(2, OUTPUT); 
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
}

void loop() {
    recvWithEndMarker();
    showNewData();
}

void recvWithEndMarker() {
    static byte ndx = 0;
    char endMarker = '\n';
    char rc;
    
    while (bt.available() > 0 && newData == false) {
        rc = bt.read();

        if (rc != endMarker) {
            Incoming_value[ndx] = rc;
            ndx++;
            if (ndx >= numChars) {
                ndx = numChars - 1;
            }
        }
        else {
            Incoming_value[ndx] = '\0'; // terminate the string
            ndx = 0;
            newData = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(Incoming_value);
        newData = false;
        //Incoming_value = receivedChars;

    }
    if(bt.available()) 
  {
     //Incoming_value = receivedChars;
    //Incoming_value = bt.read();      
    Serial.print(Incoming_value);        
    //Serial.print("\n");        
    if(Incoming_value == '1-On')             
      digitalWrite(2, RelayOn);  
      ////////////////////////
      else if(Incoming_value == '1-Off')       
      digitalWrite(2, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '2-On')       
      digitalWrite(3, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '2-Off')       
      digitalWrite(3, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '3-On')       
      digitalWrite(4, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '3-Off')       
      digitalWrite(4, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '4-On')       
      digitalWrite(5, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '4-Off')       
      digitalWrite(5, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '5-On')       
      digitalWrite(6, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '5-Off')       
      digitalWrite(6, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == '6-On')       
      digitalWrite(7, RelayOn);  
      /////////////////////////
      else if(Incoming_value == '6-Off')       
      digitalWrite(7, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if(Incoming_value == 'Go-On')       
      digitalWrite(8, RelayOn);  
      /////////////////////////
      else if(Incoming_value == 'Go-Off')       
      digitalWrite(8, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
  }                            
}
        if (Incoming_value == '1-On')

You can't use == to compare strings. Not that '1-On' is a string in any case. Use strcmp() instead

        if (strcmp(Incoming_value, "1-On") == 0)

Note the use of double quotation marks around the string

@UKHeliBob Thanks, but...

Ive added this to the code but I don't see any output. When I add Serial.print(Incoming_value); to check the statement is true I get the error: Compilation error: expected '}' before 'else'.

include <SoftwareSerial.h>
SoftwareSerial bt(13,12); /* (Rx,Tx) */  

const byte numChars = 32;
char Incoming_value[numChars];   // an array to store the received data
//char Incoming_value;
char RelayOn = LOW;
char RelayOff = HIGH;


boolean newData = false;

void setup() {
    bt.begin(9600); 
    Serial.begin(9600);
    Serial.print("<Arduino is ready>");
    pinMode(2, OUTPUT); 
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
}

void loop() {
    recvWithEndMarker();
    showNewData();
}

void recvWithEndMarker() {
    static byte ndx = 0;
    char endMarker = '\n';
    char rc;
    
    
    while (bt.available() > 0 && newData == false) {
        rc = bt.read();
       // Serial.print("rc" + rc);
        
        if (rc != endMarker) {
            Incoming_value[ndx] = rc;
        
            ndx++;
            if (ndx >= numChars) {
                ndx = numChars - 1;
            }
        }
        else {
            Incoming_value[ndx] = '\0'; // terminate the string
            ndx = 0;
            newData = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        //Serial.print("This just in ... ");
       Serial.println(Incoming_value);
        newData = false;
        
    //}
    //if(bt.available()) 
  {
    
   // Serial.print("bt avaiable");        
   // Serial.print("\n");        
    //Serial.println(Incoming_value);
    if (strcmp(Incoming_value, "1-On") == 0)  
    //Serial.print("Way 1 avaiable");           
      digitalWrite(2, RelayOn);  
      Serial.print(Incoming_value);  // This shows (Compilation error: expected '}' before 'else')
      ////////////////////////
      else if (strcmp(Incoming_value, "1-Off") == 0)       
      digitalWrite(2, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "2-On") == 0)        
      digitalWrite(3, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "2-Off") == 0)        
      digitalWrite(3, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "3-On") == 0)        
      digitalWrite(4, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "3-Off") == 0)        
      digitalWrite(4, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "4-On") == 0)        
      digitalWrite(5, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "4-Off") == 0)        
      digitalWrite(5, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "5-On") == 0)        
      digitalWrite(6, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "5-Off") == 0)       
      digitalWrite(6, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "6-On") == 0)       
      digitalWrite(7, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "6-Off") == 0)       
      digitalWrite(7, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      else if (strcmp(Incoming_value, "Go-On") == 0)        
      digitalWrite(8, RelayOn);  
      /////////////////////////
      else if (strcmp(Incoming_value, "Go-Off") == 0)        
      digitalWrite(8, RelayOff);  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
  }                            
}
}
           if (strcmp(Incoming_value, "1-On") == 0)
                //Serial.print("Way 1 avaiable");
                digitalWrite(2, RelayOn);
            Serial.print(Incoming_value);  // This shows (Compilation error: expected '}' before 'else')
            ////////////////////////
            else if (strcmp(Incoming_value, "1-Off") == 0)
              digitalWrite(2, RelayOff);

The compiler has spotted that the closing brace of the first if is missing in the code above, and the opening brace too for that matter. I Auto formatted the code in the ODE before posting the section above and it shows clearly that the dependant code block for the if has 2 lines and should, therefore, be enclosed in a pair of braces

tRY THIS (UNTESTED)

            if (strcmp(Incoming_value, "1-On") == 0)
            //Serial.print("Way 1 avaiable");
            {
                digitalWrite(2, RelayOn);
                Serial.print(Incoming_value);  // This shows (Compilation error: expected '}' before 'else')
            }
            ////////////////////////
            else if (strcmp(Incoming_value, "1-Off") == 0)
                digitalWrite(2, RelayOff);

@UKHeliBob & @Delta_G Thank for the info about the braces, that has solved the issue with the error. But I don't the if statement comparison does not seem returns false even the the string matches.

The first step in diagnosing the problem is to print what you receive before you test it. Print a "<" before it and a ">" after it so that you can see if there are any non visible characters, such as Carriage Return or Linefeed before or after the string

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