das geht ganz einfach so:
Code:if (ldr1 > (ldr2 + tol)) { } else if (ldr1 < (ldr2 - tol)) { } else { }
Hallo,
ich heiße Dominic, bin 19 und Kfz- Mechatroniker- Nfz.
Ich habe zwar schon seit einem Jahr ein Arduino Duemilanove,
hatte aber noch nicht viel Zeit es auszuprobieren:
Ich habe gerade 2 LDRs und 2 LEDs angeschloßen und lass immer eine LED leuchten,
wenn ein LDR heller ist als der andere. Wenn beide LDRs gleich beleuchtet sind,
sollte eigentlich keine LED leuchten, nur diesen Zustand erreiche ich nie.
Nun meine Frage, kann man hier eine Toleranz von ca. +/- 10 eingeben?
Hier der Quellcode:
int ledPin1 = 13;
int ledPin2 = 12;
void setup(){
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);}
void loop(){
int ldr1 = analogRead(0);
int ldr2 = analogRead(1);
if (ldr1 > ldr2){
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);}
if (ldr2 > ldr1){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);}
if (ldr1 == ldr2){ // Hier die Toleranz von +/- 10
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);}
Serial.println(ldr1);
Serial.print(ldr2);
delay(1500);
}
Gutes neues Jahr noch und schon mal Danke
Gruß Fischy
das geht ganz einfach so:
Code:if (ldr1 > (ldr2 + tol)) { } else if (ldr1 < (ldr2 - tol)) { } else { }
So viele Treppen und so wenig Zeit!
Felix' Version ist perfekt, aber wenn Du bei Deinem Code bleiben willst:
"if (ldr1 == ldr2){ // Hier die Toleranz von +/- 10"
if (abs(ldr1-ldr2) < tol) { // sollte dann passen
Allerdings wird bei kleinem Unterschied doch auch eine Deiner beiden anderen Bedingungen erfuellt sein und (ganz kurz) mal eine der beiden LEDs angesprochen..
Danke euch beiden!
Hab Calis`s Version genommen, funktioniert super genau wie ichs haben wollte.
Kannst du mir noch das "abs" Dingens erklären?
Das Programm soll später eine 2 achsige Nachfüranlage für PV-Module steuern.
An die 2 Ledpins will ich je ein Transistor mit Lastrelais anschließen der den Motor 12V/4A Getriebemotor steuert.
Zum Schutz vor Sturmschaden muss die Anlage bzw. das Modulfeld bei ca. 100 Km/h in die waagrechte fahren.
Dazu benötige ich einen Windmesser:
Auf längere Sicht würde ich mir auch noch gern ein kl. Windrad bauen, da ich den Wind nicht einschätzen kann,
möchte ich die Winddaten über einen größeren Zeitraum aufzeichenen und mittels Exel auswerten.
Windgeschwindigkeit und Winrichtung würde ich gerne mit Incremental-Geber verwirklichen.
Was benötige ich, um die Daten auf einer SD-Karte zu speichern.
Danke euch
Mit freundlichen Grüßen
Fischy
abs(x) liefert den Betrag von x, also in diesem Fall den Betrag der Differenz ldr1 - ldr2.
Dann solltest du entweder meinen Vorschlag verwenden, oder seinen so anpassen, daß du zuerst auf Gleichheit prüfst und die anderen beiden Fälle mit "else if" statt "if". Denn wie Calis schon angesprochen hat, wird auch in dem Fall daß die Differenz innerhalb der Toleranz liegt trotzdem immer eine der LEDs ganz kurz eingeschaltet. Das mag zwar bei LEDs keine Rolle spielen (man sieht es ja nicht), aber wenn da noch was anderes dran hängt ist es zumindest unschön.Das Programm soll später eine 2 achsige Nachfüranlage für PV-Module steuern.
An die 2 Ledpins will ich je ein Transistor mit Lastrelais anschließen der den Motor 12V/4A Getriebemotor steuert.
Falls du also Calis' Variante bevorzugst, solltest du sie etwa so anpassen:
Wobei die Bedingung beim zweiten "else if" nicht zwingend notwendig ist, denn wenn die Differenz nicht kleiner ist als die Toleranz UND ldr1 nicht größer als ldr2, dann kann ldr1 ohnehin nurnoch kleiner sein als ldr2.Code:if (abs(ldr1-ldr2) < tol) { } else if (ldr1 > ldr2) { } else if (ldr1 < ldr2) // Hier würde auch ein einfaches else reichen { }
Bei dieser Implementierung (wie auch bei meiner ersten Variante) ist garantiert, daß auf den LED-Pins immer ein sauberes Signal liegt.
SD Karten kann man per SPI ansprechen, was sehr gut ist da nahezu jeder µC eine SPI Schnittstelle hat. Allerdings muss man mit der Versorgungsspannung aufpassen, denn die liegt nur bei 3,3V. Softwareseitig wird die Sache schon schwieriger wenn die Daten "PC-kompatibel" gespeichert werden sollen, denn in diesem Fall benötigst du eine Bibliothek für das FAT Dateisystem.Was benötige ich, um die Daten auf einer SD-Karte zu speichern
So viele Treppen und so wenig Zeit!
Ja. ich seh das genau wie Felix. Speziell wenn Spulen (in Motor oder Relais) geschaltet werden, kann es da recht fette Induktionsimpulse geben, die Du sicher nicht haben willst. Also unbedingt anpassen!
Hallo,
ich war das WE nicht daheim, deshalb schreib ich erst jetzt.
Hab den Code geändert und ein wenig erweitert:
Der letzte Abschnitt
regelt die Nachführung bzw. die Stromversorgung der Motoren,digitalWrite(sv, LOW);
delay(10000);
digitalWrite(sv, HIGH);
delay(2000);
diese sollen später immer nur jede 1/4 Stunde ca. 30 sec. nachführen.
Die abfragen der LDRs soll im 1 Sekundentakt weiter laufen.
Und hier ist mein nächstes Problem.
Die if Abfrage (1000)nimmt die 10000ms der sv, LOW an.}
Serial.println(ldr1);
Serial.print(ldr2);
delay(1000);
digitalWrite(sv, LOW);
delay(10000);
Habe ich da etwas falsch geschrieben?
int ledPin1 = 13;
int ledPin2 = 12;
int sv = 11;
void setup(){
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(sv, OUTPUT);
Serial.begin(9600);}
void loop(){
int ldr1 = analogRead(0);
int ldr2 = analogRead(1);
if (abs(ldr1-ldr2) < 10){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
}
else if (ldr1 > ldr2){
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
}
else if (ldr1 < ldr2){
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
Serial.println(ldr1);
Serial.print(ldr2);
delay(1000);
digitalWrite(sv, LOW);
delay(10000);
digitalWrite(sv, HIGH);
delay(2000);
}
Calis007
Ja. ich seh das genau wie Felix. Speziell wenn Spulen (in Motor oder Relais) geschaltet werden, kann es da recht fette Induktionsimpulse geben, die Du sicher nicht haben willst. Also unbedingt anpassen!
Auch wenn ich Dioden umgekehrt, parrallel zum Relais schalte?
Danke Gruß Fischy
Hmm.. ich seh da kein if.
Was ich sehe:
Serial.println(ldr1);
Serial.print(ldr2);
Warum nur beim ersten das 'ln' (linefeed) dran? Ich wuerd's beim 2. oder bei beiden machen
'Die abfragen der LDRs soll im 1 Sekundentakt weiter laufen.'
Dann sollten keine weiteren delay-Befehle in derselben Schleife vorkommen ausser dem einen delay(1000).
Sonst macht das Ding ja fuer laenger nichts.
Mit:
digitalWrite(sv, LOW);
delay(10000);
schaltest Du ja nicht nur die sv auf low fuer 10 sec, sondern auch das Programm steht 10 sec. an der Stelle still...
Schau Dir mal http://arduino.cc/en/Reference/Millis an (ACHTUNG, auf die 50 Tage aufpassen!), damit kannst Du Dir eine Zeit merken und jede Sekunde (mit dem vorhandenen delay(1000)) checken, ob schon 10 sek vergangen sind seit dem digitalWrite(sv, LOW) ..
also etwa if (millis() >= zeitvorher+10000) { /* 10 sec vorbei */ zeitvorher = millis(); digitalWrite(sv, HIGH); }
aber irgendwie kommt mir das mit sv auch noch sonderbar und kompliziert vor, schreib mal klar nieder, was wann genau passieren soll (exakt, in Umgangssprache) und dann mach einen klaren Programmfluss draus (Du wolltest ja wohl auch kaum, dass sich das Ding jede 1.5 Sekunden einschaltet und dann sofort wieder ausschaltet, wenn eh alles innerhalb einer Toleranz liegt, oder? Programmiert hast Du's dann aber so
Also lass mal hoeren, was eigentlich passieren soll. Ich kann mir nicht vorstellen, dass Du einfach mal fuer 10 s sv abschalten willst und dann wieder fuer 2 s an, egal was fuer Werte gemessen werden..
Die Schutzdioden verhindern nur, dass der Induktionsimpuls beim Ausschalten nicht durch die Schaltung faehrt, sondern eben durch die Dioden abgeleitet wird. Ist wichtig und gut so.
Aber warum willst Du die Dioden elektroschocken, wenns nicht sein muss? Und der Einschaltstrom faehrt jedesmal kurz durch die Bauteile, auch nicht noetig
Hallo,
Ziel ist es, dass sich das Modulfeld alle 10min so ausrichtet, dass die Sonnenstrahlen im 90° Winkel auftreffen. So ganz genau muss das ja net sein, auf der Enfernung bis zur Sonne spielt es keine so große Rolle.
Die 2 Ldrs werden durch eine kl. Wand zwischen ihnen getrennt, so dass die Wand einen verdunkelt. Die Anlage fährt jetzt solange in die Richtung des hellern LDRs und bleibt dann stehen, sobald beide in der Toleranz liegen und wartet dann wieder 10 min und so weiter.
Nicht die beste Zeichnung.
Gruß Fischi
Geändert von Fischy (16.01.2012 um 22:43 Uhr)
Lesezeichen