Arduino - spinaní tlačitkem

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

Arduino - spinaní tlačitkem

#1 Příspěvek 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?

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#2 Příspěvek 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.

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#3 Příspěvek 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;
//--------------------------------------------------------------------------------
}

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#4 Příspěvek 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))

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#5 Příspěvek 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.
Naposledy upravil(a) Le_Ze dne 16 úno 2020, 20:56, celkem upraveno 2 x.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#6 Příspěvek od Cowley »

Dej sem cely program...

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#7 Příspěvek 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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#8 Příspěvek 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?

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#9 Příspěvek 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?

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#10 Příspěvek od Cowley »

Rozhodně, takhle je to slušný, "lapač" rušení :)

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#11 Příspěvek 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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#12 Příspěvek 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.

Uživatelský avatar
Le_Ze
Příspěvky: 631
Registrován: 24 črc 2014, 02:00
Bydliště: Ano, mam

#13 Příspěvek 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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#14 Příspěvek 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.

Uživatelský avatar
fero_b
Příspěvky: 582
Registrován: 17 kvě 2004, 02:00
Bydliště: Kosice

#15 Příspěvek 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.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“