Need help with project [App Inventor + Mega + 2xNano]

Hi everyone! First of all, sorry for my english '-.-

I'm new in Arduino programming and I need help. My project is about turning on a number of relays with one Arduino Mega, and two Nanos. An android app (made with app inventor) will send data to my Arduino Mega. This is the first question:

Can I send data through OTG with App Inventor? How? I was using Bluetooth for that, but there are signal problems.

Once Arduino Mega receive the data, it will process that information. Mega will send information to Nano1 and Nano2 connected by Serial ports (TX1-RX1 and TX2-RX2):

#include "SoftwareSerial.h"

int rele[] = {22,23,24,25};  // for example.... I have more than 10 relays      
const int ledPin = 13;


void setup(){

  Serial.begin(9600);  // For USB debugging
  Serial1.begin(9600); // nano1
  Serial2.begin(9600); // nano2

  pinMode(rele[0], OUTPUT);    
  digitalWrite(rele[0], LOW);   
    
  pinMode(rele[1], OUTPUT);
  digitalWrite(rele[1], LOW);  
 
  pinMode(rele[2], OUTPUT);    
  digitalWrite(rele[2], LOW);   
    
  pinMode(rele[3], OUTPUT);
  digitalWrite(rele[3], LOW);   

  pinMode(ledPin, OUTPUT);

}

void loop(){
  
   if (mensaje == "17a") {    
         
    digitalWrite(rele[0], HIGH);          
    Serial.println("Relay 1 activated!");  
    delay(20);     
                       
    digitalWrite(rele[1], HIGH);          
    Serial.println("Relay 2 activated!");
    delay(20);      
    }
    
    if (mensaje == "17b") {    
                     
    digitalWrite(rele[2], HIGH);          
    Serial.println("Relay 3 activated!");   
    delay(20);  
                          
    digitalWrite(rele[3], HIGH);          
    Serial.println("Relay 4 activated!");   
    delay(20); 
   }
      
    if (mensaje == "nan1A"){
      Serial1.write("1A");
    }
    if (mensaje == "nan2A"){
      Serial1.write("2A");
    }
    
    if (mensaje == "nan1B"){
      Serial1.write("1B");
    }
    if (mensaje == "nan2B"){
      Serial1.write("2B");
    }
}

When one of the Arduino Nano receives that "orders" with Serial.readString(); they will execute their sketch (or part of it).

The second question: Is my code wrong? Is the serial communication right?

Thanks in advance

Your code will not compile. The variable mensaje is not declared nor is it given a value. Why include software serial when you are using hardware serial ports?

The serial input basics thread may help if you are having trouble with serial communication.

You were right. I dont have now my sketh near but this is working now:

int rele[] = {22,23,24,25};  // for example.... I have more than 10 relays      
const int ledPin = 13;

String mensaje = Serial.readString(); // this is the OTG conection via USB


void setup(){

  Serial.begin(9600);  // For USB debugging
  Serial1.begin(9600); // nano1
  Serial2.begin(9600); // nano2

  pinMode(rele[0], OUTPUT);    
  digitalWrite(rele[0], LOW);   
    
  pinMode(rele[1], OUTPUT);
  digitalWrite(rele[1], LOW);  
 
  pinMode(rele[2], OUTPUT);    
  digitalWrite(rele[2], LOW);   
    
  pinMode(rele[3], OUTPUT);
  digitalWrite(rele[3], LOW);   

  pinMode(ledPin, OUTPUT);

}

void loop(){
  
   if (mensaje == "17a") {    
         
    digitalWrite(rele[0], HIGH);          
    Serial.println("Relay 1 activated!");  
    delay(20);     
                       
    digitalWrite(rele[1], HIGH);          
    Serial.println("Relay 2 activated!");
    delay(20);      
    }
    
    if (mensaje == "17b") {    
                     
    digitalWrite(rele[2], HIGH);          
    Serial.println("Relay 3 activated!");   
    delay(20);  
                          
    digitalWrite(rele[3], HIGH);          
    Serial.println("Relay 4 activated!");   
    delay(20); 
   }
      
    if (mensaje == "nan1A"){
      Serial1.write("1A");
    }
    if (mensaje == "nan2A"){
      Serial1.write("2A");
    }
    
    if (mensaje == "nan1B"){
      Serial1.write("1B");
    }
    if (mensaje == "nan2B"){
      Serial1.write("2B");
    }
}

The "Inlude" part was an error due examples for Arduino Uno (i think Uno must enable that for having more than a serial). This error is not important for me. The problem is the first question and second part of second question.

Thanks for your quick reply ^^

String mensaje = Serial.readString(); // this is the OTG conection via USB

void setup(){

  Serial.begin(9600);  // For USB debugging
  Serial1.begin(9600); // nano1
  Serial2.begin(9600); // nano2

I wonder how the Serial.readString is working before the serial port is opened (Serial.begin)?

I know nothing of App inventor so cannot speak to that part of your question.

Yeah you're right ::slight_smile: ... Now I will put here the original code (i found it), with some correction (like the "include" section):

int rele[] = {22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38};     
const int ledPin = 13;


void setup()
{
  Serial.begin(9600);  
  Serial1.begin(9600);
  Serial2.begin(9600);

  //Asignaciones de relés como componentes de salida en modo "apagado"

  pinMode(rele[0], OUTPUT);    
  digitalWrite(rele[0], LOW);   
    
  pinMode(rele[1], OUTPUT);
  digitalWrite(rele[1], LOW);   
    
  pinMode(rele[2], OUTPUT);
  digitalWrite(rele[2], LOW); 
    
  pinMode(rele[3], OUTPUT);
  digitalWrite(rele[3], LOW); 
    
  pinMode(rele[4], OUTPUT);
  digitalWrite(rele[4], LOW); 
    
  pinMode(rele[5], OUTPUT);
  digitalWrite(rele[5], LOW); 
    
  pinMode(rele[6], OUTPUT);
  digitalWrite(rele[6], LOW); 
    
  pinMode(rele[7], OUTPUT);
  digitalWrite(rele[7], LOW);
     
  pinMode(rele[8], OUTPUT);
  digitalWrite(rele[8], LOW); 
    
  pinMode(rele[9], OUTPUT);
  digitalWrite(rele[9], LOW); 
    
  pinMode(rele[10], OUTPUT);
  digitalWrite(rele[10], LOW); 
    
  pinMode(rele[11], OUTPUT);
  digitalWrite(rele[11], LOW); 
    
  pinMode(rele[12], OUTPUT);
  digitalWrite(rele[12], LOW);
    
  pinMode(rele[13], OUTPUT);
  digitalWrite(rele[13], LOW);
    
  pinMode(rele[14], OUTPUT);
  digitalWrite(rele[14], LOW);
    
  pinMode(rele[15], OUTPUT);
  digitalWrite(rele[15], LOW);
    
  pinMode(ledPin, OUTPUT);

}

void loop(){
  
  String mensaje = Serial.readString();
  

  
   if (mensaje == "aut1") {    
    digitalWrite(rele[0], HIGH);          
    Serial.println("Rele 1 activado!");  
    delay(20);                            
    digitalWrite(rele[1], HIGH);          
    Serial.println("Rele 2 activado!");   
    delay(20);                            
    digitalWrite(rele[2], HIGH);          
    Serial.println("Rele 3 activado!");   
    delay(20);                            
    digitalWrite(rele[3], HIGH);          
    Serial.println("Rele 4 activado!");   
    delay(20);                            
    digitalWrite(rele[4], HIGH);          
    Serial.println("Rele 5 activado!");   
    delay(20);                            
    digitalWrite(rele[5], HIGH);          
    Serial.println("Rele 6 activado!");   
    delay(20);                            
    digitalWrite(rele[6], HIGH);          
    Serial.println("Rele 7 activado!");   
    delay(20);                            
    digitalWrite(rele[7], HIGH);          
    Serial.println("Rele 8 activado!");
    }

    
    if (mensaje == "aut2") {                         
      digitalWrite(rele[8], HIGH);          
      Serial.println("Rele 9 activado!");   
      delay(20);                            
      digitalWrite(rele[9], HIGH);          
      Serial.println("Rele 10 activado!");   
      delay(20);                            
      digitalWrite(rele[10], HIGH);          
      Serial.println("Rele 11 activado!");   
      delay(20);                            
      digitalWrite(rele[11], HIGH);          
      Serial.println("Rele 12 activado!");   
      delay(20);                            
      digitalWrite(rele[12], HIGH);          
      Serial.println("Rele 13 activado!");   
      delay(20);                            
      digitalWrite(rele[13], HIGH);          
      Serial.println("Rele 14 activado!");   
      delay(20);                            
      digitalWrite(rele[14], HIGH);          
      Serial.println("Rele 15 activado!");   
      delay(20);                            
      digitalWrite(rele[15], HIGH);          
      Serial.println("Rele 16 activado!");   
      delay(20);
   }    
   
     
      if (mensaje == "nan1A"){ 
        Serial1.write("1A"); 
      }
      if (mensaje == "nan1B"){
        Serial1.write("1B");   
      }


     
      if (mensaje == "nan2A"){
        Serial2.write("2A");   
      }
      if (mensaje == "nan2B"){
        Serial2.write("2B");   
      }
      

  
  
    if (mensaje == "allA"){ 
        
        
        digitalWrite(rele[0], HIGH);         
        Serial.println("Rele 1 activado!");   
        delay(20);                            
        digitalWrite(rele[1], HIGH);          
        Serial.println("Rele 2 activado!");  
        delay(20);                            
        digitalWrite(rele[2], HIGH);          
        Serial.println("Rele 3 activado!");   
        delay(20);                            
        digitalWrite(rele[3], HIGH);          
        Serial.println("Rele 4 activado!");   
        delay(20);                            
        digitalWrite(rele[4], HIGH);          
        Serial.println("Rele 5 activado!");   
        delay(20);                            
        digitalWrite(rele[5], HIGH);          
        Serial.println("Rele 6 activado!");   
        delay(20);                            
        digitalWrite(rele[6], HIGH);          
        Serial.println("Rele 7 activado!");   
        delay(20);                            
        digitalWrite(rele[7], HIGH);          
        Serial.println("Rele 8 activado!");
        
        delay(50);      
        Serial1.write("1A"); 
        
        delay(50);       
        Serial2.write("2A"); 
        
      } 
      
  
    if (mensaje == "allB"){ 
        
        
        digitalWrite(rele[8], HIGH);          
        Serial.println("Rele 9 activado!");   
        delay(20);                            
        digitalWrite(rele[9], HIGH);          
        Serial.println("Rele 10 activado!");   
        delay(20);                            
        digitalWrite(rele[10], HIGH);          
        Serial.println("Rele 11 activado!");   
        delay(20);                            
        digitalWrite(rele[11], HIGH);          
        Serial.println("Rele 12 activado!");   
        delay(20);                            
        digitalWrite(rele[12], HIGH);          
        Serial.println("Rele 13 activado!");   
        delay(20);                            
        digitalWrite(rele[13], HIGH);          
        Serial.println("Rele 14 activado!");   
        delay(20);                            
        digitalWrite(rele[14], HIGH);          
        Serial.println("Rele 15 activado!");   
        delay(20);                            
        digitalWrite(rele[15], HIGH);          
        Serial.println("Rele 16 activado!");   
        delay(20);
        
        delay(50);        
        Serial1.write("1B"); 
        
        delay(50);        
        Serial2.write("2B"); 
        
      }
  
}

Thanks for help, I'll wait for someone who can help me with App Inventor functions ^^

BTW: Is there a way to reduce the code lenght?

grr... had a nice big post.. (but lost it on initial submit)

Anyways..

I have done/created several App Inventor 2 apps before...

That being said.. I'm not sure what the problem is. or what the question is?

I have used bluetooth from my app/phone to a bt device connected to my Arduino... (never any issues)

I'm not 100% sure on the OTG... (as I havent done it myself).. however I believe your phone should support OTG (if somewhat new'ish)..

however googling Android OTG + Arduino connection returned TONS of results and tutorials..etc.. so I'm have faith its possible on some form or another.

Yeah Google shows a lot of results, but not with App Inventor, only examples showing the app running.

I need to know what I have to do in "Blocks" section of App Inventor for sending data to Arduino via OTG. My tablet is OTG compatible and Bluetooth may be interfered by someone else where I would execute my sketches.

Thanks

BTW: Is there a way to reduce the code lenght?

  pinMode(rele[0], OUTPUT);    
  digitalWrite(rele[0], LOW);  
    
  pinMode(rele[1], OUTPUT);
  digitalWrite(rele[1], LOW);  
    
  pinMode(rele[2], OUTPUT);
  digitalWrite(rele[2], LOW);

See how these all look the same except the array index?

for(int n = 0; n < 16; n++)
 {
     pinMode(rele[n], OUTPUT);    
     digitalWrite(rele[n], LOW);  
 }

This is one reason to use arrays. This one for loop replaces all those pinMode statements.
You may be able to do the same in other parts of your sketch.

groundFungus:

  pinMode(rele[0], OUTPUT);    

digitalWrite(rele[0], LOW); 
   
  pinMode(rele[1], OUTPUT);
  digitalWrite(rele[1], LOW); 
   
  pinMode(rele[2], OUTPUT);
  digitalWrite(rele[2], LOW);



See how these all look the same except the array index?



for(int n = 0; n < 16; n++)
{
    pinMode(rele[n], OUTPUT);   
    digitalWrite(rele[n], LOW); 
}



This is one reason to use arrays. This one [for loop ](https://www.arduino.cc/en/Reference/For)replaces all those pinMode statements. 
You may be able to do the same in other parts of your sketch.

Many thanks!. I will update my code!

Please any help would be welcome. I need to send via OTG from App Inventor android aplication to my Arduino (not via bluetooth) and still without progress.