Zobrazení dvoumístných čísel

Odpovědět
pitovo
Příspěvky: 4
Registrován: 26 kvě 2019, 16:52
Reputation: 0

Zobrazení dvoumístných čísel

Příspěvek od pitovo » 03 úno 2022, 22:32

Zdravím. Jsem v programování arduina nováček, tak se omlouvám, jestli už se to zde řešilo (pročetl jsem předchozí příspěvky a nenašel). Chtěl bych, aby při vypisování data a času z rtc DS3231 se používali dvoumístná čísla (např: 01.07.2022 04:09:05). Zkoušel jsem již pár knihoven (DS3231-1.1.0, Arduino-DS3231-master) a ani v příkladech těch knihoven to nefungovalo. Předpokládám, že by se to dalo vyřešit podmínkou (pokud je jednomístné, přidej nulu), ale myslel jsem si, že by to bylo jednodušší, kdyby se přidal třeba parametr, nebo jednořádková definice formátu data/času. Děkuji za odpovědi.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Zobrazení dvoumístných čísel

Příspěvek od KamilV » 03 úno 2022, 23:33

Kód: Vybrat vše

DateTime now = RTC.now();
char buf[50];
sprintf(buf, "%2d.%2d.%4d %2d:%2d:%2d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
Serial.println(buf);

Uživatelský avatar
Diego
Příspěvky: 166
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: Zobrazení dvoumístných čísel

Příspěvek od Diego » 04 úno 2022, 05:08

Já to řešim podmínkou jak píšeš ;)
https://arze.cz - ARduino Zapojení Elektronika

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Zobrazení dvoumístných čísel

Příspěvek od AstroMiK » 04 úno 2022, 18:30

Já sprintf v Arduinu taky nepoužívám, bere si totiž strašně moc paměti.

Uvádím 3 příklady (kompilované pro Arduino NANO):

1. příklad je výpis datumu a času bez formátování
- ProgMEM: 1806 bytů
- RAM: 188

2. přiklad má doplněné nuly pomocí podmínek if
- ProgMEM: 1836 bytů
- RAM: 188

3. příklad je doplnění nul pomocí sprintf
- ProgMEM: 3060 bytů
- RAM: 218


Kód: Vybrat vše

//================================
//Projekt zabírá 1806 bytů (5%)  úložného místa pro program. Maximum je 30720 bytů.
//Globální proměnné zabírají 188 bytů (9%)  dynamické paměti, 1860 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.


void setup(void)
  {
    Serial.begin(9600);
    byte den = 5;
    byte mes = 3;
    int  rok = 2020;
    byte hod = 8;
    byte minu = 6;
    byte sek = 4;

    Serial.print(den);
    Serial.print('.');
    Serial.print(mes);
    Serial.print('.');
    Serial.print(rok);
    Serial.print(' ');
    
    Serial.print(hod);
    Serial.print(':');
    Serial.print(minu);
    Serial.print(':');
    Serial.println(sek);
    
  }

void loop(void)
  {    
  }

Kód: Vybrat vše

//================================
//Projekt zabírá 1836 bytů (5%)  úložného místa pro program. Maximum je 30720 bytů.
//Globální proměnné zabírají 188 bytů (9%)  dynamické paměti, 1860 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.


void setup(void)
  {
    Serial.begin(9600);
    byte den = 5;
    byte mes = 3;
    int  rok = 2020;
    byte hod = 8;
    byte minu = 6;
    byte sek = 4;

    if(den < 10) Serial.print('0');
    Serial.print(den);
    Serial.print('.');
    if(mes < 10) Serial.print('0');
    Serial.print(mes);
    Serial.print('.');
    Serial.print(rok);
    Serial.print(' ');
    
    if(hod < 10) Serial.print('0');
    Serial.print(hod);
    Serial.print(':');
    if(minu < 10) Serial.print('0');
    Serial.print(minu);
    Serial.print(':');
    if(sek < 10) Serial.print('0');
    Serial.println(sek);
    
  }

void loop(void)
  {
  }


Kód: Vybrat vše

//================================
//Projekt zabírá 3060 bytů (9%)  úložného místa pro program. Maximum je 30720 bytů.
//Globální proměnné zabírají 218 bytů (10%)  dynamické paměti, 1830 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.

void setup(void)
  {
    Serial.begin(9600);
    char buf[20];
    
    byte den = 5;
    byte mes = 3;
    int  rok = 2020;
    byte hod = 8;
    byte minu = 6;
    byte sek = 4;

    sprintf(buf, "%02d.%02d.%04d %02d:%02d:%02d", den, mes, rok, hod, minu, sek);
    Serial.println(buf);
  }

void loop(void)
  {
  }

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zobrazení dvoumístných čísel

Příspěvek od kiRRow » 04 úno 2022, 22:57

Uvádím 3 příklady (kompilované pro Arduino NANO):
Krásná práce ;)

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

Re: Zobrazení dvoumístných čísel

Příspěvek od pavel1tu » 05 úno 2022, 08:12

U mne vítězí SPRINTF
Při použití na větší projekt v dnešní době nepředpokládám používání Arduin s ATMega,
ale novějších modelů, kde se s pamětí rozhodně šetřit nemusí.

Ale je tu i druhá možnost s podmínkou.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Toast
Příspěvky: 9
Registrován: 18 pro 2018, 22:34
Reputation: 0

Re: Zobrazení dvoumístných čísel

Příspěvek od Toast » 04 dub 2023, 07:36

Mě funguje tohle (načtení přesného času z DS3231, zobrazení na LCD):
DateTime now = rtc.now();
char casBuffer[] = "hh:mm"; //vymezím si přesnou velikost bufferu
lcd.setCursor(15, 0);
lcd.print(now.toString(casBuffer)); //na LCD posílám to, co se vešlo do bufferu
výsledek např. 15:04.
Myslím, že jednodušeji to nejde a veliost paměti u mého projektu nemusím moc řešit (Arduino Mega).

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Zobrazení dvoumístných čísel

Příspěvek od peterple » 04 dub 2023, 20:51

Aby mal začiatočník nad čím rozmýšlať. Nepotrebujem na výpis nič okrem vlastnej funkcie print2digit

Kód: Vybrat vše

// Projekt zaberá 1732 bytov (5%) pamäte pre program. Maximum je 32256 bytov.
// Globálne premenné zaberajú 188 bytov (9%)  dynamickej pamäti, 1860 bytov zostáva pre lokálne premenné. Maximum je 2048 bytov.

void print2digit (char **p, uint8_t val){
  char *t = *p; 
  *t = (val/10)|'0';
  t++;
  *t = (val%10)|'0';
  t++;
}

void setup(void)
  {
    Serial.begin(9600);
    char buf[20]; 
    
    byte den = 5;
    byte mes = 3;
    int  rok = 2020;
    byte hod = 8;
    byte minu = 6;
    byte sek = 4;

    char *p = buf;
    print2digit(&p,den);
    *p++='.';
    print2digit(&p,mes);
    *p++='.';
    print2digit(&p,rok/100);
    print2digit(&p,rok%100);
    *p++=' ';
    print2digit(&p,hod);
    *p++=':';
    print2digit(&p,minu);
    *p++=':';
    print2digit(&p,sek);
    *p=0;
   
    
    Serial.println(buf);
  }

void loop(void)
  {
  }

Odpovědět

Kdo je online

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