Problema con Random Seed / Switch Case

Hola! Estoy armando un programa que, al pulsar un botón, enciende un led rojo, imprime un ticket (con una impresora de calor) y luego enciende un led azul para notificar que finalizó el proceso. El problema es el siguiente: funciona para imprimir de manera aleatoria cualquiera de los cuatro casos que están debajo pero, si agrego casos, ya no funciona. No entiendo cuál es el problema o si existe alguna limitación que haga que sólo funcione con 4 casos.

Cuando agrego casos nuevos al switch case y luego ajusto el rango en el renglón de RandNumber = random(1,4); ya no funciona, no hace absolutamente nada al apretar el pulsador.

El código es el siguiente:

#include "Adafruit_Thermal.h"
 
#include "alstrok.h"
#include "calaok.h"
#include "clavelok.h"
#include "liliumok.h"
 
#include "SoftwareSerial.h"
#define TX_PIN 6
#define RX_PIN 5
 
SoftwareSerial mySerial(RX_PIN, TX_PIN);
Adafruit_Thermal printer(&mySerial);
 
const int LEDAZUL = 10;
const int PULSADOR = 9;
const int LEDROJO = 8;
 
int estado;
 
long RandNumber;
 
void setup() {
 
  pinMode(7, OUTPUT); digitalWrite(7, LOW);
 
  pinMode(PULSADOR,INPUT);
  pinMode(LEDROJO,OUTPUT);
  pinMode(LEDAZUL,OUTPUT);
 
  mySerial.begin(19200);
    printer.begin();
 
  Serial.println("Inicio de sketch - secuencia de numeros aleatorios");
 
  randomSeed(analogRead(A0));
 
}
 
void loop() {
 
  	estado = digitalRead(PULSADOR);
 
	if  (estado == HIGH){
 
  digitalWrite(LEDROJO,HIGH);
 
  RandNumber = random(1,4);
 
  Serial.print("El numero aleatorio es = ");
  Serial.println(RandNumber);
  chaseRandNumber();
 
  delay(4000);
  digitalWrite(LEDROJO,LOW);
 
  delay(500);
 
  digitalWrite(LEDAZUL,HIGH);
  delay(3000);
  digitalWrite(LEDAZUL,LOW);
 
  printer.sleep();
  delay(3000L);
  printer.wake();
  printer.setDefault();
 
	}
}
 
void chaseRandNumber()
{
  switch(RandNumber)
  {
    case 1:
  espacio_inicial();
  imprimir_clavel();
  printer.justify('C');
  printer.println(F("Mensaje numero 1"));
  espacio_final();
    break;
 
    case 2:
      espacio_inicial();
  imprimir_alstro();
  printer.justify('C');
  printer.println(F("Mensaje numero 2"));
  espacio_final();
    break;
 
    case 3:
  espacio_inicial();
  imprimir_cala();
  printer.justify('C');
  printer.println(F("Mensaje numero 3"));
  espacio_final();
    break;
 
    case 4:
  espacio_inicial();
  imprimir_lilium();
  printer.justify('C');
  printer.println(F("Mensaje numero 4"));
  espacio_final();
    break;
 
  }
}
 
void espacio_inicial()
{
  printer.justify('C');
  printer.println(F("."));
  }
 
void espacio_final()
{
  printer.justify('C');
  printer.println(F("."));
  printer.println(F("."));
  printer.println(F("."));
  }
 
void imprimir_alstro()
{
  printer.printBitmap(alstrok_width, alstrok_height, alstrok_data);
  }
 
void imprimir_cala()
{
  printer.printBitmap(calaok_width, calaok_height, calaok_data);
  }
 
void imprimir_clavel()
{
  printer.printBitmap(clavelok_width, clavelok_height, clavelok_data);
  }
 
void imprimir_lilium()
{
  printer.printBitmap(liliumok_width, liliumok_height, liliumok_data);
  }

Hola! Estoy armando un programa que hace esto: cuando el usuario presiona un pulsador, enciende un led rojo, imprime un ticket con una impresora térmica (el contenido del mensaje es un caso aleatorio) y, finalmente, enciende un led azul notificando que terminó el proceso, es decir, que ya puede presionar nuevamente el pulsador para obtener otro ticket.
El problema es el siguiente: el programa funciona bien para imprimir de manera aleatoria cualquiera de los cuatro casos que están debajo en el código pero, si agrego casos nuevos y actualizo el valor del renglón de RandNumber = random(1,4); ya no funciona, no hace absolutamente nada al apretar el pulsador.

Dejo el código a continuación a ver si alguien puede ayudarme:

#include "Adafruit_Thermal.h"

#include "alstrok.h"
#include "calaok.h"
#include "clavelok.h"
#include "liliumok.h"

#include "SoftwareSerial.h"
#define TX_PIN 6 
#define RX_PIN 5 

SoftwareSerial mySerial(RX_PIN, TX_PIN); 
Adafruit_Thermal printer(&mySerial);    

const int LEDAZUL = 10;
const int PULSADOR = 9;
const int LEDROJO = 8;

int estado; 

long RandNumber;

void setup() {

  pinMode(7, OUTPUT); digitalWrite(7, LOW);

  pinMode(PULSADOR,INPUT);
  pinMode(LEDROJO,OUTPUT);
  pinMode(LEDAZUL,OUTPUT);

  mySerial.begin(19200); 
    printer.begin();
  
  randomSeed(analogRead(A0));

}

void loop() {

  	estado = digitalRead(PULSADOR); 
  
	if  (estado == HIGH){

  digitalWrite(LEDROJO,HIGH);

  RandNumber = random(1,4);
  chaseRandNumber();

  delay(4000);
  digitalWrite(LEDROJO,LOW);

  delay(500);
    
  digitalWrite(LEDAZUL,HIGH);
  delay(3000);
  digitalWrite(LEDAZUL,LOW);

  printer.sleep();    
  delay(3000L);  
  printer.wake(); 
  printer.setDefault(); 

	}
}

void chaseRandNumber()
{
  switch(RandNumber)
  {
    case 1:
  espacio_inicial();
  imprimir_clavel();
  printer.justify('C');
  printer.println(F("Mensaje 01"));
  espacio_final();
    break;

    case 2:
      espacio_inicial();
  imprimir_alstro();
  printer.justify('C');
  printer.println(F("Mensaje 02"));
  espacio_final();
    break;
 
    case 3:
  espacio_inicial();
  imprimir_cala();
  printer.justify('C');
  printer.println(F("Mensaje 03"));
  espacio_final();
    break;

    case 4:
  espacio_inicial();
  imprimir_lilium();
  printer.justify('C');
  printer.println(F("Mensaje 04"));
  espacio_final();
    break;

  }  
}

void espacio_inicial()
{
  printer.justify('C');
  printer.println(F("."));
  }

void espacio_final()
{
  printer.justify('C');
  printer.println(F("."));
  printer.println(F("."));
  printer.println(F("."));
  }

void imprimir_alstro()
{
  printer.printBitmap(alstrok_width, alstrok_height, alstrok_data);
  }

void imprimir_cala()
{
  printer.printBitmap(calaok_width, calaok_height, calaok_data);
  }

void imprimir_clavel()
{
  printer.printBitmap(clavelok_width, clavelok_height, clavelok_data);
  }

void imprimir_lilium()
{
  printer.printBitmap(liliumok_width, liliumok_height, liliumok_data);
  }

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

¿ Seguro?. Supongo que has tenido en cuenta en tus pruebas que en "randon (1,4)", el 4 no te saldra, solo el 1,2 y 3. Haber si es por es, otra cosa no le veo al código.
Saludos.

Moderador:
He fusionado tus publicaciones cruzadas @achi_coria.
La publicación cruzada va en contra de las reglas del foro de Arduino.
La razón es que las publicaciones duplicadas hacen perder el tiempo a las personas que intentan ayudar.
Alguien podría pasar mucho tiempo investigando y escribiendo una respuesta detallada sobre un tema, sin saber que alguien más ya hizo lo mismo en el otro tema.
La publicación cruzada repetida puede resultar en una suspensión del foro.
En el futuro, cree solo un tema para cada tema distinto. Esta es la etiqueta básica del foro, como se explica en "Normas del foro" guía.
Contiene mucha otra información útil. Por favor leelo.
Gracias de antemano por tu cooperacion.
HIlo cerrado y movido al ya existente.

Sí, es correcto, gracias, olvidé mencionarlo. Justamente corrigiendo eso es que detecté que no podía poner random(1,5) porque ya no funcionaba. Con modificar sólo esa línea el programa deja de funcionar.

El código sí funciona cambiando el límite de random(), el problema son los 10.5 segundos de delays().

Acabo de probar el código y estoy totalmente de acuerdo contigo, esos 10.5 seg hacen parecer que el boton no funciona.
Saludos.

Muchas gracias por la respuesta. Probé retirando los delays y agrandando el límite de random() pero, aún así, no imprime ni enciende ningún led al pulsar. Pero si devuelvo el límite a 4 sí lo hace. Es muy extraño.
¿Creen que el problema puede estar en la parte electrónica más allá del código?

No tengo la impresora así que lo que hice fue dejar solo la impresión de los mensajes enviándolos a la consola (como ves en la captura de pantalla) y funciona perfectamente el cuerpo principal del código.
Ahora, justamente, como no utilicé la impresora, puede ser que el problema venga por ese lado.
Como dices que para 1, 2 y 3 funciona bien, resta preguntar: ¿el archivo de la 4ta imagen ("liliumok") es correcto?
Para descartar y ver si se imprime sin problemas, agrega

espacio_inicial();
imprimir_lilium();

al final de setup().
Si no se imprime ya tienes al culpable.

Por otro lado, subir el límite de random() por encima de 5, si el número generado es mayor a 4, solo encendería los leds porque no hay nada para hacer en ese caso.

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