Char array problemas al cargar

Hola comunidad. Es mi primera vez publicando en este foro y casi de seguro estoy publicando de mal manera (quizás no sea la sección correcta). Pido disculpas de antemano si esto ocurre.

Desde ya quiero agradecerles a todos por responder en los distintos tópicos, pues me han ayudado muchísimo. Hace un año ya que estoy adentrándome en la programación en c++ con arduino y estoy convencido que es un viaje solo de ida.. cada vez más interesado en esto.

Les comento un problema que no puedo resolver. Trataré de ser lo más concreto posible a pesar de que es un programa largo.

tengo dos arrays de caracteres.

char HORA_ALARMA1[2]={'2','1'};
char MINUTOS_ALARMA1[2]={'3','1'};

estos se inicializan con esos valores pero pueden ser cambiados desde un teclado matricial (Keypad).

El programa funciona como un reloj despertador. Lo que ocurre es que a la hora de comparar el array HORA_ALARMA con la hora actual y el array MINUTOS_ALARMA con los minutos actuales no coinciden.

Lo que descubrí hasta ahora con el monitor serie es que el segundo array guarda datos del primero sin que yo se lo indique.

esto es lo que me aparece en el monitor serie:

Array hora 21 123A456B789C0#D
Array minutos 3121 123A456B789C
0#D

es como que el primer aray queda almacenado en los indices 2 y 3 del segundo array a pesar de que yo haya declarado al inicio que el segundo array tiene que tener dos elementos.

No estoy entendiendo que es lo que ocurre y por que lo hace.

NUEVAMENTE:
Doy gracias a todos por el apoyo y pido disculpas si la forma de postear no fue la adecuada.

Antes que nada edita el título de tu post, tiene que ser relativo a tu duda y la palabra ayuda no está permitida.

Luego, sube el código que tienes para ver dónde está el error porque lo que te muestra el serial es bastante raro, algo no está bien en el código.

Saludos

Muchas gracias por la respuesta. Ahora mismo lo publico como dices

El código está mal presentado.
Edita el post, selecciona todo el código y toca el simbolo </>

Por otro lado no encuentro dónde mandas a consola los valores de los array que te da el resultado que muestras en tu primer post.

/*----------------------------------------------------------------------------------------------------------------------------------------
 * ---------------------------------------------------------------------------------------------------------------------------------------
 *                       DISPENSADOR AUTOMÁTICO DE ALIMENTO BALANCEADO (D.A.A.B.) v. 2.0
 *                                Diseñado y programado por Agustín Marozzi
 *----------------------------------------------------------------------------------------------------------------------------------------
 ----------------------------------------------------------------------------------------------------------------------------------------*/


/*---------------------------------------------------------------------------------------------------------------------------------------
 *                                                      LIBRERIAS
 ---------------------------------------------------------------------------------------------------------------------------------------*/

#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Servo.h>




/*---------------------------------------------------------------------------------------------------------------------------------------
 *                                          OBJETOS Y DEPENDENCIAS DEL HARDWARE
 ----------------------------------------------------------------------------------------------------------------------------------------*/

/*______________________________________________________TECLADO__________________________________________________________________________*/
 

