Stránka 1 z 1

Zobrazení dvoumístných čísel

Napsal: 03 úno 2022, 22:32
od pitovo
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.

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

Napsal: 03 úno 2022, 23:33
od KamilV

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);

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

Napsal: 04 úno 2022, 05:08
od Diego
Já to řešim podmínkou jak píšeš ;)

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

Napsal: 04 úno 2022, 18:30
od AstroMiK
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)
  {
  }

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

Napsal: 04 úno 2022, 22:57
od kiRRow
Uvádím 3 příklady (kompilované pro Arduino NANO):
Krásná práce ;)

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

Napsal: 05 úno 2022, 08:12
od pavel1tu
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.

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

Napsal: 04 dub 2023, 07:36
od Toast
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).

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

Napsal: 04 dub 2023, 20:51
od peterple
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)
  {
  }