Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino - spinaní tlačitkem
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 19:35    Předmět: Arduino - spinaní tlačitkem Citovat

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:

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 19:37    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 19:53    Předmět: Citovat

Tak to bool jako boolean arduino ID sežere, to je ok.

Ale po doplnění závorek je to ještě horší Confused

kód:

//--------------------------------------------------------------------------------   
// 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;
//--------------------------------------------------------------------------------
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 20:35    Předmět: Citovat

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))
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 20:44    Předmět: Citovat

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 Le_Ze dne ne únor 16 2020, 20:56, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 20:54    Předmět: Citovat

Dej sem cely program...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 20:58    Předmět: Citovat

kód:

#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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 21:12    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 21:23    Předmět: Citovat

Cowley napsal(a):

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 21:26    Předmět: Citovat

Rozhodně, takhle je to slušný, "lapač" rušení Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 21:36    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: ne únor 16 2020, 21:44    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Le_Ze



Založen: Jul 24, 2014
Příspěvky: 655
Bydliště: Ano, mam

PříspěvekZaslal: ne únor 16 2020, 21:58    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Cowley



Založen: Feb 04, 2005
Příspěvky: 3283

PříspěvekZaslal: po únor 17 2020, 5:18    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
fero_b



Založen: May 17, 2004
Příspěvky: 582
Bydliště: Kosice

PříspěvekZaslal: po únor 17 2020, 9:03    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.18 sekund