const byte FILAS=4;
const byte COLUMNAS=4;
char keys[FILAS][COLUMNAS]={
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte pinesFilas[FILAS]={9,8,7,6};
byte pinesColumnas[COLUMNAS]={5,4,3,2};
Keypad teclado=Keypad(makeKeymap(keys),pinesFilas,pinesColumnas,FILAS,COLUMNAS);



/*___________________________________________________PANTALLA LCD_________________________________________________________________________*/

LiquidCrystal_I2C lcd (0x27,16,2);

/*______________________________________________________SERVO_____________________________________________________________________________*/

Servo servo1;
#define PINSERVO 12
#define PULSO_MIN 600
#define PULSO_MAX 2450

/*___________________________________________________RELOJ (RTC)__________________________________________________________________________*/

RTC_DS3231 rtc;

/*____________________________________________________PULSADOR____________________________________________________________________________*/

#define PULSADOR_LUZ 10




/*-----------------------------------------------------------------------------------------------------------------------------------------
 *                                                   VARIABLES
 -----------------------------------------------------------------------------------------------------------------------------------------*/

bool estado_pulsador_luz=false;
bool estado_luz_lcd=true;

char tecla;
byte contador=1;

bool estado_A1=false;
bool estado_A2=false;
bool estado_A3=false;

byte destino_alarma1=1;
byte destino_alarma2=1;
byte destino_alarma3=1;

bool estado_setA1=false;
bool estado_setA2=false;
bool estado_setA3=false;

byte posicion=1;

int hora_alarma1;
int minutos_alarma1;


char HORA_ALARMA1[2]={'2','1'};
char MINUTOS_ALARMA1[2]={'3','1'};

char HORA_ALARMA2[2]={'2','2'};
char MINUTOS_ALARMA2[2]={'3','2'};

char HORA_ALARMA3[2]={'2','3'};
char MINUTOS_ALARMA3[2]={'3','3'};





/*-----------------------------------------------------------------------------------------------------------------------------------------
 *                                                    FUNCIONES
 *-----------------------------------------------------------------------------------------------------------------------------------------

 LISTADO:
  1-  setup
  2-  loop
  3-  Bienvenido
  4-  Menu_1
  5-  Accion_1
  6-  Menu_2
  7-  Accion_2
  8-  Menu_3
  9-  Accion_3
  10- Menu_Alarma1()
  11- Accion_Alarma1()
  12- Cargar_alarma1()
  13- Menu_Alarma2()
  14- Accion_alarma2()
  15- Cargar_alarma2()
  16- Menu_alarma3()
  17- Accion_alarma3()
  xx- Dispensar_DaVinci
  xx- Dispensar_Dasha
  xx- Dispensar_Ambos
 
 
 
 
 */

/*******************************************************************************************************************************************
 *******************************************************************************************************************************************
                                                       SETUP
 *******************************************************************************************************************************************
 ******************************************************************************************************************************************/

 
void setup(){
  Serial.begin(9600);      //Descomentar esta línea si deseamos realizar pruebas con el monitor serie

  //Pin del pulsador (luz lcd) como entrada
  pinMode(PULSADOR_LUZ,INPUT);
  
  // El teclado no necesita Setup
  
  //PANTALLA LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();

  //SERVO
  servo1.attach(PINSERVO, PULSO_MIN, PULSO_MAX);

  //MÓDULO RTC
  if(!rtc.begin()){
    lcd.setCursor(6,1);
    lcd.print("RTC");
    lcd.setCursor(1,1);
    lcd.print("No encontrado!");
    while(1);
  }
  //Descomentar la siguiente línea si queremos ajustar hora del RTC -> Descomentar, conectar placa a computadora, subir, comentar y subir nuevamente.
  //rtc.adjust(DateTime(__DATE__,__TIME__));
  
  
  //Servo se pone en posicion 90
  servo1.write(90);

  //Función de bienvenida (solo se corre una vez en el setup -> ver en funciones)
  //Bienvenido();
  
    
}

/**********************************************************************************************************************************************
 **********************************************************************************************************************************************
 *                                                         LOOP
 **********************************************************************************************************************************************
 **********************************************************************************************************************************************/
 
void loop(){

  //CONTROL LUZ LCD CON PULSADOR
  
  if(estado_luz_lcd==true){
    lcd.backlight();
  }
  else{
    lcd.noBacklight();
  }
  if(digitalRead(PULSADOR_LUZ)==HIGH && estado_pulsador_luz==false){
    estado_pulsador_luz=true;
    estado_luz_lcd= !estado_luz_lcd;
    delay(200);
  }
  estado_pulsador_luz=false;


  //MAIN CONTROL DEL MENU
  
  tecla=teclado.getKey();
  if(tecla != 0){
    lcd.clear();
    delay(100);
  }


  if(contador == 1){
    Menu_1();
    Accion_1();
  }
  if(contador==2){
    Menu_2();
    Accion_2();
  }
  if(contador==3){
    Menu_3();
    Accion_3();
  }

  if(estado_setA1==true){
    Menu_Alarma1();
    Cargar_alarma1();
  }
  if(estado_setA2==true){
    Menu_Alarma2();
    Cargar_alarma2();
  }
  if(estado_setA3==true){
    Menu_Alarma3();
    Cargar_alarma3();
  }
  
  if(contador==5){
    Menu_Alarma1();
    Accion_Alarma1();
  }
  if(contador==6){
    Menu_Alarma2();
    Accion_Alarma2();
  }
  if(contador==7){
    Menu_Alarma3();
    Accion_Alarma3();
  }



} //  ------------------------------------------------- FIN DEL LOOP -----------------------------------------------------------------------







/*.............................................................................................................................................
 *                                                      Bienvenido()
 *............................................................................................................................................*/

void Bienvenido(){
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("DAAB v2.0");
  lcd.setCursor(3,1);
  lcd.print("By: Marozzi");
  delay(3000);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("BIENVENIDO");
  delay(3500);
  lcd.clear();
  delay(500);
}

/*.............................................................................................................................................
                                                          Menu_1()
..............................................................................................................................................*/

void Menu_1(){
  lcd.setCursor(0,0);
  lcd.print("A)Disp.  C)Otros");
  lcd.setCursor(0,1);
  lcd.print("B)Alarma");
  lcd.setCursor(11,1);
  DateTime fecha=rtc.now();
  lcd.print(fecha.hour());
  lcd.setCursor(13,1);
  lcd.print(":");
  lcd.setCursor(14,1);
  lcd.print(fecha.minute());
}


/*.............................................................................................................................................
                                                         Accion_1()
*.............................................................................................................................................*/

void Accion_1(){
  if(tecla == 'A'){
    lcd.clear();
    contador=2;
  }
  if(tecla == 'B'){
    lcd.clear();
    contador=3;
  }
  if(tecla == 'C'){
    lcd.clear();
    contador=4;
  }
}

/*.............................................................................................................................................
                                                         Menu_2()
 *............................................................................................................................................*/

void Menu_2(){
  lcd.setCursor(0,0);
  lcd.print("1)DaVin  3)AMB.");
  lcd.setCursor(0,1);
  lcd.print("2)Dasha  *)Atras");
}

/*..............................................................................................................................................
                                                       Accion_2()
...............................................................................................................................................*/

void Accion_2(){
  if(tecla=='1'){
   // Dispensar_DaVinci();
  }
  if(tecla=='2'){
    Dispensar_Dasha();
    
  }
  if(tecla=='3'){
    Dispensar_Ambos();
  }
  if(tecla=='*'){
    lcd.clear();
    contador=1;
    
  }
}

/*...........................................................................................................................................
                                                            Menu_3
............................................................................................................................................*/

void Menu_3(){
  lcd.setCursor(0,0);
  lcd.print("AL1>");
  lcd.setCursor(4,0);
  if(estado_A1==false){
    lcd.print("OFF");
  }
   else{
     lcd.print("ON ");
    }
  lcd.setCursor(9,0);
  lcd.print("AL3>");
  lcd.setCursor(13,0);
  if(estado_A3==false){
    lcd.print("OFF");
  }
  else{
    lcd.print("ON ");
  }
  lcd.setCursor(0,1);
  lcd.print("AL2>");
  lcd.setCursor(4,1);
  if(estado_A2==false){
    lcd.print("OFF");
  }
  else{
    lcd.print("ON ");
  }
  lcd.setCursor(9,1);
  lcd.print("*>Atras");
}

/*.............................................................................................................................................
 *                                                          Accion_3
 *............................................................................................................................................*/

 void Accion_3(){
  if(tecla=='1'){
    lcd.clear();
    contador=5;
  }
  if(tecla=='2'){
    lcd.clear();
    contador=6;
  }
  if(tecla=='3'){
    lcd.clear();
    contador=7;
  }
  if(tecla=='*'){
    lcd.clear();
    contador=1;
  }
 }

/*..............................................................................................................................................
 *                                                       Menu_Alarma1()
 *............................................................................................................................................*/

void Menu_Alarma1(){
  lcd.setCursor(0,0);
  lcd.print("AL1:");
  lcd.setCursor(5,0);
  lcd.print("A)");
  if(estado_A1==false){
    lcd.print("OFF");
  }
  if(estado_A1==true){
    lcd.print("ON ");
  }
  lcd.setCursor(11,0);
  lcd.print("B)");
  if(destino_alarma1==1){
    lcd.print("DaV");
  }
  if(destino_alarma1==2){
    lcd.print("DaS");
  }
  if(destino_alarma1==3){
    lcd.print("AMB");
  }
  lcd.setCursor(0,1);
  if(estado_setA1==false){
    lcd.print("C) "); 
  }
  if(estado_setA1==true){
    lcd.print("C->");
  }


  
  lcd.setCursor(3,1);
  for(byte i=0;i<2;i++){
    lcd.print(HORA_ALARMA1[i]);
  }
  lcd.setCursor(5,1);
  lcd.print(":");
  lcd.setCursor(6,1);
  for(byte i=0;i<2;i++){
    lcd.print(MINUTOS_ALARMA1[i]);
  }



  lcd.setCursor(9,1);
  lcd.print("*>Atras");
  
}

/*..............................................................................................................................................
 *                                                      Accion_Alarma1()
 *.............................................................................................................................................*/

void Accion_Alarma1(){
  if(tecla=='A'){
    estado_A1=!estado_A1;
  }
  if(tecla=='B'){
    destino_alarma1++;
  }
  if(destino_alarma1>3){
    destino_alarma1=1;
  }
  if(tecla=='C' && estado_setA1==false){
    estado_setA1=!estado_setA1;
    HORA_ALARMA1[0]=0;
    HORA_ALARMA1[1]=0;
    MINUTOS_ALARMA1[0]=0;
    MINUTOS_ALARMA1[1]=0;
  }
  
  
  if(tecla=='*'){
    lcd.clear();
    contador=3;
  }
}


/*.................................................................................................................................................
 *                                                       Cargar_alarma1()
 *................................................................................................................................................*/
 void Cargar_alarma1(){
  if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
    switch(posicion){
      case 1:
      HORA_ALARMA1[0]=tecla;
      posicion++;
      break;

      case 2:
      HORA_ALARMA1[1]=tecla;
      hora_alarma1=atoi(HORA_ALARMA1);
      posicion++;
      break;

      case 3:
      MINUTOS_ALARMA1[0]=tecla;
      posicion++;
      break;

      case 4:
      MINUTOS_ALARMA1[1]=tecla;
      minutos_alarma1=atoi(MINUTOS_ALARMA1)/100;
      posicion=1;
      estado_setA1=false;
      break;
    }
  }


  Serial.print("Hora ");
  Serial.println(hora_alarma1);
  Serial.print("Minutos ");
  Serial.println(minutos_alarma1);


  
  
  if(tecla=='*'){
    estado_setA1=false;
    posicion=1;
    HORA_ALARMA1[0]='_';
    HORA_ALARMA1[1]='_';
    MINUTOS_ALARMA1[0]='_';
    MINUTOS_ALARMA1[1]='_';
    lcd.clear();
    contador=3;
  }
 }


 /*..............................................................................................................................................
 *                                                       Menu_Alarma2()
 *............................................................................................................................................*/
 
