Pages: [1] 2   Go Down
Author Topic: Codeschnipsel Erklärung  (Read 1591 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo kann mir jemand diesen Codeschnipsel erklären ?
Code:
dtmf = 0;
if (digitalRead(A0) == HIGH) dtmf = dtmf + 1;
if (digitalRead(A1) == HIGH) dtmf = dtmf + 2;
if (digitalRead(A2) == HIGH) dtmf = dtmf + 4;
if (digitalRead(A3) == HIGH) dtmf = dtmf + 8;
Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn der digitale Wert am A0-Port (der ist eigentlich ein analoger Port, kann aber auch problemlos digital benutzt werden) HIGH ist (also so um die 4,75V oder höher), dann wird die Variable "dtmf" um eins hochgezählt.
Analog bei A1, A2 und A3, mit den Werten 2, 4 und 8.

Wenn also A1 und A2 HIGH sind steht nachher in "dtmf" eine 6 drin.
Logged

Stuttgart
Offline Offline
God Member
*****
Karma: 13
Posts: 511
logic enrichments
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es macht aus den 4 Anschlüssen  A3 bis A0 eine Dezimalzahl.

Code:
BIN    Dezimal
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
usw.

Edit: Wenn, wie Joghurt schon richtig bemerkt hat, die Anschlüsse digital ausgewertet werden. Ausserdem hatte ich zuerst HEX geschrieben anstatt BIN (sorry)  smiley-confuse
« Last Edit: October 02, 2012, 04:32:57 am by Realizer » Logged

Eine Kuh macht muuhh.
Viele Kuehe machen Muehe

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

thanks a lot ,jetzt ist der Groschen gefallen
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21497
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die PIN A0 bis A3 werden in eine 4 Bit Zahl umgewandelt.
Einfacher, schneller und Code schlechter lesbar geht es indem man direkt vom Port liest und die nichtgebrauchten Pins maskiert. Die analogen PINs liegen auf dem Port C
http://www.arduino.cc/en/Reference/PortManipulation

Code:
dtmf = PINC & B00001111;

grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wie bekommeichdenn hin dass er bei * den PIN 2 auf high setzt
Code:
if (dtmf == 0) dial = dial + "D";
if (dtmf == 1) dial = dial + "1";
if (dtmf == 2) dial = dial + "2";
if (dtmf == 3) dial = dial + "3";
if (dtmf == 4) dial = dial + "4";
if (dtmf == 5) dial = dial + "5";
if (dtmf == 6) dial = dial + "6";
if (dtmf == 7) dial = dial + "7";
if (dtmf == 8) dial = dial + "8";
if (dtmf == 9) dial = dial + "9";
if (dtmf == 10) dial = dial + "0";
if (dtmf == 11) dial = dial + "*";
if (dtmf == 12) dial = dial + "#";
if (dtmf == 13) dial = dial + "A";
if (dtmf == 14) dial = dial + "B";
if (dtmf == 15) dial = dial + "C";

lcd.setCursor(0,1); 
lcd.print(dial);   
Logged

Stuttgart
Offline Offline
God Member
*****
Karma: 13
Posts: 511
logic enrichments
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (dtmf == 0) dial = dial + "D";
if (dtmf == 1) dial = dial + "1";
if (dtmf == 2) dial = dial + "2";
if (dtmf == 3) dial = dial + "3";
if (dtmf == 4) dial = dial + "4";
if (dtmf == 5) dial = dial + "5";
if (dtmf == 6) dial = dial + "6";
if (dtmf == 7) dial = dial + "7";
if (dtmf == 8) dial = dial + "8";
if (dtmf == 9) dial = dial + "9";
if (dtmf == 10) dial = dial + "0";
if (dtmf == 11) {
 dial = dial + "*";
 digitalWrite(Pin2, HIGH);
}

if (dtmf == 12) dial = dial + "#";
if (dtmf == 13) dial = dial + "A";
if (dtmf == 14) dial = dial + "B";
if (dtmf == 15) dial = dial + "C";

lcd.setCursor(0,1); 
lcd.print(dial);   

Denk ich mir mal so ... smiley-wink
Logged

Eine Kuh macht muuhh.
Viele Kuehe machen Muehe

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo wie bekomme ich es denn hin dass wenn dtmf6 und  dtmf7 und dtmf8 und dtmf9 nach einander gedrückt wurden er mir ein high ausgibt ,ich habe es so versucht geht aber nícht 
  if (dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9) ;
digitalWrite (2,1)
« Last Edit: October 03, 2012, 08:28:44 am by uwefed » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21497
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das was Du kontrollierst ist daß die 4 Tasten gleichzeitig gedrückt werden. Um zu sehen ob sie hintereinander in einer gewissen Reihenfolge gedrückt wurden mußt Du die lezten x Tastendrücke zb in einem Array zwischenspeichern.
Grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Abgesehen von dem was Uwe geschrieben hat, würde Dein Code zwar das gleichzeitige Drücken der 4 Tasten erkennen, das digitalWrite(2,1) aber immer (unabhängig vom "if") ausführen.
Code:
if (dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9) ;
digitalWrite (2,1)
Grund dafür ist das unscheinbare ";" das Du hinter das "if" gesetzt hast. Damit beendest Du quasi sofort den IF-Block.
Korrekt wäre entweder
Code:

if (dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9)
    digitalWrite (2,1);
Also eine Anweisung hinter dem "if", oder
Code:
if (dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9) {
    digitalWrite (2,1);
    //und noch mehr Anweisungen die vom if abhängen
    ...
} // Ende des IF-Blocks
Die geschweiften Klammern definieren einen kompletten Code-Block, der nur ausgeführt wird, wenn die Bedingung vom "if" erfüllt ist.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 258
Posts: 21497
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

äh, hab das Kleingedruckte (gemeint ist der Strichpunkt) nicht aufmerksam gelesen. smiley-wink smiley-wink smiley-wink
Grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So genau habe ich aber auch nicht hingeschaut, sonst hätte ich beim ersten Post schon gemerkt, das die Klammern auch nicht passen :-)
Korrekterweise muß es also folgendermassen aussehen:
Code:
if ((dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9))
    digitalWrite (2,1);

