Strana 1 z 1

Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 08:41
od používateľa martinhudak
Ahoj.
Som Arduino úplný začiatočník ale skúšam si napísať jednoduchý program.

Po pripojení napätia Arduino čaká na stlačenie tlačitka.
Po stlačení tlačítka zopne rele na 1 munútu
Potom čaká 30 sekún a tak dookola. Je to ako cyklovač, kým opäť nestlačím tlačítko.
Jedným stačením program spustím, druhým stlačením program ukončím.

Napísal som si program. Funguje to ale neviem ako urobiť to ukončenie stlačením tlačitka. Môžete mi prosím pomôcť doplniť môj program?

Ďakujem veľmi pekne

const int button_enter = 8;
byte sw_enter = 0;
void setup() {
//zaciatok progamu ktory prebehne iba raz (inicializacia)
//nastavenie pinu 8 ako tlacitko vstup
pinMode(button_enter, INPUT_PULLUP);
//nastavenie pinu 2 ako vystup
pinMode(2, OUTPUT);

//nastavenie +5V na vystupe
digitalWrite(2, HIGH);
}

void loop() {
if ((digitalRead (button_enter) == 0) || (sw_enter == 1)) //stlacenie tlacitka, na pin 8 GND
{
sw_enter = 1;

//program Arduina

//zaciatok programu ktory bezi dookola kym nestlacim opat tlacitko
// delay(cas); znamena ze program nerobi nic a caka urceny cas v ms
digitalWrite(2, LOW); //pin 2 prepne na 0V (GND)
delay(60000); //cas zapnutia pinu 2 na 1minutu (60000ms)
digitalWrite(2, HIGH); //pin 2 prepne na +5V

delay(30000); //caká 30sekund (30000ms)

// caka na stlacenie tlacitka

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 09:24
od používateľa StefanST
Rozdel si program v Loop() na dve časti:
1. testuj stlačenie tlačítka. Ak je tlačidlo stlačené, nastav príznak sw_enter na opačný (0->1 resp. 1->0)
Tým zabezpečíš, že jedným tlačidlom budeš zapínať, resp vypínať cyklovač.
2. testuj nastavenie sw_enter: Ak je =1, len vtedy prebehne 1 cyklus cyklovača.
A takto to pôjde stále dokola ...

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 09:30
od používateľa martinhudak
Ďakujem.
Dúfam, že som to správne pochopil. Skúsim to prepísať alebo dufam že to nebude drzé ale môžeš mi prepísať ten môj program a ja urobím CTRL-C a CTRL-V :yawinkle: :yawinkle: :yawinkle: :yawinkle:

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 09:37
od používateľa dan21
Jedna poznamka. Snaz sa nepouzivat delay(). Blokujes si ostatne casti programu, aj ked v tomto pripade je to OK. Ale ak ho budes rozsirovat, mozu nastat problemy.

Pozri si funckiu millis() trebars tu
https://arduinoposlovensky.sk/programov ... ay-millis/

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 09:44
od používateľa martinhudak
Ďakujem za upozornenie. Finalny čas cyklovača sa bude pohybovať okolo 15 minút zapnuté relé a 10 sekúnd vypnuté. Preto som použil delay(). Prepáčte že som to nepovedal hneď. Krátke časy som použil na testovanie.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 10:14
od používateľa maskrtnik01
O to väčší dôvod vyhýbať sa delay. Ak by ste neskôr chceli, aby program počas čakania reagoval na tlačidlo, máte problém.

Správny postup je podľa millis sledovať, kedy ubehne určený čas (a medzitým sa môže robiť čo len chcete).

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 12:14
od používateľa miso156
Ak pouzijes delay() tak nemas ako ten cyklovac pocas behu (tych 15-tich minut) vypnut. Jedine ak by si obsluhoval tlacitko cez interrupt.
Dokonca aj po uplynuti delay-u je problem ten cyklovac vypnut. Musel by si ho nastavit iba na jeden 15min cyklus a manualne ho zakazdym spustat.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 12:38
od používateľa Atlan
Ono ide urobit aj kratky delay, a inkrementovat premenu..... Ale to u potom radsej fakt ten milis.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 12:39
od používateľa martinhudak
Ak by som veľmi pekne poprosil, môžete mi niekto prepísať ten program, aby fungoval správne tak ako som písal hore? Nájde sa niekto? Ja naozaj nerozumiem tomu. Aby som ho skopíroval a nahral iba? Vidím, že ste odborníci na toto tak mi to napíšte niekto.
Ďakujem

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 13:18
od používateľa maskrtnik01

Kód: Vybrať všetko

#define BUTTON_PIN 0
#define RELAY_PIN 1
#define ON_TIME 1000
#define OFF_TIME 1000
#define STATUS_READY 0
#define STATUS_ON 1
#define STATUS_OFF 2

int status;
long nextEventTicks;
int lastButtonState;
void setup()
{
    pinMode(BUTTON_PIN,INPUT_PULLUP);
    pinMode(RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN,0);

    status = STATUS_READY;
    lastButtonState = digitalRead(BUTTON_PIN);
}

void loop()
{
    int buttonState = digitalRead(BUTTON_PIN);
    long ticks = millis();

    if(buttonState & !lastButtonState)
    {
        if(status == STATUS_READY)
        {
            status = STATUS_ON;
            digitalWrite(RELAY_PIN,1);
            nextEventTicks = ticks + ON_TIME;
        }
        else
        {
            status = STATUS_READY;
            digitalWrite(RELAY_PIN,0);
        }
    }
    lastButtonState = buttonState;
    
    if(status == STATUS_ON)
    {
        if(ticks > nextEventTicks)
        {
            status = STATUS_OFF;
            digitalWrite(RELAY_PIN,0);
            nextEventTicks = ticks + OFF_TIME;
        }
    }
    else if(status == STATUS_OFF)
    {
        if(ticks > nextEventTicks)
        {
            status = STATUS_ON;
            digitalWrite(RELAY_PIN,1);
            nextEventTicks = ticks + ON_TIME;
        }
    }
}
Nie je tam debouncing tlačidla. Ďalej nie je ošetrené pretečenie millis(), to nastáva po cca 49 dňoch prevádzky.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 13:23
od používateľa miso156
Spravil som to cez jeden switch (stavovu masinu) aby to bolo pokope. Chyba tam vyriesenie zakmitov na tlacitku -celkovo jednoznacny spolahlivy stisk v tom digitalRead() if-e. Nemam arduino ani to vyvojove prostredie, pisal som to v .txt takze nerucim.

Edit: Prisiel som na to ze existuje online compiler, bola tam chybka v dvojitej deklaracii premennnej currentMillis, tak som to opravil.

Kód: Vybrať všetko

unsigned char status = 0;
unsigned long previousMillis = 0; 
unsigned long currentMillis;
unsigned long duration = 0;    
const int button_enter = 8;



void setup() {

	//zaciatok progamu ktory prebehne iba raz (inicializacia)
	//nastavenie pinu 8 ako tlacitko vstup
	pinMode(button_enter, INPUT_PULLUP);
	//nastavenie pinu 2 ako vystup
	pinMode(2, OUTPUT);

	//nastavenie +5V na vystupe
	digitalWrite(2, HIGH);
}



void loop() {


	if(digitalRead (button_enter) == 0) { 
		delay(500);  // pre zamedzenie opatovneho volania pocas jedneho stisku tl.
		if(status == 0) {
			status = 1;
		} else {
			status = 0;
			digitalWrite(2, HIGH);        //pin 2 prepne na +5V		
		}
	
	}


	switch(status) { 

		 ////////////Cyklovac vypnuty/////////	
		case 0:  			
			break;

		////////////Nastav casovac na 60000, uloz akt. cas, Nastav Pin2 Low/////////	
		case 1:  
			duration = 60000;	
			previousMillis = millis();

 
			digitalWrite(2, LOW);        //pin 2 prepne na 0V (GND)
			status = 2;		
			break;

		////////////Kontroluj casovac, po uplynuti  60sec nastav Pin2 High /////////	
		case 2:	

  			currentMillis = millis();

  
			if (currentMillis - previousMillis >= duration) {
    
    
				digitalWrite(2, HIGH);        //pin 2 prepne na +5V
				status = 3;
			}
			
			break;

		////////////Nastav casovac na 30000, uloz akt. cas/////////	
		case 3:

			duration = 30000;	
			previousMillis = millis();

 
			status = 4;		
			break;

		////////////Kontroluj casovac, po uplynuti 30sec skoc na case 1 /////////	
		case 4:
			currentMillis = millis();

  
			if (currentMillis - previousMillis >= duration) {
   
				status = 1; 
    
			}

			break;

		default:
			break;
	}	


}

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 13:25
od používateľa martinhudak
Ďakujem veľmi pekne.
Debouncing tlačidla riešim podľa obrázka:
arduino tlačítko schéma.png
Čo sa týka dlžky cyklovania tak bude cyklovať cca 5 x max. Niekde v štvrtom alebo piatom 15 minutovom cykle ho stopnem.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 14:24
od používateľa StefanST
martinhudak napísal:
11 Okt 2021, 08:41
Som Arduino úplný začiatočník ale skúšam si napísať jednoduchý program. ...
martinhudak napísal:
11 Okt 2021, 12:39
Ak by som veľmi pekne poprosil, môžete mi niekto prepísať ten program, aby fungoval správne tak ako som písal hore? Nájde sa niekto? Ja naozaj nerozumiem tomu. Aby som ho skopíroval a nahral iba? ...
Ctrl+C a Ctrl+V hotového programu nie je najlepší spôsob, ako sa učiť programovať.
Ak sa s tým nepopasuješ sám (aj s radami a usmerneniami), nenaučíš sa to.

Dostal si sa k upečenej rybe, no ďalšiu si chytiť nevieš.
Predložené programy možno intuitívne pochopíš, ako fungujú, ale nevieš, prečo to bolo práve takto navrhnuté.

Záver: Ak sa chceš aj niečo naučiť, toto nie je cesta. Ale možno nebolo cieľom prejsť od statusu "úplný začiatočník" k statusu "začiatočník".
A bola tu šanca - na zaujímavom probléme, ktorý ťa naviac aj zaujíma, prejsť postupnosťou úprav a pochopiť aj osvojiť si postupy vedúce k fungujúcemu a dobrému programu.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 14:42
od používateľa martinhudak
Ano pravda. Ja o programovani v Arduine neviem nic. Skúsal som niečo počítať po nete a potom vytvoriť. Trvalo mi to týžden a aj tak to nejde tak ako by som chcel. Preto som oslovil tu. Nájde sa niekto a napíše mi to správne. Ja to nahrám, dokončím hardware tak ako potrebujem a koniec. Možno už nikdy nebudem potrebovať Arduino. Preto toto bola ľahká cesta. Myslel som že si takto možeme pomáhať. Teda urýchliť problém. Nemusím sa hneď začať učiť programovať ak potrebujem len pre jeden projekt program. Ale nechcel som nikoho uraziť alebo niečo podobné. Nejaké návrhy som tu dostal a snáď sa s toho vysomárim a bude to fungovať. Ďakujem všetkým za ochotu a prajem pekný deň

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 14:49
od používateľa StefanST
OK - cieľom bola ryba, nie udica..
To moje rečovanie by bolo aktuálne, ak by si sa chcel učiť programovať ...
Chválihodné je, že si si to skúsil a nielen žiadal, kto ti napíše hotový program.
Takto sa aj skôr dostaneš k rade a pomoci, ak by ti niečo nešlo tak, ako si si to predstavoval.
Prajem úspešné dokončenie projektu.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 11 Okt 2021, 20:29
od používateľa peterple
V prvom rade by som rád pokritizoval niekoľko predošlých postov.
1. Odstránie zákmitov kondenzátorom. Ak niekto nevie čo urobí skratovanie kondenzátora tak nech sa pozrie na video TO220 na youtube. V tomto prípade je síce kondenzátor podstatne slabší. Takže kontakt mikrospínača sa nezničí okamžite, ale až po nejakej dobe. Treba tam doplniť ešte jeden odpor aby to bolo OK.

2. maskrtnik01 prečo sem dávaš chybný kód, keď vieš že je chybný (nerieši pretečenie). To si si nemohol zobrať kód z linku čo dal dan21 kde je to naprogramované OK? Aký to má zmysel šíriť bludy začiatočníkom. Navyše zákerné jak sviňa. To žiadny začiatočník nepochopí čo je na tom zle.

3. V tomto prípade si myslím že millis je kanón na vrabca. Pre začiatočníka to musí byť absolútne nepochopitelné. Dokonca aj tie arduino príklady na tlačítka sa mi moc nepáčia.
Čo napr. toto? Je to tiež nepochopitelné?

Kód: Vybrať všetko

const int button_enter = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

//Pocka na stisnutie a uvolnenie tlacika
void waitPushRelease()
{
  while(digitalRead (button_enter) == 1);  //cakaj pokym je tlacitko pustene
  delay(50);  //ignoruj zakmity zatvorenim oci na 50ms
  while(digitalRead (button_enter) == 0);  //cakaj pokym je tlacitko stlacene
  delay(50);  //ignoruj zakmity zatvorenim oci na 50ms
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(button_enter, INPUT_PULLUP);
}

void loop() {
    waitPushRelease(); //pockaj az stisne a pusti
    digitalWrite(ledPin, HIGH); //zapni led
    waitPushRelease(); //pockaj az stisne a pusti
    digitalWrite(ledPin, LOW); //vypni led
}

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 12 Okt 2021, 07:01
od používateľa martinhudak
Prosím skúste nekritizovať, ale poradiť. Veľmi to oceníme aj my, ktorý tomu nerozumieme. A ešte jedna vec. Ak viem, čo má robiť program a niekto mi ho napíše, pozerám na ten kód a podstatne skôr pochopím čo znamená ako keď ho mám písať sám. Takže aj takto sa ľudia učia. Každý máme svoj spôsob.

peterple ak si videl že maskrtnik01 sem dal zlý kód, prečo si ten kód neopravil, nevložil sem s milým poučením a takto by sme sa to robiť správne naučili všetci vrátane maskrtnik01 a to podstatne príjemnejším spôsobom. Ja chápem že sú tu múdrejší ľudia ako ja ale ja naozaj oceňujem snahu maskrtnik01 mi pomôcť. Za to sa mu chcem poďakovať.

peterple ďakujem za kritiku tlačítka, pravdepodobne si narážal na môj obrázok ale ja som čerpal z učenia na webe https://zschlebnice.sk/kopr/arduino.php tak potom už neviem ako zistiť čo je správne. A na druhej strane si mohol chlapsky ku komentu pribaliť tvoju presnú schému aj s odporom a povedať "takto je to správne" Aby sme to mohli používať aj my obyčajný ľudia. Toto by bolo pekné.

Chcem ale veľmi pekne poďakovať miso156. Urobil presne to, čo som od tohto fóra očakával. Vložil sem svoj program upravený pre mňa. Dokonca je to pekne jednoducho popísané, takže som hneď pochopil tie povely. Upravil som si už čas a funguje to pekne. Má to nejaké mušky (citlivosť tlačítka a blikanie počas stlačenia) ale pre moje použitie je to úplne fantastické. Ďakujem ešte raz. Páči sa mi tento prístup k nám nováčikom.

Ďakujem Vám všetkým a prajem pekný deň (vyriešené :tonqe: )

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 12 Okt 2021, 08:20
od používateľa miso156
Ten debounce bol mysleny asi takto:
image.png
R1 je nizky aby si eliminoval ucinok prechodoveho odporu tlacitka.
R2 znizuje vybijaci prud kondenzatora, taktiez predlzi casovu konstantu na cca 2ms (22k x 100n) co je vhodne, kedze bezne tlacitka zakmitavaju okolo 20ms, menej kvalitne aj okolo 50ms.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 12 Okt 2021, 08:31
od používateľa maskrtnik01
Chcel by som to trošku ukľudniť. Od peterple som dostal zaslúžene. Bohužial správne ošetrenie pretečenia už nie je úplne moja doména.

Či je to v tomto konkrétnom prípade pruser závisí od toho, ako dlho bude arduino zapnuté. 47 dní(aj niečo) sa nebude diať nič, potom príde problém. Po resete zase 47 dní kľud.

Tým kódom som ale aj tak chcel poukázať na inú vec. Delay nie je až taká milá pomoc ako by sa zdalo. Keď dáte delayom čakať 15 minút, 15 minút sa nič nemôže diať. Žiadne predčasné ukončenie, dokonca ani zobrazenie ostávajúceho času na displayi.

Preto lepší prístup je ako bol demonštrovaný na obidvoch ukážkach kódu - millis. Dĺžka jedného behu loop() sa zminimalizuje, a je možné kvazi-paralelne vykonávať viac vecí.

Re: Spúštanie a vypínanie programu jedným tlačítkom

Napísané: 12 Okt 2021, 20:40
od používateľa peterple
maskrtnik01:
Aký máš s tým problém? Jediná vec je že musíš robiť rozdiel a porovnávať tú časovú differenciu. Tá sa vypočíta správne aj keď je aktuálny čas pretečený a odpamätaný je ešte pred pretečením. Treba si to predstaviť tak že sa nepohybuješ po číselnej osi po priamke ale vlastne v kruhu. To je jediná zmena. Už som tu (SvetElektro) niekoľkokrát na to upozorňoval a dával odkaz kde to vysvetľujem, ale je to marný, je to marný, je to marný.

martinhudak:
Mojim cieľom bolo poukázať na bludy ktoré sa tu šíria. Na tej stránke ZŠ a MŠ na to jaksi nemá kto a ako upozorniť. Ono riadiť sa a argumentovať podľa agentúry JPP (jedna pani povedala), nie je dvakrát moc múdre. Inak klobúk dole pred učiteľom na tej škole. Schémy pekne nakreslené v eagle, žiadne omaľovávanky arduinistov alebo paintbrush ako často tu v iných vláknach.
Tá kritika je pre teba a ďalších aby vedeli že tieto riešenia obsahujú čertovo kopýtko. Alebo si myslíš že je v poriadku že vznikla ďalšia stránka ktorá šíry hlúposti?

A že som neporadil? Si si istý? Skúšal si kód z bodu 3?
martinhudak napísal:
11 Okt 2021, 08:41
Jedným stačením program spustím, druhým stlačením program ukončím.
Nerobí to čo si požadoval? Keby si si ho prečítal a pochopil tak by si vedel že žiadne hw odstraňovanie zákmitov nepotrebuje. Tak načo by som kreslil nejaké schémy ktoré nie sú vôbec treba. Zbytočne niekam trepať externé súčiastky (až 3 aby to bolo OK).

Ešte taká malá podotázka. Viete prečo si na AVR možete dovoliť ten kondenzátor na digitálny vstup pripojiť? Vďaka čomu? Je to možné pripojiť na hocijaký MCU?