void Menu_Alarma2(){
  lcd.setCursor(0,0);
  lcd.print("AL2:");
  lcd.setCursor(5,0);
  lcd.print("A)");
  if(estado_A2==false){
    lcd.print("OFF");
  }
  if(estado_A2==true){
    lcd.print("ON ");
  }
  lcd.setCursor(11,0);
  lcd.print("B)");
  if(destino_alarma2==1){
    lcd.print("DaV");
  }
  if(destino_alarma2==2){
    lcd.print("DaS");
  }
  if(destino_alarma2==3){
    lcd.print("AMB");
  }
  lcd.setCursor(0,1);
  if(estado_setA2==false){
    lcd.print("C) "); 
  }
  if(estado_setA2==true){
    lcd.print("C->");
  }


  
  lcd.setCursor(3,1);
  for(byte i=0;i<2;i++){
    lcd.print(HORA_ALARMA2[i]);
  }
  lcd.setCursor(5,1);
  lcd.print(":");
  lcd.setCursor(6,1);
  for(byte i=0;i<2;i++){
    lcd.print(MINUTOS_ALARMA2[i]);
  }



  lcd.setCursor(9,1);
  lcd.print("*>Atras");
  
}


/*..............................................................................................................................................
 *                                                      Accion_Alarma2()
 *.............................................................................................................................................*/

