Stránka 1 z 2
Arduino - spinaní tlačitkem
Napsal: 16 úno 2020, 19:35
od Le_Ze
Nazdar.
Asi už senilním.
Nějak mi to hapruje.
Sepnout to jde kdykoliv a okamžitě.
Když to chci rozepnout, tak musím někd držet delši dobu.
Když rožnu obě dvě, tak někdy nejde zhasnout.
Když to zkoušim, mam u sebe notas a vidím komunikaci přes ser.port.
Už se to nedostane přes if.
Kód: Vybrat vše
bool AktualniStavPinu_D2; bool MinulyStavPinu_D2 = 0;
bool AktualniStavPinu_D3; bool MinulyStavPinu_D3 = 0;
//--------------------------------------------------------------------------------
// Pro rele 2 - tlačitko D4 - Led svetlo pokoj------------------------------------
AktualniStavPinu_D4 = digitalRead(4); // nacteni aktualniho stavu tlacitka D4
if (AktualniStavPinu_D4 == 1 && MinulyStavPinu_D4 == 0) // je-li stisknuto tlacitko D4
{
expander.toggle(2);// obrati stav pinu 2 na expanderu
Serial.println("A001_Rele2 " + String(expander.digitalRead(2))+ " vyp");
delay(50);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D4 = AktualniStavPinu_D4;
//--------------------------------------------------------------------------------
// Pro rele 3 - tlačitko D5 - Led svetlo pokoj -----------------------------------
AktualniStavPinu_D5 = digitalRead(5); // nacteni aktualniho stavu tlacitka D5
if (AktualniStavPinu_D5 == 1 && MinulyStavPinu_D5 == 0) // je-li ted stisknuto tlacitko D5
{
expander.toggle(3);// obrati stav pinu 3 na expanderu
Serial.println("A001_Rele3 " + String(expander.digitalRead(3))+ " vyp");
delay(50);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D5 = AktualniStavPinu_D5;
Kde by mohl být kopanec?
Napsal: 16 úno 2020, 19:37
od Cowley
Závorky () ti nesedí.
((Jedno porovnání) && (druhé porovnání))
Ale tam hodně záleží na překladači.
A máš D4 a D5 definované jako bool?
Nahoře je jenom D2 a D3.
Napsal: 16 úno 2020, 19:53
od Le_Ze
Tak to bool jako boolean arduino ID sežere, to je ok.
Ale po doplnění závorek je to ještě horší
Kód: Vybrat vše
//--------------------------------------------------------------------------------
// Pro rele 2 - tlačitko D4 - Led svetlo pokoj------------------------------------
AktualniStavPinu_D4 = digitalRead(4); // nacteni aktualniho stavu tlacitka D4
if ((AktualniStavPinu_D4 == 1) && (MinulyStavPinu_D4 == 0)) // je-li stisknuto tlacitko D4
{
expander.toggle(2);// obrati stav pinu 2 na expanderu
Serial.println("A001_Rele2 " + String(expander.digitalRead(2))+ " vyp");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D4 = AktualniStavPinu_D4;
//--------------------------------------------------------------------------------
// Pro rele 3 - tlačitko D5 - Led svetlo pokoj -----------------------------------
AktualniStavPinu_D5 = digitalRead(5); // nacteni aktualniho stavu tlacitka D5
if ((AktualniStavPinu_D5 == 1) && (MinulyStavPinu_D5 == 0)) // je-li ted stisknuto tlacitko D5
{
expander.toggle(3);// obrati stav pinu 3 na expanderu
Serial.println("A001_Rele3 " + String(expander.digitalRead(3))+ " vyp");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D5 = AktualniStavPinu_D5;
//--------------------------------------------------------------------------------
}
Napsal: 16 úno 2020, 20:35
od Cowley
A máš vstupy definované jako PULL_UP?
Pak máš v klidu na vstupu log.1 a při stisku log.0, takže je celé IF udělané opačně.
((Aktual == 0) && (minuly == 1))
Napsal: 16 úno 2020, 20:44
od Le_Ze
Je tam AktualniStavPinu_D4 == 1
Spinam to když je na pinu HIGH.
A na pin mám připojený 2,2 K odpor na GND.
Samostatně to funguje jak má.
Když však rožnu obě, je problem je zhasnout.
I když třeba chci zhasnout jen jedno, tak to nejde.
Ty vypinače jsou od arduina tak 5 metru a připojene přs UTP kabl.
Oranžový + oranžovo bilý 5V + GND
A zbylych 6 dratu na piny - vypinače.
Když jsem to měl obraceně, a spinal přes LOW, tak se stavalo, že se světlo samo rožlo.
Asi ten 10K PULL_UP odpor je malo pro ten točený UTP.
Tak jsem to předělal, a spinam přes HIGH.
Napsal: 16 úno 2020, 20:54
od Cowley
Dej sem cely program...
Napsal: 16 úno 2020, 20:58
od Le_Ze
Kód: Vybrat vše
#include <PCF8574.h>
#include <Wire.h>
PCF8574 expander;
PCF8574 expander1;
char inString[32];
int inCount;
boolean AktualniStavPinu_D2; boolean MinulyStavPinu_D2 = 0;
boolean AktualniStavPinu_D3; boolean MinulyStavPinu_D3 = 0;
boolean AktualniStavPinu_D4; boolean MinulyStavPinu_D4 = 0;
boolean AktualniStavPinu_D5; boolean MinulyStavPinu_D5 = 0;
boolean AktualniStavPinu_D6; boolean MinulyStavPinu_D6 = 0;
boolean AktualniStavPinu_D7; boolean MinulyStavPinu_D7 = 0;
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
Wire.begin();
byte error, address;
//-------------------------------------------------------------------------------------------
Wire.beginTransmission(0x20);
if (Wire.endTransmission() != 0){Serial.print("expander 0x20 nenalezen");}
//-------------------------------------------------------------------------------------------
Wire.beginTransmission(0x3F);
if (Wire.endTransmission() != 0){Serial.print("expander 0x3F nenalezen");}
//-------------------------------------------------------------------------------------------
expander.begin(0x20);
expander1.begin(0x3F);
pinMode(2, INPUT); // rele 0
pinMode(3, INPUT); // rele 1
pinMode(4, INPUT); // rele 2
pinMode(5, INPUT); // rele 3
pinMode(6, INPUT); // rele 4
pinMode(7, INPUT); // rele 5
pinMode(8, INPUT); // rele 6
pinMode(9, INPUT); // rele 7
// nastavi všechny koliky u expanderu PCF8574 - 0x20 jako vystup
for (byte i = 0; i < 8; i++) expander.pinMode(i, OUTPUT);
// nastavi všechny koliky u expanderu1 PCF8574 - 0x3F led blikač, jako vystup
for (byte i = 0; i < 8; i++) expander1.pinMode(i, OUTPUT);
// Nastaví vysoký stav "HIGH" na všech kolících expanderu PCF8574 - 0x20.
expander.set();
// Nastaví vysoký stav "HIGH" na všech kolících expanderu PCF8574 - 0x3F.
expander1.set(); // Nastaví vysoký stav "HIGH" na všech kolících.
Serial.println("stavrelay " + String(expander.read(), BIN));
}
void loop()
{
inCount = 0;
while (Serial.available() > 0)
{
inString[inCount] = Serial.read();
delay(10);
if (inString[inCount] == '\0') break;
inCount++;
}
inString[inCount] = '\0';
if (inCount > 0) {
String MyString = inString;
MyString.trim();
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele0") // rele 0
{
expander.toggle(0); //negace - obrati stav pinu
Serial.println("A001_Rele0 " + String(expander.digitalRead(0))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele1") // rele 1
{
expander.toggle(1); //negace - obrati stav pinu
Serial.println("A001_Rele1 " + String(expander.digitalRead(1))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele2") // rele 2
{
expander.toggle(2); //negace - obrati stav pinu
Serial.println("A001_Rele2 " + String(expander.digitalRead(2))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele3") // rele 3
{
expander.toggle(3);
Serial.println("A001_Rele3 " + String(expander.digitalRead(3))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele4") // // rele 4
{
expander.toggle(4);
Serial.println("A001_Rele4 " + String(expander.digitalRead(4))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele5") // // rele 5
{
expander.toggle(5);
Serial.println("A001_Rele5 " + String(expander.digitalRead(5))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele6") // rele 6
{
expander.toggle(6);
Serial.println("A001_Rele6 " + String(expander.digitalRead(6))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_rele7") // rele 7
{
expander.toggle(7);
Serial.println("A001_Rele7 " + String(expander.digitalRead(7))+ " net");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
//-------------------------------------------------------------------------------------------
if (MyString == "A001_info") // info vÜechnř rele
{
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
}
//--------------------------------------------------------------------------------
// Pro rele 2 - tlačitko D4 - Led svetlo pokoj------------------------------------
AktualniStavPinu_D4 = digitalRead(4); // nacteni aktualniho stavu tlacitka D4
if ((AktualniStavPinu_D4 == 1) && (MinulyStavPinu_D4 == 0)) // je-li stisknuto tlacitko D4
{
expander.toggle(2);// obrati stav pinu 2 na expanderu
Serial.println("A001_Rele2 " + String(expander.digitalRead(2))+ " vyp");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D4 = AktualniStavPinu_D4;
//--------------------------------------------------------------------------------
// Pro rele 3 - tlačitko D5 - Led svetlo pokoj -----------------------------------
AktualniStavPinu_D5 = digitalRead(5); // nacteni aktualniho stavu tlacitka D5
if ((AktualniStavPinu_D5 == 1) && (MinulyStavPinu_D5 == 0)) // je-li ted stisknuto tlacitko D5
{
expander.toggle(3);// obrati stav pinu 3 na expanderu
Serial.println("A001_Rele3 " + String(expander.digitalRead(3))+ " vyp");
delay(100);
Serial.println("A001_stavrelay " + String(expander.read(), BIN));
}
MinulyStavPinu_D5 = AktualniStavPinu_D5;
//--------------------------------------------------------------------------------
if (expander.digitalRead(0) == 0) (expander1.blink(0, 1, 1000));
if (expander.digitalRead(1) == 0) (expander1.blink(1, 1, 1000));
if (expander.digitalRead(2) == 0) (expander1.blink(2, 1, 1000));
if (expander.digitalRead(3) == 0) (expander1.blink(3, 1, 1000));
if (expander.digitalRead(4) == 0) (expander1.blink(4, 1, 1000));
if (expander.digitalRead(5) == 0) (expander1.blink(5, 1, 1000));
//--------------------------------------------------------------------------------
}
Spravně tam ma byt 6 vypinaču.
Jelikož to hapruje, tak jsem to smaz a zatím řešim jen ty 2.
Napsal: 16 úno 2020, 21:12
od Cowley
Zkus to nakrátko přímo u desky.
Pouštět do vstupu 5V na dálku je docela odvaha.
Já bych udělal vstupy PULL-UP a přívody oddělil optronama.
Počítám, že se bavíme o tlačítkách a ne vypínačích?
Napsal: 16 úno 2020, 21:23
od Le_Ze
Cowley píše:
Pouštět do vstupu 5V na dálku je docela odvaha.
Proč?
UTP je ve zdi v krku a nikde se nemijí s nějakýma kablama.
Ještě mně tak napada.
Ty odpory mám u vypinače.Těch 5 metru od arduina.Nevadí to?
Není lepší je dat přimo na piny?
Napsal: 16 úno 2020, 21:26
od Cowley
Rozhodně, takhle je to slušný, "lapač" rušení
![Smile :)](./images/smilies/icon_smile.gif)
Napsal: 16 úno 2020, 21:36
od Le_Ze
A nejlepši řešení?
První jsem to zkoušel spinat přes LOW a zaplý PULL_UP.
Tak 2 až 5 x za den se to samo rožlo.
Pak jsem ještě přidal ten 2,2 k odpor k vypinačo na GND.To same.
Když jsem to předělal a spinam přes HIGH, tak se to nerožina ale blbne.
Napsal: 16 úno 2020, 21:44
od Cowley
Optrony a PULL-UP
Něco ke čtení
Zkus si napsat jednoduchej prográmek a nech si vypisovat co se děje na vstupu při tak dlouhých přívodech.
Napsal: 16 úno 2020, 21:58
od Le_Ze
Mam třeba v technicke mistnosti mega a z každeho pokoje připojene čidlo HC-SR501.
Vzdalenost tak 5 - 8 metru přes stejný UTP a 5 roku bez poruchy a bez problemu.
Do kuchyně natahle zase UTP 8 metru. co mi spina rele co spina led pod kuch.linkou při pohybu.
Ještě se mi za těch 5 roku nestalo, že by se samo bezduvodně rožlo.
Nebo že bý nějake čidlo hlasilo bezduvodně poplach a to jich je 7.
Napsal: 17 úno 2020, 05:18
od Cowley
A taky bych nepřepínal výstup hned, jakmile se zjistí změna na vstupu, ale až po několika stejných odebraných "vzorcích" za sebou.
Zabráníš tím jak rušení, tak zákmitům z tlačítek.
Napsal: 17 úno 2020, 09:03
od fero_b
ako pise Cowley, toto ti bude reagovat na kazdu "ihlu". nie je dobre v hlavnej slucke (maximalou rychlostou CPU) pozerat na zmenu vstupu a hned ako nastane spravit akciu. Toto nie je dobry sposob snimania tlacidiel. Podla mojich skusenosti, by si to mal stav drotikov snimat v preruseni (casovanom na povedzme 50ms) a ked nastane zmena, zdvihnut zastavku, a hlavna slucka vybavi poziadavku (tlacidlo bolo stlacene) a zhodi zastavku.
Taky kod samozrejme neosetri nejaky HW problem.