if Abfrage 3 Taster

Hallo zusammen,

ich bin neu hier. Arduino-technisch ein Anfänger. Einige Tutorials habe ich schon "durch" gemacht hat bisher alles geklappt.

Zu meiner Frage:
Ich würde gerne eine Art Alarmanlage "basteln".
Es gibt einen Schlüsselschalter (Taster NO NO) (zwei separate NO)
Und einen Drucksensor (Taster NO)
Sowie einen Piper (Sirene)

Es gibt noch die Variable "AnAus"

Idee war: Wir der Schlüsselschalter auf an gestellt (das ist ein Taster) geht die Variable auf 1.
Wenn der Drucksensor betätigt wird UND die Variable AnAus auf 1 gesetzt ist geht die Sirene an.

Es tut sich aber garnix?

::slight_smile: Wahrscheinlich irgendein Anfänger Fehler der schon 1000 mal gefragt wurde....

const int Schluesselschalteraus = 1;
const int Schluesselschalteran = 2;
const int Sensortaster = 7;
const int Sirene = 13;

//Variablen 

int AnAus = 0;


void setup() {
  // put your setup code here, to run once:
pinMode (Schluesselschalteraus, INPUT);
pinMode (Schluesselschalteran, INPUT);
pinMode (Sensortaster, INPUT);
pinMode (Sirene, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  if 
  // wenn der Schlüsselschalteran auf durchgang gedreht wird, wird die Variable AnAus auf 1 gesetzt

  (Schluesselschalteran, HIGH){
    AnAus = 1;}

  
  if 
  // wenn der Schlüsselschalteraus auf durchgang gedreht wird, wird die Variable AnAus auf 0 gesetzt
  
  (Schluesselschalteraus, HIGH){
    AnAus = 0;}


if 
  // wenn die Variable AnAus auf 1 gesetzt ist UND der Sensortaster gedrückt gehalten wird geht die Sirene an
  ((AnAus == 1) && (Sensortaster, HIGH)){
  digitalWrite (Sirene, HIGH);
  }

}

Das muss auch heißen

if(deinSchalter == HIGH)

nur mit deinem Schalternamen.

Hallo
der Zustand des Schlüsselschalters muss mit der digitalRead()-Funktion gelesen werden

Hallo,
wie hast Du die Schalter / Taster denn angeschlossen. Vermutlich fehlt ein Widerstand als pullDown. Zudem finde ich nicht die Stelle wo die Taster eingelesen werden digitalRead(pin)

Schau die noch mal die einfachen Beispiele in der IDE an.

Heinz

Hallo
probier mal [UNGTESTET]:

const int Schluesselschalteraus = 1;
const int Schluesselschalteran = 2;
const int Sensortaster = 7;
const int Sirene = 13;
//Variablen
int AnAus = 0;
void setup() {
  // put your setup code here, to run once:
  pinMode (Schluesselschalteraus, INPUT);
  pinMode (Schluesselschalteran, INPUT);
  pinMode (Sensortaster, INPUT);
  pinMode (Sirene, OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(Schluesselschalteran))  AnAus = 1;
  if (digitalRead(Schluesselschalteraus)) AnAus = 0;
  if
  // wenn die Variable AnAus auf 1 gesetzt ist UND der Sensortaster gedrückt gehalten wird geht die Sirene an
  ((AnAus == 1) && (digitalRead(Sensortaster), HIGH)) {
    digitalWrite (Sirene, HIGH);
  }
}

Hallo
oder die Kurzversion :slight_smile: [UNGETESTET]:

void loop() {
  // put your main code here, to run repeatedly:
   if ((digitalRead(Schluesselschalteran)) && (digitalRead(Sensortaster))) digitalWrite (Sirene, HIGH);
}

Hallo,

warum wilst Denn eigentlich von dem Schlüsselschalter beide Kontakte verwenden, Sinn macht das doch nicht wirklich.

Heinz

HotSystems:
Das muss auch heißen

if(deinSchalter == HIGH)

nur mit deinem Schalternamen.

Du meinst So:

const int Schluesselschalteraus = 1;
const int Schluesselschalteran = 2;
const int Sensortaster = 7;
const int Sirene = 13;

//Variablen 

int AnAus = 0;


void setup() {
  // put your setup code here, to run once:
pinMode (Schluesselschalteraus, INPUT);
pinMode (Schluesselschalteran, INPUT);
pinMode (Sensortaster, INPUT);
pinMode (Sirene, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  if 
  // wenn der Schlüsselschalteran auf durchgang gedreht wird, wird die Variable AnAus auf 1 gesetzt

  (Schluesselschalteran == HIGH){
    AnAus = 1;}

  
  if 
  // wenn der Schlüsselschalteraus auf durchgang gedreht wird, wird die Variable AnAus auf 0 gesetzt
  
  (Schluesselschalteraus == HIGH){
    AnAus = 0;}


if 
  // wenn die Variable AnAus auf 1 gesetzt ist UND der Sensortaster gedrückt gehalten wird geht die Sirene an
  ((AnAus == 1) && (Sensortaster == HIGH)){
  digitalWrite (Sirene, HIGH);
  }

}

paulpaulson:
Hallo
der Zustand des Schlüsselschalters muss mit der digitalRead()-Funktion gelesen werden

Das wäre ja dann sowas:

const int Schluesselschalteraus = 1;
const int Schluesselschalteran = 2;
const int Sensortaster = 7;
const int Sirene = 13;

//Variablen 

int AnAus = 0;


void setup() {
  // put your setup code here, to run once:
pinMode (Schluesselschalteraus, INPUT);
pinMode (Schluesselschalteran, INPUT);
pinMode (Sensortaster, INPUT);
pinMode (Sirene, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  if 
  // wenn der Schlüsselschalteran auf durchgang gedreht wird, wird die Variable AnAus auf 1 gesetzt

  (digitalRead(Schluesselschalteran)){
    AnAus = 1;}

  
  if 
  // wenn der Schlüsselschalteraus auf durchgang gedreht wird, wird die Variable AnAus auf 0 gesetzt
  
  (digitalRead (Schluesselschalteraus)){
    AnAus = 0;}


if 
  // wenn die Variable AnAus auf 1 gesetzt ist UND der Sensortaster gedrückt gehalten wird geht die Sirene an
  ((AnAus == 1) && digitalRead(Sensortaster == HIGH)){
  digitalWrite (Sirene, HIGH);
  }

}

Bei dem Code geht die Sirene beim Betätigen des Schlüsslschalters direkt an.

paulpaulson:
Hallo
probier mal [UNGTESTET]:

const int Schluesselschalteraus = 1;

const int Schluesselschalteran = 2;
const int Sensortaster = 7;
const int Sirene = 13;
//Variablen
int AnAus = 0;
void setup() {
 // put your setup code here, to run once:
 pinMode (Schluesselschalteraus, INPUT);
 pinMode (Schluesselschalteran, INPUT);
 pinMode (Sensortaster, INPUT);
 pinMode (Sirene, OUTPUT);
}
void loop() {
 // put your main code here, to run repeatedly:
 if (digitalRead(Schluesselschalteran))  AnAus = 1;
 if (digitalRead(Schluesselschalteraus)) AnAus = 0;
 if
 // wenn die Variable AnAus auf 1 gesetzt ist UND der Sensortaster gedrückt gehalten wird geht die Sirene an
 ((AnAus == 1) && (digitalRead(Sensortaster), HIGH)) {
   digitalWrite (Sirene, HIGH);
 }
}

Hier das Gleiche, wird der Schlüsselschalter betätigt geht die Sirene direkt an.

@Rentner:
die Wiederstände sind drin.
Ich weiss nicht ob ich das richtig beschrieben habe.
Ich benutze einen Schlüsselschalter bei dem man den Schlüssel in die Mittelpostition einsteckt wenn man ihn nach rechts dreht schließt sich ein Stromkreis (und der Schlüssel geht wieder in die Mittelposition) und beim nach links drehen schließt sich ein anderer Stromkreis (und der Schlüssel geht wieder in die Mittelposition).
Vom Prinzip wie zwei Drucktaster NO.

mario820:

((AnAus == 1) && (digitalRead(Sensortaster), HIGH))

Das sollte wohl eher ((AnAus == 1) && (digitalRead(Sensortaster) == HIGH)) { sein

MicroBahner:
Das sollte wohl eher

((AnAus == 1) && (digitalRead(Sensortaster) == HIGH)) {

sein

du hast recht, das kommt dabei raus, wenn man den Sketch nicht testet, oder sollte das eine Denkaufgabe für den Fragesteller sein :slight_smile: ?

mario820:
Es gibt einen Schlüsselschalter (Taster NO NO) (zwei separate NO)

const int Schluesselschalteraus = 1;

const int Schluesselschalteran = 2;

Du benutzt PIN 1
Das ist nicht schick. Der wird ebenso wie PIN 0 für die serielle Schnittstelle und das hochladen gebraucht.

Versuche PIN 2 und Pin3
Ich würde gerne was ausprobieren:

const int Schluesselschalteraus = 2;
const int Schluesselschalteran = 3;
const int Sensortaster = 7;
//Variablen
bool ein = false;
bool aus = false;
void setup() {
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (Schluesselschalteraus, INPUT);
  pinMode (Schluesselschalteran, INPUT);
  pinMode (Sensortaster, INPUT);
}

void loop() {
  if (digitalRead(Schluesselschalteraus) != aus)
  {
    Serial.println(F("Schalter aus erkannt"));
    Serial.print(F("Neuer Zustand von aus: "));
    aus = !aus;
    Serial.println(aus);
  }
  if (digitalRead(Schluesselschalteran) != ein)
  {
    Serial.println(F("Schalter ein erkannt"));
    Serial.print(F("Neuer Zustand von ein: "));
    ein = !ein;
    Serial.println(ein);
  }
}

Den Code ausführen, mehrfach den Schlüsseltaster bedienen und die Ausgaben komplett hier rein kopieren.

Rentner:
warum wilst Denn eigentlich von dem Schlüsselschalter beide Kontakte verwenden, Sinn macht das doch nicht wirklich.

Doch, doch - Sowas ist in der Industrie Standard. Hand - 0 - Automatik :wink:

Hallo,

ja ok , also bei dem Schlüsselschalter handelt es sich um tastenden Schalter links- 0 - rechts. Dann macht das dann Sinn

rechts tasten Anlage einschalten (Alarmanlage ist schraf)
links tasten Anlage ausschalten ( Alarmanlage aus / Reset )

Bei eingeschalteter Anlage und dem Drucktaster (z.B Fenster auf ) wird der Pipse eingeschaltet und bleibt so lange an wie die Anlage noch eingeschaltet ist.

Dann nimm am besten noch eine LED dazu damit Du den Status Anlage “ein” sehen kannst.

ich hab mal was zusammmen geschrieben mit der klassischen Sruktur Eingabe, Verarbeitung , Ausgabe. Natürlich kann man das kürzen, aber es soll ja für einen Anfänger verständlich sein. Ich leg mir halt gerne Eingänge und Ausgänge auf bool Variable, die lassen sich zum Einen einfach und gut lesbat logisch verknüpfen und zum Anderen auch einfach negieren.

const byte pin_ein = 2;
const byte pin_aus = 3;
const byte pin_Fenster = 4;
const byte led = 13;
const byte pipser = 5;

// Status Variable
bool ein, aus, fenster_auf;
bool anlage_ein, alarm;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode ( pin_ein, INPUT);
  pinMode (pin_aus, INPUT);
  pinMode (pin_Fenster, INPUT);
  pinMode(led, OUTPUT);
  pinMode(pipser, OUTPUT);
}

void loop() {
  // Eingänge einlesen
  ein = digitalRead (pin_ein);
  aus = digitalRead(pin_aus);
  fenster_auf = digitalRead(pin_Fenster);

  // ====== Verarbeiten
  if (ein)anlage_ein = true;// Anlage einschalten

  if (aus) {
    anlage_ein = false;   // Anlage aus
    alarm = false;        // Alarm aus
  }

  if (anlage_ein & fenster_auf)alarm = true; // Logische Verknüfung
 
  // Ausgange ansteuern
  digitalWrite(led, anlage_ein);
  digitalWrite(pipser, alarm);

  // Serial.println(alarm);
  //delay(100);
}

Heinz

Hallo zusammen erst einmal Danke für die vielen Hinweise! Kurze Rückmeldung:

Ich habs hinbekommen, es waren == und digitalRead und noch ein paar andere Sachen, glaube ich zumindest.

const int Schluesselschalteraus = 2;
const int Schluesselschalteran = 3;
const int Sirene = 12;
const int Sensortaster = 7;

//Variablen 


int AnAus = 0;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
pinMode (Schluesselschalteraus, INPUT);
pinMode (Schluesselschalteran, INPUT);
pinMode (Sensortaster, INPUT);
pinMode (Sirene, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

   
  // wenn der Schlüsselschalteran auf durchgang gedreht wird, wird die Variable AnAus auf 1 gesetzt

  if(digitalRead(Schluesselschalteran)){
    AnAus = 1;
    }
  
   
  // wenn der Schlüsselschalteraus auf durchgang gedreht wird, wird die Variable AnAus auf 0 gesetzt
  
   if(digitalRead(Schluesselschalteraus)){
    AnAus = 0;
    }

        
 
  // wenn die Variable AnAus auf 1 gesetzt ist UND der KFZStrom gedrückt gehalten wird geht die Sirene an
  if ((AnAus==1) && digitalRead(Sensortaster)){
  digitalWrite (Sirene,HIGH);
  }


if (AnAus==0){
digitalWrite (Sirene,LOW);
}
}

Das war ja “nur” ein erster Teil.
Letztendlich hätte ich gerne noch ein paar Sachen mehr aber Schritt für Schritt.

Momentan bin ich soweit, dass wenn der Schlüsselschalter auf “an” stand, der Taster betätigt wird, erst ein Warnton kommt und wenn man bis dahin den Schlüsselschalter nich auf “aus” geschaltet hat die Sirene ertönt. (ohne "delay (xy))
Grade bin ich dabei mit dem Schlüsselschalter eine Zentralverriegelung zusätzlich zu verriegeln und entriegeln.
Eigentlich klappt das nur nach ein par Betätigungen tut sich nichts mehr.

Da schreibe ich eventuell die Tage was zu, mit samt dem Code.

Ich gelobe Besserung wegen PIN1 und Pin2.

Besten Gruß

mario820:
Ich gelobe Besserung

Dann mal als ersten Ansatz: drücke STRG-T vor dem Veröffentlichen...
Und: Pin2 kannst nehmen - 0 und 1 sind nur von vornherein belegt

Hallo
Hier kommt die Freitagvormittagsversion zum Testen: :slight_smile:

// if Abfrage 3 Taster - getestet mit Arduino Mega und Prototyp-Shield
//Variablen
const int SchluesselSchalterAus = A1; //
const int SchluesselSchalterAn = A2;  // Kontakt schaltet gegen GND
const int SensorTaster = A3;          // 
const int Sirene = 13;                // LED schaltet gegen +5V
const bool AN = true;
const bool AUS = false;
bool AnAus = AUS;
void setup() {
  pinMode (SchluesselSchalterAus, INPUT_PULLUP);
  pinMode (SchluesselSchalterAn, INPUT_PULLUP);
  pinMode (SensorTaster, INPUT_PULLUP);
  pinMode (Sirene, OUTPUT);
}
void loop() {
  if (not digitalRead(SchluesselSchalterAn)) AnAus = AN;
  if (not digitalRead(SchluesselSchalterAus)) AnAus = AUS;
  digitalWrite (Sirene, not (AnAus && not digitalRead(SensorTaster)));
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.