Pomoc s Arduinom

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Pomoc s Arduinom

Príspevok od používateľa tomo27 » 12 Mar 2014, 20:37

Zdravím Vás,
neviem či som to dal do dobrej témy, ak nie prepáčte.
Už asi týždeň sa trápim s programom do Arduina. Potrebujem jedným tlačidlom odosielať data do registrov 74HC595. Ale tak aby sa pri prvom stisknuti odoslali jedny data a pri druhom stisku druhé, a potom odznova.
Proste ked stlačim tlačidlo prvy krat pošle do registrov napr: B00000001, B00000011, B00000111 a podruhe B00011111, B00111111, B01111111
Prelúskal som množstvo stránok ale nejak sa neviem k tomu dopracovať.
Tu je kód ktorý doteraz mam.

int TLAC1 = 3;
int TLAC2 = 4;
int TLAC3 = 5;
int TLAC4 = 6;
int TLAC5 = 7;
int TLAC6 = 8;
int TLAC7 = 9;
int TLAC8 = 10;
int latchPin = 2;
int clockPin = 1;
int dataPin = 0;



void setup()
{

pinMode(TLAC1, INPUT);
pinMode(TLAC2, INPUT);
pinMode(TLAC3, INPUT);
pinMode(TLAC4, INPUT);
pinMode(TLAC5, INPUT);
pinMode(TLAC6, INPUT);
pinMode(TLAC7, INPUT);
pinMode(TLAC8, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);


//na zaciatku reset registrov
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 3
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 2
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 1
digitalWrite(latchPin, HIGH);

}
void loop()
{
if (digitalRead(TLAC1))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000111);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00000011);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00000001);//1
digitalWrite(latchPin, HIGH);

while (digitalRead(TLAC1)) delay(50);
}
{
if (digitalRead(TLAC2))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00001110);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00000110);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00001000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC2)) delay(50);
{
if (digitalRead(TLAC3))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC3)) delay(50);
}
if (digitalRead(TLAC4))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00011000);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00011000);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00011000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC4)) delay(50);
}
if (digitalRead(TLAC5))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00110000);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00110000);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00110000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC5)) delay(50);

if (digitalRead(TLAC6))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B01100000);//3
shiftOut(dataPin, clockPin, MSBFIRST, B01100000);//2
shiftOut(dataPin, clockPin, MSBFIRST, B01100000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC6)) delay(50);

if (digitalRead(TLAC7))
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B11000000);//3
shiftOut(dataPin, clockPin, MSBFIRST, B11000000);//2
shiftOut(dataPin, clockPin, MSBFIRST, B11000000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC7)) delay(50);

if (digitalRead(TLAC8))//TLACIDLO NA VYPNUTIE VSETKEHO.
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//3
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//2
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//1
digitalWrite(latchPin, HIGH);
}
while (digitalRead(TLAC8)) delay(50);
}



Vedel by mi niekto poradiť ako na to?
Ďakujem veľmi pekne
0
Naposledy upravil/-a tomo27 v 13 Mar 2014, 20:07, upravené celkom 1 krát.

Pega
Stály člen
Stály člen
Príspevky: 192
Dátum registrácie: 28 Mar 2012, 08:52

Re: Pomoc s Arduinom

Príspevok od používateľa Pega » 13 Mar 2014, 05:39

Potrebujem jedným tlačidlom odosielať data do registrov 74HC595. Ale tak aby sa pri prvom stisknuti odoslali jedny data a pri druhom stisku druhé, a potom odznova.
Udělej si k tlačítku počitadlo stisků.

Kód: Vybrať všetko

byte T1_counter = 0; // počitadlo stisknutí TLAC1

if (digitalRead(TLAC1)) 
{
   digitalWrite(latchPin, LOW);
   if(T1_counter == 0) shiftOut(data1);
   if(T1_counter == 1) shiftOut(data2);
   digitalWrite(latchPin, HIGH);

   T1_counter++;
   if(T1_counter >= 2)  T1_counter == 0;
}
0

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 13 Mar 2014, 12:56

ďakujem za pomoc.
Ale nejak to nefunguje.
Dosadil som to takto:

