dva displeje TM1637

Odpovědět
Xandys
Příspěvky: 14
Registrován: 21 úno 2018, 21:17
Reputation: 0

dva displeje TM1637

Příspěvek od Xandys » 16 pro 2018, 13:11

Ahoj všem. prosím o radu. Mám kód na odpočet času s displejem TM1637. Doplnil jsem si spouštění druhého času a ten bych chtěl zobrazit na druhém displeji clock2. Nevím si s tím rady. poradí mi někdo? Díky
zde kód:

// button pin
const int tlacitko1 = 2;
const int tlacitko2 = 3;

#include <TM1637Display.h>

// display pins

const int data = 7;
const int clock1 = 8;
const int clock2 = 9;



/*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/
uint8_t digits[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
TM1637Display set_displej(clock1, data);
TM1637Display get_displej(clock2, data);

unsigned int frekvence = 640;
unsigned int perioda = 1000000 / frekvence;
unsigned int pulPeriody = perioda / 2;




void setup()
{


set_displej.setBrightness(7);
get_displej.setBrightness(7);
pinMode(tlacitko1, INPUT_PULLUP);
pinMode (tlacitko2, INPUT_PULLUP);



pinMode(clock1, OUTPUT);
pinMode(clock2, OUTPUT);
pinMode(data, OUTPUT);



setupInterrupt();

start();
writeValue(0x8f);
stop();

// clear display
write(0x00, 0x00, 0x00, 0x00);
}

byte tcnt2;
unsigned long time = 0;

// Credits for the interrupt setup routine:
// http://popdevelop.com/2010/04/mastering ... e-arduino/
void setupInterrupt()
{
/* First disable the timer overflow interrupt while we're configuring */
TIMSK2 &= ~(1<<TOIE2);

/* Configure timer2 in normal mode (pure counting, no PWM etc.) */
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
TCCR2B &= ~(1<<WGM22);

/* Select clock source: internal I/O clock */
ASSR &= ~(1<<AS2);

/* Disable Compare Match A interrupt enable (only want overflow) */
TIMSK2 &= ~(1<<OCIE2A);

/* Now configure the prescaler to CPU clock divided by 128 */
TCCR2B |= (1<<CS22) | (1<<CS20); // Set bits
TCCR2B &= ~(1<<CS21); // Clear bit

/* We need to calculate a proper value to load the timer counter.
* The following loads the value 131 into the Timer 2 counter register
* The math behind this is:
* (CPU frequency) / (prescaler value) = 125000 Hz = 8us.
* (desired period) / 8us = 125.
* MAX(uint8) + 1 - 125 = 131;
*/
/* Save value globally for later reload in ISR */
tcnt2 = 131;

/* Finally load end enable the timer */
TCNT2 = tcnt2;
TIMSK2 |= (1<<TOIE2);
}

/*
* Install the Interrupt Service Routine (ISR) for Timer2 overflow.
* This is normally done by writing the address of the ISR in the
* interrupt vector table but conveniently done by using ISR() */
ISR(TIMER2_OVF_vect) {
/* Reload the timer */
TCNT2 = tcnt2;

if(time > 0)
{
time--;
}
}

void loop()
{

cela();
pulka ();
displayTime();






}


//------------------------------------------------------------------
void cela()
{
const unsigned long sprintDuration = 36000000 ; // 60 minut
static uint8_t previousButtonState = LOW;

uint8_t buttonState = digitalRead(tlacitko1);
if(buttonState == LOW && previousButtonState == HIGH)
{
time = sprintDuration;
}

previousButtonState = buttonState;


}
void pulka()
{
const unsigned long sprintDuration = 1800000 ; // 30 minut
static uint8_t previousButtonState = LOW;

uint8_t buttonState = digitalRead(tlacitko2);
if(buttonState == LOW && previousButtonState == HIGH)
{
time = sprintDuration;


}
previousButtonState = buttonState;

}


void displayTime()
{
unsigned long t = (unsigned long)(time/1000);
uint8_t minutes = (byte)((t / 60) % 60);
uint8_t seconds = (byte)(t % 60);



write(digits[minutes / 10], digits[minutes % 10] | ((seconds & 0x01) << 7) , digits[seconds / 10], digits[seconds % 10]);
}

void write(uint8_t first, uint8_t second, uint8_t third, uint8_t fourth)
{
start();
writeValue(0x40);
stop();

start();
writeValue(0xc0);
writeValue(first);
writeValue(second);
writeValue(third);
writeValue(fourth);

stop();
}

void start(void)
{
digitalWrite(clock1,HIGH);//send start signal to TM1637
digitalWrite(data,HIGH);
delayMicroseconds(5);

digitalWrite(data,LOW);
digitalWrite(clock1,LOW);
delayMicroseconds(5);
}

void stop(void)
{
digitalWrite(clock1,LOW);
digitalWrite(data,LOW);
delayMicroseconds(5);

digitalWrite(clock1,HIGH);
digitalWrite(data,HIGH);
delayMicroseconds(5);

}

bool writeValue(uint8_t value)
{
for(uint8_t i = 0; i < 8; i++)
{
digitalWrite(clock1, LOW);
delayMicroseconds(5);
digitalWrite(data, (value & (1 << i)) >> i);
delayMicroseconds(5);
digitalWrite(clock1, HIGH);
delayMicroseconds(5);
}

// wait for ACK
digitalWrite(clock1,LOW);
delayMicroseconds(5);

pinMode(data,INPUT);

digitalWrite(clock1,HIGH);
delayMicroseconds(5);

bool ack = digitalRead(data) == 0;

pinMode(data,OUTPUT);

return ack;
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: dva displeje TM1637

Příspěvek od pavel1tu » 16 pro 2018, 20:34

Pro každý displej dej jak data tak clock zvlášť ....
Nemohu to ověřit, ale vychází to z logiky jak funguje knihovna a i ze zahraničních for.

Pak prostě tak jak posíláš zobrazení na jeden displej, pošleš na druhý - musí se dodržet tak jak to máš při deklaraci jejich různé názvy....

Pokud jsi rozchodil jeden displej, neměl by být problém použít i druhý.

PS: mám takovou zásadu - své proměnné i názvy deklarovaných zařízení - musí se lišit od názvů proměnných v knihovnách, a být logické, já bych napsal Display1, Display2 než ty tvoje set_ get_ ale asi to ničemu nevadí ...
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Xandys
Příspěvky: 14
Registrován: 21 úno 2018, 21:17
Reputation: 0

Re: dva displeje TM1637

Příspěvek od Xandys » 17 pro 2018, 20:17

Děkuji za odpověď. S arduinem tak nějak začínám a tento program jsem vygooglil. Abych se přiznal, tak jsem nevyčetl to , kde jsou data odeslána do displeje. Dle knihovny a přiloženého příkladu jsem pochopil, že zobrazuji na displeji pomocí display.showNumberDec().

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů