Zdravím mám problém... jsem začátečník a potřebuji poradit...

Odpovědět
Lukas_Slavkov
Příspěvky: 2
Registrován: 27 bře 2020, 19:22
Reputation: 0

Zdravím mám problém... jsem začátečník a potřebuji poradit...

Příspěvek od Lukas_Slavkov » 27 bře 2020, 19:35

Zdravím, začínám s arduinem a mam desku Uno ale na ní mám Shield... Nicméně potřebuji udělat to aby se mi při stisknutí tlačítka na A1 a A2 měnily módy tak jak jsou vypsané a ne že by mi to přepnulo pouze při držení tlačítka. Předem děkuji za odpověď a přeji krásný zbytek dne. :D

char ledPinD1 = 13; // Ledka na shieldu
char ledPinD2 = 12; // Ledka na shieldu
char ledPinD3 = 11; //Ledka na shieldu
char ledPinD4 = 10; //Ledka na shieldu
char ledPinD5 = 5; //Spínač
char ledPinD6 = 6; //Spínač
const int analogInPin = A0; // potenciometr
const int buttonPin1 = A1; //tlačítko
const int buttonPin2 = A2; //tlačítko
int sensorValue = 0;
int buttonState1 = 0;
int buttonState2 = 0;

void setup()
{
pinMode(ledPinD1, OUTPUT);
pinMode(ledPinD2, OUTPUT);
pinMode(ledPinD3, OUTPUT);
pinMode(ledPinD4, OUTPUT);
pinMode(ledPinD5, OUTPUT);
pinMode(ledPinD6, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
Serial.begin(9600);
}

void loop()
{
sensorValue = analogRead(analogInPin);
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.println("");
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
if (buttonState1 == HIGH) {
if(sensorValue > 799){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD2, HIGH);
digitalWrite(ledPinD1, HIGH);
digitalWrite(ledPinD3, LOW);
}
else if(sensorValue > 599){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, HIGH);
digitalWrite(ledPinD2, LOW);
digitalWrite(ledPinD1, LOW);

}
else if(sensorValue > 399){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, HIGH);
digitalWrite(ledPinD1, HIGH);
digitalWrite(ledPinD2, LOW);
}
else if(sensorValue > 199){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, HIGH);
digitalWrite(ledPinD2, HIGH);
digitalWrite(ledPinD1, LOW);
}
switch (sensorValue) {
case 0 ... 498:
digitalWrite(ledPinD5, LOW);
digitalWrite(ledPinD6, HIGH);
break;
case 499 ... 798:
digitalWrite(ledPinD6, LOW);
digitalWrite(ledPinD5, HIGH);
break;
case 799 ... 2000:
digitalWrite(ledPinD5, LOW);
digitalWrite(ledPinD6, LOW);

}
delay(250);
}
if (buttonState2 == HIGH) {
if(sensorValue > 799){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD2, HIGH);
digitalWrite(ledPinD1, LOW);
digitalWrite(ledPinD3, HIGH);
}
else if(sensorValue > 599){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, HIGH);
digitalWrite(ledPinD2, LOW);
digitalWrite(ledPinD1, HIGH);

}
else if(sensorValue > 399){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, HIGH);
digitalWrite(ledPinD1, LOW);
digitalWrite(ledPinD2, LOW);
}
else if(sensorValue > 199){
digitalWrite(ledPinD4, HIGH);
digitalWrite(ledPinD3, LOW);
digitalWrite(ledPinD2, HIGH);
digitalWrite(ledPinD1, HIGH);
}
switch (sensorValue) {
case 0 ... 498:
digitalWrite(ledPinD5, LOW);
digitalWrite(ledPinD6, LOW);
break;
case 499 ... 798:
digitalWrite(ledPinD6, HIGH);
digitalWrite(ledPinD5, LOW);
break;
case 799 ... 2000:
digitalWrite(ledPinD5, HIGH);
digitalWrite(ledPinD6, LOW);
}
}
}

Wojta
Příspěvky: 184
Registrován: 22 črc 2017, 16:39
Reputation: 0

Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...

Příspěvek od Wojta » 28 bře 2020, 14:02

Zdarec. Nejdřív něco do začátku. Zaprvé dej příště jako předmět opravdu předmět, tedy něco jako "udržení stavu tlačítka". Pak se to hned chce lidem víc řešit. Za druhé, na kódy je tu v editoru hezká možnost code, tak ji příště taky použij, líp se to čte ;)

A k té konkrétní otázce. Koukni na proměnné a jak je používat. Pak bych si jednu takovou proměnnou pro každé tlačítko udělal, nacpal do nich nuly a když se tlačítko zmáčkne tak zneguješ (převrátíš -> pokud je 0 tak na 1, pokud 1 tak na 0) její hodnotu. Na to je hezký binární operátor ~. Ten převrátí všechny bity v proměnné ale to ti vůbec neva. A v těch podmínkách co tam teď máš budeš koukat na tuhle proměnnou místo buttonState. Kdybys chtěl študovat dál tak hledej s klíčovými slovy "arduino toggle button" nebo tak.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...

