mehrere Lichtsensoren auswerten

Hallo Leute

hab da ein kleines Problem und zwar möchte ich gerne mehrere Lichtsensoren unabhängig von einander steuern.Wenn zum Bsp.es in der küche dunkel wird soll das licht an gehen und im Flur aber noch nicht erst wenn es dort dunkler wird hab ihr für mich eine Lösung habe bereits mehere Code geschrieben klappt aber leider nicht :frowning:

int Analog0 = A0;// Analogen Eingang 0 als Analog0 definieren
int Analog1 = A1;
int helligkeit = 0; // Variabel helligkeit auf 0 setzen
int helligkeit1 = 0; 
int helldunkelgrenze = 83; // Grenzwert hell-dunkel
int helldunkelgrenze1 = 133;
void setup() {
Serial.begin(9600); //Serial-Übertragung auf 300Baud-reicht völlig
pinMode(14, OUTPUT); //Digitaler-Ausgang 10 für LED-Ansteuerung
pinMode(13, OUTPUT);
}

void loop() {
helligkeit = analogRead(Analog0); // Helligkeitssensor auslesen
helligkeit1 = analogRead(Analog1);
Serial.println(helligkeit, DEC); // Ausgabe in dezimal über Serial mit Linefeed zum Einstellen des Grenzwertes “helldunkelgrenze”

if (helligkeit < helldunkelgrenze)
{
digitalWrite(14, HIGH); // LED an
} 
if (helligkeit > helldunkelgrenze)
{
digitalWrite(14, LOW); // LED aus
}
delay(150); // 500ms Pause, damit nicht zuviele Zahlen über den Screen laufen

if (helligkeit1 < helldunkelgrenze1)
{
digitalWrite(13, HIGH); // LED an
} 
if (helligkeit1 > helldunkelgrenze1)
{
digitalWrite(13, LOW); // LED aus
}
delay(150); // 500ms Pause, damit nicht zuviele Zahlen über den Screen laufen
}

Beim Uno kollidieren Pin 14 und A0 ...

Michael hat recht.

clemens5555:
pinMode(14, OUTPUT); //Digitaler-Ausgang 10 für LED-Ansteuerung

Dies Zeile passt nicht. Willst du vielleicht D10 anstelle D14 verwenden, denn D14 gibt es beim Arduino-Uno eigentlich nicht.

Und, du wirst, wenn dein Code läuft ein anderes Problem bekommen:

if (helligkeit < helldunkelgrenze){
  digitalWrite(14, HIGH); // LED an
}
if (helligkeit > helldunkelgrenze){
  digitalWrite(14, LOW); // LED aus
}

Du schaltest Licht ein, wenn es zu dunkel ist.
Dann wird es hell werden (weil ja das Licht brennt!)
und das Licht wird wieder ausgeschalten.
Es sei denn, du platzierst deinen Sensor so, dass er nur das externe Licht misst.

Ausserdem würde ich noch eine Hysterese einbauen, damit es nicht flackert. zum Beispiel so:

if (helligkeit < helldunkelgrenze* 0.9){
  digitalWrite(14, HIGH); // LED an
}
if (helligkeit > helldunkelgrenze *1.1){
  digitalWrite(14, LOW); // LED aus
}

Nicht ganz so kleine Controller können zwar Gleitkomma per Software simulieren, aber wenns nicht nötig ist...

Einen int 0 .. 1023 mit einem Wert mit Hysterese vergleichen, würde ich so machen:

const int helldunkelgrenze = 183;
// int grenzeein = helldunkelgrenze * 0.9;  // unnötig
// int grenzeaus = helldunkelgrenze* 1.1;

const byte hysterese = 10;

if (helligkeit > helldunkelgrenze+hysterese) digitalWrite(10,LOW); // aus
if (helligkeit < helldunkelgrenze-hysterese) digitalWrite(10,HIGH); // an

mit const gibt man dem Compiler übrigens die Chance, das Ganze noch besser zu machen :wink:
Oder du definierst die Hysterese gleich selbst.

if (helligkeit > 190) digitalWrite(10,LOW); // aus
if (helligkeit < 170) digitalWrite(10,HIGH); // an 
// zwischen 170 und 190 erstmal nichts tun

Michael, klar ist deine Methode besser.
Ich wollte eigentlich nur das Prinzip einer Hysterese deutlich machen.
Ich war mir nicht sicher, ob der Fredersteller das kennt.

Vielen Dank für eure Ideen :grin:

leider klappt mein umgeschriebener Coder nicht ich kann nicht unabhängig von denn 1 Lichtsensor zu denn anderen Lichtsensor schalten dunkel ich denn einen Sensor ab gehen gleich alle 2 Leds an obwohl der 1 sensor nicht abgedunkelt ist was mache ich falsch so sieht mein Code aus
ich verwende das Arduino Bord 2560

int Analog0 = A0;
int Analog1 = A1;
int helligkeit = 0; 
int helligkeit1 = 0; 
int helldunkelgrenze = 83; 
int helldunkelgrenze1 = 133;
void setup() {
Serial.begin(9600); 
pinMode(14, OUTPUT); 
pinMode(13, OUTPUT);
}

void loop() {
helligkeit = analogRead(Analog0); 
helligkeit1 == analogRead(Analog1);
Serial.println(helligkeit, DEC); 

const byte hysterese = 10;

if (helligkeit > helldunkelgrenze+hysterese) digitalWrite(13,LOW); // aus
if (helligkeit < helldunkelgrenze-hysterese) digitalWrite(13,HIGH); // an


const byte hysterese1 = 10;
if (helligkeit1 > helldunkelgrenze1+hysterese1) digitalWrite(14,LOW); // aus
if (helligkeit1 < helldunkelgrenze1-hysterese1) digitalWrite(14,HIGH); // an
}

Du machst viele Sachen doppelt ...

Hier mal ein Alternativ Vorschlag:

const bool an = true;
const bool aus = false;

class HystereseSchalter
{
  public:
  int inPin;
  int outPin;
  int hysterese; 
  int schwellwert;
  bool zustand;
  
  HystereseSchalter(int inPin,int outPin,int hysterese,int schwellwert, bool start=aus) :inPin(inPin),outPin(outPin),hysterese(hysterese),schwellwert(schwellwert)
  {
    zustand = start;
    pinMode(outPin,OUTPUT);
  }
  void update()
  {
    if(zustand)
    {
      if(analogRead(inPin)-hysterese < schwellwert)
      {
        zustand = an;
      }
    }else
    {
      if(analogRead(inPin)+hysterese > schwellwert)
      {
        zustand = aus;
      }
    }
    digitalWrite(outPin,zustand);
  }
};


HystereseSchalter Kanal1(A0,13,10,83);
HystereseSchalter Kanal2(A1,12,10,133);

void setup() {}

void loop() 
{
  Kanal1.update();
  Kanal2.update();
}

helligkeit1 == analogRead(Analog1); hat ein = zuviel

Grüße Uwe

Mit Uwes Korrektur geht es auf meinem UNO. Meine restlichen Veränderungen sind nur Kosmetik.

const byte Analog0 = A0; // ist eine Konstante
const byte Analog1 = A1; // ist eine Konstante
int helligkeit = 0;      // ist eine Variable
int helligkeit1 = 0;     // ist eine Variable 
const int helldunkelgrenze = 83;   // ist eine Konstante
const int helldunkelgrenze1 = 133; // ist eine Konstante
const byte hysterese = 10;   // ist die halbe Hysterese
const byte hysterese1 = 10;  // ist die halbe Hysterese

void setup() {
Serial.begin(9600); 
pinMode(8 , OUTPUT); 
pinMode(9, OUTPUT);
}

void loop() {
helligkeit = analogRead(Analog0); 
helligkeit1 = analogRead(Analog1);
Serial.println(helligkeit, DEC); 

if (helligkeit > helldunkelgrenze+hysterese) digitalWrite(8,LOW); // aus
if (helligkeit < helldunkelgrenze-hysterese) digitalWrite(8,HIGH); // an

if (helligkeit1 > helldunkelgrenze1+hysterese1) digitalWrite(9,LOW); // aus
if (helligkeit1 < helldunkelgrenze1-hysterese1) digitalWrite(9,HIGH); // an
delay(500);  // Nur wegen der Anzeige, sonst loeschen
}

Leider funkioniert der Code bei mir nicht :sob:

const bool an = true;
const bool aus = false;

class HystereseSchalter
{
public:
int inPin;
int outPin;
int hysterese;
int schwellwert;
bool zustand;

HystereseSchalter(int inPin,int outPin,int hysterese,int schwellwert, bool start=aus) :inPin(inPin),outPin(outPin),hysterese(hysterese),schwellwert(schwellwert)
{
zustand = start;
pinMode(outPin,OUTPUT);
}
void update()
{
if(zustand)
{
if(analogRead(inPin)-hysterese < schwellwert)
{
zustand = an;
}
}else
{
if(analogRead(inPin)+hysterese > schwellwert)
{
zustand = aus;
}
}
digitalWrite(outPin,zustand);
}
};

HystereseSchalter Kanal1(A0,13,10,83);
HystereseSchalter Kanal2(A1,12,10,133);

void setup() {}

void loop()
{
Kanal1.update();
Kanal2.update();
}

Die Logik stimmt nicht ganz:
if(zustand)
heisst genaugenommen
if(zustand==an)
und schaltet nicht oder an

im else Zweig (wenn schon aus) ebenso: entweder nichts tun oder nochmal zustand = aus setzen.

michael_x:
Die Logik stimmt nicht ganz:
if(zustand)
heisst genaugenommen
if(zustand==an)
und schaltet nicht oder an

im else Zweig (wenn schon aus) ebenso: entweder nichts tun oder nochmal zustand = aus setzen.

Das stimmt, da habe ich einen logischen Bock eingebaut.
:slight_smile: so ist das leider, wenn man gerade nicht genug Lichtsensoren da hat :slight_smile:
(und einen Knick in der Denke)

Hier mal eine korrigierte Version.
(nicht schöner, aber hoffentlich korrekter)

const bool an = true;
const bool aus = false;

class HystereseSchalter
{
  public:
  int inPin;
  int outPin;
  int hysterese; 
  int schwellwert;
  bool zustand;
  
  HystereseSchalter(int inPin,int outPin,int hysterese,int schwellwert, bool start=aus) :inPin(inPin),outPin(outPin),hysterese(hysterese),schwellwert(schwellwert)
  {
    zustand = start;
    pinMode(outPin,OUTPUT);
  }
  void update()
  {
      if(analogRead(inPin)-hysterese < schwellwert)
      {
        zustand = an;
      }
      if(analogRead(inPin)+hysterese > schwellwert)
      {
        zustand = aus;
      }
      digitalWrite(outPin,zustand);
  }
};


HystereseSchalter Kanal1(A0,13,10,83);
HystereseSchalter Kanal2(A1,12,10,133);

void setup() {}

void loop() 
{
  Kanal1.update();
  Kanal2.update();
}

ungetestet