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;
}
dva displeje TM1637
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: dva displeje TM1637
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í ...
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: dva displeje TM1637
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().
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů