Go Down

Topic: Neuling sucht eine Lösung (Read 5147 times) previous topic - next topic

blackscorpion371

Danke, probiere ich morgen gleich mal aus, heute ist es sehr spät geworden.

blackscorpion371

Die Werte der LDR auslesen hat mich nicht wirklich weiter gebracht, zumal ich nun den ersten ersetzt habe um 2 baugleiche Komponenten zu verwenden.

So wie mein Code jetzt aussieht wird aber immer nur der erste LDR abgefragt. Ändere ich auf ldrPin2 wird der 2. LDR abgefragt aber der erste nicht mehr.
Deshalb denke ich Hardware mäßig sollte alles passen, aber im Code passt was noch nicht im loop.

Hat wer nen Tip?


Code: [Select]
// Schalten eines Relais bei "Alarm"
//
// Falls ein 'A' über die serielle Schnittstelle empfangen wird,
// wird ein LDR ausgewertet. Bei "Dunkelheit" wird der "relaisPin"
// für eine bestimmte Dauer auf LOW geschalten.

const int ldrSchwellwert = 800;      // Wert wurde "experimentell" für meinen LDR ermittelt
const int ldrSchwellwert2 = 200;      // Gewünschter Schwellwert
const int stromstossDauer = 800;     // gewünschte Stromstoß-Dauer (Millisekunden)
const byte relaisPin1 = 3;
const byte relaisPin2 = 2;
const byte ldrPin1 = A0;
const byte ldrPin2 = A1;

void setup() {
  Serial.begin(9600);
  digitalWrite(relaisPin1, HIGH);  // Das Relais-Modul ist "active LOW". Dies ist ein "Trick", damit es bei Reset nicht einschaltet.
  digitalWrite(relaisPin2, HIGH);
  pinMode(relaisPin1, OUTPUT);
  pinMode(relaisPin2, OUTPUT);
}

void loop() {
//  Serial.println(analogRead(ldrPin1));  // LDR Wert anzeigen
  if (Serial.available()) {      // wenn Zeichen auf der seriellen Schnittstelle empfangen wurden...
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...
      if (analogRead(ldrPin1) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin1, LOW);  // Relais EINS EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin1, HIGH);  // Relais EINS AUS
    Serial.println("Schwellwert nicht überschritten.");
  }

  //  Serial.println(analogRead(ldrPin2));  // LDR Wert anzeigen
  if (Serial.available()) {      // wenn Zeichen auf der seriellen Schnittstelle empfangen wurden...
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...
      if (analogRead(ldrPin2) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin2, LOW);  // Relais EINS EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin2, HIGH);  // Relais EINS AUS
      }
    }
  }
    }
  }
}                                                                                                                 

michael_x

Code: [Select]
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...


wenn du weisst was das soll, weisst du auch, warum das doppelt drin ist?

Hinweis:
Auf der Seriellen Schnittstelle kommen Zeichen einzeln an. Wenn ein Zeichen da ist und du schnell genug bist, ist danach kein weiteres da...

Quote
Code: [Select]
      }
    }
  }
    }
  }
}           
Da sag ich nichts zu, aber das wird beim Korrigieren auch besser ;)

blackscorpion371

Super war richtig hilfreich.............


und ohne die vielen geschweiften Klammern meckert ja das A IDE beim kompilieren.

Also was ist falsch und wie muss es richtig lauten?

heißt doch lernen durch machen und nicht durch raten ;-)

agmue

Dann mache mal dies:

Code: [Select]
void loop() {
  //  Serial.println(analogRead(ldrPin1));  // LDR Wert anzeigen
  if (Serial.available()) {      // wenn Zeichen auf der seriellen Schnittstelle empfangen wurden...
    int inbyte = Serial.read();  // ein Zeichen lesen
    if (inbyte == 'A') {         // falls das Zeichen ein A ist...
      if (analogRead(ldrPin1) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
        digitalWrite(relaisPin1, LOW);  // Relais EINS EIN
        delay(stromstossDauer);
        digitalWrite(relaisPin1, HIGH);  // Relais EINS AUS
        Serial.println("Schwellwert nicht überschritten.");
      }

      //  Serial.println(analogRead(ldrPin2));  // LDR Wert anzeigen
      if (inbyte == 'A') {         // falls das Zeichen ein A ist...
        if (analogRead(ldrPin2) < ldrSchwellwert) {    // LDR auswerten und falls es "dunkel" ist, das Relais schalten:
          digitalWrite(relaisPin2, LOW);  // Relais EINS EIN
          delay(stromstossDauer);
          digitalWrite(relaisPin2, HIGH);  // Relais EINS AUS
        }
      }
    }
  }
}
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

blackscorpion371

Danke nun funktioniert es, aber warum steht beim ldr1 in der Letzten Codezeile

Serial.println("Schwellwert nicht überschritten.");

bevor der Code für den ldr2 beginnt???

agmue

#51
Feb 10, 2018, 07:23 pm Last Edit: Feb 10, 2018, 07:24 pm by agmue
Das habe ich einfach von Deinem Programm übernommen. Wenn Du es nicht weißt, dann schmeiß es raus :)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

