Codeschnipsel Erklärung

Hallo kann mir jemand diesen Codeschnipsel erklären ?

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;

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.

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

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) :~

thanks a lot ,jetzt ist der Groschen gefallen

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

dtmf = PINC & B00001111;

grüße Uwe

wie bekommeichdenn hin dass er bei * den PIN 2 auf high setzt

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);
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 ... :wink:

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)

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

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.

 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

if (dtmf == 6) && (dtmf == 7) && (dtmf == 8 ) && (dtmf == 9)
    digitalWrite (2,1);

Also eine Anweisung hinter dem "if", 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

Die geschweiften Klammern definieren einen kompletten Code-Block, der nur ausgeführt wird, wenn die Bedingung vom "if" erfüllt ist.

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

So genau habe ich aber auch nicht hingeschaut, sonst hätte ich beim ersten Post schon gemerkt, das die Klammern auch nicht passen :slight_smile:
Korrekterweise muß es also folgendermassen aussehen:

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

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

Etwas in der Art:

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
    } 
}

ich habe nun versucht den code anzupassen allerings bricht mirmein code bei 3 eingaben schon direkt ab

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();

Poste bitte mal den ganzen Sketch.
Was mich verwirrt ist der folgende Code:

int wert = tasten[index] + tasten[index] + tasten[index] + tasten[index]+ tasten[index];

Was soll das bewirken, Im Grunde machst Du an dieser Stelle ein

int wert = tasten[index]*5;

weil Du 5 Mal den gleichen Wert addierst. Dabei soll dann 42 rauskommen?
OK, 42 ist die Antwort auf alle Fragen, das wissen wir wohl alle. :slight_smile:
Aber wie kommst Du darauf?
Mario.

in deinem Post hast du folgenen code angeben

tasten[index-3] * 1000 + tasten[index-2] * 100 + tasten[index - 1 ] * 10 + tasten[index];

eklariert war der code 6789
6bekommt den index 0 7 den index1 8 den Index2 und 9den index 3

in den index wird dochder dezimalwert von DTMF gespeichert ? richtig

ich bin davon ausgegangen bei deinem beispiel dass z.B inex 3 damiteinemwertvon 9-3*1000 also 6000 speichert bei
an bei mal den Serialausdruck von DTMF und index sowie ob der WERT bestanden oder falsch ist

6
0
7
1
8
2
falsch
9
3
6
0
7
1
8
2
bestanden

Nein.

Im Array unter dem index = 0 ist der erste der letzten 4 Tasten also dtfm Wert gespeichert. (tasten[0] = dtfm <- also die 6)
Im Array unter dem index = 1 ist der zweite der letzten 4 Tasten also dtfm Wert gespeichert. (tasten[1] = dtfm <- also die 7)
Im Array unter dem index = 2 ist der dritte der letzten 4 Tasten also dtfm Wert gespeichert. (tasten[2] = dtfm <- also die 8)
Im Array unter dem index = 3 ist der vierte der letzten 4 Tasten also dtfm Wert gespeichert. (tasten[3] = dtfm <- also die 9)

oder einfach tasten[] = { 6,7,8,9}

Es sind also die 4 letzten Ziffern gespeichert, die eingegeben wurden. Mein Beispiel mit dem tasten[index-3] ist etwas umständlich, weil ich erst eine andere Idee hatte. Man kann das Ganze einfacher darstellen.

Du hast im Array, wie oben geschrieben jetzt die 4 Ziffern gespeichert. Das läßt sich aber umständlich vergleichen, daher machen wir einfach eine Zahl daraus (das klappt im übrigen nur, wenn es tatsähclich nicht mehr als 10 verschiedene Ziffern gibt, sind es mehr, klappt das nicht mehr so einfach) . Da wir 4 Stellen haben, gibt es eine tausender, eine hunderter , ein zehner und eine einer-Stelle. Also
6* 1000 = 6000
7* 100 = 700
8* 10 = 80
9 * 1 = 9

Summe = 6789 und damit eine Zahl die man super vergleichen kann. So kannst Du dann z.B. auch mehrere Zahlenkombinationen in einem "switch () { case ...}" Konstrukt vergleichen.