0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« on: February 16, 2011, 12:47:36 pm » |
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); }
|
|
|
|
« Last Edit: February 18, 2011, 11:27:57 am by comeollas »
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #1 on: February 17, 2011, 12:12:51 pm » |
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_Displayvoid 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  disp.syncDisplays(); delay(100); disp.clear(); } }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #2 on: February 17, 2011, 04:06:46 pm » |
Pues pasa la temperatura a una cadena de texto, ¿no?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #3 on: February 17, 2011, 05:34:04 pm » |
Buenas, no se exactamente a que te refieres con cadena de texto 
|
|
|
|
« Last Edit: February 17, 2011, 05:42:39 pm by comeollas »
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #4 on: February 17, 2011, 05:49:29 pm » |
Si funciona poniendo "Hola", en vez de poner la temperatura en número tal cual, 25, pues ponerlo en texto "25"
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #5 on: February 17, 2011, 06:02:31 pm » |
Pero ese valor tiene que benir de una variable no puedo poner "25" y que escriva eso y ya esta.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #6 on: February 17, 2011, 06:21:30 pm » |
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()
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #7 on: February 18, 2011, 10:50:36 am » |
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
|
|
|
|
« Last Edit: February 18, 2011, 11:30:28 am by comeollas »
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #8 on: February 18, 2011, 12:19:53 pm » |
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  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
|
|
|
|
« Last Edit: February 18, 2011, 12:21:33 pm by chiva »
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #9 on: February 18, 2011, 01:02:21 pm » |
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  - 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)
|
|
|
|
« Last Edit: February 18, 2011, 01:07:59 pm by comeollas »
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #10 on: February 18, 2011, 01:43:27 pm » |
¿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
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #11 on: February 18, 2011, 02:07:47 pm » |
¿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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #12 on: February 18, 2011, 03:48:04 pm » |
¿Lo que has hecho con los if y else if en la cadena de caracteres? Sigo sin saber a donde quieres llegar 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 1
Posts: 105
Arduino rocks
|
 |
« Reply #13 on: February 18, 2011, 04:48:09 pm » |
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); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #14 on: February 18, 2011, 07:04:00 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
|