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ří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: 593
- Registrován: 08 pro 2017, 19:05
- Reputation: 0
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
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
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: 593
- Registrován: 08 pro 2017, 19:05
- Reputation: 0
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:
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
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
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
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
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.
-
kiRRow
- Příspěvky: 1164
- Registrován: 07 kvě 2019, 07:03
- Reputation: 0
- Bydliště: Opava
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
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.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů