Go Down

Topic: Matriz led 8x32 (Read 3712 times) previous topic - next topic

comeollas

Feb 16, 2011, 06:47 pm Last Edit: Feb 18, 2011, 05:27 pm by comeollas Reason: 1
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

Code: [Select]

/*
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);

}

comeollas

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 http://milesburton.com/index.php/Arduino_%26_the_Sure_2416_Information_Display




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 :P
    disp.syncDisplays();

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

chiva

Pues pasa la temperatura a una cadena de texto, ¿no?
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas

#3
Feb 17, 2011, 11:34 pm Last Edit: Feb 17, 2011, 11:42 pm by comeollas Reason: 1
Buenas, no se exactamente a que te refieres con cadena de texto :P




chiva

Si funciona poniendo "Hola", en vez de poner la temperatura en número tal cual, 25, pues ponerlo en texto "25"
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas

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()
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas

#7
Feb 18, 2011, 04:50 pm Last Edit: Feb 18, 2011, 05:30 pm by comeollas Reason: 1
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:
Code: [Select]
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.
Code: [Select]

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

chiva

#8
Feb 18, 2011, 06:19 pm Last Edit: Feb 18, 2011, 06:21 pm by chiva Reason: 1
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 :smiley-mr-green:

Code: [Select]
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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas

#9
Feb 18, 2011, 07:02 pm Last Edit: Feb 18, 2011, 07:07 pm by comeollas Reason: 1
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.
Code: [Select]
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.

Code: [Select]
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 :P

- 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)

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas


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

chiva

¿Lo que has hecho con los if y else if en la cadena de caracteres? Sigo sin saber a donde quieres llegar :smiley-red:
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

comeollas

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.

Code: [Select]

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);
}

chiva

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Go Up