Die IDE zeigt Dir an, wozu diese geschweifte Klammer gehört, wenn Du mit dem Cursor drauf gehst.
Etwas augenfreundlicher formatieren kannst Du den Sketch per STRG+T
Wenn dort mehrere Klammern senkrecht untereinander stehen - ist was faul.
Das muß aber nicht zwingend sein, daß eine Klammer zu viel ist, da kann auch einfach ein ; in einer der Zeilen fehlen, daß der Compiler die Zeilen anders sieht, als die IDE.

Und mit so vielen Punkten am Stück wolltest Du was erreichen?
Satzzeichen sind keine Rudeltiere - wobei ich ja schon froh bin, wenn überhaupt Welche benutzt werden - scheint heute in den Schulen nicht mehr zum Stoff zu gehören :(

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

michael_x

Quote
lernen durch machen und nicht durch raten ;-)
Wenn du unter "machen" "copy&paste" verstehs: Gibt auch noch die Varianten "versuchen zu verstehen" und evtl. "ausprobieren".
Das ist zwar näher am "raten", finde ich aber trotzdem spannender ;)

blackscorpion371

Selbst mit copy&paste kann ich vergleichen was ich zuviel, oder zuwenig habe.

Ist noch vieles zu lernen und einiges anzuschaffen. als nächstes mal so ein Steckboard z.B. bin ja noch
am Anfang und Rom wurde auch nicht in einer Woche erbaut ;-)

jetzt nochmal zum aktuellen Projekt:

Im Großen und Ganzen läuft es wie gewünscht nur der 2. LDR (Aussenbeleuchtung) schaltet schon wenn es noch zu hell ist, obwohl ich den Wert schon auf 1 gesetzt habe. Ich verwende unten gezeigte LDR für beide Kanäle und jeweils 10 kOhm als Spannungsteiler.
Von ganz hell zu ganz dunkel zeigt das Messgerät zwischen 5 kOhm und 10 kOhm an.
Für den 1. Kanal (Innenbeleuchtung) passt das gut nur eben für außen nicht. Kann ich durch ändern des Spannungsteilers für den LDR2 daran etwas ändern? (muss immer noch löten udn kann nicht so einfach umher stecken) oder muss ein anderer LDR her?




Auf jeden Fall schon einmal vielen Dank an alle, welche bisher geholfen haben.

@postmaster

Satzzeichen gab es auch 1977 als ich in die Schule gekommen bin schon und sind mir nicht fremd, wobei ich die alte Rechtsschreibung bevorzuge!  :)

MfG Iev


agmue

Die Theorie für die Spannung am analogen Eingang, Schaltung entsprechend #35:

UA0 = (5V * 10k) / (RLDR + 10k)

RLDR = 5 kOhm ergibt 3,3 V
RLDR = 10 kOhm ergibt 2,5 V

Kannst Du diese Werte in der Praxis bestätigen?

Wenn ja, liegen sie weitab der Grenzen 0V und 5V.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

Ganz so früh war meine Schulzeit nun doch wieder nicht, aber zumindest war ich da schon existent ;).
(Mit der 'Nummer der Rechtschreibung' stimme ich Dir voll und ganz zu, zumindest war ich mit der Schule soweit durch, als dieser Quatsch anfing ... oder wohl neuerdings 'schreiben nach Gehör' ... was ein Tinnef)

Wenn Du den Spannungsteiler änderst, ändert sich auch die Mess-Spannung (3-fach S geschickt umgangen ;) ).

Wenn Du den LDR an +5V angeschlossen hast, das andere Ende an A0 und dem Pull-DN Widerstand und Dessen Ende an GND, müsste laut den Info's hier im Thread bei voller Beleuchtung 5K zu 10K, bei Dunkelheit 28K zu 10K den Spannungsteiler bilden.

Du musst in Deinem Programm noch eine Umrechnung drin haben, daß Du mit diesen Werten (3,3V bzw 1,3V) auf '1' kommst.
Welche Referenz benutzt der Arduino derzeit?
Wenn Du jetzt Fragezeichen in den Augen hast: Versorgungsspannung (also 5V bei 5V-Systemen, 3.3V bei 3.3V)
Quelle: im Nachbarthread - von 2014

MfG

PS: irgendwo her hatte ich die 28K ...
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

agmue

PS: irgendwo her hatte ich die 28K ...
Möglicherweise aus dem Datenblatt, siehe #11 und #13 ;)
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

blackscorpion371

Produktblatt LDR

Mein Arduino UNO läuft mit 5 Volt

Der Nano der später zum Einsatz kommen soll ebenso.

Der Link zum Nachbarthread von 2014 funktioniert leider nicht.


@agmue

verstehe gerade nicht was du meinst?

5*10 / 15 + 10

500 / 25

agmue

Ich gehe hiervon aus:

Ich verwende unten gezeigte LDR für beide Kanäle und jeweils 10 kOhm als Spannungsteiler.
Von ganz hell zu ganz dunkel zeigt das Messgerät zwischen 5 kOhm und 10 kOhm an.
Mein Arduino UNO läuft mit 5 Volt
UA0 = (5V * 10k) / (RLDR + 10k)   -> das "k" steht für kiloOhm

UA0 = (50Vk) / (5k + 10k) = 50Vk / 15k = 3,3V

UA0 = (50Vk) / (10k + 10k) = 50Vk / 20k = 2,5V

Oder?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up