Pasar código de NANO a arduino UNO.

Hola como están? queria ver si algun compañero me puede sacar de dudas tengo un codigo que saque de la red pero es para funcionar en arduino nano,el autor del codigo no responde a unas dudas que tengo(quizas el blog no este activo o lo a dejado morir) la duda es la siguiente,no veo nada en el lcd poniendo los pines como los tiene en el codigo ya e echo varios cambios de cableado y de programacion cambiando los pines y no sale nada,solo lo tipico las barras de la primera linea,yo quiero que se vea en un lcd i2c y en el modo normal (A5,A4),y una pregunta,¿se puede trabajar perfectamente con el arduino uno en vez del arudino nano? se que habra algunos pines que tendre que andar cacharreando pero primero queria solucinar el del lcd.

os dejo el codigo original,os agradesco vuestra colabaración.

#include <SoftwareSerial.h>
#include <Keypad.h>


          
#define txPin 13 // Pin de Transmision

SoftwareSerial LCD = SoftwareSerial(0, txPin);                                          // since the LCD does not send data back to the Arduino, we should only define the txPin




const int LCDdelay=10;                                                                  // conservative, 2 actually works

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns

char keys[ROWS][COLS] = 
{
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};

byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const int passwordLength = 6;                                                                  // Definimos cuantos digitos queremos que tenga nuestra contraseña
int  currentLength        = 0;                                                                  // Define que numero de la contraseña estamos escribiendo actualmente sobre el teclado
char password[passwordLength];                                                                 // Almacena la contraseña o codigo de ACTIVACION/DESACTIVACION
char codIntro[passwordLength];                                                                 // Almacena los valores de los códigos introducidos

int i = 0; 
int j = 0;
int delayCountDown = 800;
char entered[5];                                                                               // Almacena el codigo introducido por el teclado para compararlo con el almacenado en password[5]

char horas[2];                                                                          // Definimos buffer las  HORAS
char minutos[2];                                                                          // Definimos buffer los  MINUTOS
char segundos[2];                                                                         // Definimos buffer los  SEGUNDOS

unsigned int horasTotal;                                                                          // Definimos  las  HORAS
unsigned int minutosTotal;                                                                          // Definimos  los  MINUTOS
unsigned int segundosTotal;                                                                         // Definimos  los  SEGUNDOS

int bufferTiempo[3];

int intentos = 5;
int posicion = 5;
int countPos = 0;

int cables[5] = {1,1,1,1,1};

const int digitosLenght    = 2;                                                                // Definimos que longitud tienen que debe tener cada HORA, cada MINUTO y cada SEGUNDOS. HORA: 00(2)  MINUTO: 00(2)  SEGUNDO: 00(2)
const int maxDigitosTiempo = 6;                                                                // Definimos la longitud total que tener las HORAS, MINUTOS y SEGUNDOS. HORA: 00(2) + MINUTO: 00(2) + SEGUNDO: 00(2) = 6

int keySwitch =  0;




void setup()
{
    Serial.begin(9600);   
    pinMode(12, INPUT);
    pinMode(11, OUTPUT);
    LCD.begin(9600);
    clearLCD();
    lcdPosition(0,0);
    backlightOn();
    
    
    
    keypad.addEventListener(keypadEvent); // Add an event listener for this keypad
    
    introduccionJuego();
      
}

void loop()
{
  if(digitalRead(12))
  {
       switch(keySwitch)
       {
          case 0 : //tone(11, 440, 500);                  
                   introduceTiempoPartida();                 
                   convertirDigitosTiempoPartidaInteger();                
                   introduceCodigoActivacion();
                   keySwitch = 1; 
                   break;
                   
          case 1 : comprobarCables();
                   leerCodigo(); 
                   countDown(); 
                   ponerTiempo();  
                   ponerPantallaCodigo();
                   ponerIntentosRestantes();
                   break;
       } 
   }
   else
   {
      Serial.println("0");
      delay(500);
   }
}

void comprobarCables()
{
    cables[0] = analogRead(0);
    cables[1] = analogRead(1);
    cables[2] = analogRead(2);
    cables[3] = analogRead(3);
    cables[4] = analogRead(4);
    
    Serial.print("( ");
    Serial.print(cables[0]);
    Serial.print(" , ");
    Serial.print(cables[1]);
    Serial.print(" , ");
    Serial.print(cables[2]);
    Serial.print(" , ");
    Serial.print(cables[3]);
    Serial.print(" , ");
    Serial.print(cables[4]); 
    Serial.print("  )");
    Serial.println();
    
    if(cables[0]<1015)                            // AUMENTA VELOCIDAD +4
    {
       tone(11, 1200, 300);
       delay(700);
       tone(11, 1200, 300);
       delay(700);
       delayCountDown=250;
       Serial.println("AUMENTA VELOCIDAD +4");
       
    }
    if(cables[1]<1015)                            // PONE LA BOMBA EN NORMALIDAD
    {
       delayCountDown=1000;
       Serial.println("VELOCIDAD NORMAL");
       
    }
    if(cables[2]<1015)                            // SE DETIENE
    {
      bombaDesactivada();
      Serial.println("1");
     
    }
    if(cables[3]<1015)                            // EXPLOTA
    {
       Serial.println("2");
       bombaExplosion();
       
    }
    if(cables[4]<1015)                            // AUMENTA VELOCIDAD +2
    {

el codigo es muy largo y no cabe,esta es la continuacion.

}

void leerCodigo()
{
   if(j < passwordLength)
   {
    lcdPosition(1, 5+j);
    
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*')&&(key != '#'))
      { 
        LCD.print(key);
        codIntro[j] = key;
        j++;
        //tone1.play(NOTE_C6, 200);
      }
    }
  }
   comprobarCodigo(); 
}

void ponerPantallaCodigo()
{
    lcdPosition(1,0); 
    LCD.print("COD:");
    
    //Leer Codigo del teclado 
    //Comprobar Codigo

}

void bombaDesactivada()
{
    clearLCD();
    lcdPosition(0, 5);
    LCD.print("3");
    lcdPosition(1, 1);
    LCD.print("4 :)");
    tone(11, 800, 300);
    delay(700);
    tone(11, 800, 300);
    delay(700);
    tone(11, 800, 300);
    delay(1000000);  
}

void bombaExplosion()
{
    clearLCD();
    lcdPosition(0, 5);
    LCD.print("5");
    lcdPosition(1, 2);
    LCD.print("6");
    tone(11, 200, 2500);
    delay(1000000);
}

void comprobarCodigo()
{
  if(j==passwordLength)
  {
     if(codIntro[0]==password[0] && codIntro[1]==password[1] && codIntro[2]==password[2] && codIntro[3]==password[3] && codIntro[4]==password[4] && codIntro[5]==password[5])
     {
          bombaDesactivada();
     } 
     else
     {
        lcdPosition(1, 5);
        LCD.print("ERROR!");
        tone(11, 200, 300);
        delay(500);
        
        if(intentos>0)
        {
          intentos--;
        }
        else
        {
           bombaExplosion();
        }      
        j=0;
        clearLCD();
     } 
  }  
}

void ponerIntentosRestantes()
{
    lcdPosition(1,15); 
    LCD.print(intentos);
}

void ponerTiempo()
{  
     char bufferTiempo[9]=""; 
     sprintf(bufferTiempo, "%02d:%02d:%02d", horasTotal, minutosTotal, segundosTotal); 
     lcdPosition(0,4);   LCD.print(bufferTiempo);
    
}



void lcdPosition(int row, int col)                                                       // Goto with row & column 
{
  LCD.write(0xFE);                                                                       //command flag
  LCD.write((col + row*64 + 128));                                                       //position 
  delay(LCDdelay);
}

void clearLCD()                                                                          //Limpiamos el LCD
{
  LCD.write(0xFE);                                                                       //command flag
  LCD.write(0x01);                                                                       //clear command.
  delay(LCDdelay);
}

void backlightOn()                                                                       //turns on the backlight
{  
  LCD.write(0x7C);   //command flag for backlight stuff
  LCD.write(157);    //light level.
  delay(LCDdelay);
}

void backlightOff()
{  //turns off the backlight
  LCD.write(0x7C);   //command flag for backlight stuff
  LCD.write(128);     //light level for off.
  delay(LCDdelay);
}

void serCommand()
{   //a general function to call the command flag for issuing all other commands   
  LCD.write(0xFE);
}

y sigue:

// Taking care of some special events.
void keypadEvent(KeypadEvent key)
{
  
}

void introduceTiempoPartida()
{
int count = 0;

lcdPosition(0,3); 
LCD.print("7");
lcdPosition(1,1); 
LCD.print("8");

delay(1000);
clearLCD();

lcdPosition(0,1); 
LCD.print("9");

lcdPosition(1,1); 
LCD.print("H:");
lcdPosition(1,6);
LCD.print("M:");
lcdPosition(1,11);
LCD.print("S:"); 




while (currentLength < maxDigitosTiempo)
{
 
  
  char key = keypad.getKey();
  key == NO_KEY;
  if (key != NO_KEY)
  {
    if ((key != '*')&&(key != '#'))
    { 
       switch(count)
       {
         case 0 :   lcdPosition(1,3);              // HORA     (1,3)
                    LCD.print(key);
                    currentLength++;
                    horas[0]=key;
                    count++;
                    break; 
                    
         case 1 :   lcdPosition(1,4);              // HORA     (1,4)
                    LCD.print(key);
                    currentLength++;
                    horas[1]=key;
                    count++;
                    break;
                    
         case 2 :   lcdPosition(1,8);              // MINUTO   (1,8)
                    LCD.print(key);
                    currentLength++;
                    minutos[0]=key;
                    count++;
                    break; 
                    
         case 3 :   lcdPosition(1,9);              // MINUTO   (1,9)
                    LCD.print(key);
                    currentLength++;
                    minutos[1]=key;
                    count++;
                    break; 
                    
         case 4 :   lcdPosition(1,13);              // SEGUNDO  (1,13)
                    LCD.print(key);
                    currentLength++;
                    segundos[0]=key;
                    count++;
                    break; 
                    
         case 5 :   lcdPosition(1,14);              // SEGUNDO  (1,14)
                    LCD.print(key);
                    currentLength++;
                    segundos[1]=key;
                    count++;
                    break;
         case 6 :   delay(1500);count=0;break;           
       }//Switch 
    }// if * #
  }// if NOKEY
   
} //while
currentLength=0;
delay(3000);
clearLCD();


}

void convertirDigitosTiempoPartidaInteger()
{
  int hora0      =  horas[0]      -  '0';           // Convertimos el char a integer quitandole el valor de '0' de la tabla ASCII 
  int hora1      =  horas[1]      -  '0';
  int minuto0    =  minutos[0]    -  '0';
  int minuto1    =  minutos[1]    -  '0';
  int segundo0   =  segundos[0]   -  '0';
  int segundo1   =  segundos[1]   -  '0';

  horasTotal     =  (hora0*10)+hora1;
  minutosTotal   =  (minuto0*10)+minuto1;
  segundosTotal  =  (segundo0*10)+segundo1;


  
}

void countDown()
{
  if(horasTotal == 0)
  {
   if(minutosTotal == 0 && segundosTotal != 0)
{
           segundosTotal--; 
           if(segundosTotal>10)
           {
             tone(11, 440, 200);
             tone(11, 440, 100);
             delay(100);
             tone(11, 440, 100);
             delay(100);
           }
           else
           {  
             tone(11, 440, 200);
           } 
      }
      
if(minutosTotal != 0 && segundosTotal == 0)
{
           minutosTotal--;
           segundosTotal = 59;
      }
      
if(minutosTotal != 0  && segundosTotal != 0)
{
           segundosTotal--;
      }
  }

  if(horasTotal != 0)
  {
      if(minutosTotal == 0 && segundosTotal == 0)
{
           horasTotal--;
           minutosTotal = 59;
           segundosTotal = 59;
      }
     
if(minutosTotal == 0 && segundosTotal != 0)
{
           segundosTotal--; 
      }
      
if(minutosTotal != 0 && segundosTotal == 0)
{
           minutosTotal--;
           segundosTotal = 60;
      }
      
if(minutosTotal != 0  && segundosTotal != 0)
{
           segundosTotal--;
      }
  }
  
  if(horasTotal==0 && minutosTotal==0 && segundosTotal==0)
  {
     bombaExplosion();
  }
  
  
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  leerCodigo(); 
  delay(delayCountDown/20);
  
}


void introduceCodigoActivacion()
{ 


lcdPosition(0,0); 
LCD.print("10");
lcdPosition(1,2); 
LCD.print("11");

delay(1000);
clearLCD();

lcdPosition(0,1); 
LCD.print("12");

while (currentLength < passwordLength)
{
  lcdPosition(1, 5+currentLength);
  
  char key = keypad.getKey();
  key == NO_KEY;
  if (key != NO_KEY)
  {
    if ((key != '*')&&(key != '#'))
    { 
      LCD.print("*");
      password[currentLength] = key;
      currentLength++;
      //tone1.play(NOTE_C6, 200);
    }
  }
}
 delay(4000);
 clearLCD();
 
if (currentLength == passwordLength)
{
  lcdPosition(0,0); 
  LCD.print("13");
  lcdPosition(1,5); 
    
  LCD.print(password[0]);
  LCD.print(password[1]);
  LCD.print(password[2]);
  LCD.print(password[3]);
  LCD.print(password[4]);
  LCD.print(password[5]);

  //tone1.play(NOTE_E6, 200);
  delay(6000);
  clearLCD();
  
      
      lcdPosition(0, 5);
      LCD.print("14");
      lcdPosition(1, 4);
      LCD.print("15");
      tone(11, 800, 300);
      delay(700);
      tone(11, 800, 300);
      delay(700);
      tone(11, 800, 300);
      delay(2000);
      clearLCD();    
  
  lcdPosition(0,4); 
  LCD.print("16");
  lcdPosition(1,7); 
  LCD.print(":)");      
  
  delay(2000);
  clearLCD();
  
  currentLength = 0;
}


}

void introduccionJuego()
{
lcdPosition(0,5); 
LCD.print("17");
lcdPosition(1,4); 
LCD.print("18");

delay(3000);
//clearLCD();


}

Nano y UNO son casi iguales salvo porque NANO tiene entradas A6 y A7 que el UNO no tiene.
Si tu código no las usa entonces no hay problemas en copiarlo en el IDE y solo cambiar la tarjeta objetivo a UNO y debería funcionar.

Cuando un código es muy grande (+ de 9000) caracteres lo que puedes hacer es adjuntarlo con las herramientas que aparecen al pie lado izquierdo.
Ahora en el post#2 te quedó el código sin el tag de código, intenta editarlo.
Si no sabes como mira las normas del foro que te guiarán.

Gracias por tu aporte surbyte,ya e modificado el post,el caso es no se usan los pines que me describe A6 Y A7,aun asi tengo una atem 2560 que esa si daria para hacerlo verdad? como digo en el post todo me compila bien sin error,el problema que tengo es el lcd que quiero poner un i2c,el autor usa otro lcd que no se que modelo es exactamente y yo quiero que en los pines A5 y A4 me funcionen a mi,lo e echo y no compila da error,tambien lo e echo con el codigo original y no se exactamente cuales son las salidas del lcd,creo que el 0 y el 13,pero este lcd solo tiene 3 cables ,rojo,negro y blanco,asi que aqui me pierdo se como son los 16x2 que tienen 4 cables no se mucho de programación pero asi lo e echo y no muestra nada en el lcd.

este es el lcd que usa el autor,yo quiero que me funcione el tipo i2c 16x2 alguien me puede ayudar a poner el lcd ic2?

os agradeceria tambien el que lo sepa que me diga que tipo de lcd es este.

Ahhh ahora quieres correr un LCD I2C en un Mega? bueno, los pines I2C en el MEGA son

Hola de nuevo! No es eso no me has entendido quería decir que si no fuera en UNO iria en 2560, como tb tiene A6 Y A7 eso es lo de menos de momento lo que quiero es meter en el código los parámetros del i2c para me funcione el lcd,yo no se hacerlo.

Ahora te comprendo.
Esta librería New LiquidCrystal es brillante
Te permite dejar todo el código del lcd tal como está y solo modificas su inicialización.
Para un LCD i2C solo debes iniciarlo asi

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x38); // Set the LCD I2C address

Bueno pues haciendo lo que me indicas me da exactamente el mismo error que me da mi y es este:

AirsoftBurguera_ino : 22 : error : ' keypadEvent ' variable o campo declarado desierto
AirsoftBurguera_ino : 22 : error : ' KeypadEvent ' no se declaró en este ámbito
AirsoftBurguera_ino.ino : En función " void setup () ' :
AirsoftBurguera_ino : 83 : error : ' keypadEvent ' no se declaró en este ámbito
variable o campo ' keypadEvent ' declarados nulos

Este informe podría tener más información con
"Muestra una salida detallada durante la compilación "
from activala Archivo > Preferencias

Bueno pero ese es error del resto del código.

Te adjunto el código.
A mi me compila.
Le faltaba un {

CodigoNano.ino (13.1 KB)

si compilar compila el original sin problema,lo que pasa es que no se ve en mi lcd que es i2c y al poner las lineas de ic2 da ese error y no se ve nada,con el codigo que me has pasado sigue igual solo se ven las barras de carga del lcd.

Bueno yo no tengo lcd i2c asi que si no funciona no se que decirte.
Supongo que has hecho una prueba simple no?
En otro programa mas chico , has corrido un ejemplo I2C para el LCD?

Yo si tengo lcd i2c. Cuando tenga un rato, lo pruebo.

Gracias por vuestra colaboración si e corrido el i2c con otro programa y me funciona bien, el problema esta en meter las lineas en el codigo y da el error de arriba antes mencionado.

Prueba con el codigo que te adjunto y la libreria de DF robot.

Libreria LCD i2c DFrobot

CodigoNano.ino (12.3 KB)

Gracias carmeloco ya veo el lcd funcionando y con letras,aunque no como lo tiene el autor es decir,al principio del programa ponia dos frases una en la linea 1 y la otra en la linea 2,aqui me salen las dos frases en la misma linea,andare investigando y haciendo pruebas....de todas maneras te agradeceria que me dijeras que tipo de lcd a usado el autor del proyecto,nunca e visto ese tipo de lcd solo con tres cables,en los posts de mas arriba hay dos fotos para que lo veas.

No necesito las fotos. Declara el lcd con un softserial, lo que deja claro que es un lcd serie. Lo de las posiciones, la clave, está en los comandos de setCursor.

Yo no lo he llegado a probar, porque he estado fuera de casa y no tenia acceso a ningún lcd, y no dispongo de keypad, y hacerme uno a base de pulsadores y cables, me da mucha pereza, jajajaja

De nuevo gracias,pero al final despues de tanto andar rondando a la morena veo muy complicado poder llevar a cabo este proyecto,sin tener esquema electrico estoy mas que perdido,ya e intentado rebuscar y rebuscar ver y requetever pero no me hago con ello,mil gracias por vuestro tiempo invertido al menos e aprendido una cosa mas.

Las dos lineas a las que te refieres son 17 y 18? o sea la rutina introduccionJuego() ?

¿El autor del código no proporciona el esquema eléctrico?