void Accion_Alarma2(){
  if(tecla=='A'){
    estado_A2=!estado_A2;
  }
  if(tecla=='B'){
    destino_alarma2++;
  }
  if(destino_alarma2>3){
    destino_alarma2=1;
  }
  if(tecla=='C' && estado_setA2==false){
    estado_setA2=!estado_setA2;
    HORA_ALARMA2[0]='_';
    HORA_ALARMA2[1]='_';
    MINUTOS_ALARMA2[0]='_';
    MINUTOS_ALARMA2[1]='_';
  }
  
  
  if(tecla=='*'){
    lcd.clear();
    contador=3;
  }
}


/*.................................................................................................................................................
 *                                                       Cargar_alarma2()
 *................................................................................................................................................*/
 void Cargar_alarma2(){
  if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
    switch(posicion){
      case 1:
      HORA_ALARMA2[0]=tecla;
      posicion++;
      break;

      case 2:
      HORA_ALARMA2[1]=tecla;
      posicion++;
      break;

      case 3:
      MINUTOS_ALARMA2[0]=tecla;
      posicion++;
      break;

      case 4:
      MINUTOS_ALARMA2[1]=tecla;
      posicion=1;
      estado_setA2=false;
      break;
    }
  }
  if(tecla=='*'){
    estado_setA2=false;
    posicion=1;
    HORA_ALARMA2[0]='_';
    HORA_ALARMA2[1]='_';
    MINUTOS_ALARMA2[0]='_';
    MINUTOS_ALARMA2[1]='_';
    lcd.clear();
    contador=3;
  }
 }


 /*..............................................................................................................................................
 *                                                       Menu_Alarma3()
 *............................................................................................................................................*/

