Hallo liebe Gemeinde,
habe hier eine etwas komplexere Frage.
Das Setup ist folgendes: zwei Lichtschranken an einem Arduino Nano über eine Spannungsmessung angeschlossen. Immer wenn die Lichtschranke unterbrochen ist ist der Spannungspegel hoch.
Auch eine Ampel ist angeschlossen.
Die Lichtschranke soll Personen in einem Raum zählen, die eine Lichtschranke zählt am Eingang die Leute die reingehen, die zweite die Leute am Ausgang.
Das Problem ist, die Lichtschranke zählt falsch, da die Personen am Eingang quasi anders reingehen aus am Ausgang rausgehen.
Das Rausgehen ist nämlich geordnet, da zählt die Schranke richtig.
Am Eingang kommen aber die Leute etwas ungeordneter rein, mal zu zweit, dann eng hintereinander etc... Die Lichtschranke zählt hier einfach immer zu viel und das bekomme ich nicht in den Griff.
Das Zählen passiert in einer Schleife, siehe unten, die Schranke wartet nach jedem Zählen und das ist glaube ich das Problem, dass die beiden Schranken in einer Schleife zählen und nicht unabhängig. Mir fällt aber nichts ein wie ich das anders lösen kann, da ich das nicht hintereinander abarbeiten möchte.
Ich hab schon an der Zeit rumgespielt, das macht es allerdings nicht wirklich besser.
Eine andere Idee war quasi am Eingang immer nur "eins" zu zählen und am Ausgang pro Unterbrechung "drei" abzuziehen, um den Messfehler , das hat aber auch nicht wirklich funktioniert.
Nun weiß ich langsam nicht mehr weiter und dachte ich frage mal hier, ob vielleicht hier noch jemand eine andere Idee hat.
Den Code habe ich mal hier unten eingefügt.
Ich hoffe das Problem ist einigermaßen Verständlich, ansonsten einfach fragen, dann probier ichs nochmal zu erläutern...
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //I2C Display 16x2 [SDA>A4 SCL>A5]
//Variablendeklaration
int rot = 2; //Relaistrigger für Ampel rot an D2
int gelb = 3 ; //Relaistrigger für Ampel gelb an D3
int gruen = 4; //Relaistrigger für Ampel gruen an D4
int LS1 = 0; //Analogeingang für Lichtschranke Eingang A0
int LS2 = 1; //Analogeingang für Lichtschranke Ausgang A1
int count; //Zählvariable
int trigger = 1000; // Analoger Triggerwert, bei dem die LS ausgelöst werden soll [=Empfindlichkeit/Schwellenwert]
int GWlow = 50; //Personengrenzwerte [Ampelschalte] bis gelb
int GWhigh = 75; //Obergrenze Personen - Ampel rot
int passthrough = 1000; //Zeit zum durchgehen durch die Lichtschranke in ms
int handschalter= 8; //Anschluss Schalter für Modus-Wahl Automatic oder Hand
int manuellrg= 9; //Anschluss für Wählschalter manuelles Grün oder Rot
void setup()
{
lcd.init(); //Im Setup wird der LCD gestartet
lcd.backlight(); //Hintergrundbeleuchtung einschalten.
pinMode(rot, OUTPUT); //Ampelausgänge zum Relais
pinMode(gelb, OUTPUT); //Ampelausgänge zum Relais
pinMode(gruen, OUTPUT); //Ampelausgänge zum Relais
digitalWrite(rot, HIGH); //Ampel StartUp
digitalWrite(gelb, HIGH); //Ampel StartUp
digitalWrite(gruen, HIGH); //Ampel StartUp
lcd.setCursor(0, 0);// //StartUp "Sequenz" Display
lcd.print("LG ");
lcd.setCursor(0, 1);//
lcd.print("Wilkommen...");
delay(1000); //Kunstpause
Serial.begin(9600); //Serieller Monitor aktiv
pinMode(handschalter,INPUT); //Schalter Modus
pinMode(manuellrg,INPUT);//Schalter manuelle Farbe
//StartUp abgeschlossen
//Vorbereitung Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Modus: AUTOMATIC");
lcd.setCursor(0, 1);
lcd.print("Besucher:");
}
void loop()
{
//Handbetrieb
while(digitalRead(handschalter)==HIGH)//Moduswahlschalter ist an
{
if(digitalRead(manuellrg)==HIGH){ //Manuelle Farbe ist rot
digitalWrite(rot, LOW);
digitalWrite(gelb, HIGH);
digitalWrite(gruen, HIGH);
}
if(digitalRead(manuellrg)==LOW){ //Manuelle Farbe ist grün
digitalWrite(rot, HIGH);
digitalWrite(gelb, HIGH);
digitalWrite(gruen, LOW);
}
lcd.setCursor(0, 0);
lcd.print("Modus: HAND "); //Anzeige des Modus
}
//Automaticbetrieb
lcd.setCursor(0, 0); //Anzeige des Modus
lcd.print("Modus: AUTOMATIC ");
lcd.setCursor(11, 1);
lcd.print(count); //Zeigt die aktuelle Besucheranzahl auf Display an.
Serial.print("Besucher: "); //damit die Ausgabe schön aussieht
Serial.println(count);//gibt die aktuelle Besucherzahl auf dem Seriellen Monitor aus.
//Abtastung Lichtschranke
if (analogRead(LS1) > trigger )//passiert Eingang
{
count++;
}
if ( analogRead(LS2) > trigger) //passiert Ausgang
{
count--;
}
delay(passthrough); //Warten damit nur einmal gezählt wird
//Ampelschaltung
if (count < GWlow) //Wenn Wert unter erstem Grenzwert -> Ampel grün
{
digitalWrite(rot, HIGH);
digitalWrite(gelb, HIGH);
digitalWrite(gruen, LOW);
}
else if ((count > GWlow) && (count < GWhigh)) //Wenn Wert zwischen dem ersten und zweiten Grenzwert -> Ampel gelb
{
digitalWrite(rot, HIGH);
digitalWrite(gelb, LOW);
digitalWrite(gruen, HIGH);
}
else if (count > GWhigh) //Wert hat den oberen Grenzwert überschritten (zu viele Personen) -> Ampel rot
{
digitalWrite(rot, LOW);
digitalWrite(gelb, HIGH);
digitalWrite(gruen, HIGH);
}
}