//ODER

if ((dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9)) {
    digitalWrite (2,1);
    //und noch mehr Anweisungen die vom if abhängen
    ...
} // Ende des IF-Blocks
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

wie ihr seht bin absoluter neuling und versuche gerade durch code schnipsel durch zusteigen kann mir einer das mit den arrays erklären ?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Etwas in der Art:
Code:
int tasten[4];          //Array für 4 Werte
int index = 0;            //Zählindex

//irgendwelcher Code innerhalb von loop()
...

//Wert für DTMF wurde ermittelt
...
tasten[index] = dtmf;          //wert von dtmf an die aktuelle Stelle (index) in das Array schreiben
index++;                             //Wert von index um 1 erhöhen, damit wird beim nächsten speichern an die nächste stelle im array geschrieben
if(index==4) {
    index = 0;                       //wenn der index über die 4 werte hinausgehen würde, dann auf 0 zurücksetzen
}

//prüfen ob 4 tasten gedrückt wurden und schauen welche es waren
if(index==3) {  //aufpassen, index fängt bei 0 an zu zählen, damit haben wir bei einem wert von index=3 schon 4 werte erfasst
    int wert = tasten[index-3] * 1000 + tasten[index-2] * 100 + tasten[index - 1 ] * 10 + tasten[index];  // kleiner trick um aus den 4 werten eine zahl zu machen die man leichter vergleichen kann

    //prüfen, ob die tastenfolge eingegeben wurde
    if(wert == 6789) {
        // letzte ziffernfolge war 6789
        //hier den passenden code rein, den das 6789 auslösen soll
        ...
        
        index=0; //index wieder auf 0 setzen und damit von vorne anfangen
    } else {

        //alle werte im array um eins nach vorn verschieben und index wieder auf das letzte element setzen
        for(int i=0;i<3;i++) tasten[i] = tasten[i+1];
        index = 3;

        //auch das ist ein trick. damit wird aus "1234" im Array dann ein "234" und der nächste Tastendruck wird wieder hinten angefügt
        //somit hat man immer die letzten 4 tasten die gedrückt wurden, egal wie oft das passiert.
        //Es wird also auch dann die 6789 erkannt wenn z.B. 123456789 getippt wird und erst der 6. bis 9. Tastendruck die 6789 ist
    }
}
« Last Edit: October 03, 2012, 11:23:45 am by mkl0815 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ich habe nun versucht den code anzupassen allerings bricht mirmein code bei 3 eingaben schon direkt ab
Code:
void code(){
if (dtmf == 6) dial = dial + "6";
if (dtmf == 7) dial = dial + "7";
if (dtmf == 8) dial = dial + "8";
if (dtmf == 9) dial = dial + "9";
if (dtmf == 12) dial = dial + "#";
lcd.setCursor(0,1) ; // Prints on 2nd row ist column
lcd.print(dial);
tasten[index] = dtmf; //wert von dtmf an die aktuelle Stelle (index) in das Array schreiben
index++;
if(index==5) {
index = 0; }
if(index==4) {
int wert = tasten[index] + tasten[index] + tasten[index] + tasten[index]+ tasten[index]; Serial.print(wert);
//prüfen, ob die tastenfolge eingegeben wurde
if(wert == 42) {
  digitalWrite(2,1);
index=0; } else {
lcd.clear();
  lcd.print("Code falsch");
delay(3000);
resetFunc();
Logged

Pages: [1] 2   Go Up
Jump to: