Display con TM1638+Arduino  Topic is solved solved with post #14548

Español

Display con TM1638+Arduino

Postby PSArias » Mon 30. Sep 2013, 19:09

Buenas compañeros, abro este nuevo hilo para quien quiera montarse el display, intentaré dejarlo lo más fácil posible así cualquiera con un mínimo de soltura, podrá hacerlo :) Vamos allá...

Primero tengo que dar las gracias a tronicgr por su estupendo post que me hizo decidirme a contruir el display, y por su código base de Arduino que me ha sido de mucha ayuda para comprender el funcionamiento y ampliar bastante sus funciones.

El post en cuestión es este: http://www.x-sim.de/forum/viewtopic.php?t=155, ahí encontrarán los materiales necesarios, donde conseguirlos y su correspondiente esquema de conexión. Dicho ésto, les dejo un vídeo del comportamiento del display:



Como podrán ver, he implementado funciones extra, tales como la muestra de temperatura, gasolina restante (a medida que queda menos gasolina los leds se van apagando) y la posibilidad de poder cambiar las RPM a las que se mostrará el shift light, cambiar la cantidad de gasolina máxima (para el correcto funcionamiento de la gasolina restante que indican los leds) y cambiar la intensidad de luminosidad del display en general. Todas estas funciones se pueden seleccionar pulsando los distintos botones que trae la TM1638 debajo:

Botón 1: Muestra la marcha actual y la velocidad con los leds iluminando de izquierda a derecha.
Botón 2: Lo mismo que el 1, pero cambia la forma de iluminación de los leds hacia el centro.
Botón 3: Para setear las RPM máximas. (Con los botones 6 y 7 se disminuye y aumenta la cantidad respectivamente)
Botón 4: Temperatura de agua y aceite.
Botón 5: Gasolina restante.
Botón 6: Capacidad máxima del tanque de gasolina. (Con los botones 6 y 7 se disminuye y aumenta la cantidad respectivamente)
Botón 7: Cambiar la intensidad de iluminación del display en general. (Con los botones 6 y 7 se disminuye y aumenta la intensidad respectivamente)
Botón 8: Sale de cualquiera de las opciones anteriores.

Aquí les dejo el código Arduino que necesitan cargar (ORIGINAL):

Code: Select all
/*
Programmed by PSArias
Thanks to tronicgr for the base code
http://x-sim.de
*/
#include <TM1638.h> //can be downloaded from http://code.google.com/p/tm1638-library/
#define RPMMAX 9500;
#define MAXFUEL 60;
// define a module on data pin 5, clock pin 4 and strobe pin 3
TM1638 module(5, 4, 3);

void setup() {
  //Create Serial Object
  Serial.begin(115200);
  // initialize the screen:
  module.clearDisplay();             
  byte values[]={0,0,0,0,0,0,0,0};         
  byte value = 32;
  for(int i=0; i<10; i++){
    if(i<2) {
      values[0]=value;
      value/=2;
    }
    else if(i-2>0){
      values[i-2]=value;
      values[i-3]=0;
    }
    else
      values[i-2]=value;
    module.setDisplay(values);
    delay(50);
  }
  value=4; 
  for(int i=9; i>=0; i--){
    if(i>7) {
      values[7]=value;
      value/=2;
    }
    else if(i<7){
      values[i]=value;
      values[i+1]=0;
    }
    else
      values[i]=value;
    module.setDisplay(values);
    delay(50);
  }
  value=32;
  for(int i=0;i<2;i++){
    values[0]=value;
    value/=2;
    module.setDisplay(values);
    delay(50);
  }
  for(int i=128;i>=1;i/=2){
    module.setDisplayToString("        ",i);
    delay(50);
  }
  for(int i=0; i<3; i++){
    module.setDisplayToString("        ",255);
    module.setLEDs(0b11111111 | 0b111111111<< 8 );
    delay(250);
    module.setDisplayToString("        ",0);
    module.setLEDs(0b00000000 | 0b00000000<< 8 );
    delay(250);
  }
  module.setDisplayToString("  rEAdy ");
  module.setLEDs(0b11111111 | 0b00000000<< 8 );
  delay(1500);
  module.clearDisplay();             
}

byte option, button;
int i;
char bufferArray[20];              // holds all serial data into a array
unsigned int rpm;                  //holds the rpm data (0-65535 size)
unsigned int rpmleds;              //holds the 8 leds values
unsigned int rpmmax = RPMMAX;      //retrieves from x-sim USO this value as parameter divided by 100
byte maxfuel = MAXFUEL;
unsigned int carspeed;             //holds the speed data (0-65535 size)
byte gear;                         // holds gear value data
byte oilTemp;
byte waterTemp;
byte fuel;
byte intensity=7;
byte d1;                           // high byte temp variable
byte d2;                           // low byte temp variable
byte rpmdata = 0;                  // marker that new data are available
byte speeddata = 0;                // marker that new data are available
byte geardata = 0;                 // marker that new data are available
byte oilTempData = 0;
byte waterTempData = 0;
byte fuelData = 0;

void getData(){
  if (Serial.available() >= 9)  {    //if 6 bytes available in the Serial buffer...
        for (i=0; i<17; i++) {         // for each byte
        bufferArray[i] = Serial.read();        // put into array
       }
    }
   
  if (bufferArray[0] == 'R' ){      // if new bytes have been recieved
 
     d1 = bufferArray[1];      // store high byte of rpm
     d2 = bufferArray[2];      // store low byte of rpm
     rpm = ((d1<<8) + d2);               // concatonate bytes (shift 8 bits)
     rpmdata=1;                          // we got new data!
  }
  if (bufferArray[4] == 'S' ){
     d1 = bufferArray[5];      // store high byte of speed
     d2 = bufferArray[6];      // store low byte of speed
     carspeed = ((d1<<8) + d2);          // concatonate bytes (shift 8 bits)
     speeddata=1;                        // we got new data!
  }
  if (bufferArray[7] == 'G' ){
     gear = bufferArray[8];         // retrieves the single byte of gear (0-255 value)
     geardata=1;                    // we got new data!
  }
  if (bufferArray[9] == 'O' ){
     d1 = bufferArray[10];
     d2 = bufferArray[11];
     oilTemp = ((d1<<8) + d2);
     oilTempData = 1;
  }
  if (bufferArray[12] == 'W' ){
     d1 = bufferArray[13];
     d2 = bufferArray[14];
     waterTemp = ((d1<<8) + d2);
     waterTempData = 1;
  }
  if (bufferArray[15] == 'F' ){
     fuel = bufferArray[16];
     fuelData = 1;
  }
 
}