Příspěvek od gilhad » 29 bře 2020, 00:27

Jeste hezci je logicky operator !, ktery neguje logickou hodnotu a lepe vyjadruje zamer te konstrukce.

BTW:

Kód: Vybrat vše

int tlacitko=0;

if (tlacitko) { Serial.println ("Tohle se nevypise."); };
if (~tlacitko) { Serial.println ("Tohle se vypise."); };
if (tlacitko && ~tlacitko) { Serial.println ("Tohle se nevypise."); };
if (!tlacitko) { Serial.println ("Tohle se vypise."); };
if (tlacitko && !tlacitko) { Serial.println ("Tohle se nevypise."); };

tlacitko=1;

if (tlacitko) { Serial.println ("Tohle se vypise."); };
if (~tlacitko) { Serial.println ("WTF: Tohle se vypise."); };
if (tlacitko && ~tlacitko) { Serial.println ("WTF: Tohle se vypise."); };
if (!tlacitko) { Serial.println ("Tohle se nevypise."); };
if (tlacitko && !tlacitko) { Serial.println ("OK: Tohle se nevypise."); };

tlacitko=1;
tlacitko=~tlacitko; // negace?

if (tlacitko) { Serial.println ("WFT: Tohle se vypise."); };
if (~tlacitko) { Serial.println ("Tohle se vypise."); };
if (tlacitko && ~tlacitko) { Serial.println ("WTF: Tohle se vypise."); };
if (!tlacitko) { Serial.println ("Tohle se nevypise!"); };
if (tlacitko && !tlacitko) { Serial.println ("OK: Tohle se nevypise."); };

tlacitko=1;
tlacitko= ! tlacitko; // opravdu negace

if (tlacitko) { Serial.println ("Tohle se nevypise."); };
if (~tlacitko) { Serial.println ("Tohle se vypise."); };
if (tlacitko && ~tlacitko) { Serial.println ("Tohle se nevypise."); };
if (!tlacitko) { Serial.println ("Tohle se vypise."); };
if (tlacitko && !tlacitko) { Serial.println ("Tohle se nevypise."); };



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

Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...

Příspěvek od kiRRow » 29 bře 2020, 09:09

Řekl bych, že to bude tímhle :

Kód: Vybrat vše

int tlacitko=0; // tady je jádro pudla - raději : boolean tlacitko = false;

if (~tlacitko) { Serial.println ("WTF: Tohle se vypise."); };
if (tlacitko && ~tlacitko) { Serial.println ("WTF: Tohle se vypise."); };
pokud je proměnná int nastavena na 1 ... bude v ní něco jako 00000001, po bitové negaci v ní bude 11111110 ... což není false a proto se to vypíše.
Int ve skutečnosti zabírá dva bajty a ne jeden, ale pro ilustraci to stačí

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...

Příspěvek od gilhad » 29 bře 2020, 11:24

Presne tak - proto je dobre pouzivat na logicke operace logicke operatory a na bitove operace operatory bitove, pak funguje vse jak ma, at uz si na tlacitka udelas jakoukoli promennou a at uz ti funkce z knihoven vraci cokoli :D

(
Ono nekde z netu zkopirujes kus kodu a tlacitko tam daji do int a zrovna jim to funguje, protoze s tim nedelaji nic slozitejsiho.
Pak jinde najdes pekny trik, jak ta tlacitka zkombinovat, jenze tam logicky predpokladaji boolean.
A pak si vymyslis vlastni podminku a ono to obcas chodi a obcas ne a z kodu okolo vubec neni jasne proc.


Ostatne si vubec nejsem jisty, zda je definovano co presne udela bitovy operator s booleanama. Napr. podle tohoto https://en.wikibooks.org/wiki/C%2B%2B_P ... _operators
The bitwise operators work bit by bit on the operands. The operands must be of integral type (one of the types used for integers).
coz muze znamenat, ze tam dojde k automaticke konverzi typu na int, pak se porovede operace a pak se pripadne vysledek zkonvertuje na typ, ktery je pozadovan od vyrazu (pri prirazeni na typ promenne, v podminkach na int a tak podobne).
Cili pokud uz bych to chtel pouzivat, tak to nejdriv vyzkousim pro dany kompilator a jeho parametry, jak se to presne chova (a pak tomu stejne nebudu prilis verit, protoze s jinym kompilatorem/verzi/parametry to zase muze byt jinak) - http://catb.org/jargon/html/N/nasal-demons.html
)

Odpovědět

Kdo je online

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