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
Nyomógombok
Re: Nyomógombok
Ü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
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;
}
Re: Nyomógombok
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.
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