5 Eingänge 1 Ergebnis

Hallo Zusammen
Ich hoffe ihr könnt mir hier weiterhelfen

Kurz zu mir, Ich hab leichte Vorkenntnisse und fang mich gerade wieder an reinzudenken

Meine Frage ist

Ich hab 5 Pins die als Input eingerichtet sind
1 Pin ist bei der Übertragung immer auf HIGH gibt sozusagen den Start vor

Die anderen 4 Pins dienen als BCD Code Übertragung

Die Auswertung hab ich mit einem IF Befehl gemacht was auch ganz gut klappt

Jetzt kommt’s

Kann ich irgendwie vorher schon festlegen ohne denn IF Befehl was es wird und als int festlegen?

TS93:
Kann ich irgendwie vorher schon festlegen ohne denn IF Befehl was es wird und als int festlegen?

Kannst Du das mal verständlich formulieren, was Du damit meinst?

Gruß Tommy

Die Reihenfolge in der du die 5 Eingänge erfasst (und 4 davon in eine BCD-Ziffer wandelst), bleibt dir überlassen.

Wenn du das "unnötigerweise" machst, ist das ziemlich egal.

Aber den Datentyp int sehe ich nirgends in deinen Andeutungen.

Kann ich irgendwie vorher schon festlegen ohne denn IF Befehl was es wird und als int festlegen?

Ach, das geht bestimmt!
Mit hellseherischen Fähigkeiten kann man durchaus schon vorher wissen, was hinterher rauskommen wird.

entschuldigt das ich das so kompliziert gemacht habe

OK versuch ich es mal anders erklärt

ich hab ein MT8870 (DTMF-Decoder) der über 5 Ausgänge verfügt stQ und Q1bis4
stQ ist quasi der Status das was passiert und Q1bis 4 geben an was gedrückt wurde
Q1 = High+Q2-4 Low wäre eine "1" und so weiter und so fort

so sieht das dann aus mit dem IF Befehl
if (!altSTQ && STQ && Q4 == LOW && Q3 == LOW && Q2 == LOW && Q1 == HIGH )

das ist mein stand aktuell das ich sehen kann was per DTMF gewählt wurde

mein plan ist es daraus das so zu machen das ich eine 4 Stellige Pin über DTMF eingeben kann wo am ende bei richtiger eingabe ein Relais schaltet

besser?

Das geht doch viel einfacher.
Nimm eie Variable vom Typ byte, setze sie auf 0 und danach setze die Bits (suche nach bitSet) entsprechend Deinen Eingängen, dann hast Du direkt die Zahl.

Gruß Tommy

Die anderen 4 Pins dienen als BCD Code Übertragung

Wenn du die geschickt auf die Arduino Pins verteilst, z.B. A0 bis A3, kannst du sie auf einen Rums einlesen.

Warum ist dein Programm geheim?

Ich schau mir mal eure Vorschläge an

Wie meinst du das mit geheim?

Du solltest uns mal Deinen bisherigen Sketch zeigen.

Gruß Tommy

Hier der aktuelle Sketch

//Bibliotheken Einspielen
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Definieren des Displays
LiquidCrystal_I2C lcd(0x27, 16, 2);

//Festlegen von Pins
const byte Q1  = 7;  // Pin Q1 vom DTMF Module zum Arduino (Pin7)
const byte Q2  = 6;  // Pin Q2 vom DTMF Module zum Arduino (Pin6)
const byte Q3  = 5;  // Pin Q3 vom DTMF Module zum Arduino (Pin5)
const byte Q4  = 4;  // Pin Q4 vom DTMF Module zum Arduino (Pin4)
const byte STQ = 3;  // Pin STQ vom DTMF Module zum Arduino (Pin3)

bool stQ1 = LOW;     // Variable fuer Status (HIGH/LOW) der Pins Q1,Q2,Q3,Q4,STQ
bool stQ2 = LOW;     // ...
bool stQ3 = LOW;     // ...
bool stQ4 = LOW;     // ...
bool stSTQ = LOW;     // ...
bool altSTQ;

int r1_led = 13;
int relais = 8;

void setup() 
{
  // Pins als Input definieren
  pinMode(Q1,  INPUT);  
  pinMode(Q2,  INPUT);  
  pinMode(Q3,  INPUT);
  pinMode(Q4,  INPUT);
  pinMode(STQ, INPUT);
  stSTQ = digitalRead(STQ);
  altSTQ = stSTQ;

  // LCD Starten
  lcd.begin();

  //Startsequenz von LCD Display
  lcd.backlight();
  lcd.print("Bitte Warten");
  lcd.setCursor(0,1);
  lcd.print("System Startet");
  delay(5000);
  lcd.clear();
  delay(2000);
  lcd.print("Herzlich");
  lcd.setCursor(0,1);
  lcd.print("Willkommen");

  delay(100);
  
  //StatusLED geht an
  digitalWrite(r1_led,HIGH);    
  delay(200); 
}

void loop() 
{
  // Lese Status (HIGH/LOW) der Pins Q1,Q2,Q3,Q4,STQ ein.
  stQ1  = digitalRead(Q1);    
  stQ2  = digitalRead(Q2);
  stQ3  = digitalRead(Q3);
  stQ4  = digitalRead(Q4);
  altSTQ = stSTQ;
  stSTQ = digitalRead(STQ);

  // Taste [1]
  if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == LOW && stQ2 == LOW && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("1");
  }

  // Taste [2]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == LOW && stQ2 == HIGH && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("2"); 
  }

  // Taste [3]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == LOW && stQ2 == HIGH && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("3"); 
  }

  // Taste [4]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == HIGH && stQ2 == LOW && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("4");
  }

  // Taste [5]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == HIGH && stQ2 == LOW && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("5");
  }

  // Taste [6]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == HIGH && stQ2 == HIGH && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("6");
  }

  // Taste [7]
  else if (!altSTQ && stSTQ && stQ4 == LOW && stQ3 == HIGH && stQ2 == HIGH && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("7");
  }

  // Taste [8]
  else if (!altSTQ && stSTQ && stQ4 == HIGH && stQ3 == LOW && stQ2 == LOW && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("8");
  }

  // Taste [9]
  else if (!altSTQ && stSTQ && stQ4 == HIGH && stQ3 == LOW && stQ2 == LOW && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("9");
  }

  // Taste [0]
  else if (!altSTQ && stSTQ && stQ4 == HIGH && stQ3 == LOW && stQ2 == HIGH && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("0");
  }

  // Taste [*]
  else if (!altSTQ && stSTQ && stQ4 == HIGH && stQ3 == LOW && stQ2 == HIGH && stQ1 == HIGH )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("*");
  }

  // Taste [#]
  else if (!altSTQ && stSTQ && stQ4 == HIGH && stQ3 == HIGH && stQ2 == LOW && stQ1 == LOW )
  {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("es wurde gewählt");
  lcd.setCursor(0,1);
  lcd.print("#");
  }
  delay(50);
}

Auf diese Art :

{
  int val;

  pinMode(Q1,  INPUT); 
  pinMode(Q2,  INPUT); 
  pinMode(Q3,  INPUT);
  pinMode(Q4,  INPUT);

  val = (digitalRead(Q1) << 3)  | (digitalRead(Q2) << 2) | (digitalRead(Q3) << 1) | digitalRead(Q4);
  
  Serial.print("Schalterwert : ");
  Serial.println(val,HEX);

hast du nachher in val einen Zahlwert zwischen 0 und 15 je nach gedrückten Tasten.

Ulli

const byte Q1  = 7;  // Pin Q1 vom DTMF Module zum Arduino (Pin7)

const byte Q2  = 6;  // Pin Q2 vom DTMF Module zum Arduino (Pin6)
const byte Q3  = 5;  // Pin Q3 vom DTMF Module zum Arduino (Pin5)
const byte Q4  = 4;  // Pin Q4 vom DTMF Module zum Arduino (Pin4)

Ja, das meinte ich mit ungeschickt verteilt....
Könntest du das noch auf die analogen Pins umbauen?

Ist das richtig, dass Taste[ * ] und Taste [ # ] bei dir den gleichen Code haben?

ja bau ich gleich mal um

ähm eigentlich nicht schau ich mir gleich mal mit an

da kann ich aber nicht mehr das LCD verwenden oder? (hängt auf A4/A5)
oder stQ auf einen Digitalen lassen?

stQ kannst Du auf einem digitalen lassen. Es geht darum, dass die 4 Datenbits in einem Register liegen und damit kann die Zahl direkt eingelesen werden.

Gruß Tommy

ja bau ich gleich mal um

Vorschlag für den umbau:
A0 -> Q1
....
A3 -> Q4

Vereinfacht das Einlesen ungemein!

byte wahlCode = PINC & 0xf;

da kann ich aber nicht mehr das LCD verwenden oder? (hängt auf A4/A5)

Doch klar, brauchst nur A0 bis A3

oder stQ auf einen Digitalen lassen?

Klar, dreht sich nur darum das eine Daten Nibble schon fertig vorbereitet an die Pins zu legen. In der richtigen Reihenfolge. Dann muss man da im Code nicht hässlich mit rum fummeln.

ok hab ich erledigt funktioniert auch wieder alles :smiley:
nun weiß ich wirklich nicht wie es weiter geht oder wo ihr hin wollt

Gruß Tim

Völlig ungetestet, nur eben aus deinem Code zusammengestoppelt.
Überflüssigen Kram entfernt.

//Bibliotheken Einspielen
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Definieren des Displays
LiquidCrystal_I2C lcd(0x27, 16, 2);


int r1_led = 13;
int relais = 8;
const byte STQ = 3;  // Pin STQ vom DTMF Module zum Arduino (Pin3)


char readDTMF()
{
  static bool altSTQ = true;
  // char result = '/0'; // falsch
  char result = '\0'; // besser
  bool stSTQ = digitalRead(STQ);
  if(stSTQ && ! altSTQ)
  {
    byte code = PINC & 0xf;
    switch(code)
    {
      case 1 ... 9 : result = '0'+code; break;
      case      10 : result = '0';      break;
      case      11 : result = '*';      break;
      case      12 : result = '#';      break;
    }
  }
  altSTQ = stSTQ;
  return result;
}





void setup()
{
  // Pins definieren

  pinMode(r1_led,OUTPUT);
  pinMode(STQ, INPUT);
  // LCD Starten
  lcd.begin();

  //Startsequenz von LCD Display
  lcd.backlight();
  lcd.print("Bitte Warten");
  lcd.setCursor(0,1);
  lcd.print("System Startet");
  delay(5000);
  lcd.clear();
  delay(2000);
  lcd.print("Herzlich");
  lcd.setCursor(0,1);
  lcd.print("Willkommen");

  delay(100);
 
  //StatusLED geht an
  digitalWrite(r1_led,HIGH);   
  delay(200);
}

void loop()
{
  char wahlZeichen = readDTMF();
  if(wahlZeichen)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("es wurde gewählt");
    lcd.setCursor(0,1);
    lcd.print(wahlZeichen);
  }
}

Funktioniert nicht so ganz
Fehlt hier nicht noch das auslesen der Pins A0-A3 ? oder ist das PinC & 0xf?

Hi

Pinout Nano
Dort sind auch die Port-Namen angegeben - A0 bis A5 sind PC0...PC5.
Das Ver-UND-en mit 0x0F lässt nur die unteren 4 Bit stehen - also PC0...PC3, Welche die Arduino-Pins A0...A3 sind.

Davon ab - Funktioniert nicht ganz - ist eine etwas schwammige Fehlerbeschreibung.

MfG