Proyecto TriBot conn multiples sensores

Hola que tal muy buen día tengan todos ustedes miembros del foro, pues como habrán leído el titulo del tema es un Robot controlado por 3 motores, les explicare un poco el funcionamiento de lo que trato de hacer:

Este es un robot el cual era un jueguete, pero se quiso adaptar para ser controlado por arduino como un proyecto escolar y como es un proyecto escolar tiene cierto punto de complejidad creo yo para novatos en programación con arduino.

Este robot tiene 3 motores para hacerlo funcionar, es decir para moverse hacia adelante, atrás o a los lados, estos movimientos se tienen realizaran por medio de un sensor ultrasonico "automatico" y por medio de una app y un modulo bluetooth "manual", se agregaron otros sensores mas, como un sensor de presencia PIR el cual al ser accionado este emite unos sonidos obtenidos desde una memoria SD, un sensor de temperatura DTH11, la cual es mostrada por una pantalla LCD de 16x2, un sensor de gotas "LLUVIA" que activa un motor y unos leds, y por ultimo un sensor de color que activan unos leds RGB.

como todo novato tengo los mismos problemas que algunos han comentado aquí y en otros lados, que los códigos individuales funcionan perfectamente y al momento de unirlos "PUM" se hace un desastre total, ahora mismo estoy tratando a unir los códigos de audio y de temperatura pues creo que me han generado un poco mas de problemas, ya que al inicio muestro un mensaje de bienvenida el cual se muestra correctamente, pero al momento de pasar a mostrar la temperatura este se queda pasmado y solo se muestra el numero "3" por toda la pantalla, pero el código sigue funcionando con el sensor de presencia y el audio si se emite correctamente solo que la temperatura nunca es mostrada, a continuación les dejo el código por si alguien me pudiera aportar alguna idea de como solucionar ese error y seguir buscando otros errores en los códigos siguientes que pienso agregar.

#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 5
#define DHTYPE DHT11
DHT dht(DHTPIN, DHTYPE);
#include <SD.h>           //define libreria LCD
#define SD_ChipSelectPin 53 //define pin de SD (SPI)
#include <TMRpcm.h>         //libreria reproduccion asincrona sonido
#include <SPI.h>            // SPI, para controlar SD

#define __MAX_ESTADOS_TALKING 4  
#define __MIN_ESTADOS_TALKING 2  

TMRpcm tmrpcm;                  
/// variables SD y audio///
int numeroFrases;
//sensor de movimiento
int calibrationTime = 10;           
int pirPin = 4;   
// Maquina de EStados
int MEstados,MEstados2;
int max_estados = 0; // control de numero maximo de cambios 
//temporizadores
long t1;
int masdelay = 0; // poner delay aleatorio 
long t_espera_aleatoria;  //para introducir intervalos aleatorios
//alternador de sonido
String nombre_archivo = String(20);
String terminacion = String(5);
char cadena[60];
//variables LCD//
LiquidCrystal lcd(13, 12, 10, 9, 8, 7);

void setup (){
  {
    dht.begin();
    presentacion();
  }
  {
    
   MEstados  = 0;
   MEstados2 = 0;
   tmrpcm.speakerPin = 11; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
   Serial.begin(115200);
  
  if (!SD.begin(SD_ChipSelectPin)) {  
    Serial.println("SD fail");  
    return;   

  }
  else{   
    Serial.println("SD ok");   
  }
  tmrpcm.play("inicio"); //el sonido inicial
  //Inicializo sensor de movimiento
  pinMode(pirPin, INPUT);
  digitalWrite(pirPin, LOW);
  //Estabilizar el sensor de movimiento
    for(int i = 0; i < calibrationTime; i++){
      delay(1000);
      }
    delay(50);
  t1 = millis();
 }
}

void loop(){  
  
  {
  int h = dht.readHumidity();
  int t = dht.readTemperature(); 
///////////humedad
     lcd.setCursor(0,1);
     lcd.print("HUMEDAD: ");
     lcd.setCursor(8,1);
     lcd.print(h);  //escribe humedad
     lcd.print("%");
   //////////Temperatura     
     lcd.setCursor(0,0);
     lcd.print("TEMPERATURA:");
     lcd.setCursor(12,0);
     lcd.print(t); //escribe temperatura
     lcd.print("C");
    }
 
    //Gestion de la maquina de Estados 
    if (MEstados2!=MEstados){
      MEstados = MEstados2;
      Serial.print(millis());Serial.print(":");Serial.print(MEstados);Serial.print(":");
      
    }
    
    //Maquina de estados ppal
    switch(MEstados){
      case 0: //Deteccion de movimiento
        max_estados = 0;
        if(digitalRead(pirPin) == HIGH){
          //no hago nada sigo contando
        }
        else{
          t1= millis();          
        }
        if ((millis()-t1)>10){
          MEstados2 = 1;
          numeroFrases = random(__MIN_ESTADOS_TALKING,__MAX_ESTADOS_TALKING);
          t1 = millis();
        
        }
        break;
        
      case 1: //He detectado movimiento
        tmrpcm.stopPlayback();
        aleatorio(10);
        nombre_archivo = "audio1";
        nombre_archivo = nombre_archivo + terminacion;
        nombre_archivo.toCharArray(cadena,40);
        Serial.println(nombre_archivo);
        tmrpcm.play(cadena);
        MEstados2 = 101;
        t1 = millis();
        break;

      case 101:
        if (millis()-t1>3500){
          MEstados2 = 2;
          t1 = millis();
        }
        break;

      case 2: 
        max_estados++;
        MEstados2 = 3;
        if (max_estados>=numeroFrases){
          Serial.println("Salgo por maxEstados");
          MEstados2 = 100;
        }
        break;

      case 3: //Reproduce una cadena aleatoria
        tmrpcm.stopPlayback();
        aleatorio(19);
        nombre_archivo = "aa";
        nombre_archivo = nombre_archivo + terminacion;
        nombre_archivo.toCharArray(cadena,40);
        Serial.println(nombre_archivo);
        tmrpcm.play(cadena);
        //masdelay= random(1000,3500);
        //delay(masdelay);
        MEstados2 = 103;
        break;
     case 103: //espera fija entre frases
        if (millis()-t1>3500){
          MEstados2 = 104;
          t1 = millis();
          t_espera_aleatoria = random(1000,3000);
        }
        break;
         break;   
     case 104://espera aleatoria entre frases
        if (millis()-t1>t_espera_aleatoria){
          MEstados2 = 2;
          t1 = millis();
        }
         break;   

         
     case 100: //Acabo y vuelvo a estado de deteccion
        if(digitalRead(pirPin) == LOW){ 
          MEstados2 = 0;
          tmrpcm.stopPlayback();
          aleatorio(8);
          nombre_archivo = "audio2";
          nombre_archivo = nombre_archivo + terminacion;
          nombre_archivo.toCharArray(cadena,40);
          tmrpcm.play(cadena);
          delay(8000);
          t1 = millis();
       }
    }
}
//para seleccionar los archivos de froma aleatoria
void aleatorio(int imax){
    byte aux_aleatorio = random(1,imax); //para cada sonido hay 10 variantes
    switch(aux_aleatorio){
      case 1:
        terminacion = "-1";
        break;
      case 2:
         terminacion = "-2";
         break;
      case 3:
         terminacion = "-3";
         break;
      case 4:
         terminacion = "-4";
         break;
      case 5:
         terminacion = "-5";
         break;
      case 6:
         terminacion = "-6";
         break;
      case 7:
         terminacion = "-7";
         break;
      case 8:
         terminacion = "-8";
         break;
      case 9:
         terminacion = "-9";
         break;
      case 10:
         terminacion = "-10";
         break;
      case 11:
        terminacion = "-11";
        break;
      case 12:
         terminacion = "-12";
         break;
      case 13:
         terminacion = "-13";
         break;
      case 14:
         terminacion = "-14";
         break;
      case 15:
         terminacion = "-15";
         break;
      case 16:
         terminacion = "-16";
         break;
      case 17:
         terminacion = "-17";
         break;
      case 18:
         terminacion = "-18";
         break;
      case 19:
         terminacion = "-19";
         break;
      default:
         terminacion = "-11";
         break;
    }
}
void presentacion() {
  // set up the LCD's number of columns and rows:
  dht.begin();
  lcd.begin(16, 2);
   lcd.setCursor(0, 1);
   lcd.print("Bienvenidos");
   for (int positionCounter = 0; positionCounter < 57; positionCounter++) {
  lcd.scrollDisplayLeft();
  }
  lcd.setCursor(0, 0);
  lcd.print("Proyecto arduino");
  for (int positionCounter = 0; positionCounter < 45; positionCounter++) {
  lcd.scrollDisplayLeft();
  delay(450);
  }
  {
  delayMicroseconds(500);
  lcd.clear();
}
   }

ustedes disculpen pues me gaste los caracteres máximos por post,les comento lo que no se publico:

cabe mencionar que en un principio tenia el código que muestra la temperatura en el void de "prensentacion" como una función más pero tuve el mismo resultado, así que moví el loop al código principal, de igual manera estaba tratando de eliminar los "delays" por (millis) en algunos casos utiliza delayMicroseconds no se que tanto pueda ayudarme en este código, pues aun tengo mas por agregar, espero puedan apoyarme con alguna idea de antemano muchas gracias.

Como muchos seguramente programaste cada movimiento por separado y luego cuando integraste todo no funciono por los delays u otras estructuras que retiene el programa. Te recomiendo que vuelvas a recorrer el mismo camino. Empieza posteando tu programa para el movimiento mas simple e intenta hacerlo sin utilizar Delays, sera mas fácil aprender y ayudarte de ese modo .

saludos

Hola que tal muy buenos días pues ya eh batallado algo ya ando en modo desesperación pues no puedo dedicarme a otra cosa ya que no puedo terminar este proyecto eh leído de una librería que se llama protothreads pero no eh conseguido nada con éxito aún .

dejo algunos codigos que tengo, para ver si me podrian ayudar a modificar almenos algo minimo que me pueda ayudar, pues creo que las ideas me han dejado de fluir por su atención muchas gracias.

codigo de un sensor de lluvia que me hace activa un motor

int motorcPin1 = 28;  // motor cabeza
int motorcPin2 = 29;  // motor cabeza cambio de giro 

const int sensorPin = 6;
void setup() {
  pinMode(sensorPin, INPUT);
  pinMode(motorcPin1, OUTPUT);
  pinMode(motorcPin2, OUTPUT);
}

void loop() {
      int value = 0;
      value= digitalRead(sensorPin);
      if (value == LOW){
        digitalWrite(motorcPin1, 1); 
        digitalWrite(motorcPin2, 0);
        delay(2000);
      }
      else if (value == HIGH){
         digitalWrite(motorcPin1, 0); 
         digitalWrite(motorcPin2, 1); 
      }
      delay(2000);
     
      }
codigo de un mensaje de bienvenida y muestra temperatura en LCD

#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 5
#define DHTYPE DHT11
DHT dht(DHTPIN, DHTYPE);


LiquidCrystal lcd(13, 12, 10, 9, 8, 7);

void setup() {
   dht.begin();
  lcd.begin(16, 2);
   lcd.setCursor(0, 1);
   lcd.print("Bienvenidos");
   for (int positionCounter = 0; positionCounter < 57; positionCounter++) {
  lcd.scrollDisplayLeft();
  }
  lcd.setCursor(0, 0);
  lcd.print("Proyecto Arduino");
  for (int positionCounter = 0; positionCounter < 45; positionCounter++) {
  lcd.scrollDisplayLeft();
  delay(450);
  }
  {
  delayMicroseconds(500);
  lcd.clear();
}
   }
   void loop() {
int h = dht.readHumidity();
int t = dht.readTemperature(); 
///////////humedad
     lcd.setCursor(0,1);
     lcd.print("HUMEDAD: ");
     lcd.setCursor(8,1);
     lcd.print(h);  //escribe humedad
     lcd.print("%");
   //////////Temperatura     
     lcd.setCursor(0,0);
     lcd.print("TEMPERATURA:");
     lcd.setCursor(12,0);
     lcd.print(t); //escribe temperatura
     lcd.print("C");
    }

estos mensajes que son mostrados en el lcd son los que se alteran cuando activo los motores que controlan el movimiento de "robot", no se si pueda ser por los delays que contiene el código o tiene algúna interferencia o algún pico de corriente que afecta al LCD.

No mencionas como alimentas al robot imagino que con baterías.
Si la pantalla enloquece solo al activar los motores, ya tienes una buena pista.
A mi me ocurrió alguna vez algo similar, y la solución final fue separar las funtes de alimentación de la placa y en mi caso de los ocho relés.

Mario_Lucio:
No mencionas como alimentas al robot imagino que con baterías.
Si la pantalla enloquece solo al activar los motores, ya tienes una buena pista.
A mi me ocurrió alguna vez algo similar, y la solución final fue separar las funtes de alimentación de la placa y en mi caso de los ocho relés.

si tiene razón amigo, no comente, pero tengo baterías separadas para alimentar motores y arduino por separado, supongo que tengo que tendre que alimentar al lcd muy aparte de los motores para evitar los retornos electromagnéticos.

Alimenta el LCD con el Arduino. No consume mucho.