Start Elkretssimulator


TM1638 Knappar & Leds

Fixa enkel kontrollpanel

Så, vi behöver ett gäng knappar, displayer och lysdioder. Det finns inte tillräckligt med portar på en arduino, eller vanligtvis någon annan processor heller för den delen, för detta. Här kommer Led Driver Controller TM1638 in i bilden. Låt oss experimentera lite med ett kretskort byggt runt Led Driver Controller TM1638 (klicka för datablad till TM1638).

TM1638's anslutningar

Det finns 5 stycken pinnar på ena sidan av kortet, de är.

VCC – 5v
Gnd – GND
STB – Strobe pin
CLK – clock pin
DIO – data pin

Vi kommunicerar alltså med kortet med hjälp av en seriesignal. Så det går enbart åt 3 trådar och vi får tillgång till 8 knappar, 8 displayer och 8 lysdioder. Detta gör labbandet väldigt mycket enklare.

Vi kan göra en uppkoppling som t.ex. ser ut som nedan. Kan kopplas upp på flera sätt. Vad vi gör är att vi definierar våra pinnar i koden senare.



Bibliotek till arduino eller kompatibelt kort

Finns ett käckt bibliotek som gör livet lätt här.

1. Hämta hem biblioteket på denna adress. Klicka på knappen clone or download och välj download (ladda ner) som ZIP.
2. Nu ligger den hämtade ZIP-filen på din dator, där du valt att lägga den (eventuellt i ditt bibliotek med nerladdade filer). Om inte arduinos utveckligsmiljö är startad, starta den nu. Under skiss, välj inkludera bibliotek, lägg till ZIP-bibliotek. Surfa fram till filen du hämtade. På min dator är detta: C:/Användare/Dell 780/Hämtade filer och här hittar jag en fil som heter tm1638-library-master.zip

Markera den klicka på öppna, så läses modulen in.

När vi hädanefter skriver #include <TM1638.h> så hittar kompilatorn koden. Fint.

Läs av intryckta knappar

Kod för att visa buttonsvärdet på display. Vi läser av värdet när en button trycks ner och visar detta värde.

#include <TM1638.h>

#define DIO 8 
#define CLK 9
#define STB 10

TM1638 module(DIO, CLK, STB);

byte buttons;

void setup() 
{

}

void loop() 
{
  buttons=module.getButtons();
  module.setDisplayToDecNumber(buttons,0,false);
}





Skriva ut text

Om vi vill trycka ut en text så går det bra också.

#include <TM1638.h>

#define DIO 8 
#define CLK 9
#define STB 10

TM1638 module(DIO, CLK, STB);

void setup() 
{
  module.setDisplayToString("el.st");
}

void loop()
{

}




Skriva ut siffror

Räknar upp till en stor siffra.

#include <TM1638.h>

#define DIO 8 
#define CLK 9
#define STB 10

TM1638 module(DIO, CLK, STB);

void setup() 
{
  for (long int i=1; i<99999999; i++)
  {
    module.setDisplayToDecNumber(i,0,false);
  }
}

void loop()
{

}




Tända lysdioer

För att tända lysdioderna gör vi såhär.

#include <TM1638.h>

#define DIO 8 
#define CLK 9
#define STB 10

TM1638 module(DIO, CLK, STB);

void setup() 
{

}

void loop()
{
  module.setLEDs(1);
  delay(1000);
  module.setLEDs(2);
  delay(1000);
  module.setLEDs(4);
  delay(1000);
  module.setLEDs(4+2);
  delay(1000);
}



En klocka med TM1638

Om man vill göra en klocka så kan det göras såhär. Med 2 knappar ställer vi in timmar och minuter.


Räkna upp klockan

Vi sätter ett interrupt som anropar ISR 12019.2 gånger per sekund. Detta gör vi genom att sätta OCR1A = 77 med en prescaler på 1024. Detta ger oss; Frekvensen = Klockfrekvens / (prescaler x (OCR1A+1)) Frekvensen = 16000000 / (1024 x (OCR1A+1)) Frekvensen = 16000000 / (1024 x (77+1)) Frekvensen = 200.32 per sekund Räknaren interruptTicks räknar upp vid varje interruptanrop. 200.32 anrop per sekund ger 12019.2 anrop per minut. När denna räknare har nått 12019 så har det alltså gått ganska exakt 1 minut. Inte riktigt exakt, klockan kommer gå fel 1.4 sekunder per dygn. Men det är accepterbart i detta exempel. Den händige fixar snabbt en mer exakt klocka även utan extern realtidsmodul.

#include <TM1638.h>

#define DIO 8 
#define CLK 9
#define STB 10

TM1638 module(DIO, CLK, STB);
unsigned int interruptTicks = 0;
unsigned int minutes = 58;
unsigned int hours = 15;
byte buttons=0, lastbutton=0;

void updateDisplay()
{
  char num[10] = {'0','1','2','3','4','5','6','7','8','9'};
  char* txt = (char *)"tid";
  char* tid = (char *)"0000";

  tid[0] = num[round(hours/10)];
  tid[1] = num[hours-(round(hours/10)*10)];
  tid[2] = num[round(minutes/10)];
  tid[3] = num[minutes-(round(minutes/10)*10)];

  module.setDisplayToString(txt, 0);
  module.setDisplayToString(tid, 0, 4); 
}

void setup() 
{
  // Frekvensen = Klockfrekvens / (prescaler x (OCR1A+1))
  // Frekvensen = 16000000 / (1024 x (OCR1A+1))
  // Frekvensen = 16000000 / (1024 x (77+1))
  // Frekvensen = 200.32 per sekund
  // Eller 12019.2 per minut. Om vi räknar med 12019 per
  // minut så blir felet 1.4 sekunder per dygn.
 
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A =  77;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10); // prescaler=1024
  TIMSK1 |= (1 << OCIE1A);
  sei();
}

void loop()
{
  buttons=module.getButtons();
  if(lastbutton != buttons)
  {
    switch(buttons)
    {
      case 128:
      {
        minutes++;
        if(minutes>59)
          minutes = 0;
      }
      break;
      case 64:
      {
        hours++;
        if(hours>23)
          hours = 0;
      }
      break;    
    }
    
  }
  lastbutton = buttons;
  updateDisplay();  
}

ISR(TIMER1_COMPA_vect)
{
  interruptTicks++;
  if(interruptTicks>12018)
  {
    interruptTicks = 0;
    minutes ++;    
  }
  if(minutes>59)
  {
    minutes = 0;
    hours++;
  }
  if(hours>23)
  {
    hours=0;
  }
}  



De olika funktionerna som finns att labba med i tm1638 -biblioteket hittar du här.