Crear varios loops temporizados en un sketch

Hola a todos!!! :slight_smile: :slight_smile:

Tengo un problema que espero que alguien pueda darme soluci贸n, seguramente sea sencilla la soluci贸n pero mi poca experiencia me impide solucionarlo.

Tengo una matriz de leds programables de 8x16, me descargue las librer铆as de Adafruit para su control, y se incluye un programa de ejemplo para imprimir texto giratorio en la matriz, hasta aqui todo me funciona bien, pues estuve haciendo pruebas y lo que necesito hacer en este sketch es que me vaya mostrando diferentes textos en diferentes colores seg煤n tiempo, es decir, que por ejemplo me muestre el mensaje 鈥渉ola鈥 en color verde durante 5 minutos, y despu茅s me muestre el mensaje 鈥渁dios鈥 en color azul durante un minuto, y despu茅s vuelva a aparecer de nuevo el mensaje hola, empezando de nuevo el ciclo de tiempo.

Hasta ahora la 煤nica forma que he tenido de hacer esto es creado varios sketchs diferentes, cada uno con su texto y con su color, y tengo que estar carg谩ndolos en el arduino, pero evidentemente esto es una forma muy burda de afrontar el problema y lo ideal seria automatizar esto en el mismo sketch.

He intentado yo modificar el c贸digo, a帽adiendo dos loops, cada uno con su texto y luego renombrando las variables para que no se repitan, pero no me funciona, lo m谩ximo que he conseguido es que me muestre los dos textos a la vez mezclados y parpadeando, por lo que intuyo que no he resuelto bien el problema, y tendr茅 que decirle de alguna manera al c贸digo que se ejecute primero un loop y despu茅s el otro.

He estado buscando en Internet soluciones y he visto gente que pregunta por cosas similares, pero no se da una soluci贸n directa a este problema.

Dejo aqu铆 el c贸digo original para que echeis un vistazo:

// Adafruit_NeoMatrix example for single NeoPixel Shield.


#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif

#define PIN 6



Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 8, PIN,
 NEO_MATRIX_BOTTOM 聽 聽+ NEO_MATRIX_RIGHT +
 聽NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
 聽NEO_GRB 聽 聽 聽 聽 聽 聽+ NEO_KHZ800);


const uint16_t colors[] = {
 聽matrix.Color(0, 0, 255), matrix.Color(0, 255, 0), matrix.Color(255, 0, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};

 聽

void setup() {
 聽matrix.begin();
 聽matrix.setTextWrap(false);
 聽matrix.setBrightness(255);
 聽matrix.setTextColor(colors[0]);
}

int x 聽 聽= matrix.width();
int pass = 0;

void loop() {
 聽matrix.fillScreen(0);
 聽matrix.setCursor(x, 0);
 聽matrix.print(F("Prueba de texto"));


 聽if(--x < -130) {
 聽 聽x = matrix.width();
 聽 聽if(++pass >= 3) pass = 0;
 聽 聽matrix.setTextColor(colors[pass]);
 聽}
 聽matrix.show();


 聽delay(100);

}

Y aqu铆 esta el c贸digo modificado por mi en el que he intentado meter dos loops llamando a 2 funciones, pero como ya he comentado no me funciona y me muestra los 2 mensajes al mismo tiempo en la matriz led.

void setup() {
 聽matrix.begin();
 聽matrix.setTextWrap(false);
 聽matrix.setBrightness(50);
 聽matrix.setTextColor(colors[0]);


 聽matrix2.begin();
 聽matrix2.setTextWrap(false);
 聽matrix2.setBrightness(50);
 聽matrix2.setTextColor(colors[0]
}

int x 聽 聽= matrix.width();
int y 聽 聽= matrix2.width();
int pass = 0;

void loop() {

secuencia_uno();

secuencia_dos();
 聽
}


void secuencia_uno() {
 聽matrix.fillScreen(0);
 聽matrix.setCursor(x, 0);
 聽matrix.print(F("Hola"));
 聽if(--x < -130) {
 聽 聽x = matrix.width();
 聽 聽if(++pass >= 5) pass = 0;
 聽 聽matrix.setTextColor(colors[pass]);
 聽}
 聽matrix.show();
 聽delay(100);
}


void secuencia_dos() {
matrix2.fillScreen(0);
 聽matrix2.setCursor(x, 0);
 聽matrix2.print(F("Adios"));
 聽if(--y < -130) {
 聽 聽y = matrix2.width();
 聽 聽if(++pass >= 5) pass = 0;
 聽 聽matrix2.setTextColor(colors2[pass]);
 聽}
 聽matrix2.show();
 聽delay(100);

}

Agradeceria muchisimo que alguien me echase una mano!!

Saludos.

Mario.

A ver como se comporta. Si repite demasiado las secuencias uno y dos esta claro que tendremos que ejuctarlas una sola vez.

#define TIEMPO1聽 聽 聽 聽  5*60*1000
#define TIEMPO2聽 聽 聽 聽  1*60*1000

int x聽 聽 = matrix.width();
int y聽 聽 = matrix2.width();
int pass = 0;
unsigned long start;
byte estado = 0;

void setup() {
聽 matrix.begin();
聽 matrix.setTextWrap(false);
聽 matrix.setBrightness(50);
聽 matrix.setTextColor(colors[0]);


聽 matrix2.begin();
聽 matrix2.setTextWrap(false);
聽 matrix2.setBrightness(50);
聽 matrix2.setTextColor(colors[0]);
}


void loop() {
聽 聽 switch(estado) {
聽 聽 聽 case 0: start = millis();
聽 聽 聽 聽 聽 聽 聽 estado = 1;
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 1: secuencia_uno();
聽 聽 聽 聽 聽 聽 聽 if (millis()-start> TIEMPO1) {
聽 聽 聽 聽 聽 聽 聽 聽 聽 estado = 2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 start = millis(); 
聽 聽 聽 聽 聽 聽 聽 }
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 2: secuencia_dos();
聽 聽 聽 聽 聽 聽 聽 if (millis()-start> TIEMPO2) {
聽 聽 聽 聽 聽 聽 聽 聽 聽 start = millis();
聽 聽 聽 聽 聽 聽 聽 聽 聽 estado = 0;
聽 聽 聽 聽 聽 聽 聽 }
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 }

void secuencia_uno() {
聽 聽 matrix.fillScreen(0);
聽 聽 matrix.setCursor(x, 0);
聽 聽 matrix.print(F("Hola"));
聽 聽 if (--x < -130) {
聽 聽 聽 聽 x = matrix.width();
聽 聽 聽 聽 if (++pass >= 5) 
聽 聽 聽 聽 聽 聽 pass = 0;
聽 聽 聽 聽 matrix.setTextColor(colors[pass]);
聽 聽 }
聽 聽 matrix.show();
聽 聽 delay(100);
}

void secuencia_dos() {
聽 聽 matrix2.fillScreen(0);
聽 聽 matrix2.setCursor(x, 0);
聽 聽 matrix2.print(F("Adios"));
聽 聽 if (--y < -130) {
聽 聽 聽 聽 y = matrix2.width();
聽 聽 聽 聽 if (++pass >= 5) 
聽 聽 聽 聽 聽 聽 pass = 0;
聽 聽 聽 聽 matrix2.setTextColor(colors2[pass]);
聽 聽 }
聽 聽 matrix2.show();
聽 聽 delay(100);
}

Hola surbyte!!
Pues he cogido tu codigo y le he a帽adido las librerias que le faltaban y no me deja compilar, me tira el siguiente error: 鈥渕atrix2鈥 was not declared in this scope鈥 no entiendo porque dice que no se ha declarado matrix2, seguramente algo he pasado por alto, este es el codigo completo:

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
 
#define PIN 6

 
#define TIEMPO1聽 聽 聽 聽  5*60*1000
#define TIEMPO2聽 聽 聽 聽  1*60*1000


Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 8, PIN,
聽 NEO_MATRIX_BOTTOM聽 聽 + NEO_MATRIX_RIGHT +
聽 NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
聽 NEO_GRB聽 聽 聽 聽 聽 聽 + NEO_KHZ800);



const uint16_t colors[] = {
聽 matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(255, 255, 0),matrix.Color(0, 0, 255), matrix.Color(255, 0, 255), matrix.Color(0, 255, 255), matrix.Color(255, 255, 255)};
 
const uint16_t colors2[] = {
聽 matrix2.Color(255, 0, 0), matrix2.Color(0, 255, 0), matrix2.Color(255, 255, 0),matrix2.Color(0, 0, 255), matrix2.Color(255, 0, 255), matrix2.Color(0, 255, 255), matrix2.Color(255, 255, 255)};


int x聽 = matrix.width();
int y聽 = matrix2.width();
int pass = 0;
unsigned long start;
byte estado = 0;





void setup() {
聽 matrix.begin();
聽 matrix.setTextWrap(false);
聽 matrix.setBrightness(50);
聽 matrix.setTextColor(colors[0]);


聽 matrix2.begin();
聽 matrix2.setTextWrap(false);
聽 matrix2.setBrightness(50);
聽 matrix2.setTextColor(colors2[0]);
}


void loop() {
聽 聽 switch(estado) {
聽 聽 聽 case 0: start = millis();
聽 聽 聽 聽 聽 聽 聽 estado = 1;
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 1: secuencia_uno();
聽 聽 聽 聽 聽 聽 聽 if (millis()-start> TIEMPO1) {
聽 聽 聽 聽 聽 聽 聽 聽 聽 estado = 2;
聽 聽 聽 聽 聽 聽 聽 聽 聽 start = millis(); 
聽 聽 聽 聽 聽 聽 聽 }
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 2: secuencia_dos();
聽 聽 聽 聽 聽 聽 聽 if (millis()-start> TIEMPO2) {
聽 聽 聽 聽 聽 聽 聽 聽 聽 start = millis();
聽 聽 聽 聽 聽 聽 聽 聽 聽 estado = 0;
聽 聽 聽 聽 聽 聽 聽 }
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 }

void secuencia_uno() {
聽 聽 matrix.fillScreen(0);
聽 聽 matrix.setCursor(x, 0);
聽 聽 matrix.print(F("Hola"));
聽 聽 if (--x < -130) {
聽 聽 聽 聽 x = matrix.width();
聽 聽 聽 聽 if (++pass >= 5) 
聽 聽 聽 聽 聽 聽 pass = 0;
聽 聽 聽 聽 matrix.setTextColor(colors[pass]);
聽 聽 }
聽 聽 matrix.show();
聽 聽 delay(100);
}

void secuencia_dos() {
聽 聽 matrix2.fillScreen(0);
聽 聽 matrix2.setCursor(x, 0);
聽 聽 matrix2.print(F("Adios"));
聽 聽 if (--y < -130) {
聽 聽 聽 聽 y = matrix2.width();
聽 聽 聽 聽 if (++pass >= 5) 
聽 聽 聽 聽 聽 聽 pass = 0;
聽 聽 聽 聽 matrix2.setTextColor(colors2[pass]);
聽 聽 }
聽 聽 matrix2.show();
聽 聽 delay(100);
}

Gracias!!