Kód: Vybrať všetko

 if (digitalRead(TLAC1)); 
{
   digitalWrite(latchPin, LOW);
   if(T1_counter == 0) 
      shiftOut(dataPin, clockPin, MSBFIRST, B00000011);//register 3
      shiftOut(dataPin, clockPin, MSBFIRST, B00000011);//register 2
      shiftOut(dataPin, clockPin, MSBFIRST, B00000011);//register 1
    digitalWrite(latchPin, HIGH);   
      
   if(T1_counter == 1)
   digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//register 3
      shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//register 2
      shiftOut(dataPin, clockPin, MSBFIRST, B00001100);//register 1
   digitalWrite(latchPin, HIGH);

   T1_counter++;
   if(T1_counter >= 2)  T1_counter == 0;
}

Na začiatku sa hneď pošlú tie prve data, a tie druhe preblikujú. Na stlačenie nereaguje.
Kde robim chybu v kode?


EDIT:
Skúsil som ešte jednu vec. Vytvoril som dve polia: DATA1 a DATA2
Teraz to funguje tak na polovicu. Keď prvý krát stlačím tak pošle DATA1. Ale na druhe už nereaguje.
tu je kód:

Kód: Vybrať všetko

void loop()
{
byte T1_counter = 0; // počitadlo stisknutí TLAC1

if (digitalRead(TLAC1)) 
{
   digitalWrite(latchPin, LOW);
   if(T1_counter == 0) shiftOut(dataPin, clockPin, MSBFIRST, DATA1[0,1,2]);
   if(T1_counter == 1) shiftOut(dataPin, clockPin, MSBFIRST, DATA2[0,1,2]);
   digitalWrite(latchPin, HIGH);

   T1_counter++;
   if(T1_counter >= 2)  T1_counter == 0;
}

a ešte jednu vec som si všimol. V tom poli DATA1 je:
{B00000001, B00000011, B00000111};
ale pošle sa do všetkých troch registrov hodnota B00000111
prečo?
0

Pega
Stály člen
Stály člen
Príspevky: 192
Dátum registrácie: 28 Mar 2012, 08:52

Re: Pomoc s Arduinom

Príspevok od používateľa Pega » 13 Mar 2014, 15:55

1.
Deklaruj "byte T1_counter = 0;" jako globální (dej to za řádek "int dataPin = 0;").

2.

Kód: Vybrať všetko

if(T1_counter == 0) shiftOut(dataPin, clockPin, MSBFIRST, DATA1[0,1,2]);
Tos našel na kterém smetišti?
Správně je

Kód: Vybrať všetko

 for (int j = 0; j < 3; j++) 
    {
       shiftOut(dataPin, clockPin, MSBFIRST, DATA1[j]);
    }


3.
Podle kódu máš tlačítka zapojené proti plusu.
Máš na nich pull-down odpory proti zemi?
0

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 13 Mar 2014, 18:41

1.
Mam to deklarovane ako si napísal.
2.
tak som myslel že je to správne. Vyberal som s pola čo potrebujem.
3.
Ano rezistory tam mam 10K k zemi.

Dam ti sem ešte raz čo mam.
teraz to funguje tak, že síce reaguje na stláčanie, ale po každom pošle náhodne hodnoty do všetkých troch registrov.

Kód: Vybrať všetko

int TLAC1 = 3;  
int TLAC2 = 4;
int TLAC3 = 5;
int TLAC4 = 6;
int TLAC5 = 7;
int TLAC6 = 8;
int TLAC7 = 9;
int TLAC8 = 10;
int latchPin = 2;
int clockPin = 1;
int dataPin = 0;
byte T1_counter = 0;
byte DATA1[] = 
{B00000001, B00000011, B00000111};
byte DATA2[] = 
{B10000000, B10000000, B10000000};



void setup()
  {
    pinMode(TLAC1, INPUT);    
    pinMode(TLAC2, INPUT);
    pinMode(TLAC3, INPUT);
    pinMode(TLAC4, INPUT);
    pinMode(TLAC5, INPUT);
    pinMode(TLAC6, INPUT);
    pinMode(TLAC7, INPUT);
    pinMode(TLAC8, INPUT);
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
        
 //na zaciatku reset registrov   
           digitalWrite(latchPin, LOW);
             shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 3
             shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 2
             shiftOut(dataPin, clockPin, MSBFIRST, B00000000);//register 1
           digitalWrite(latchPin, HIGH); 
  }
void loop()
{
 for (int j = 0; j < 3; j++) 

if (digitalRead(TLAC1)) 
  {
   digitalWrite(latchPin, LOW);
   if(T1_counter == 0) 
   shiftOut(dataPin, clockPin, MSBFIRST, DATA1[j]);
   if(T1_counter == 1) 
   shiftOut(dataPin, clockPin, MSBFIRST, DATA2[j]);
   digitalWrite(latchPin, HIGH);

delay(500);

   if(T1_counter >= 2)  T1_counter == 0;
   
  }
 
  }

Ďakujem za trpezlivosť
0

Pega
Stály člen
Stály člen
Príspevky: 192
Dátum registrácie: 28 Mar 2012, 08:52

Re: Pomoc s Arduinom

Príspevok od používateľa Pega » 13 Mar 2014, 22:56

Kód: Vybrať všetko

void loop()
{
   if (digitalRead(TLAC1)) 
   {
      digitalWrite(latchPin, LOW);

      if(T1_counter == 0)
      { 
         for (int j = 0; j < 3; j++) 
         {
           shiftOut(dataPin, clockPin, MSBFIRST, DATA1[j]);
         }
      }

      if(T1_counter == 1)
      { 
         for (int j = 0; j < 3; j++) 
         {
           shiftOut(dataPin, clockPin, MSBFIRST, DATA2[j]);
         }
      }

      digitalWrite(latchPin, HIGH);

      T1_counter++;
      if(T1_counter >= 2)  T1_counter == 0;

      delay(500);
   }
}
0

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 14 Mar 2014, 10:03

tak skúsil, som to. Funguje mi to, len: Prve stlačenie - DATA1 - OK, Druhe stlačenie - DATA2 - OK. Ale tretie stlačenie by malo odoslať znova DATA1, štvrte - DATA2, piate DATA1, šieste DATA2 ........

Teraz reaguje na prve, druhe, ale na dalšie už nie.
0

Pega
Stály člen
Stály člen
Príspevky: 192
Dátum registrácie: 28 Mar 2012, 08:52

Re: Pomoc s Arduinom

Príspevok od používateľa Pega » 14 Mar 2014, 12:16

Kód: Vybrať všetko

if(T1_counter >= 2)  T1_counter == 0;
má být

Kód: Vybrať všetko

if(T1_counter >= 2)  T1_counter = 0;
0

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 14 Mar 2014, 14:03

Takto to už ide ako ma. Diky.

Ale teraz by som to potreboval aplikovať na viacero tlačitiek.
Na začiatok som dal dve.
Pridal som:

byte T2_counter = 0;

byte DATA3[]
byte DATA4[]

premennu "j" som v premenoval na "b"


cely ten kod som skopíroval a poprepisoval na druhe tlačítko.

Prve tlačítko ide ako predtým, v poriadku. Ale druhe nereaguje
Nechápem tomu.
0

Používateľov profilový obrázok
rudko
Power user
Power user
Príspevky: 2340
Dátum registrácie: 28 Dec 2012, 08:33
Vek: 37

Re: Pomoc s Arduinom

Príspevok od používateľa rudko » 14 Mar 2014, 14:36

podla mna zbytocne zlozite riesenie cez countre. po kazdom stlaceni tlacidla spravit x = x*(-1) a potom vyhodnocovat podmienku x>0
za x dosadit premennu pre kazde tlacitko (typ int staci)
0
Drink coffee. Do stupid things faster with more energy...

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 14 Mar 2014, 18:06

Diky za koment.
už by som to radšej doriešil s tym "counter" to je už funkčne. už len to doriešiť na viac tlačitok.
0

Používateľov profilový obrázok
tomo27
Stály člen
Stály člen
Príspevky: 122
Dátum registrácie: 02 Júl 2013, 14:53
Bydlisko: Bratislava

Re: Pomoc s Arduinom

Príspevok od používateľa tomo27 » 14 Mar 2014, 20:36

už mi to šľape aj s viacerými tlačitkami.
Ďakujem za pomoc
Pega
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok