Matriz led 8x32

Buenas, compre por ebay una matriz de leds de sure electronics de 8x32 pixels de color verde.

He modifcado un codigo para mostrar la temperatura de un lm 35, ire modificandolo para mejorarlo con ayuda de vosotros y lo dejare aqui posteado por si os sirve de ayuda, dejare escrito en el codigo donde se tienen que poner los cables para que no haya perdida al montarlo, fijense que muchas cosas estan en ingles del codigo de la matriz de leds, no tengo suficientes conocimientos para explicar para que son las lineas de codigo esas.

En el codigo sobran cosas pero por ahroa es funcional, ire modificandolo para quitar lo que no se necesite

/*
Conector del Display 	Pines digitales del Arduino 	Sure's Connector
CS1 	                                        4                                3
CS2                                    	5 	                          1
CS3 	                                        6 	                          2
CS4 	                                        7 	                          4
WR 	                                        8 	                          5
DATA 	                                9 	                          7
RD 	                                       10 	                          6
GND 	                                       gnd 	                          11
+5V 	                                       +5V 	                          12
*/
#include "MatrixDisplay.h"
#include "DisplayToolbox.h"
#include "font.h"

#define DEMOTIME 30000  // 30 seconds max on each demo is enough.
#define DISPDELAY 100    // Each "display" lasts this long
#define LONGDELAY 1000  // This delay BETWEEN demos

#define SCROLLSPEED 50 /// time in Miliseconds to wait between shifts
#define MAXSTRING 50

// Macro to make it the initDisplay function a little easier to understand
#define setMaster(dispNum, CSPin) initDisplay(dispNum,CSPin,true)
#define setSlave(dispNum, CSPin) initDisplay(dispNum,CSPin,false)

const byte nDisp = 2;//  Numero de displays si pongo solo 1 no me funciona
const byte pinData = 9;// Data 
const byte pinWR = 8;// WR 
const byte pinCS1 = 4; //
const byte pinCS2 = 5;

int lm35 = A0;
int temperatura = 0;
int temp2 = 0;

// Init Matrix
MatrixDisplay disp(nDisp,pinWR,pinData, true);
// Pass a copy of the display into the toolbox
DisplayToolbox toolbox(&disp);

// Prepare boundaries
uint8_t X_MAX = 0;
uint8_t Y_MAX = 0;

//setup banner
char banner[MAXSTRING];

void setup() {
 // Fetch bounds (dynamically work out how large this display is)
 X_MAX = disp.getDisplayCount() * (disp.getDisplayWidth()-1)+1;
 Y_MAX = disp.getDisplayHeight();

 // Prepare displays
 disp.setMaster(0,pinCS1);
 disp.setSlave(1,pinCS2);
// disp.setSlave(2,6);
// disp.setSlave(3,7);
pinMode(lm35, INPUT); //Li diem que el pin del LM35 es una entrada

Serial.begin (9600); //inicia comunicacio al monitor serie per a llegir al pc tambe

}





/*
* Copy a character glyph from the myfont data structure to
* display memory, with its upper left at the given coordinate
* This is unoptimized and simply uses setPixel() to draw each dot.
*/
void drawChar(uint8_t x, uint8_t y, char c)
{
 uint8_t dots;
 if (c >= 'A' && c <= 'Z' ||
   (c >= 'a' && c <= 'z') ) {
   c &= 0x1F;   // A-Z maps to 1-26
 }
 else if (c >= '0' && c <= '9') {
   c = (c - '0') + 27;
 }
 else if (c == ' ') {
   c = 0; // space
 }
 for (char col=0; col< 5; col++) {
   dots = pgm_read_byte_near(&myfont[c][col]);
   for (char row=0; row < 7; row++) {
     if (dots & (64>>row))             // only 7 rows.
       toolbox.setPixel(x+col, y+row, 1);
     else
       toolbox.setPixel(x+col, y+row, 0);
   }
 }
}


// Write out an entire string (Null terminated)
void drawString(uint8_t x, uint8_t y, char* c)
{
     for(char i=0; i< strlen(c); i++)
     {
           drawChar(x, y, c[i]);
           x+=6; // Width of each glyph
     }
}

//-------------- funcio del LM35
void lm()
{ 
//Calcula la temperatura amb referencia de 5v
temperatura = (5.0 * analogRead(lm35)*100.0)/1024.0;  //variable pk doni la temp correcta
temp2 = ((5.0 * analogRead(lm35)*100.0)/1024.0)/10; //variable per a donar els decimals no funcion be encara
Serial.begin (9600);
Serial.println (temperatura); //escriu la temperatura al monitor serie

delay (10);
}

//----------------------------------------------



void scrollText(){
 int x = X_MAX;
 int charsFinished = 0;
 char visible[11];             //create visible array to hold string
 int i = 0;
 unsigned long lastUpdate = 0;   //variable used for scrolling function
 
 
 for (int n = 0; n < 11; n++){      //fill visible array with first char of string
   visible[n] = banner[n];
 }
 
 while(charsFinished < strlen(banner)){              //while string still has characters
   if(millis() - lastUpdate > SCROLLSPEED){        
     lastUpdate = millis();    
visible[11]='\0';     
     drawString(x, 0, visible);                 //draw visible array
     disp.syncDisplays();                      
       
     x--;
       
     if (x <= -6){                        //after each character is finished  
       charsFinished++;                   //advance one character
       x = 0;
       
       i = 0;
       while(i < 11 && banner[i + charsFinished] != '\0'){  
           visible[i] = banner[i + charsFinished];      
           i++;
       }
       visible[i] = banner[i + charsFinished];        
     }
     
     disp.clear();
   }
 }
}


void loop() {
   lm();
   sprintf(banner,"Temperatura interior " "%d" " Graus", temperatura);
   scrollText();
   delay(10);
 
}

He estado probando otras librerias con ejemplos y estoy igual no me acepta poner en lugar de una palabra/frase una variable que seria temperatura (es el valor que me da el LM35 que funciona correctamente en un lcd y serial).

La libreria es de esta MilesBurton.com

void demoText()
{

int y=Y_MAX-7;
int x=X_MAX;
boolean textDir = false;
boolean textRight = false;
for (int i=0; i < (DEMOTIME/DISPDELAY)/4; i++)
{
if(y<=0) textDir = true;
else if(y>=(Y_MAX-7)) textDir = false;

if(x>=X_MAX) textRight = false;
else if(x<=0) textRight = true;

if(textDir) y++;
else y--;

if(textRight) x++;
else x--;

drawString(x,y,"Hola"); ----> aqui me gustaria poner la variable, cambio "hola" por temperatura sin comillas claro :stuck_out_tongue:
disp.syncDisplays();

delay(100);
disp.clear();
}
}

Pues pasa la temperatura a una cadena de texto, ¿no?

Buenas, no se exactamente a que te refieres con cadena de texto :stuck_out_tongue:

Si funciona poniendo "Hola", en vez de poner la temperatura en número tal cual, 25, pues ponerlo en texto "25"

Pero ese valor tiene que benir de una variable no puedo poner "25" y que escriva eso y ya esta.

chiva:
Pues pasa la temperatura a una cadena de texto, ¿no?

Eso es lo que te decía, coge el int, byte o lo que sea y pásalo a texto con por ejemplo sprintf()

Gracias Chiva, bufff como me ha costado entenderte tio XDDD piensa que nunca he programado en C jeje

A base de buscarrrrrrrrr y buscaaaaaaaaarrrr por foros de C vi que simplemente era poner sin hacer nada complicado esto:

sprintf(banner,"Temperatura interior " "%d" "grados", temperatura);

Ahora me lo escribe correctamente, pero me encuentro que cuando pongo otra linea despues de scroll() se espera a que termine de pasar el texto antes de ir a por el siguiente que seria otro LM35 o sonda con la temperatura exterior, o mas datos incluso que no sean temperaturas.

Sabrias modificarme (si es posible comentar el codigo seria la bomba porque quizas asi entenderia como funciona el scroll).

Actualizo: podria ser que el scroll de ese tiempo porque cree que tiene 2 displais de 8x32 en lugar de 1 solo.

void scrollText(){
 int x = X_MAX;
 int charsFinished = 0;
 char visible[11];             //create visible array to hold string
 int i = 0;
 unsigned long lastUpdate = 0;   //variable used for scrolling function
 
 
 for (int n = 0; n < 11; n++){      //fill visible array with first char of string
   visible[n] = banner[n];
 }
 
 while(charsFinished < strlen(banner)){              //while string still has characters
   if(millis() - lastUpdate > SCROLLSPEED){        
     lastUpdate = millis();    
visible[11]='\0';     
     drawString(x, 0, visible);                 //draw visible array
     disp.syncDisplays();                      
       
     x--;
       
     if (x <= -6){                        //after each character is finished  
       charsFinished++;                   //advance one character
       x = 0;
       
       i = 0;
       while(i < 11 && banner[i + charsFinished] != '\0'){  
           visible[i] = banner[i + charsFinished];      
           i++;
       }
       visible[i] = banner[i + charsFinished];        
     }
     
     disp.clear();
   }
 }
}
void loop() {
   lm();
   sprintf(banner,"Temperatura interior " "%d" "grados", temperatura);
   scrollText();
   delay(10);
  sprintf(banner,"Temperatura Exterior " "%d" "grados", temperatura2);
   scrollText();
   delay(10);
}

Y una vez mas mil gracias por ayudar a este patata de la programacion xDD

El scroll da ese tiempo porque Arduio no puede hacer varias cosas a la vez, asi que hasta que no haya terminado de hacer el scroll completo, es decir, mostrar todas las letras y que la última haya desparecido de la pantalla, entonces terminará la función de scroll y continuará ejecutando el código.
Para evitar eso, puedes hacer lo que he hecho en el código que te he puesto aquí abajo, meter las dos variables en una misma cadena de texto, entonces si que se mostrarán seguidas sin que tenga que desaparecer completamente la primera para que aparezca la segunda. (mira que buffer lo tengas creado con tamño suficiente para guardar la cadena que te he puesto).

