Převod výstupu na čas

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Printy
Příspěvky: 10
Registrován: 07 lis 2021, 15:39
Reputation: 0

Převod výstupu na čas

Příspěvek od Printy » 07 lis 2021, 15:43

Dobrý den, prosím o pomoc. Mám měření doby stisku tlačítka, které se zobrazuje na displeji. Potřeboval bych to ale zobrazovat jako min:sek.
Začínám programovat a nějak se s tím nemohu vypořádat. Všem děkuji za pomoc.

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
//nastavíme adresu a typ displeje
LiquidCrystal_I2C lcd(0x27,16,2);
int tlacitko_pin = 7; //pin tlačítka
bool stav_tlacitka;
int cas = 0;

void setup() {
  pinMode(tlacitko_pin, INPUT);
  Serial.begin(9600);
  lcd.init();     // initializace lcd
  lcd.backlight();
 
}


void loop() {
  stav_tlacitka = digitalRead(tlacitko_pin); //čtení stavu tlačítka
  cas = -1; //vynulování po vypnutí
  while (stav_tlacitka == HIGH) {
    stav_tlacitka = digitalRead(tlacitko_pin);
    cas++;
   Serial.println(cas); 
    lcd.setCursor ( 0, 0 );
  lcd.print("cas behu: ");
   lcd.setCursor ( 9, 0 );
   lcd.print("   ");      //Musíme smazat předchozí hodnotu, páč, když ubylo jedno číslo, tak to poslední zůstalo za aktuálním a nepřepíše se.
    lcd.setCursor ( 9, 0 );   //Vrátí kurzor za nápis "cas spusteni".
  lcd.print(cas);
    delay(1000);
  }
}
Edit: přidal jsme značky CODE. Gilhad

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

Re: Převod výstupu na čas

Příspěvek od AstroMiK » 07 lis 2021, 15:58

Nehledě na to, že měřit čas pomocí delay(1000) je blbost, tak převod celých sekund na minuty a sekundy se dělá třeba takhle:

(v proměnné 'cas' předpokládám celkový počet sekund)

Kód: Vybrat vše

  int minuty = cas / 60;
  int sekundy = cas % 60;

Lepší by v tomto případě bylo použití millis().
K tvému delay(1000) se totiž každou sekundu přidá ještě nezanedbatelný čas pro testování tlačítka, výpis do sériové linky a vykreslování na displeji.

Printy
Příspěvky: 10
Registrován: 07 lis 2021, 15:39
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od Printy » 07 lis 2021, 16:04

Zkusím to, moc děkuji za radu.

Printy
Příspěvky: 10
Registrován: 07 lis 2021, 15:39
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od Printy » 07 lis 2021, 18:23

Asi jsem JELITO a nemám tu co dělat. Ale nechci se vzdávat. Zadal jsem to takto, ale nejspíš něco přehlížím. Vrací mi to samé "0"

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
//nastavíme adresu a typ displeje
LiquidCrystal_I2C lcd(0x27,16,2);
int tlacitko_pin = 7; //pin tlačítka
bool stav_tlacitka;
int cas = 0;
int sekundy = cas  % 60;
int minuty = cas / 60;

void setup() {
  pinMode(tlacitko_pin, INPUT);
  Serial.begin(9600);
  lcd.init();     // initializace lcd
  lcd.backlight();
 
}


void loop() {
  

  stav_tlacitka = digitalRead(tlacitko_pin); //čtení stavu tlačítka
  cas = -1; //vynulování po vypnutí
  while (stav_tlacitka == HIGH) {
    stav_tlacitka = digitalRead(tlacitko_pin);
    cas++;
  
   Serial.println(minuty); 
   Serial.println(":"); 
   Serial.println(sekundy); 
    lcd.setCursor ( 0, 0 );
     //lcd.print("cas behu: ");
   //lcd.setCursor ( 9, 0 );
   lcd.print("   ");      //Musíme smazat předchozí hodnotu, páč, když ubylo jedno číslo, tak to poslední zůstalo za aktuálním a nepřepíše se.
    lcd.setCursor ( 0, 0 );   //Vrátí kurzor za nápis "cas spusteni".
  lcd.print(minuty);
  lcd.print(":");
  lcd.print(sekundy);
 
 
 
   delay(1000);
  }
}
Edit: přidal jsme značky CODE. Gilhad

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

Re: Převod výstupu na čas

Příspěvek od AstroMiK » 07 lis 2021, 19:08

Kód na tomhle fóru zadávej pomocí značky "</>". Lépe se to potom čte.

Přepočet sekund na sekundy a minuty je třeba dělat po každé aktualizaci času (každou sekundu). Tys to tam měl jen na začátku programu.

Přidal jsem tam ještě řádku:

Kód: Vybrat vše

if (sekundy < 10) lcd.print('0');
která zajistí tisk úvodních nul v sekundách (když je jich míň než 10).

A mezi minuty a sekundy jsem doplnil dvojtečku.

Vyzkoušej to. Já tu nemám displej.


Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//nastavíme adresu a typ displeje
LiquidCrystal_I2C lcd(0x27,16,2);
int tlacitko_pin = 7; //pin tlačítka
bool stav_tlacitka;
int cas = 0;


void setup() {
pinMode(tlacitko_pin, INPUT);
Serial.begin(9600);
lcd.init(); // initializace lcd
lcd.backlight();

}


void loop() {


stav_tlacitka = digitalRead(tlacitko_pin); //čtení stavu tlačítka
cas = -1; //vynulování po vypnutí
while (stav_tlacitka == HIGH) {
stav_tlacitka = digitalRead(tlacitko_pin);
cas++;

int sekundy = cas % 60;
int minuty = cas / 60;

Serial.print(minuty);
Serial.print(":");
Serial.println(sekundy);
lcd.setCursor ( 0, 0 );
//lcd.print("cas behu: ");
//lcd.setCursor ( 9, 0 );
lcd.print(" "); //Musíme smazat předchozí hodnotu, páč, když ubylo jedno číslo, tak to poslední zůstalo za aktuálním a nepřepíše se.
lcd.setCursor ( 0, 0 ); //Vrátí kurzor za nápis "cas spusteni".

lcd.print(minuty);
lcd.print(":");
if (sekundy < 10) lcd.print('0');
lcd.print(sekundy);

delay(1000);
}
}


Printy
Příspěvky: 10
Registrován: 07 lis 2021, 15:39
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od Printy » 07 lis 2021, 19:15

Moc Vám děkuji, funguje to. Toto přesně potřebuji pro další výuku.
Ještě jednou moc díky, jste borec...

Printy
Příspěvky: 10
Registrován: 07 lis 2021, 15:39
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od Printy » 09 lis 2021, 13:10

Tak jsem nějak z Vaší pomocí zvládl alespoň základ prvního projektu. Za což ještě jednou moc děkuji.
Cílem je zobrazovat na LCD dobu běhu čerpadla, spotřebu, výtlak a celkový čas běhu.
Jen ještě řeším jak při výpadku napájení uložit a po restartu znovu nahrát data. Šlo by to přes modul s SD kartou?
Díky za každou pomoc

Kód: Vybrat vše

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//nastavíme adresu a typ displeje
LiquidCrystal_I2C lcd(0x27,20,4);
int tlacitko_pin = 7; //pin tlačítka
bool stav_tlacitka;
int cas = 0;
int cascelkem = 0;


void setup() {
pinMode(tlacitko_pin, INPUT);
Serial.begin(9600);
lcd.init(); // initializace lcd
lcd.backlight();

}


void loop() {


stav_tlacitka = digitalRead(tlacitko_pin); //čtení stavu tlačítka
cas = -1; //vynulování po vypnutí
while (stav_tlacitka == HIGH) {
stav_tlacitka = digitalRead(tlacitko_pin);
cas++;
cascelkem++;

int sekundy = cas % 60;
int minutyc = cascelkem / 60;
int sekundyc = cascelkem % 60;
int hodinyc = (cascelkem  / 60 / 60) % 24;
int minuty = cas / 60;
int spt = minutyc * 0.0183333333333333;
int litry = minutyc * 0.045;


Serial.print(minuty);
Serial.print(":");
Serial.println(sekundy);
lcd.setCursor ( 0, 0 );
lcd.print("CAS BEHU:");
//lcd.setCursor ( 9, 0 );
lcd.print(" "); //Musíme smazat předchozí hodnotu, páč, když ubylo jedno číslo, tak to poslední zůstalo za aktuálním a nepřepíše se.
lcd.setCursor ( 9, 0 ); //Vrátí kurzor za nápis "cas spusteni".

lcd.print(minuty);
lcd.print(":");
if (sekundy < 10) lcd.print('0');
lcd.print(sekundy);
lcd.setCursor ( 0, 1);
lcd.print("SPOTREBA:");
lcd.print(spt);
lcd.print(" KWh");
lcd.setCursor ( 0, 2);
lcd.print("PRECERPANO:");
lcd.print(litry);
lcd.print(" m3");
lcd.setCursor ( 0, 3);
lcd.print("CELKOVY CAS:");
lcd.print(hodinyc);
lcd.print(":");
if (minutyc < 10) lcd.print('0');
lcd.print(minutyc);
lcd.print(":");
if (sekundyc < 10) lcd.print('0');
lcd.print(sekundyc);


//delay(1000);
}
}

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od ondraN » 09 lis 2021, 13:39

Data můžeš ukládat třeba každou minutu do interní EEPROM arduina a po zapnutí si je zase načíst. V nejhorším případě přijdeš o minutu Ale v zhledem k tomu, že má každá buňka paměti omezený počet cyklů zápisu, je třeba zvolit vhodné rozprostření dat v EEPROM.
Třeba jedna buňka má životnost 100 000 zápisů (údaj výrobce, ale může být prakticky i milión). To je dosaženo při minutovém intervalu za cca 2 měsíce. Nejjednodušší je mít třeba v první buňce paměti ukazatel na použitou oblast pro zápis. Každý zápis ověřit zpětným čtením. Jakmile nesouhlasí to co bylo přečteno s tím co bylo uloženo, zapsat to do nové oblasti a refrešnout ukazatel na novou oblast. Až se dojde na poslední možnou oblast, signalizovat blížící se průšvih :mrgreen:
Externí SD nedoporučuji, protože při takovém režimu zápisu brzy odejde.Udělal jsem zkušenost z datalogeru, kde bylo za čtvrt roku po kartě (Kingston). V diskuzích se objevují podobné zkušenosti.
Další možnost je EERAM, ale na tu zatím nejsou knihovny, takže by sis musel komunikaci napsat.

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

Re: Převod výstupu na čas

Příspěvek od kiRRow » 09 lis 2021, 14:08

Běžně se tohle řeší, že mám stroj, na něm si nastavím parametry, ty uložím příkazem do EEPROM a pak ten stroj mohu odpojit od napájení, přenést jinam a nastavení mi v něm zůstane. (analogicky třeba router - nastavím v kanclu a u zákazníka to jen zapojím)

Pak se řeší, jestli je třeba, aby stroj byl schopen pracovat i po výpadku napájení po určitou dobu. To zajišťuje zálohovaný zdroj. (třeba alarm - zde je třeba, aby pracoval i když zloději vypnou proud)

Poslední požadavek co jsem zažil bylo, aby stroj při výpadku napájení "regulerně ukončil svou činnost". Tj. byl napájen po dostatečně dlouhou dobu, aby si mohl uložit co právě dělá a pak se k tomu mohl po obnově napájení vrátit. Zde potřebuješ dostatečně dimenzovaný záložní zdroj se zpětnou vazbou. Dá se to řešit pomocí superkondenzátorů, přes které se napájí procesor a zároveň sleduješ napětí před nimi. Zaznamenáš-li výpadek, uložíš požadované data a poznamenáš si že došlo k výpadku. (takhle to dělají lepší UPSky k PC - Dochází li jim baterie, tak ti uspí počítač (příkazem přes usb/rs232) - ten v podstatě vysype celou RAM do souboru na disku a po zapnutí ho zase načte)

--- takhle pracují i ony EERAM, v podstatě RAMka s ROMkou v jednom pouzdře napájená přes záložní kondenzátor

Myslím, že ty potřebuješ ten třetí způsob chování při výpadku napájení

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Převod výstupu na čas

Příspěvek od ondraN » 09 lis 2021, 15:04

kiRRow píše:
09 lis 2021, 14:08
..............

Myslím, že ty potřebuješ ten třetí způsob chování při výpadku napájení
Tohle asi fakt není třeba jen pro zálohování motohodin. Ten způsob, co jsem popsal používají třeba přístrojovky v autech pro uchování počtu ujetých km nebo digitální watmetry v el. rozvodech. Jen je třeba si stanovit, jak velkou hodnotu mohu ztratit v případě výpadku a podle toho stanovit četnost zápisů.
Pokud se chci pojistit i proti výpadku v okamžiku zápisu, stačí použít dvojí zapis s kontrolním součtem a bere se ten, který ho má OK.

Odpovědět

Kdo je online

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