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.
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);
}
}
}
Zdravím mám problém... jsem začátečník a potřebuji poradit...
-
- Příspěvky: 2
- Registrován: 27 bře 2020, 19:22
- Reputation: 0
Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...
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.
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.
Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...
Jeste hezci je logicky operator !, ktery neguje logickou hodnotu a lepe vyjadruje zamer te konstrukce.
BTW:
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."); };
Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...
Řekl bych, že to bude tímhle :
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čí
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."); };
Int ve skutečnosti zabírá dva bajty a ne jeden, ale pro ilustraci to stačí
Re: Zdravím mám problém... jsem začátečník a potřebuji poradit...
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
(
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
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
)
(
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
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).The bitwise operators work bit by bit on the operands. The operands must be of integral type (one of the types used for integers).
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
)
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů