Código incompatible con arduino Mega

Hola, os dejo el siguiente código a ver si me sabéis decir en qué falla pues en arduino UNO funciona a la perfección pero en arduino MEGA no funciona. Solo usa un puerto serial para comunicarse con el ordenador y leer una cadena de datos y sacar información de esa cadena, también cuando se presionan ciertos botones lo envía al ordenador.

Usa los mismos pines que en arduino Mega… No entiendo dónde puede estar la incompatibilidad. Muchas gracias de antemano

/*
 * Versión de prueba utilizando el Sketch de corte de tramos modificado para elevarlo hasta 9 
 * y obtener la velocidad de CEREA.
*/

// Arduino Cerea corte de tramos
#define _marca 14       
#define _contur 15     
#define _a 12           
#define _b A0          
#define _auto A1        
#define _left A2       
#define _right A3      
#define _turnleft A4    
#define _turnright A5  
#define warte 80   

String _Marca="0;";
String _Contur="0;";
String _A="0;";
String _B="0;";
String _Auto="0;";
String _Left="0;";
String _Right="0;";
String _TurnLeft="0;";
String _TurnRight="0;";

String cmd;
String vel_cerea; //cadena que utilizaremos para analizar la velocidad
char nextChar;
String teilbreite;
int anztb ;
int i;
int lsensorVal;
float velocidad; //variable donde almacenamos la velocidad

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);   //Sección 1 Pin 2 
  pinMode(3, OUTPUT);   //Sección 2 Pin 3
  pinMode(4, OUTPUT);   //Sección 3 Pin 4
  pinMode(5, OUTPUT);   //Sección 4 Pin 5
  pinMode(6, OUTPUT);   //Sección 5 Pin 6
  pinMode(7, OUTPUT);   //Sección 6 Pin 7
  pinMode(8, OUTPUT);   //Sección 7 Pin 8
  pinMode(9, OUTPUT);   //Sección 8 Pin 9
  pinMode(10, OUTPUT);  //Sección 9 Pin 10
  pinMode(11, OUTPUT);  // Pin 11  Mando hidráulico
  pinMode(_marca,INPUT_PULLUP);
  pinMode(_contur,INPUT_PULLUP);
  pinMode(_a,INPUT_PULLUP);
  pinMode(_b,INPUT_PULLUP);
  pinMode(_auto,INPUT_PULLUP);
  pinMode(_left,INPUT_PULLUP);
  pinMode(_right,INPUT_PULLUP);
  pinMode(_turnleft,INPUT_PULLUP);
  pinMode(_turnright,INPUT_PULLUP);

  digitalWrite(2, LOW);  // Todos los pines en bajo
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);

}

void loop()
{
    
  cmd = "";   // vacía la cadena cmd
  vel_cerea = ""; //vacía la cadena de velocidad
  ser();      // llamada la funcion ser
  
  if (cmd.startsWith("@CEREA;")) {  //Si empieza la cadena con @CEREA: 
    cerea(); //llamamos a la función que analiza y gestiona el corte de tramos.
    velocidad_cerea(); //llamamos a la función que analiza sólo la velocidad.
  }
  if (cmd.startsWith("@HIDRAU")) {    //Si empieza la cadena con @HIDRAU:
    hidrau();                         //Si no se necesita el hidráulico se puede quitar(con //). "evt. hier entferenen um Hyraulik nicht zu nutzten"
  }

  TMarca();
  TContur();
  TA();
  TB();
  TAuto();
  TLeft();
  TRight();
  TTurnLeft();
  TTurnRight();
}

void TMarca()
{
  if (digitalRead(_marca)==LOW)
  {
    do {delay(warte);} while (digitalRead(_marca)==LOW);
    if (_Marca=="0;")
    {
      _Marca="1;";
    }
    else
    {
      _Marca="0;";
    }
    SendSerial();
  }
}

void TContur()
{
  if (digitalRead(_contur)==LOW)
  {
    do {delay(warte);} while (digitalRead(_contur)==LOW);
    if (_Contur=="0;")
    {
      _Contur="1;";
    }
    else
    {
      _Contur="0;";
    }
    SendSerial();
  }
}

void TA()
{
  if (digitalRead(_a)==LOW)
  {
    do {delay(warte);} while (digitalRead(_a)==LOW);
    _A="1;";
    SendSerial();
    delay(100);
    _A="0;";
    SendSerial();
  }  
}

void TB()
{
  if (digitalRead(_b)==LOW)
  {
    do {delay(warte);} while (digitalRead(_b)==LOW);
    _B="1;";
    SendSerial();
    delay(100);
    _B="0;";
    SendSerial();
  }  
}
  

void TAuto()
{
  if (digitalRead(_auto)==LOW)
  {
    do {delay(warte);} while (digitalRead(_auto)==LOW);
    if (_Auto=="0;")
    {
      _Auto="1;";
    }
    else
    {
     _Auto="0;";
    }
      SendSerial();
  }
}

void TLeft()
{
  if (digitalRead(_left)==LOW)
  {
    do {delay(warte);} while (digitalRead(_left)==LOW);
   _Left="1;";
   SendSerial();
   delay(100);
   _Left="0;";
   SendSerial();
  }
}

void TRight()
{
  if (digitalRead(_right)==LOW)
  {
    do {delay(warte);} while (digitalRead(_right)==LOW);
  _Right="1;";
  SendSerial();
  delay(100);
  _Right="0;";
  SendSerial();
  }
}

void TTurnLeft()
{
  if (digitalRead(_turnleft)==LOW)
  {
    do {delay(warte);} while (digitalRead(_turnleft)==LOW); 
   _TurnLeft="1;";
   SendSerial();
   delay(100);
   _TurnLeft="0;";
   SendSerial();
  }
}

void TTurnRight()
{
  if (digitalRead(_turnright)==LOW)
  {
    do {delay(warte);} while (digitalRead(_turnright)==LOW);
  _TurnRight="1;";
  SendSerial();
  delay(100);
  _TurnRight="0;";
  SendSerial();
  }
}

void SendSerial()
{
  Serial.print ("@SDOSE;"+_Marca+_Contur+"0;0;"+_A+_B+_Auto+_Left+_Right+_TurnLeft+_TurnRight+"END"); //si contacto en GND Marc fuera.wenn Kontakt auf GND Marc aus
  Serial.print ('\r');
  Serial.print ('\n');  
}

void velocidad_cerea()
{
  vel_cerea.remove(0, 7); //eliminamos @cerea; de la cadena
  int posicion = vel_cerea.indexOf(';'); //busca hasta el primer ; (esa cifra es la velocidad)
  vel_cerea.remove(-2 ); //retrocedemos para selecionar el ; y eliminamos hasta el final de la cadena, ahora solo debería de quedar en la cadena la cifra de velocidad.
  velocidad = vel_cerea.toFloat(); //Pasamos el valor de la cadena a un número entero, que como definimos velocidad de tipo float debería de tener decimales.
 /*
  * Aquí hacemos lo que queramos con la velocidad. 
 */ 
}


void cerea()   //Evaluar cadena.String auswerten evaluar
{

  cmd.remove(0, 7); //elimina @Cerea; . entferenen 

  int first = cmd.indexOf(';');   //busca el primer; .erstem ; suchen
  int second = cmd.indexOf(';', first + 1 );  // busca el segundo; .zweiten ; suchen

  cmd.remove(0, second + 1); //velocidad y menos 1 distancia.geschwindigkeit und minus 1 entferene

  int ende = cmd.indexOf('END'); //busca "fin"
  anztb = (ende - 2) / 2; //determina el número de las secciones(sección 1 es pin 2).anzahl teilbreiten ermitteln

  teilbreite = cmd.substring(0, ende - 3); //determinar el número de secciones.teilbreiten in einen neuen string

 

  int b = 1;
  for (i = 0; i < anztb * 2 ; i = i + 2) { //cambiar secciones de ancho parcial.teilbreiten schalten
    b = b + 1;
    if (teilbreite.substring(i, i + 1) == "1")  digitalWrite(b, LOW);       //Enciende la sección.Teilbreite einschalten
    if (teilbreite.substring(i, i + 1) == "0" ) digitalWrite(b, HIGH);      //Apaga la sección.Teilbreite ausschalten
  }

  for (i = anztb + 1 ; i < 10; i++) { // secciones restantes
    digitalWrite(i + 1, HIGH);
  } 
}


void hidrau()
{
  int ende = cmd.indexOf('END'); //busca "end".sucht nach "end"
  cmd.remove(0, ende - 3); // quitar el resto.rest entfernen
  
  
  if (cmd.substring(0, 1) == "1") {
    digitalWrite(11, LOW);         //hidraulico encendido -> reemplace bajo por alto si no se requiere hidro
  }
  if (cmd.substring(0, 1) == "0") {
    digitalWrite(11, HIGH);       //hidraulico apagado.hyro aus
  }
}


void ser()   // Leer la interfaz serial hasta el regreso
{
  do {
    if (Serial.available() > 0)
    {
      nextChar = Serial.read();
      if (nextChar >= 32) {
        cmd += nextChar;
        vel_cerea += nextChar;
      }
    }
  } while (nextChar != 10);  //leer hasta el final de la línea.solange lesen bis zeilenende
}

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