Vypsaní textu pouze jednou při stisknutém tlačítku

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od petan » 27 črc 2018, 20:22

Přečti si ty komentáře v tom kódu. Je tam místo na hlídání náběžné i sestupné hrany u dvou vstupů. Stačí tam cokoliv přidat.
Nepoužíváš pinMode(xx, INPUT_PULLUP); ??

bobynos
Příspěvky: 10
Registrován: 09 bře 2018, 22:25
Reputation: 0

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od bobynos » 27 črc 2018, 20:34

petan píše:
27 črc 2018, 20:22
Přečti si ty komentáře v tom kódu. Je tam místo na hlídání náběžné i sestupné hrany u dvou vstupů. Stačí tam cokoliv přidat.
Nepoužíváš pinMode(xx, INPUT_PULLUP); ??
Nemám používám INPUT a tlačítko mám připojený přes rezistor na desce.

Zkoumám ten kód a zatím se mi nedaří.

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

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od rejze69 » 27 črc 2018, 21:20

If (!digitalRead(tlcRed) && !digitalRead(ledStart)) {
Serial.println("RED");
digitalWrite(ledStart, HIGH);
}
if (digitalRead(tlcRed)) {
digitalWrite(ledStart, LOW);
}

Takhle jsem to myslel.
Jen si to zkontroluj jestli to odpovídá. A nejsem si jist co to bude dělat bez debounce.

bobynos
Příspěvky: 10
Registrován: 09 bře 2018, 22:25
Reputation: 0

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od bobynos » 27 črc 2018, 21:40

rejze69 píše:
27 črc 2018, 21:20
If (!digitalRead(tlcRed) && !digitalRead(ledStart)) {
Serial.println("RED");
digitalWrite(ledStart, HIGH);
}
if (digitalRead(tlcRed)) {
digitalWrite(ledStart, LOW);
}

Takhle jsem to myslel.
Jen si to zkontroluj jestli to odpovídá. A nejsem si jist co to bude dělat bez debounce.
Toto se mezi sebou pere. V podstatě se ledka ani nerozsvítí jen tak lehounce. A text vypisuje pomaleji, ale pořád dokola.

Už mám vyřešeno pomocí odkazu co tu petan poslal. Vypadá, že to bude fungovat uvidíme až to dodělám. Ty ledky tam ve výsledku nebudou mám je jenom tak pro znázornění.

Diky mooc

bobynos
Příspěvky: 10
Registrován: 09 bře 2018, 22:25
Reputation: 0

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od bobynos » 27 črc 2018, 21:41

Vyřešeno po stisknutí tlačítka vypíše jeden řádek a rozsvítí ledku po puštění tlačítka už nic nevypíše a ledka zhasne.
Díky za rady.

Kód: Vybrat vše

#include <HardwareSerial.h>

const int tlcRed = 2;
const int tlcGreen = 3;
const int ledErr = 4;
const int ledStart = 5;
bool lasttlcRed;
bool lasttlcGreen;
bool nowtlcRed;
bool nowtlcGreen;

void setup()
{
	pinMode(tlcRed, INPUT);
	pinMode(tlcGreen, INPUT);
	pinMode(ledStart, OUTPUT);
	pinMode(ledErr, OUTPUT);
	Serial.begin(9600);
	Serial.println("Komunikace spustena");
}

void loop()
{
	nowtlcRed = digitalRead(tlcRed);
	nowtlcGreen = digitalRead(tlcGreen);

	if (nowtlcRed != lasttlcRed) {
		if (nowtlcRed == LOW) {
			digitalWrite(ledStart, HIGH);
			Serial.println("RED");
			delay(10);
		}
		else { digitalWrite(ledStart, LOW); }
	}

	if (nowtlcGreen != lasttlcGreen) {
		if (nowtlcGreen == LOW) {
			digitalWrite(ledErr, HIGH);
			Serial.println("GREEN");
			delay(10);
		}
		else{digitalWrite(ledErr, LOW); }
	}

	lasttlcRed = nowtlcRed;
	lasttlcGreen = nowtlcGreen;
}

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

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od rejze69 » 27 črc 2018, 22:04

@ bobynos
Ještě o tom přemýšlím proč se to pere. Můžeš mi sem prosím dát celý kód jak to tam bylo vložené?
Taky se učím a z vlastních chyb je to nejlepší.

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

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od rejze69 » 28 črc 2018, 08:27

Nenašel jsem proč by to nefungovalo, tak to rozeberu po kroku.
Průběh 1. Tlačítko uvolněno, klidový stav
První if neplatí - není stisknuto tlc.
Druhý if platí, ale led stejně nesvítí, takže bezezměny

Průběh 2. Stiskli jsme tlačítko a držíme ho
První if platí - stisknuto tlačítko a zároveň nesvítí led
Pošlem serial
Rozsvítíme led
Druhý if neplatí - stále držíme tlačítko
Led tedy nezhasínáme

Průběh 3. Stále držíme tlačítko, led svítí
První if neplatí - je sice stisknuto tlačítko, ake zároveň svítí led
Nic se tedy neposílá serial ani nemění stav led
Druhý if neplatí - stále držíme tlačítko
Led tedy nezhasne

Průběh 4. Uvilnili jsme tlačítko
První if neplatí - je uvolněné tlačítko a navíc stále svítí led
Nis se tedy neposílá.
Druhý if platí - je uvolněni tlačítko
Zhasneme tedy led

A jsme u průběhu 1. Klidový stav

Vážně mi nedochází proč by to nemělo fungovat.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od petan » 28 črc 2018, 09:43

@rejze69 Průběh 1: Tlačítko i LEDka jsou v log. 0. Ty v podmínce neguješ, takže (1 && 1) je pravda, tudíž se první podmínka splní. Vypíše text "RED" a rozsvítí se LEDka. Druhá podmínka není splněna. ... Pokud tedy není použit pull-up rezistor.

Číst stav digitálního výstupu není úplně běžný. Spíš si doporučuji udělat nějakou proměnnou, tu zapisovat na výstup a v podmínkách ji testovat.


Zajímalo by mě, jak má ty tlačítka připojený? Podle kódu má připojený pull-up...nebo něco, kdo ví co.
Můžeš sem hodit nějaký schéma, nebo fotku?

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

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od rejze69 » 28 črc 2018, 10:43

Podle původního zápisu má pullup na tlačítku definovanej. Tohle mi nedošlo že to funguje přesně jako logický součin,ale myslel jsem, že musí být prostě splněny podmínky. No a to je právě ta chyba, kterými se člověk učí. Jinak použít čtení digitálního výstupu už mám ve svém posledním projektu vyzkoušený a funguje mi to bez zaváhání.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Vypsaní textu pouze jednou při stisknutém tlačítku

Příspěvek od petan » 28 črc 2018, 12:23

rejze69 píše:
28 črc 2018, 10:43
Podle původního zápisu má pullup na tlačítku definovanej. Tohle mi nedošlo že to funguje přesně jako logický součin,ale myslel jsem, že musí být prostě splněny podmínky. No a to je právě ta chyba, kterými se člověk učí. Jinak použít čtení digitálního výstupu už mám ve svém posledním projektu vyzkoušený a funguje mi to bez zaváhání.
Já tam nikde Pull-up nevidím. Ale dle všeho tam je (asi extrerně). Proto bych chtěl vidět schéma, nebo fotku zapojení.

Ona to není chyba, ale je to nestandardní a může to vyvolat nečekané stavy. Při načítání v průběhu programu se může změnit stav vstupu. Pokud s tím člověk počítá, tak to může být i výhoda, ale pokud máš pod sebou dvě podmínky a obě vyhodnocují vstup/výstup (který přímo načítají), tak může být první podmínka provedena a druhá třeba ne. Nemusí být na dva stejné příkazy v programu spoleh.

Třeba PLC fungují tak, že nejdřív načtou všechny vstupy a ty si uloží do paměti. Pak se provede celý program - vypočítají se požadované výstupy a ty se uloží do proměnných. Na konci programu se proměnné vypíší na výstupy.

Pak mě ještě napadá výkon takovýho programu. Pokud v programu použiju několikrát zápis/čtení na port může být program pomalejší. Neměřil jsem, ale asi bude rozdíl mezi if(digitalRead(x)) a if(variable)...hlavně při vícenásobném čtení/zápisu.

Kód: Vybrat vše

void loop(){
 if (digitalRead(10){
 	//první podmínka
 	//tento kód se provede - a zabírá nějaký čas
 }
 
 //během provádění první podmínky IN10 = 0
 
 if (digitalRead(10){
 	//druhá podmínka
 	//toto se neprovede
 }
 
 /////////////
 //na rozdíl od
 /////////////
 
 void loop(){
 byte vstup10 = digitalRead(10);
 if (vstup10){
 	//první podmínka
 	//tento kód se provede - a zabírá nějaký čas
 }
 
 //během provádění první podmínky IN10 = 0
 
 if (vstup10){
 	//druhá podmínka
 	//toto se taky provede
 }
}

Odpovědět

Kdo je online

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