Simple "Alarm"anlage

Hallo,

ich bin noch ein absoluter Newbie (Learning by doing) und versuche mich gerade an einer simplen "Alarmanlage" die wiefolgt ablaufen soll:

Bewegungssensor wird aktiviert -> LED und LCD Text "Alarm" sollen sich immer wiederholen, bis ein Button gedrückt wird

Ihr schlagt wahrscheinlich die Hände über dem Kopf zusammen, wenn ihr meinen Code seht :grinning_face: Ich geh schonmal in Deckung :stuck_out_tongue:

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ButtonPin 5 
#define PyroelectricPIN 23
#define LED_BUILTIN 27



void setup() {

}

void loop() { 
  pinMode(23, INPUT);
  pinMode(5, INPUT);
  pinMode(27, OUTPUT);
  LiquidCrystal_I2C lcd(0x27, 16, 2);
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
if (digitalRead(23) && (digitalRead(5)==1)){
    while (digitalRead(5)==1) && (digitalRead(23)==0) ) {
      digitalWrite(27, HIGH);
      delay(1 * 1000);
      lcd.print("Alarm!!!!");
      delay(1 * 1000);
      digitalWrite(27, LOW);
      delay(1 * 1000);
      lcd.clear();
    }
  }
  else{
    digitalWrite(23, LOW);
    digitalWrite(27, LOW);
    lcd.clear();
    lcd.print("Alles OK");
  }
}

Gibt es denn auch eine Frage zu deinem Problem ?
Allerdings solltest du deinen Sketch etwas aufräumen und Dinge, die in das Setup gehören, auch dahin schreiben und aus der Loop nehmen.

du sollst nicht in Deckung gehen sondern zu deinem Werke stehen.
Wenn du zu deinem Code Fragen hast (z.B. warum am LCD nichts ausgegegeben wird) dann sollst du exakt beschreiben was dir aktuell missfällt. Lass uns nicht raten.

Beim Ausformulieren deiner Frage kannst du auch versuchen diese selbst zu beantworten (Rubber Duck Debugging).

Sehr leicht wäre es, wenn du zunächst vergleichst, was in einem LCD Sketch alles wo drinnen steht und wo ähnliches bei dir ist - oder ob es überhaupt da ist.

So erstmal aufgeräumt und natürlich habe ich im Eifer des Gefechts mein Problem vergessen zu schreiben :zipper_mouth_face:

Folgendes: Im Ablauf wird quasi nicht abgefragt ob ein Knopf gedrückt wird, sondern er wechselt sofort zum "else" Bereich. Der Knopf ist bisher ohne Funktion und im Display erscheint daher "Alles OK". Könntet ihr mir einen kleinen Gedankenanstoss geben, in welche Richtung ich weiter tüfteln sollte, um irgendwann einen Erfolg zu spüren :wink:
Ist die "If than else" mit "while" Schleife in dem Fall die beste Wahl?

Edit: Der Bewegungssensor ist auch aktiv, da er rot leuchtet, wenn ich die Hand davor halte.

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ButtonPin 5 
#define PyroelectricPIN 23
#define LED_BUILTIN 27



void setup() {
  pinMode(23, INPUT);
  pinMode(5, INPUT);
  pinMode(27, OUTPUT);
  LiquidCrystal_I2C lcd(0x27, 16, 2);
}

void loop() { 
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
if (digitalRead(23) && (digitalRead(5)==1)){
    while (digitalRead(5)==1) && (digitalRead(23)==0) ) {
      digitalWrite(27, HIGH);
      delay(1 * 1000);
      lcd.print("Alarm!!!!");
      delay(1 * 1000);
      digitalWrite(27, LOW);
      delay(1 * 1000);
      lcd.clear();
    }
  }
  else{
    digitalWrite(23, LOW);
    digitalWrite(27, LOW);
    lcd.clear();
    lcd.print("Alles OK");
  }
}

Dann fehlen noch genaue Angaben zum Controller und Bewegungssensor.
Bitte poste dazu die Links deines Lieferanten.

Und warum verwendest du diese Namen nicht weiter ?

Mal die Namen eingesetzt:

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ButtonPin 5 
#define PyroelectricPIN 23
#define LED_BUILTIN 27

void setup() {
  pinMode(PyroelectricPIN, INPUT);
  pinMode(ButtonPin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  LiquidCrystal_I2C lcd(0x27, 16, 2);
}

void loop() { 
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
  if (digitalRead(PyroelectricPIN) && (digitalRead(ButtonPin)==1)){
    while (digitalRead(ButtonPin)==1) && (digitalRead(PyroelectricPIN)==0) ) {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(1000);
      lcd.print("Alarm!!!!");
      delay(1000);
      digitalWrite(LED_BUILTIN, LOW);
      delay(1000);
      lcd.clear();
    }
  } else{
    digitalWrite(PyroelectricPIN, LOW);
    digitalWrite(LED_BUILTIN, LOW);
    lcd.clear();
    lcd.print("Alles OK");
  }
}

if (digitalRead(PyroelectricPIN)
Fehlt da was?

digitalWrite(PyroelectricPIN, LOW);
Warum auf ein Input ein digitalWrite?

loop ist bereits eine Schleife. Entferne diese Schleife einmal.

Was Du da verbaut hast, ist egal.
Wichtig wäre zu wissen wie?
Mach mal ein Foto vom Aufbau, das erklärt alles. (Widerstände, Tasteranschlüsse, etc.pp. ehe ich das alles abfrage....)

Sehe ich anders. Sind das alles 5Volt Komponenten ?
Stimmen die Pins ? Ein Uno wäre es wohl nicht.

Du siehst es so - ich sehe gar nichts.
Aber Du darfst natürlich gerne einen Fragenkatalog bauen.
Mit einem Foto erspare ich mir unnötige Nachfragen.
Die Frage, ob die Taste nu 5V geeignet ist, wird sich wohl nicht stellen.
Und alles andere funktioniert ja wohl.

Nö, steht ja schon in Post #5.

Und von Taste habe ich nichts geschrieben.

Hallöchen, die Sensoren gehören zu einem Kit, also gehe ich stark davon aus, die Sachen sind aufeinander abgestimmt.

Ich habe beim unten genannten Code nun das Problem, dass er immer in else if und dann ins else springt und somit if komplett übergeht. Hat jemand eine Idee woran das liegen könnte bzw. wo mein Denkfehler ist?

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ButtonPin 5 
#define PyroelectricPIN 23
#define LED_BUILTIN 27
LiquidCrystal_I2C lcd(0x27, 16, 2);


void setup() { 
  
  pinMode(23, INPUT);
  pinMode(5, INPUT);
  pinMode(27, OUTPUT);
   
  


}

void loop() { 

int ReadValue = digitalRead(PyroelectricPIN);
int buttonState = digitalRead(ButtonPin);

if ((ReadValue==1) && (buttonState==0)) {
      digitalWrite(27, HIGH);
      delay(1 * 1000);
            digitalWrite(27, LOW);
      delay(1 * 1000);
        lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
      lcd.print("Alarm!!!!");
      delay(1 * 1000);
      digitalWrite(27, LOW);
      delay(20000);
      
    }

  else if ((ReadValue==1) && (buttonState==1)) {
    
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
      lcd.print("erledigt");
      delay(1 * 10000);
      digitalWrite(27, LOW);
      delay(1 * 1000);
      
  }
  else{    
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
    lcd.print("Alles OK");
    
    
  }
}

Damit wissen wir immer noch nicht, was das tatsächlich für Teile sind.
Also Link posten.

hast du sowohl im if als auch im else Zweig. --> unnötig

Die ganzen Änderungen aus #6 hast du auch nicht umgesetzt.

Ja.

https://www.keyestudio.com/products/keyestudio-esp32-iot-control-smart-farm-starter-kit-for-arduino-scratch-30-graphical-programming

Also richtig angeschlossen sind sie.... wenn ich die einzelnen Teile seperat anspreche, geben sie auch alle die richtigen Werte zurück bzw. führen das aus, was sie machen sollen

  • formatiere zunächst deinen Code mit STRG-T
  • Du hast dir Konstanten für deine Pins angelegt, aber verwendest diese nur zufällig.
    z.B. schreibst du doch wieder pinMode(27, OUTPUT)
    bereinige das im ganzen Code! keine Hardcoded 23/27 in Setup und Loop mehr!
  • schau dir noch mal das Hello World Beispiel vom LCD an und kontrolliere was von lcd ins setup gehört und was in den Programmablauf soll.
  • Dann aktivierst du in setup die Serielle Schnittstelle
  • Und in Loop gibst du dir die zwei Variablen ReadValue und buttonState aus damit du siehst welchen Wert diese haben.
  • und in den jeweiligen If Zweigen gibst du auf der Seriellen Schnittstelle aus, in welchem Zweig du bist.
  • Damit kannst du dann debuggen, warum du in welchen Zweig kommst.
  • Wenn du nicht weiterkommst, poste deinen bereinigten Code und zeige uns die Serielle Ausgabe die dich verwirren lässt.

Ja super...ein ESP32, der nur 3,3Volt auf den Pins verträgt, gemischt mit Modulen die an 5Volt betrieben werden (können), und damit auch 5 Volt auf die Pins des ESP32 schicken.
Es funktioniert kurzzeitig, aber das verträgt dieser nicht lange.

Echt, ein tolles Set für Anfänger. Absolut ungeeignet.

Und nein, bei falschem Aufbau, sind Probleme vorbestimmt.

Dein Code compiliert nicht.
Hast Du mal einen aktuellen Code, wenn Du schon den Aufbau nicht fotografieren willst?

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
constexpr uint8_t buttonPin {5};
constexpr uint8_t pyroPin {23};
constexpr uint8_t ledPin {27};

LiquidCrystal_I2C lcd(0x27, 16, 2);


void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(buttonPin, INPUT);
  pinMode(pyroPin, INPUT);
  pinMode(ledPin, OUTPUT);
  lcd.setCursor(0, 0);
  lcd.cursor();
  lcd.blink();
}

void loop()
{
  if ((digitalRead(buttonPin) == 1) || (digitalRead(pyroPin) == 1))
  {
    while ((digitalRead(buttonPin) == 1)
           && (digitalRead(pyroPin) == 0) )
    {
      digitalWrite(ledPin, HIGH);
      delay(1 * 1000);
      lcd.print("Alarm!!!!");
      delay(1 * 1000);
      digitalWrite(ledPin, LOW);
      delay(1 * 1000);
      lcd.clear();
    }
  }
  else
  {
    digitalWrite(ledPin, LOW);
    lcd.clear();
    lcd.print("Alles OK");
  }
}

compiliert - und sieht ganz sicher besser aus, als #1.

Guten Morgen, also nach reiflichen Tests, muss ich feststellen, dass der Button IMMER 1 (also aktiv) zurück gibt. Ich werde ihn mir mal aus dem ganzen System ausbauen und auf dem Testboard testen.