También he comentado el código, aunque nunca he usado matrices de leds y al faltar parte del código hay cosas que no puedo asegurar que sean así, pero que supongo que lo serán más o menos. He modificado alguna cosa para que quede más claro el código, por lo que si he roto algo me dices :grin:

void scrollText(){
  int x = X_MAX;
  int charsFinished = 0;
  char visible[11]; //vector con las letras que son visibles en la matriz
  int i = 0;
  unsigned long lastUpdate = 0;


  for (int n = 0; n < 11; n++){      //llenamos el vector para poder empezar a escribir
    visible[n] = banner[n];
  }
  //escribimos el finalizador de cadenas, para saber cuando se acaba el texto
  visible[11]='\0';

  while(charsFinished < strlen(banner)){              //mientras existan carácteres
    while (millis() - lastUpdate < SCROLLSPEED);      //esperamos a que pase el tiempo
    //guardamos cuando hemos realizado la actualizacion
    lastUpdate = millis();
    //renderiza el texto y con 'x' aplica el desplazamiento 
    //de la letra para realizar el efecto de movimiento
    drawString(x, 0, visible);
    //actualizar la matriz de leds
    disp.syncDisplays();                      
    //desplazamos 1 led las letras
    x--;

    if (x <= -6){                        //cuando acabemos una letra (¿letra = 7 leds?)
      charsFinished++;                   //siguiente carácter
      x = 0;
      //quitamos el primer caracter y ponemos el siguiente al final
      for (i=0;i<11;i++){
        visible[i] = banner[i + charsFinished];
        if (banner[i+charsFinished] == '\0') break;
      }
      visible[11]='\0';
    }
    //limpiamos la matriz de leds
    disp.clear();
  }
}
void loop() {
  lm();
  sprintf(banner,"Interior: %dC   Exterior: %dC", temperatura, temperatura2);
  scrollText();
}

Un saludo

Muchas gracias Chiva, ahora me queda claro jejeje

No sabia que por cada %d que ponga podre poner una variable mas temperatura, te..2 y otras cosas.

sprintf(banner,"Interior: %dC   Exterior: %dC", temperatura, temperatura2);

Cada vez me va gustando mas jejeje

Ahora he echo unas pruebas con if, else if, que nunca he tenido la oportunidad de probarlo para hacer que haga de "Madre" he echo un ejemplo y veo que va bien que dice "hace calor" "hace fesquita" y "hace frio ponte la chaqueta" jajaaja, son tonterias pero bueno, asi aprendo a usar mas cosas.

void dia() {
  
    if (temperatura >= 25)
   {
   sprintf(banner,"Fa caloreta O_o'"); }
else if (temperatura >=23) {
sprintf(banner, "fa fresqueta");
}
else if (temperatura <23) {
sprintf(banner, "fa fresca posat la jaqueta");
}
  
   scrollText();
   delay(10);
}

Un par de preguntas mas :stuck_out_tongue:

  • Se puede integrar de alguna manera con el sprint que me has modificado?
  • Como se pondira el (char)223 que en las pruebas en un LCD es el simbolo de º para poner ºC (si lo pongo sale una cosa rara, quizas en fonts.h necesita tener ese caracter creado)

¿A que te refieres con integrar el sprintf? No se si lo que he entendido es lo que querías.

Al principio iba a poner º en vez de C, pero me he imaginado que no lo tendría la librería, asi que puse C. Si no funciona, pues posiblemente tengas que añadirlo a fonts.h o donde esté la definición del resto de letras.

Un saludo

chiva:
¿A que te refieres con integrar el sprintf? No se si lo que he entendido es lo que querías.

Al principio iba a poner º en vez de C, pero me he imaginado que no lo tendría la librería, asi que puse C. Si no funciona, pues posiblemente tengas que añadirlo a fonts.h o donde esté la definición del resto de letras.

Un saludo

Me refiero a poner lo que he echo con los if y else if en la cadena de caracteres.

¿Lo que has hecho con los if y else if en la cadena de caracteres? Sigo sin saber a donde quieres llegar :blush:

Este codigo hace que al final del sprintf que muestra que temperatura hay interior y exterior escriva algo, seria util por ejemplo para mostrar si una ventana esta abierta o cualquier cosa.

Queria saber como se podria hacer para ponerlo dentro del mismo sprintf que me has enseñado a usar.

void dia() {
  
    if (temperatura >= 25)
   {
   sprintf(banner,"Fa caloreta O_o'"); }
else if (temperatura >=23) {
sprintf(banner, "fa fresqueta");
}
else if (temperatura <23) {
sprintf(banner, "fa fresca posat la jaqueta");
}
  
   scrollText();
   delay(10);
}

Te refieres a poner la temperatura y luego el texto según la temperatura que haga todo en un mismo sprintf?

sprintf parece que tiene la opción de tomar cadenas de carácteres con %p, pero no se si estará implementada en las librerías de Arduino.

Lo más fácil sería hacer lo que has hecho tu, 2 cadenas separadas.

Un saludo

Oki, gracias Chiva por tu tiempo, intentare con %p y si no esta implementado pues una detras de la otra jejeje.