odpočet času

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, ...)
Odpovědět
Xandys
Příspěvky: 14
Registrován: 21 úno 2018, 21:17
Reputation: 0

odpočet času

Příspěvek od Xandys » 25 črc 2018, 16:11

Ahoj všem, mám prosbu. Chci si sestrojit odpočtové zařízení. Našel jsem na webu i projekt, který by mi vyhovoval. Avšak dle tohoto kódu se čas odpočítává pořád dokola. Mohl by mi někdo prosím poradit, jak smyčku zastavit a spouštět přednastavený čas tlačítkem.Moc děkuji.
Kód zde:


// DEFINES
// Macros to retrieve the fractional seconds and minute parts of a time
// supplied in ms
#define numberOfSeconds(_time_) ((_time_ / 1000) % 60)
#define numberOfMinutes(_time_) (((_time_ / 1000) / 60) % 60)

// INCLUDES
// https://github.com/avishorp/TM1637
#include <TM1637Display.h>

// CONSTANTS
const uint8_t OFF[] = {0, 0, 0, 0};
// In this library, the byte order is .GFEDCBA
const uint8_t PLAY[] = {B01110011, B00111000, B01011111, B01101110};

// GLOBALS
// Create a display object, specifying parameters (Clock pin, Data pin)
TM1637Display display(2, 3);

// 1000ms in 1sec, 60secs in 1min, 60mins in 1hr. So, 1000x60x60 = 3600000ms = 1hr
unsigned long timeLimit = 3600000;

void setup(){
Serial.begin(9600);
// Set brightness
display.setBrightness(0x0c);
// Clear the display
display.setSegments(OFF);
}

void countdown() {

// Calculate the time remaining
unsigned long timeRemaining = timeLimit - millis();

while(timeRemaining > 0) {
// To display the countdown in mm:ss format, separate the parts
int seconds = numberOfSeconds(timeRemaining);
int minutes = numberOfMinutes(timeRemaining);

// This displays the seconds in the last two places
display.showNumberDecEx(seconds, 0, true, 2, 2);
// Display the minutes in the first two places, with colon
display.showNumberDecEx(minutes, 0x80>>3, true, 2, 0);

// Update the time remaining
timeRemaining = timeLimit - millis();
}
}
void displayText() {
display.setSegments(PLAY);
delay(2000);
}
void loop(){
//displayText();
countdown();


}

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: odpočet času

Příspěvek od rejze69 » 25 črc 2018, 16:22

Dole v hlavni smyčce se volá funkce countdown() atak před to volání dáš podmínku examp.
if(stisknutoTlacitko) {
countdown();
}
Pak se bude odpocet spoustet jen kdyz stisknes tlacitko.
V reálu je to malinko složitější, neb musíš ošetřit zákmit tlačítka. Navíc je to teď napsané tak, že dokud čas nedoběhne, tak to nebude dělat nic co není součástí cyklu while v tom countdown().

Xandys
Příspěvky: 14
Registrován: 21 úno 2018, 21:17
Reputation: 0

Re: odpočet času

Příspěvek od Xandys » 25 črc 2018, 17:22

Díky za odpověď . S arduinem začínám a tak trochu i tápu. Kód jsem upravil takto:

V hlavičce
#define numberOfSeconds(_time_) ((_time_ / 1000) % 60)
#define numberOfMinutes(_time_) (((_time_ / 1000) / 60) % 60)
const int tlac = 4;
int stisknutoTlacitko = 0;

a ve void loop takto:

stisknutoTlacitko = digitalRead(tlac);

if (stisknutoTlacitko == HIGH)
{
countdown();

}

A čas se spouští automaticky jako před tím.

Co mám blbě?

díky

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: odpočet času

Příspěvek od rejze69 » 25 črc 2018, 18:07

To stisknutoTlacitko byl jen priklad a vubec na to nepotrebujes promennou da se kontrolovat rovnou digitalRead() nastav si vybraný digitální pin jako pullup input (to aby byl jasně daný stav, protože jinak je potřeba použít externí rezistor. Tlacitko proto budes pripojovat proti gnd) můžeš ho nadefinovat pod nazvem Tlaciko a podívej se na google jak se pracuje s tlacitky a taky heslo "debounce" . Asi bych ti mohl něco písnout, ale na mobilu bez brýlí to nedám.
Pak v loop bude
If (!digitalRead(Tlacitko) { //ten vykricni je invertor protoze pullup ti nastavi vstup na HIGH
Countdown() ;
}

Xandys
Příspěvky: 14
Registrován: 21 úno 2018, 21:17
Reputation: 0

Re: odpočet času

Příspěvek od Xandys » 26 črc 2018, 13:20

Děkuji za pomoc rejze69, tlačítko už displej zapíná, akorát že zapíná jen displej(svit) ale čas už běží v procesoru od zapnutí desky. :roll:


void loop(){
//displayText();

if (!digitalRead(buttonPin)){

countdown();

}}

debounce jsem zatím neřešil

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: odpočet času

Příspěvek od rejze69 » 26 črc 2018, 16:41

Aha ten countdown odečítá millis() a ty bëží samozřejmě od spuštění desky, takže budeš potřebovat ještě jednu proměnnou kupř. unsigned long timeStart a na zacatek countdown() dáš timeStart = millis(); pak budeš odečítat místo mills() tu proměnnou timeStart. A nezapomeň si dole přepsat to time remaining update kde musíš odečíst timeStart od millis() tedy bude to končit -millis() -timeStart.
Snad jsem to s tim odecitanim nepopletl. Princip je dobre, ale s matikou jsem na stiru. :lol:

Odpovědět

Kdo je online

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