Codigo carga en arduino (keystudio) MEGA y no en arduino UNO R3 (original)

Buenas!

Hace poco que he comenzado con Arduino a modo de hobby, y toqueteando estoy haciendo un programa que pueda correr en un Arduino UNO R3 (original) pero no consigo que lo haga. Desconozco si existen limitaciones por la propia placa, ya que el corro el codigo en MEGA (keystudio) y no hay ningún tipo de problema.

No es tanto el código en sí, sino por qué puede estar ocurriendo esto.

Buscando en otro idomas no he encontrado nada (o no sé como encontrarlo) si me pueden echar una mano, lo agradecería!!!!

Sin ver el código y sin saber si al menos compila para UNO o ver los errores, nos pides jugar a las adivinanzas.
Lo mínimo que deberías hacer es buscar las características de la Mega y de la UNO y compararlas para ver si lo que corre en la primera puede correr en la segunda.
Solo por jugar tu juego, podría ser falta de memoria o mala asignación de pines o cualquier otra cosa.

Saludos

Buenas,
Disculad!

Adjunto el codigo. Lo raro es que funcionaba perfectamente hace unas horas, y de repente dejó de funcionar.

Dentro de mi poco conocimiento, he intentado optimizar el código lo máximo posible.

Al final la funcionalidad es "adivinar" la contraseña de 3 números, utilizando tan solo 2 señales de entrada (2 botones fisicos) en los pines 2/3. Y en cualquier momento puedes volver al inicio del juego.

Lo que comento, la memoria del arduino indicaba que utiliza el 60% y la flash al 44% (si no recuerdo mal).

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

Adafruit_SSD1306 display(128, 64, &Wire, 13);
LiquidCrystal_I2C LCD(0x27,20,4);
int GAME=0;
int START=0;
int n1;
int n2;
int n3;
int RB = 2;
int LB = 3;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
LCD.init();
pinMode(RB,INPUT);
pinMode(LB,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("Wanna play");
display.setCursor(0,20);
display.println("password  game?");
display.display();
GAME=0;
START=0;
LCD.noBacklight();
LCD.clear();

  if (digitalRead (RB)== HIGH && digitalRead(LB) == HIGH){
while (GAME == 0 && START==0){
START_GAME_LOOP();
}
while (GAME == 1 && START==0){
Password_Game_START();
}
while (GAME == 1 && START==1){
Password_Game_FIRST();
}
while (GAME == 1 && START==2){
Password_Game_SECOND();
}
while (GAME == 1 && START==3){
Password_Game_THIRD();
}
  }

if ((digitalRead (RB)== HIGH && digitalRead(LB) == LOW) || (digitalRead (RB)== LOW && digitalRead(LB) == HIGH)){

display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);

display.setCursor(0,0);
display.println("PRESS");
display.setCursor(0,20);
display.println("LB & RB");
display.display();
delay(1000);
}
  }
 
//--------------------------------------------------------------------------------------------//
//GAME START//
void START_GAME_LOOP(){
if (GAME==0){
GAME=1;
delay(500);
}else {
GAME=0;
GAME=0;
START=0;
n1=0;
n2=0;
n3=0;
}
  }
void GAME_LOOP(){
GAME=0;
START=0;
n1=0;
n2=0;
n3=0;
delay(500);
}

void Password_Game_START(){

if (digitalRead (RB) == LOW && digitalRead(LB) == LOW){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);

display.setCursor(0,0);
display.println("Let's");
display.setCursor(0,20);
display.println("start");
display.setCursor(0,40);
display.println("Press RB");
display.display();

//USE OTHER BUTTOM
if (digitalRead (RB) == LOW && digitalRead(LB) == HIGH){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("USE RB");
display.setCursor(0,40);
display.println("NOT LB");
display.display();
delay(3000);
}
//COUNT 3
if (digitalRead (RB) == HIGH && digitalRead(LB) == LOW){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("Wait...");
display.setCursor(0,40);
display.println(3);
display.display();
delay(1000);

//COUNT 2
if (digitalRead(RB)==HIGH){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("Wait...");
display.setCursor(0,40);
display.println(2);
display.display();
delay(1000);

//COUNT 1
if (digitalRead(RB)==HIGH){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("Wait...");
display.setCursor(0,40);
display.println(1);
display.display();
delay(1000);

//COUNT 0
if (digitalRead(RB)==HIGH){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(1);
display.setCursor(0,0);
display.println("Wait...");
display.setCursor(0,40);
display.println(0);
display.display();
delay(1000);

START=1;
}
  }
    }
      }
        }
          
if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
            }
              }
// PASWORD GAME START (FINISH)
//--------------------------------------------------------------------------------------------// PASSWORD 1
void Password_Game_FIRST (){

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("FIRST CLUE");
display.setCursor(0,20);
display.println("CHOOSE NUMBER *1*");
display.setCursor(0,40);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,50);
display.println("PRESS RB TO ACCEPT");
display.display();



if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n1 != 1){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("WRONG NUMBER");
display.setCursor(0,20);
display.println("TRY AGAIN");
display.display();
delay(1000);
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n1 == 1){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("GUESSED!!");
display.setCursor(0,20);
display.println("LET'S TRY SECOND ONE");
display.display();
delay(3000);
START=2;
}

//CHOSE FIRST NUMBER OF PASSWORD
if (digitalRead (LB) == HIGH && digitalRead(RB) == LOW){
while(digitalRead(RB) == LOW && START ==1){
//COME TO START
if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
  display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("GAME FINISHED");
GAME_LOOP();
delay (1000);
}

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("SEE OTHER SCREEN");
display.setCursor(0,20);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,40);
display.println("PRESS RB TO ACCEPT");
display.display();


if(digitalRead (LB)==HIGH){
  if(n1 == 9){
    n1 = 0;
    delay(500);
 }else{
n1 = n1 + 1;
delay(500);
 }

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n1);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
 
}else{

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n1);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");

}
  }
    }
      }
        


//--------------------------------------------------------------------------------------------// PASSWORD 2
void Password_Game_SECOND (){

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("SECOND CLUE");
display.setCursor(0,20);
display.println("2*5-3");
display.setCursor(0,40);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,50);
display.println("PRESS RB TO ACCEPT");
display.display();

LCD.backlight();
LCD.clear();
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);

if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n2 != 7){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("WRONG NUMBER");
display.setCursor(0,20);
display.println("TRY AGAIN");
display.display();
delay(1000);
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n2 == 7){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("GUESSED!!");
display.setCursor(0,20);
display.println("LET'S TRY LAST ONE");
display.display();
delay(3000);
START=3;
}

//CHOSE FIRST NUMBER OF PASSWORD
if (digitalRead (LB) == HIGH && digitalRead(RB) == LOW){
while(digitalRead(RB) == LOW && START ==2){
//COME TO START
if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
}

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("SEE OTHER SCREEN");
display.setCursor(0,20);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,40);
display.println("PRESS RB TO ACCEPT");
display.display();


if(digitalRead (LB)==HIGH){
  if(n2 == 9){
    n2 = 0;
    delay(500);
 }else{
n2 = n2 + 1;
delay(500);
 }

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n2);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);
 
}else{

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n2);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);

}
  }
    }
      }
//--------------------------------------------------------------------------------------------// PASSWORD 3
void Password_Game_THIRD(){

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("LAST CLUE");
display.setCursor(0,20);
display.println("SECOND DIGIT OF YOUR");
display.setCursor(0,30);
display.println("BIRTHDAY");
display.setCursor(0,45);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,55);
display.println("PRESS RB TO ACCEPT");
display.display();

LCD.backlight();
LCD.clear();
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);
LCD.setCursor(11,1);
LCD.print(n2);

if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n3 != 8){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("WRONG NUMBER");
display.setCursor(0,20);
display.println("TRY AGAIN");
display.display();
delay(1000);
}

if (digitalRead (LB) == LOW && digitalRead(RB) == HIGH && n3 == 8){
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("GUESSED!!");
display.setCursor(0,20);
display.println("YOU BEAT");
display.setCursor(0,40);
display.println("THE GAME");
display.display();

LCD.backlight();
LCD.clear();
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);
LCD.setCursor(11,1);
LCD.print(n2);
LCD.setCursor(12,1);
LCD.print(n3);
delay(3000);
START=0;
}

if (digitalRead (LB) == HIGH && digitalRead(RB) == LOW){
while(digitalRead(RB) == LOW && START ==3){
//COME TO START
if (digitalRead (RB) == HIGH && digitalRead(LB) == HIGH){
GAME_LOOP();
}

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(1);
display.setCursor(0,0);
display.println("SEE OTHER SCREEN");
display.setCursor(0,20);
display.println("PRESS LB TO CHOOSE");
display.setCursor(0,40);
display.println("PRESS RB TO ACCEPT");
display.display();


if(digitalRead (LB)==HIGH){
  if(n3 == 9){
    n3 = 0;
    delay(500);
 }else{
n3 = n3 + 1;
delay(500);
}

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n3);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);
LCD.setCursor(11,1);
LCD.print(n2);
 
}else{

LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(n3);
LCD.setCursor(0,1);
LCD.print("PASSWORD:");
LCD.setCursor(10,1);
LCD.print(n1);
LCD.setCursor(11,1);
LCD.print(n2);

}
  }
    }
      }

Si

El Sketch usa 19214 bytes (59%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 905 bytes (44%) de la memoria dinámica, dejando 1143 bytes para las variables locales. El máximo es 2048 bytes.

O sea, quedan 1143 bytes de RAM de los cuales se necesitan 1024 como buffer para la pantalla OLED por lo que no queda memoria suficiente para el resto.

Hay una librería para la 1306 que es solo para texto entonces usa muy poca memoria (buscala como "SSD1306Ascii").

Problema resuelto!

Mil gracias! La peculiaridad es que no es exactamente igual que la otra, y está mucho más optimizada para lo que buscaba!

Mil gracias!

Si claro, es solo para texto entonces no necesita del buffer gráfico por lo que usa casi nada de la memoria RAM.