Masken-Reminder mit Alarm

Moinsen,

Ich arbeite momentan an einem Projekt bei dem ich eine Maskenerrinnerung baue, diese soll sich bei Überschreitung eines, durch einen Entfernungsmesser ermittelten Wert, aktivieren.

Im Anhang findet ihr ein Bild von meiner bisherigen Kostruktion.

Hier mein bisheriger Code:

#include <LiquidCrystal.h>
#define trigger 6
#define echo 7
#define ledpin 13
#define buzzer 8

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// LCD-Library initiieren mit der Zuordnung der Pins 
void setup() {
  
  lcd.begin(16, 2); 
  //Konfiguriere LCD 16 Zeichen und 2 Zeilen 
  //Text für Frage vorbereiten und anzeigen, nicht in Routine, da selber Text
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Maske dabei?"); 

  // Verschiedene Spannungen definieren für verschiedene Befehle 
   pinMode(trigger, OUTPUT); 
   pinMode(ledpin, OUTPUT);
   pinMode(echo, INPUT);
   pinMode(buzzer, OUTPUT);
   digitalWrite(trigger,HIGH); //Signal initialisieren
   
}

void loop() {
  String msg;
  float d = GetDistance(20);
  msg = "Dist: ";
  msg+=d;
  PrintResult(0, msg);
  if(d>20) {
    Reminder(1);    
  }
  else
  {
    Reminder(0);
  }
  delay(100);
}

void Reminder(int onoff)
{
  // Wenn onoff = 1 dann LED einschalten und piezzo piepen lassen
  // Sonst LED ausschalten und piezzo ausschalten
  if(onoff == 1)
  {
    digitalWrite(ledpin, HIGH);
    tone(buzzer,500);
    delay(50);
    tone(buzzer, 400); 
  }
  else
  {
    digitalWrite(ledpin, LOW);
   noTone(buzzer);
  }
  
}


void PrintResult(int pos, String text) {
  // print the number of seconds since reset:
  int i;
  for(i=0; i < pos && i + text.length() < 16; i++)
  {
    lcd.setCursor(i,1); 
    lcd.print(" ");
  }
  if(pos + text.length() >= 16)
  {
    pos = 16 - text.length();
  }
  lcd.setCursor(pos,1); 
  lcd.print(text);
}


float GetDistance(float temp)
{
   float echozeit, schallgeschw, distance;
   digitalWrite(trigger,LOW); //Messung initiieren
   delayMicroseconds(3); // warten, bis sensor bereit ist, d.h. 250us
   digitalWrite(trigger,HIGH); //Burst senden ...
   delayMicroseconds(10); // ... für 10us
   echozeit = pulseIn(echo, HIGH); // zeit des echos
     schallgeschw = (331.5 + (0.6* temp)) / 10000; //in cm/ms
   distance = schallgeschw * echozeit / 2;
   return distance;
}

Wenn der Wert von 20cm überschritten wird, aktiviert sich ein Piezzo&LED-Alarm. So weit, so gut.

Mein Plan war es nun den Alarmzustand solange aktiviert zu lassen (ungeachtet von darauffolgenden Unterschreitungen der 20cm), bis dieser durch das Drücken eines Knopfes wiederum deaktiviert wird.

Ich bin leider noch relativ neu was die ganze Sprache angeht und daher nicht sicher, mit welchen Befehlen ich arbeiten muss.

Ich würde mich sehr über Anregungen, Ideen und Verbesserungsvorschläge freuen!

Danke für eure Hilfe, viele Grüße!

timmertens:
Hier mein bisheriger Code:

  if(d>20) {

Reminder(1);   
  }
  else
  {
    Reminder(0);
  }
  delay(100);
}





Wenn der Wert von 20cm überschritten wird, aktiviert sich ein Piezzo&LED-Alarm. So weit, so gut. 

Mein Plan war es nun den Alarmzustand solange aktiviert zu lassen (ungeachtet von darauffolgenden Unterschreitungen der 20cm), bis dieser durch das Drücken eines Knopfes wiederum deaktiviert wird.

Als erstes mal musst Du einen Knopf definieren.
Das geht recht gut mit einem Taster zwischen PIN und GND.

Also
#define TasterPIN 9

im Setup den mit einem Pullup als input initialisieren

und im loop teilst Du auf:

  if ((d > 20) || (buzzer == HIGH)) {
    Reminder(1);
  }
  if (TasterPIN == LOW) {
    Reminder(0);
  }

Hi, danke dir für deine schnelle Hilfe!!! Ich habe deine Anleitung befolgt und bin leider dennoch bisher zu keiner funktionierenden Lösung gekommen...

Zuerst habe ich den Knopf angeschlossen an GND und PIN9 und definiert.

#define button 9

Im Setup habe ich ich diesen dann folgendermaßen initialisiert :

pinMode(button,INPUT_PULLUP);

Wenn ich nun im Loop nun folgendes eingebe:

if((d > 20) || (buzzer == HIGH)) {
    Reminder(1);    
  }
  if (button == LOW) {
    Reminder(0);
  }
 else
  {
    Reminder(0);
  }
  delay(100);
}

...funktioniert dies leider nicht, der Arduino reagiert nicht auf den Input des Knopfes....

Code hat sich bis auf die beiden Stellen nicht verändert.

LG

Deine Variable button ist der Pin, an dem der Taster höngt. Der verändert sich nicht. Du musst schon den Pin auslesen:

if (digitalRead(button) == LOW)

Gruß Tommy

timmertens:
Im Setup habe ich ich diesen dann folgendermaßen initialisiert :

pinMode(button,INPUT_PULLUP);

Das ist richtig.

Und jetzt wollte ich es mal drauf ankommen lassen und Dir ein wenig was zum suchen geben.
Aber da siehst Du mal, wo so Fallen stecken können.

Ums kurz zu machen:
if (button) ist immer wahr. und if (buzzer) ebenfalls.
Denn button ist 9 und buzzer 8
In Deinem Fall soll button und buzzer aber ein PIN sein und Du willst den Zustand des PIN auslesen.
Das machst mit digitalRead() wie beim Taster üblich.

Also: ändere in:
digitalRead(buzzer) == HIGH
bzw.
digitalRead(button)==LOW

Und dann nur was reinkopieren ist Mist.

if((d > 20) || (buzzer == HIGH)) {
    Reminder(1);    
  }
  if (button == LOW) {
    Reminder(0);
  }
 else
  {
    Reminder(0);
  }
  delay(100);
}

Bei Dir würde jetzt - egal ob Taste gedrückt oder nicht - der buzzer immer aus sein.

Mega, es funktioniert alles!!! Danke euch!!
Habe nun noch einen Timer hinzugefügt, welcher den Alarm nach 30sek wieder scharf stellt!

if((d > 20) || (digitalRead(buzzer) == HIGH)) {
    Reminder(1);    
  }
  if (digitalRead(button) == LOW) {
    Reminder(0);
      lcd.clear();  
      lcd.setCursor(0, 1);
      lcd.print("Stay safe!");
      delay (10000);
      lcd.setCursor(0, 0);
      lcd.print("Maske dabei?");
      
      
  }
}

timmertens:
Mega, es funktioniert alles!!!

      lcd.setCursor(0, 1);

lcd.print("Stay safe!");
      delay (10000);
      lcd.setCursor(0, 0);
      lcd.print("Maske dabei?");

Das glaub ich nicht.

Habe nun noch einen Timer hinzugefügt, welcher den Alarm nach 30sek wieder scharf stellt!

???
Aber gut - wenns passt...