Nyomógombok

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Avatar
wedds
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2009. augusztus 26. szerda, 6:00

Re: Nyomógombok

Hozzászólás Szerző: wedds »

Köszönöm a gyors választ, Robert.
Itt a kapcsoló egy mágneses nyitásérzékelő lenne, amely egy lassú, szakaszos mozgást kéne hogy megszámoljon, és előfordulhat, hogy az érzékelő előtt éppen megáll a mágnes, vagy lassan halad el előtte. A kapcsolások száma max. 10db/perc. Az 1sec delayt a stabilitás miatt tettem bele, majd kiderül, jó-e.
A progit átírtam, így próbálgatva működöképesnek tűnik.

const int erzekelopin = 8;
int ledpin = 13;
void setup() {
// serial communication:
Serial.begin(9600);
pinMode(erzekelopin, INPUT);
pinMode(ledpin, OUTPUT);
}
int pulses = 0;

void loop() {

digitalWrite(ledpin, LOW);
if (digitalRead(erzekelopin) == LOW) {
delay(20);
if (digitalRead(erzekelopin) == HIGH) {
delay(1);
pulses = pulses +1 ;
digitalWrite(ledpin, HIGH);
delay(1000);
}
}
// kiíratás:!
Serial.println(pulses);
}


További szép napot
venmedve
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2017. február 2. csütörtök, 18:29

Re: Nyomógombok

Hozzászólás Szerző: venmedve »

Üdv mindenkinek!

A problémám nem igazán a nyomógomb kezeléssel van, csak azért ide írom mert itt futottam bele.
Környezet:
Arduino UNO
WIN 10
Arduino 1.6.5

Probléma:
A nyomógomb kezelését függvényben végzem.
A változók definíciója:
byte s,o,g = 0;
Ebben az esetben a program nem megy.

byte s = 0;
byte o = 0;
byte g = 0;
Ebben az esetben a program működik.

Mi a fene történik? mindkét megoldás szabályos. :(

A teljes program kommentezve

Kód: Egész kijelölése

/*
 Billentyuzet matrik
 Sor es oszlop 10 k
 ellenallassal tapon
 igy cserelheto a
   1   2   3   4
   5   6   7   8
   9  10  11  12
  13  14  15  16
  Ha nincs felhuzo, hasznalhatoaz
  INPUT_PULLUP
* Egy kicsit pazarlo de gyakorlasnak jo 
* Ja es nem turi a tobb gomb egyideju nyomasat
* vagy ha van eleg port jol hasznalhato
* 2 port 1 gomg
* 3 port 2 gomb
* bekotestol fuggoen
* 
* 4 port 3 vagy 4 gomb 1*3 vagy 2*2
* 5 port 4 vagy 6 gomb 1*4 vagy 2*3
* 6 port 5, 8, 9 gomb 1*5, 2*4, 3*3
* 7 port 6, 10, 12 gomb 1*6, 2*5, 3*4
* 
* A program a cols és rows tomben megedott labakra
* epitett matrix gombsort olvassa be es kiirja a megnyomott
* gomb szamat.
* ha nem nyomtunk gombot nullat ir ki
* A tomboket atdafinnialva n*m-es nyomogomb matrixot kezelhetunk
* Jelen esetben egy 4*4-es tasztaturar olvas
*/

// a matrix oszlopokhoz tartozo labak
// tombbe szervezve
// az oszlopok 1  2  3  4
byte cols[] = {4, 5, 6, 7};
// a matrix sorokhoz tartozo labak
// tombbe szervezve
// a sorok     1  2   3   4
byte rows[] = {8, 9, 10, 11};
byte oldgomb, gomb = 0;

void setup() {
  // put your setup code here, to run once:
  // az oszlopokhoz tartozo labakat kimenetre allitjuk
  pinMode(cols[0], OUTPUT); //  1. oszlop
  pinMode(cols[1], OUTPUT); //  2. oszlop
  pinMode(cols[2], OUTPUT); //  3. oszlop
  pinMode(cols[3], OUTPUT); //  4. oszlop
  // az oszlopokhoz tartozo labakat H szintre allitjuk
  digitalWrite(cols[0], HIGH);
  digitalWrite(cols[1] , HIGH);
  digitalWrite(cols[2] , HIGH);
  digitalWrite(cols[3] , HIGH);
  // a sorokhoz tartozo labakat bementre allitjuk
  // a megnyomott gomgokrol L szintet olvasunk,
  // a nyugalomban levo gombok H szinten vannak.
  pinMode(rows[0], INPUT);  //  1. sor
  pinMode(rows[1], INPUT);  //  2. sor
  pinMode(rows[2], INPUT); //  3. sor
  pinMode(rows[3], INPUT); //  4. sor
  // csak teszt a soros porton kirjuk a megnyomott gomb sorszamat.
  Serial.begin(9600);
  Serial.println("Start...");
}


// a fuggveny beolvassa a megnyomott gombot
// a bomb sorszamaval ter vissza
byte RowsRead() {
  // lokakis valtozok oszlop, sor, gomb
  // EZ NRM MUKODIK
  // byte o,s,g = 0;
 /* ****************** */ 
  // ez mukodik
  byte o = 0;
  byte s = 0;
  byte g = 0;
  // ciklus amig el nem eri az oszlopok szamat
  // es nem talal megnyomott gombot
  while ((o < sizeof(cols)) && (g == 0)) {
    // ciklus amig el nem eri a sorok szamat
    // es nem talal megnyomott gombot
    while ((s < sizeof(rows)) && (g == 0)) {
      // Az aktualis oszlop vezeteket L -re huzza
      digitalWrite(cols[o], LOW);
      // var egy kicsit, hogy a vezeték beálljon
      // delay(1);
      // megvizsgalja, hogy az aktualis sor L szintu-e
      if (digitalRead(rows[s]) == LOW) {
        // megvarja a prellt 
        delay(2);
        if (digitalRead(rows[s]) == LOW){
        // ha igen, akkor az aktualis sor es oszlop metszespontjaban
        // egy megnyomott gomb van
        // a gomb szamanak kiszamitasa
        // mivel a C szeru nyelvekben a tombok elso eleme '0'
        // az elso sor elso (oszlop) gombjanak szama = 0+1 + 0*4 ami 1
        // a negyedik sor negyedik oszlopa pedig
        // gomb = 3+1 + 3*4 ami 16 
        g = (o + 1) + (s * 4);
          
        }
      }
      // vissza allitja az oszlop vezeteke H szintre
      digitalWrite(cols[o] , HIGH);
      // var a szint stabilizalasara
      // nem feltetlen kell ilyen hosszu ido (1 ms)
      // delay(1);
      // a kovetkezo sor
      s++;
    }
    // visszaallitja a sort nullara 
    s = 0;
    // a kovetkezo oszlop
    o++;
  }
  // visszateres a megnyomott gomb kodjaval
  return (g);
}



void loop() {
  gomb = RowsRead();
  if (gomb != 0 && oldgomb != gomb) {
    Serial.println(gomb);
  }
  oldgomb = gomb;
}

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Nyomógombok

Hozzászólás Szerző: Robert »

Kérdés, max féltre megy:
byte o,s,g = 0;
Itt csak a g=0, a többi a memóriarekeszt foglalja csak le (benne levő érték véletlenszerű)

byte o = 0;
byte s = 0;
byte g = 0;
Itt mindent lefoglalsz, és kezdőérték mindnél 0.
http://www.tavir.hu - a gazda :)
Válasz küldése