void Menu_Alarma3(){
  lcd.setCursor(0,0);
  lcd.print("AL3:");
  lcd.setCursor(5,0);
  lcd.print("A)");
  if(estado_A3==false){
    lcd.print("OFF");
  }
  if(estado_A3==true){
    lcd.print("ON ");
  }
  lcd.setCursor(11,0);
  lcd.print("B)");
  if(destino_alarma3==1){
    lcd.print("DaV");
  }
  if(destino_alarma3==2){
    lcd.print("DaS");
  }
  if(destino_alarma3==3){
    lcd.print("AMB");
  }
  lcd.setCursor(0,1);
  if(estado_setA3==false){
    lcd.print("C) "); 
  }
  if(estado_setA3==true){
    lcd.print("C->");
  }


  
  lcd.setCursor(3,1);
  for(byte i=0;i<2;i++){
    lcd.print(HORA_ALARMA3[i]);
  }
  lcd.setCursor(5,1);
  lcd.print(":");
  lcd.setCursor(6,1);
  for(byte i=0;i<2;i++){
    lcd.print(MINUTOS_ALARMA3[i]);
  }



  lcd.setCursor(9,1);
  lcd.print("*>Atras");
  
}

/*..............................................................................................................................................
 *                                                      Accion_Alarma3()
 *.............................................................................................................................................*/

void Accion_Alarma3(){
  if(tecla=='A'){
    estado_A3=!estado_A3;
  }
  if(tecla=='B'){
    destino_alarma3++;
  }
  if(destino_alarma3>3){
    destino_alarma3=1;
  }
  if(tecla=='C' && estado_setA3==false){
    estado_setA3=!estado_setA3;
    HORA_ALARMA3[0]='_';
    HORA_ALARMA3[1]='_';
    MINUTOS_ALARMA3[0]='_';
    MINUTOS_ALARMA3[1]='_';
  }
  
  
  if(tecla=='*'){
    lcd.clear();
    contador=3;
  }
}


/*.................................................................................................................................................
 *                                                       Cargar_alarma3()
 *................................................................................................................................................*/
 void Cargar_alarma3(){
  if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
    switch(posicion){
      case 1:
      HORA_ALARMA3[0]=tecla;
      posicion++;
      break;

      case 2:
      HORA_ALARMA3[1]=tecla;
      posicion++;
      break;

      case 3:
      MINUTOS_ALARMA3[0]=tecla;
      posicion++;
      break;

      case 4:
      MINUTOS_ALARMA3[1]=tecla;
      posicion=1;
      estado_setA3=false;
      break;
    }
  }
  if(tecla=='*'){
    estado_setA3=false;
    posicion=1;
    HORA_ALARMA3[0]='_';
    HORA_ALARMA3[1]='_';
    MINUTOS_ALARMA3[0]='_';
    MINUTOS_ALARMA3[1]='_';
    lcd.clear();
    contador=3;
  }
 }


/*.............................................................................................................................................
 *                                                   Dispensar_DaVinci()
 *...........................................................................................................................................*/

 void Dispensar_DaVinci(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("<-DISPENSANDO");
  lcd.setCursor(4,1);
  lcd.print("Da Vinci");
  servo1.write(0);
  delay(650);
  servo1.write(90);
  delay(1000);
  lcd.clear();
 }

 /*...............................................................................................................................................
  *                                                     Dispensar_Daha()
  *..............................................................................................................................................*/

 void Dispensar_Dasha(){
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("DISPENSANDO->");
  lcd.setCursor(6,1);
  lcd.print("Dasha");
  servo1.write(180);
  delay(650);
  servo1.write(90);
  delay(1000);
  lcd.clear();
 }

 /*..................................................................................................................................................
  *                                                      Dispensar_Ambos()
  *................................................................................................................................................*/

 void Dispensar_Ambos(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("<-DISPENSANDO->");
  lcd.setCursor(5,1);
  lcd.print("Ambos.");
  servo1.write(0);
  delay(650);
  servo1.write(90);
  delay(500);
  servo1.write(180);
  delay(650);
  servo1.write(90);
  delay(500);
  lcd.clear();
 }


Creo haber solucionado el problema aunque no de la manera correcta.

El segundo array de caracteres llamado MINUTOS_ALARMA2 que es un array de solo dos elementos se carga con 4 elementos. Los primeros dos son del mismo array y los otros dos son del array HORA_ALARMA2 (que tambien es de dos elementos)

como yo necesito solo los primeros dos elementos del array MINUTOS_ALARMA2 lo que hago es transformarlo en numero entero con la funcion atoi y luedo dividirlo por 100. de esa manera solo obtengo los primeros dos elementos y no los 4 que no se por que me los carga en ese array.

Ya pude reproducir el problema, deduzco que un array esta a continuación del otro en la memoria, y como atoi() convierte todos los caracteres hasta que encuentre uno no numérico, ocurre esto.

La verdad no encuentro solución usando atoi(), sin embargo yo no la usaría, me parece más práctico obtener cada dígito restando el código ASCII de '0' (o sea 48), luego

char digitos [2] = {'2','1'};  // representa nro. 21 decimal

int numero = (digitos[0] - 48) * 10 + (digitos[1] - 48);

También podrías guardar directamente los dígitos como números haciendo la resta en el ingreso, cambiando el tipo de array a byte (por claridad porque en realidad ambos tipos son lo mismo), algo como

byte HORA_ALARMA1[2] = {2,1};  // representa nro. 21 decimal

// luego en ingreso 

HORA_ALARMA1[0] = tecla - 48;

Por otro lado modificaría

if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){

por

if(tecla >= '0' && tecla <= '9') {

Saludos

PD: Ya sé cual es el problema.

atoi() espera convertir una string, como tal debe terminar con un caracter nulo ('\0'), al no encontrar el final de la string en el array, continúa con lo que encuentra en la memoria (que en este caso coincide con el array anteriormente definido).

Para hacer las cosas correctamente para poder usar la función atoi() deberías definir los arrays así

char HORA_ALARMA1[3] = {'2', '1', '\0'};

Luego, en el ingreso, solo cambias los valores de los índices 0 y 1 (el índice 2 no se toca entonces conserva el caracter nulo)

MUCHÍSIMAS GRACIAS!!! Sobre todo por tomarte la molestia de leer el código seguro spaguetti y de principiante super largo.. Muy buenos tus aportes (lo de como simplificar de 0 a 9 y lo del caracter nulo.. justop estaba leyendo eso y comenzando a hacer pruebas.. por lo que va funciona bien!!!

Muy agradecido!

De nada!

La verdad, cuando pude repetir el error, me dije "qué pasa acá?", me puse a investigar y no encontraba el por qué (de hecho leí varios posts en diferentes foros con consultas similares y no había soluciones), hasta que "me cayó la ficha" de que seguro era por lo del caracter nulo. Lo probé y salió.
Como ves, siempre se aprende algo nuevo. :wink:

Muchas gracias nuevamente. Por cosas así siempre crece la comunidad.