- LiTime Speicher und Akkus         
Ergebnis 1 bis 9 von 9

Thema: Toleranz

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2012
    Beiträge
    6

    Toleranz

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    40
    Beiträge
    1.780
    das geht ganz einfach so:

    Code:
    if (ldr1 > (ldr2 + tol))
    {
    }
    else if (ldr1 < (ldr2 - tol))
    {
    }
    else
    {
    }
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2011
    Beiträge
    158
    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..

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2012
    Beiträge
    6
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    40
    Beiträge
    1.780
    Zitat Zitat von Fischy Beitrag anzeigen
    Danke euch beiden!

    Hab Calis`s Version genommen, funktioniert super genau wie ichs haben wollte.

    Kannst du mir noch das "abs" Dingens erklären?
    abs(x) liefert den Betrag von x, also in diesem Fall den Betrag der Differenz ldr1 - ldr2.

    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.
    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.


    Falls du also Calis' Variante bevorzugst, solltest du sie etwa so anpassen:
    Code:
    if (abs(ldr1-ldr2) < tol)
    {
    }
    else if (ldr1 > ldr2)
    {
    }
    else if (ldr1 < ldr2) // Hier würde auch ein einfaches else reichen
    {
    }
    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.

    Bei dieser Implementierung (wie auch bei meiner ersten Variante) ist garantiert, daß auf den LED-Pins immer ein sauberes Signal liegt.

    Was benötige ich, um die Daten auf einer SD-Karte zu speichern
    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.
    So viele Treppen und so wenig Zeit!

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2011
    Beiträge
    158
    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!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2012
    Beiträge
    6
    Hallo,

    ich war das WE nicht daheim, deshalb schreib ich erst jetzt.

    Hab den Code geändert und ein wenig erweitert:

    Der letzte Abschnitt
    digitalWrite(sv, LOW);
    delay(10000);
    digitalWrite(sv, HIGH);
    delay(2000);
    regelt die Nachführung bzw. die Stromversorgung der Motoren,

    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)
    }
    Serial.println(ldr1);
    Serial.print(ldr2);
    delay(1000);


    digitalWrite(sv, LOW);
    delay(10000);
    nimmt die 10000ms der sv, LOW an.

    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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.06.2011
    Beiträge
    158
    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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2012
    Beiträge
    6
    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.


    Klicke auf die Grafik für eine größere Ansicht

Name:	LDR.jpg
Hits:	1
Größe:	28,1 KB
ID:	21224



    Gruß Fischi
    Geändert von Fischy (16.01.2012 um 22:43 Uhr)

Ähnliche Themen

  1. Toleranz-/Genauigkeitsfrage
    Von Crazy Harry im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 26.05.2010, 14:22
  2. Toleranz bei Versorgungsspannung?
    Von jörn im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 21.02.2005, 23:51
  3. Wie kann ich in der < und > Funktion eine Toleranz ein
    Von Arne im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.01.2005, 20:14

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test