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:
¿ 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.
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.