void option1(byte rpmMode){
  getData();
  //Speed Data---------------------------------------------
  if (speeddata == 1) {
    for(int i=7; i>=5; i--){
      if(carspeed!=0){
        module.setDisplayDigit(carspeed%10, i, false);
        carspeed/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    //module.setDisplayToDecNumber(carspeed, 0, false);  //displays numerical the speed
    speeddata=0;                     
  }

  //Gear Data ---------------------------------------------- 
  if (geardata == 1) {
     gear = gear - 127;      // offset the 0 value in 8-bit
     if (gear >= 1 and gear <10 ){
        module.setDisplayDigit(gear, 1, false);   // displays numerical value of the current gear
     }
     if (gear == 0){
        module.setDisplayToString("n", 0, 1);  // displays the character for neutral
     }
     if (gear == 255){                        // -1 that reprecents reverse rollover to 255 so...
        module.setDisplayToString("r", 0, 1);  // displays the character for reverse
     }
     geardata=0;
  }
 
  //RPM Data------------------------------------------------------
  if (rpmdata == 1) {
     rpmleds = map(rpm,0,rpmmax,0,9);    // distributes the rpm level to the 8 leds + 1 for shift change
     if(rpmMode==1) {
       if (rpmleds==0){
         module.setLEDs(0b00000000 | 0b00000000<< 8);
       }
       if (rpmleds==1){
         module.setLEDs(0b00000001 | 0b00000000<< 8 );
       }
       if (rpmleds==2){
         module.setLEDs(0b00000011 | 0b00000000<< 8 );
       }
       if (rpmleds==3){
         module.setLEDs(0b00000111 | 0b00000000<< 8 );
       }
       if (rpmleds==4){
         module.setLEDs(0b00001111 | 0b00000000<< 8);
       }
       if (rpmleds==5){
         module.setLEDs(0b00011111 | 0b00000000<< 8);
       }
       if (rpmleds==6){
         module.setLEDs(0b00011111 | 0b00100000<< 8 );
       }
       if (rpmleds==7){
         module.setLEDs(0b00011111 | 0b01100000<< 8 );
       }
       if (rpmleds==8){
         module.setLEDs(0b11111111 | 0b111111111<< 8 );   
       }
     }
     else if(rpmMode==2) {
       if (rpmleds==0){
         module.setLEDs(0b00000000 | 0b00000000<< 8);
       }
       if (rpmleds==1){
         module.setLEDs(0b00000000 | 0b00000000<< 8 );
       }
       if (rpmleds==2){
         module.setLEDs(0b10000001 | 0b00000000<< 8 );
       }
       if (rpmleds==3){
         module.setLEDs(0b10000001 | 0b00000000<< 8 );
       }
       if (rpmleds==4){
         module.setLEDs(0b11000011 | 0b00000000<< 8 );
       }
       if (rpmleds==5){
         module.setLEDs(0b11000011 | 0b00000000<< 8 );
       }
       if (rpmleds==6){
         module.setLEDs(0b11100111 | 0b00000000<< 8 );
       }
       if (rpmleds==7){
         module.setLEDs(0b11100111 | 0b00011000<< 8 );
       }
       if (rpmleds==8){
         module.setLEDs(0b11111111 | 0b111111111<< 8 );   
       }
     }
     rpmdata=0;
  }
}

void option3(){  //Set RPM Max. vlaue
  byte buttonPressed;
  do {
    module.setDisplayToDecNumber(rpmmax,0,false);
    buttonPressed = module.getButtons();
    if(buttonPressed==32)
      rpmmax-=500;
    else if(buttonPressed==64)
      rpmmax+=500;
    delay(100);
  }while(buttonPressed!=128);
}

void option4(){
  getData();
  module.setDisplayToString("l",0,4);
  if(oilTempData==1 && oilTemp<255 && oilTemp>0){
    for(int i=7; i>=5; i--){
      if(oilTemp!=0){
        module.setDisplayDigit(oilTemp%10, i, false);
        oilTemp/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    oilTempData=0;
  }
  if(waterTempData==1 && waterTemp<255 && waterTemp>0){
    for(int i=2; i>=0; i--){
      if(waterTemp!=0){
        module.setDisplayDigit(waterTemp%10, i, false);
        waterTemp/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    waterTempData=0;
  }
 
}

void option5(){  //Set Fuel Max. vlaue
  byte buttonPressed;
  do {
    fuel = maxfuel;
    for(int i=3; i>=1; i--){
      if(fuel!=0){
        module.setDisplayDigit(fuel%10, i, false);
        fuel/=10;
      }
      else if(i==3)    //There is 0Lts, no fuel!
        module.setDisplayDigit(0,i,false);
      else             //clean left zeros
        module.clearDisplayDigit(i, false);
    }
    module.setDisplayToString("LtS",0,5);
    buttonPressed = module.getButtons();
    if(buttonPressed==32)
      maxfuel-=1;
    else if(buttonPressed==64)
      maxfuel+=1;
    delay(100);
  }while(buttonPressed!=128);
  clean();
}

void option6(){
  getData();
  if(fuelData==1 && fuel<228 && fuel>=127){
    fuel-=127;
    int maxLed = fuel*8/maxfuel;
    for(int i=0; i<8; i++){
      if(i>=maxLed){
        if(maxLed==0 && fuel >= 0)
          module.setLED(2,0);
        else
          module.setLED(0, i);
      }
      else
        module.setLED(1, i);
    }
    for(int i=3; i>=1; i--){
      if(fuel!=0){
        module.setDisplayDigit(fuel%10, i, false);
        fuel/=10;
      }
      else if(i==3)    //There is 0Lts, no fuel!
        module.setDisplayDigit(0,i,false);
      else             //clean left zeros
        module.clearDisplayDigit(i, false);
    }
    module.setDisplayToString("LtS",0,5);
    fuelData = 0;
  }
}

void option7(){
  byte buttonPressed;
  do {
    module.setupDisplay(1,intensity);
    module.setDisplayToString("--tESt--",0);
    buttonPressed = module.getButtons();
    if(buttonPressed==32 && intensity>0)
      intensity--;
    else if(buttonPressed==64 && intensity<7)
      intensity++;
    delay(80);
  }while(buttonPressed!=128);
}

void clean(){
  module.clearDisplay();
  module.setLEDs(0b00000000 | 0b00000000<< 8);
}

void loop() {
 
  button=module.getButtons();
  if(button!=0){
    switch(button){
    case 1:
      clean();
      module.setDisplayToString("GEAr SPd",0);
      delay(1000);
      module.clearDisplay();
      module.setDisplayToString("LEdS 1",0,1);
      delay(1000);
      clean();
    break;
    case 2:
      clean();
      module.setDisplayToString("GEAr SPd",0);
      delay(1000);
      module.clearDisplay();
      module.setDisplayToString("LEdS 2",0,1);
      delay(1000);
      clean();
    break;
    case 4:
      clean();
    break;
    case 8:
      clean();
      module.setDisplayToString("tAG l AC",0b10000000);
      delay(1000);
      clean();
    break;
    case 16:
      clean();
      module.setDisplayToString("FUEL",0,2);
      delay(1000);
      clean();
    break;
    case 32:
      clean();
      module.setDisplayToString("SEt FUEL",0);
      delay(1000);
      clean();
    break;
    case 64:
      clean();
      module.setDisplayToString("briGht",0,1);
      delay(1000);
      clean();
    break;
    }
    option = button;
  }
 
  switch(option){
    case 1:
      option1(1);
    break;
    case 2:
      option1(2);
    break;
    case 4:
      option3();
    break;
    case 8:
      option4();
    break;
    case 16:
      option6();
    break;
    case 32:
      option5();
    break;
    case 64:
      option7();
    break;
    case 128:
      clean();
    break;
    default:
      clean();
      break;
  }
}


ACTUALIZACIÓN: Otra versión del código donde los leds parpadean ahora con el shift light y las RPM's para setear el shift light se pueden subir y bajar de a 250.

Code: Select all
/*
Programmed by PSArias
Thanks to tronicgr for the base code
http://x-sim.de
*/
#include <TM1638.h> //can be downloaded from http://code.google.com/p/tm1638-library/
#define RPMMAX 9500;
#define MAXFUEL 60;
// define a module on data pin 5, clock pin 4 and strobe pin 3
TM1638 module(5, 4, 3);

void setup() {
  //Create Serial Object
  Serial.begin(115200);
  // initialize the screen:
  module.clearDisplay();             
  byte values[]={0,0,0,0,0,0,0,0};         
  byte value = 32;
  for(int i=0; i<10; i++){
    if(i<2) {
      values[0]=value;
      value/=2;
    }
    else if(i-2>0){
      values[i-2]=value;
      values[i-3]=0;
    }
    else
      values[i-2]=value;
    module.setDisplay(values);
    delay(50);
  }
  value=4; 
  for(int i=9; i>=0; i--){
    if(i>7) {
      values[7]=value;
      value/=2;
    }
    else if(i<7){
      values[i]=value;
      values[i+1]=0;
    }
    else
      values[i]=value;
    module.setDisplay(values);
    delay(50);
  }
  value=32;
  for(int i=0;i<2;i++){
    values[0]=value;
    value/=2;
    module.setDisplay(values);
    delay(50);
  }
  for(int i=128;i>=1;i/=2){
    module.setDisplayToString("        ",i);
    delay(50);
  }
  for(int i=0; i<3; i++){
    module.setDisplayToString("        ",255);
    module.setLEDs(0b11111111 | 0b111111111<< 8 );
    delay(250);
    module.setDisplayToString("        ",0);
    module.setLEDs(0b00000000 | 0b00000000<< 8 );
    delay(250);
  }
  module.setDisplayToString("  rEAdy ");
  module.setLEDs(0b11111111 | 0b00000000<< 8 );
  delay(1500);
  module.clearDisplay();             
}

byte option, button;
int i;
char bufferArray[20];              // holds all serial data into a array
unsigned int rpm;                  //holds the rpm data (0-65535 size)
unsigned int rpmleds;              //holds the 8 leds values
unsigned int rpmmax = RPMMAX;      //retrieves from x-sim USO this value as parameter divided by 100
byte maxfuel = MAXFUEL;
unsigned int carspeed;             //holds the speed data (0-65535 size)
byte gear;                         // holds gear value data
byte oilTemp;
byte waterTemp;
byte fuel;
byte intensity=7;
byte d1;                           // high byte temp variable
byte d2;                           // low byte temp variable
byte rpmdata = 0;                  // marker that new data are available
byte speeddata = 0;                // marker that new data are available
byte geardata = 0;                 // marker that new data are available
byte oilTempData = 0;
byte waterTempData = 0;
byte fuelData = 0;

void getData(){
  if (Serial.available() >= 9)  {    //if 6 bytes available in the Serial buffer...
        for (i=0; i<17; i++) {         // for each byte
        bufferArray[i] = Serial.read();        // put into array
       }
    }
   
  if (bufferArray[0] == 'R' ){      // if new bytes have been recieved
 
     d1 = bufferArray[1];      // store high byte of rpm
     d2 = bufferArray[2];      // store low byte of rpm
     rpm = ((d1<<8) + d2);               // concatonate bytes (shift 8 bits)
     rpmdata=1;                          // we got new data!
  }
  if (bufferArray[4] == 'S' ){
     d1 = bufferArray[5];      // store high byte of speed
     d2 = bufferArray[6];      // store low byte of speed
     carspeed = ((d1<<8) + d2);          // concatonate bytes (shift 8 bits)
     speeddata=1;                        // we got new data!
  }
  if (bufferArray[7] == 'G' ){
     gear = bufferArray[8];         // retrieves the single byte of gear (0-255 value)
     geardata=1;                    // we got new data!
  }
  if (bufferArray[9] == 'O' ){
     d1 = bufferArray[10];
     d2 = bufferArray[11];
     oilTemp = ((d1<<8) + d2);
     oilTempData = 1;
  }
  if (bufferArray[12] == 'W' ){
     d1 = bufferArray[13];
     d2 = bufferArray[14];
     waterTemp = ((d1<<8) + d2);
     waterTempData = 1;
  }
  if (bufferArray[15] == 'F' ){
     fuel = bufferArray[16];
     fuelData = 1;
  }
 
}

void option1(byte rpmMode){
  getData();
  //Speed Data---------------------------------------------
  if (speeddata == 1) {
    for(int i=7; i>=5; i--){
      if(carspeed!=0){
        module.setDisplayDigit(carspeed%10, i, false);
        carspeed/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    //module.setDisplayToDecNumber(carspeed, 0, false);  //displays numerical the speed
    speeddata=0;                     
  }

  //Gear Data ---------------------------------------------- 
  if (geardata == 1) {
     gear = gear - 127;      // offset the 0 value in 8-bit
     if (gear >= 1 and gear <10 ){
        module.setDisplayDigit(gear, 1, false);   // displays numerical value of the current gear
     }
     if (gear == 0){
        module.setDisplayToString("n", 0, 1);  // displays the character for neutral
     }
     if (gear == 255){                        // -1 that reprecents reverse rollover to 255 so...
        module.setDisplayToString("r", 0, 1);  // displays the character for reverse
     }
     geardata=0;
  }
 
  //RPM Data------------------------------------------------------
  if (rpmdata == 1) {
     rpmleds = map(rpm,0,rpmmax,0,8);    // distributes the rpm level to the 8 leds + 1 for shift change
     if(rpmMode==1) {
       if (rpmleds==0){
         module.setLEDs(0b00000000 | 0b00000000<< 8);
       }
       if (rpmleds==1){
         module.setLEDs(0b00000001 | 0b00000000<< 8 );
       }
       if (rpmleds==2){
         module.setLEDs(0b00000011 | 0b00000000<< 8 );
       }
       if (rpmleds==3){
         module.setLEDs(0b00000111 | 0b00000000<< 8 );
       }
       if (rpmleds==4){
         module.setLEDs(0b00001111 | 0b00000000<< 8);
       }
       if (rpmleds==5){
         module.setLEDs(0b00011111 | 0b00000000<< 8);
       }
       if (rpmleds==6){
         module.setLEDs(0b00011111 | 0b00100000<< 8 );
       }
       if (rpmleds==7){
         module.setLEDs(0b00011111 | 0b01100000<< 8 );
       }
       if (rpmleds==8){
         module.setLEDs(0b11111111 | 0b111111111<< 8 );
         delay(50);
         module.setLEDs(0b00000000 | 0b00000000<< 8);
         delay(50); 
       }
     }
     else if(rpmMode==2) {
       if (rpmleds==0){
         module.setLEDs(0b00000000 | 0b00000000<< 8);
       }
       if (rpmleds==1){
         module.setLEDs(0b00000000 | 0b00000000<< 8 );
       }
       if (rpmleds==2){
         module.setLEDs(0b10000001 | 0b00000000<< 8 );
       }
       if (rpmleds==3){
         module.setLEDs(0b10000001 | 0b00000000<< 8 );
       }
       if (rpmleds==4){
         module.setLEDs(0b11000011 | 0b00000000<< 8 );
       }
       if (rpmleds==5){
         module.setLEDs(0b11000011 | 0b00000000<< 8 );
       }
       if (rpmleds==6){
         module.setLEDs(0b11100111 | 0b00000000<< 8 );
       }
       if (rpmleds==7){
         module.setLEDs(0b11100111 | 0b00011000<< 8 );
       }
       if (rpmleds==8){
         module.setLEDs(0b11111111 | 0b111111111<< 8 );
         delay(50);
         module.setLEDs(0b00000000 | 0b00000000<< 8);
         delay(50);   
       }
     }
     rpmdata=0;
  }
}

void option3(){  //Set RPM Max. vlaue
  byte buttonPressed;
  do {
    module.setDisplayToDecNumber(rpmmax,0,false);
    buttonPressed = module.getButtons();
    if(buttonPressed==32)
      rpmmax-=250;
    else if(buttonPressed==64)
      rpmmax+=250;
    delay(100);
  }while(buttonPressed!=128);
}

void option4(){
  getData();
  module.setDisplayToString("l",0,4);
  if(oilTempData==1 && oilTemp<255 && oilTemp>0){
    for(int i=7; i>=5; i--){
      if(oilTemp!=0){
        module.setDisplayDigit(oilTemp%10, i, false);
        oilTemp/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    oilTempData=0;
  }
  if(waterTempData==1 && waterTemp<255 && waterTemp>0){
    for(int i=2; i>=0; i--){
      if(waterTemp!=0){
        module.setDisplayDigit(waterTemp%10, i, false);
        waterTemp/=10;
      }
      else
        module.clearDisplayDigit(i, false);
    }
    waterTempData=0;
  }
 
}

void option5(){  //Set Fuel Max. vlaue
  byte buttonPressed;
  do {
    fuel = maxfuel;
    for(int i=3; i>=1; i--){
      if(fuel!=0){
        module.setDisplayDigit(fuel%10, i, false);
        fuel/=10;
      }
      else if(i==3)    //There is 0Lts, no fuel!
        module.setDisplayDigit(0,i,false);
      else             //clean left zeros
        module.clearDisplayDigit(i, false);
    }
    module.setDisplayToString("LtS",0,5);
    buttonPressed = module.getButtons();
    if(buttonPressed==32)
      maxfuel-=1;
    else if(buttonPressed==64)
      maxfuel+=1;
    delay(100);
  }while(buttonPressed!=128);
  clean();
}

void option6(){
  getData();
  if(fuelData==1 && fuel<228 && fuel>=127){
    fuel-=127;
    int maxLed = fuel*8/maxfuel;
    for(int i=0; i<8; i++){
      if(i>=maxLed){
        if(maxLed==0 && fuel >= 0)
          module.setLED(2,0);
        else
          module.setLED(0, i);
      }
      else
        module.setLED(1, i);
    }
    for(int i=3; i>=1; i--){
      if(fuel!=0){
        module.setDisplayDigit(fuel%10, i, false);
        fuel/=10;
      }
      else if(i==3)    //There is 0Lts, no fuel!
        module.setDisplayDigit(0,i,false);
      else             //clean left zeros
        module.clearDisplayDigit(i, false);
    }
    module.setDisplayToString("LtS",0,5);
    fuelData = 0;
  }
}

void option7(){
  byte buttonPressed;
  do {
    module.setupDisplay(1,intensity);
    module.setDisplayToString("--tESt--",0);
    buttonPressed = module.getButtons();
    if(buttonPressed==32 && intensity>0)
      intensity--;
    else if(buttonPressed==64 && intensity<7)
      intensity++;
    delay(80);
  }while(buttonPressed!=128);
}

void clean(){
  module.clearDisplay();
  module.setLEDs(0b00000000 | 0b00000000<< 8);
}

void loop() {
 
  button=module.getButtons();
  if(button!=0){
    switch(button){
    case 1:
      clean();
      module.setDisplayToString("GEAr SPd",0);
      delay(1000);
      module.clearDisplay();
      module.setDisplayToString("LEdS 1",0,1);
      delay(1000);
      clean();
    break;
    case 2:
      clean();
      module.setDisplayToString("GEAr SPd",0);
      delay(1000);
      module.clearDisplay();
      module.setDisplayToString("LEdS 2",0,1);
      delay(1000);
      clean();
    break;
    case 4:
      clean();
    break;
    case 8:
      clean();
      module.setDisplayToString("tAG l AC",0b10000000);
      delay(1000);
      clean();
    break;
    case 16:
      clean();
      module.setDisplayToString("FUEL",0,2);
      delay(1000);
      clean();
    break;
    case 32:
      clean();
      module.setDisplayToString("SEt FUEL",0);
      delay(1000);
      clean();
    break;
    case 64:
      clean();
      module.setDisplayToString("briGht",0,1);
      delay(1000);
      clean();
    break;
    }
    option = button;
  }
 
  switch(option){
    case 1:
      option1(1);
    break;
    case 2:
      option1(2);
    break;
    case 4:
      option3();
    break;
    case 8:
      option4();
    break;
    case 16:
      option6();
    break;
    case 32:
      option5();
    break;
    case 64:
      option7();
    break;
    case 128:
      clean();
    break;
    default:
      clean();
      break;
  }
}


En archivos adjuntos les dejaré el profile creado en X-sim para que el display pueda leer los datos sin problemas y tal como los espera.

Bueno compañeros, espero que todo les funcione a la perfección y cualquier duda, sugerencia o comentario, por aquí estaré. Simplemente cargar el código arduino, abrir el profile de X-sim, darle al play en el extractor y todo debería ir como la seda ;)

Saludos!
Attachments
tm1638.zip
Profile de X-Sim configurado para el uso con el display TM1638
(1.31 KiB) Downloaded 665 times
Last edited by PSArias on Wed 23. Jul 2014, 16:44, edited 1 time in total.
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby PSArias » Thu 3. Oct 2013, 12:08

vicente34 wrote:Mil gracias PS por el codigo Arduino y el profiler.
Segui los pasos, puse los pines donde correspondia y bingo,tacometro funcionando.
Pero tengo un problema,no consigo que cambie de lectura cuando pulso la botonera, y a veces cuando voy pasado de vueltas, el numero que indica la marcha parpadea y en los de la velocidad salen mas numeros con algo menos de luminosidad,aunque esto ultimo a lo mejor es debida a que las pruebas las estoy haciendo con el teclado ,con todas las ayudas activadas a tope,de manera que solo pulso la barra espaciadora y tiro millas.
Aun asi es mucho mas de lo que yo solo habria conseguido, y sinceramente con lo que tengo ya me sobra, porque el resto de datos normalmente ya los tengo en pantalla con el Hud,pero ya que estamos ,tampoco estaria mal del todo conseguir que funcione como tu lo tienes.Todo es cuestion de ir probando,hace dos dias estaba amargado porque no habia manera de hacer andar esto y hoy todo marcha sobre ruedas.
Bueno como te he dicho antes,mil gracias,o mejor aun UN MILLON,saludos. :D :D :D :D :lol: :lol: :lol: :lol:


Vicente, te contesto por aquí, así todo lo referente a la TM1638 queda archivado en este post :D
Que raro lo que me comentas de la botonera... ¿Te animas a hacer un vídeo y ponerlo aquí? Es que así tendría más pistas de lo que le puede estar pasando. Si no, no pasa nada... ¿Tú le das por ejemplo al botón 5 y te dice Fuel y después no te muestra nada, o directamente no te muestra nada si pulas al botón 5? (Me refiero al 5º botón contando de izquierda a derecha). A ver si es que es una versión diferente de la placa y el código necesita unos botones. Como te he dicho, si no puedes subir el vídeo, haz una foto a la placa para que la vea ;)

Saludos compañero, seguimos en contacto!
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby vicente34 » Thu 3. Oct 2013, 15:58

PS, resulta que ya se porque no cambia la botonera.Parece ser que por algun motivo, cargue el codigo de tronicgr y este funciona perfectamente,asi que descubierto mi herror, procedi a cargar tu codigo.
Cuando cargo, empezo un guion a dar vueltas por el display,despues se encendieron los puntitos del display y los leds en rojo y para terminar, se encendieron los leds en verde y aparecio la palabra " ready ",pero eso fue todo,encendi el converter y nada, eso se quedo apagado.
He estado comparando los codigos pero para mi estan escritos en Arameo,no entiendo nada.
En cuanto a las fotos,haber si me dices como las cuelgo y te mando alguna.
Un abrazo.
User avatar
vicente34
 
Posts: 149
Images: 0
Joined: Sun 21. Jul 2013, 19:00
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby PSArias » Thu 3. Oct 2013, 16:13

Perfecto vicente! Eso significa que el código está bien cargado jajaja esas filigranas se las hice para que quedara un poco más estético :lol:
Una vez que has puesto el Converter, y has ejecutado el juego, ¿Has pulsado el primer botón para que te muestre la información? ¿O algún botón? Es que lo hice para que por defecto se quedara apagado, si no pulsas ingún botón, no muestra nada, debí decirtelo a eso :roll:

Prueba eso y me dices cualquier cosa...

Saludos!!
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby vicente34 » Thu 3. Oct 2013, 21:05

PS,nada,cargo el codigo,salen las filigranas, ejecuto el converter,le doy a los botones y nada. :?: :?: :?: :?: :?: :?: :?: :?: :?: :? :?
Saludos.
User avatar
vicente34
 
Posts: 149
Images: 0
Joined: Sun 21. Jul 2013, 19:00
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby PSArias » Thu 3. Oct 2013, 22:34

Ahora si que me dejas... alucinado jajaja
Pero, ¿Ni siquiera te sale nada de nada cuando le das a algún botón? Por ejemplo, si le das al 4, ¿No te sale Fuel escrito?
Es para darme pistas de que está pasando, si es que no lee las pulsaciones por algún cambio en la plaqueta, si es versión diferente, o en la librería... Si no puedes hacer la foto, no pasa nada, dime que versión es la plaqueta, eso lo miras arriba de los display de 8 segmentos al lado de donde dice LKM1638, dice V: y ahí dirá la cersión :)

Espero a ver que me comentas, le encontraremos solución :D

Saludos!
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby vicente34 » Fri 4. Oct 2013, 21:27

Hola PS,la version es la " V: 1.2 " y como te digo,pulso los botones y no sale nada.
En cuanto a la foto, se la puedo hacer lo que no se es como colgarla.
Un abrazo.
User avatar
vicente34
 
Posts: 149
Images: 0
Joined: Sun 21. Jul 2013, 19:00
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby PSArias » Sat 5. Oct 2013, 12:40

Es muy raro lo que me comentas vicente, la mia tabién es V:1.2..

El código en un principio está bien, he revisado la libreria y en el tema de los botones no ha cambiado, lo que probaré es a ver si en el Arduino UNO el código funciona bien y los botones reaccionan, si todo va bien, entonces me temo de que puedas tener algún problema en tu placa con los botones :|.. Esperemos que no sea el caso.

Probaré eso y te digo algo vicente..

EDITO: Lo acabo de probar vicente, y si que funciona en el Arduino UNO. Cada vez sospecho más de que pueda ser un problema de la placa, de los botones...

Saludos!
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby PSArias » Mon 7. Oct 2013, 00:27

Vicente, te he programado un programita muy sencillo para probar los botones, cárgalo al Arduino, y cuando ya esté, es simplemente apretar un botón y se tiene que encender el led correspondiente al botón apretado. Por las dudas, no sé si ya la tienes, pero bájate la última versión de la libreria de la TM1638, en el código está la página de donde descargarla.

Code: Select all
#include <TM1638.h> //can be downloaded from http://code.google.com/p/tm1638-library/

// define a module on data pin 5, clock pin 4 and strobe pin 3
TM1638 module(5, 4, 3);

void setup(){
}

byte button;

void loop() {
 
  button=module.getButtons();
  if(button!=0){
    switch(button){
    case 1:
       module.setLEDs(0b00000001 | 0b00000000<< 8 );
    break;
    case 2:
       module.setLEDs(0b00000010 | 0b00000000<< 8 );
    break;
    case 4:
       module.setLEDs(0b00000100 | 0b00000000<< 8 );
    break;
    case 8:
       module.setLEDs(0b00001000 | 0b00000000<< 8 );
    break;
    case 16:
       module.setLEDs(0b00010000 | 0b00000000<< 8 );
    break;
    case 32:
       module.setLEDs(0b00100000 | 0b00000000<< 8 );
    break;
    case 64:
       module.setLEDs(0b01000000 | 0b00000000<< 8 );
    break;
    case 128:
       module.setLEDs(0b10000000 | 0b00000000<< 8 );
    break;
    }
  }
}


Si no, prueba con este otro, aunque en un principio es lo mismo, pero por probar...

Code: Select all
#include <TM1638.h> //can be downloaded from http://code.google.com/p/tm1638-library/

// define a module on data pin 5, clock pin 4 and strobe pin 3
TM1638 module(5, 4, 3);

void setup(){
}

byte button;

void loop() {
 
  button=module.getButtons();
  if(button!=0){
    switch(button){
    case 0b00000001:
       module.setLEDs(0b00000001 | 0b00000000<< 8 );
    break;
    case 0b00000010:
       module.setLEDs(0b00000010 | 0b00000000<< 8 );
    break;
    case 0b00000100:
       module.setLEDs(0b00000100 | 0b00000000<< 8 );
    break;
    case 0b00001000:
       module.setLEDs(0b00001000 | 0b00000000<< 8 );
    break;
    case 0b00010000:
       module.setLEDs(0b00010000 | 0b00000000<< 8 );
    break;
    case 0b00100000:
       module.setLEDs(0b00100000 | 0b00000000<< 8 );
    break;
    case 0b01000000:
       module.setLEDs(0b01000000 | 0b00000000<< 8 );
    break;
    case 0b10000000:
       module.setLEDs(0b10000000 | 0b00000000<< 8 );
    break;
    }
  }
}


A ver si así funciona... Esperemos que si! ;)

Saludos!!
User avatar
PSArias
 
Posts: 78
Joined: Wed 13. Mar 2013, 00:35
Has thanked: 0 time
Been thanked: 0 time

Re: Display con TM1638+Arduino

Postby vicente34 » Mon 7. Oct 2013, 09:55

Ps,que tal.
Desgraciadamente esto sigue sin funcionar.Agradezco mucho tu esfuerzo,pero no te preocupes porque esto tiene pinta de ser lo que tuas dicho,que la placa tenga algun defecto.No pasa nada,en principio seguire el proyecto con lo que ya tengo y asi para cuando acabe tengo algo mas con lo que entretenerme.De todas formas lo mas probable es que me pida otra nueva y ya esta,porque por 5 euros no voy a salir de pobre.
Bueno lo dicho PS,muchas garcias y no te preocupes que tus codigos estan guardados y los utilizare cuando tenga la placa nueva.
Un abrazo.
User avatar
vicente34
 
Posts: 149
Images: 0
Joined: Sun 21. Jul 2013, 19:00
Has thanked: 0 time
Been thanked: 0 time

Next

Return to Spanish language

Who is online

Users browsing this forum: No registered users and 3 guests