Go Down

Topic: Definieren was While Schleife macht (Read 246 times) previous topic - next topic

tzudeml

Jun 15, 2019, 09:13 pm Last Edit: Jun 15, 2019, 09:31 pm by tzudeml
Moin zusammen,

ich messe mit Arduino diverse Spannungen und schalte je nach Spannung und Schalterzustand verschiedene Ausgänge. Das ganze funktioniert im ganzen schon super, nur klappt meine Hysterese noch nicht. Ich schalt z.B. einen Ausgang ab 4.8V und er soll bei 4.1V abfallen. Was aber leider nicht funktioniert. Er miest die Spannung scheinbar nichtmehr, weil er dann immer diese 4.8V weiter misst und im Monitor anzeigt. Also HIGH bei 4.8V aber kein LOW nach 4.1V

Code: [Select]
// setup läuft nur 1x bei Start
void setup() {
  // Serial Ausgabe zur Analyse
  Serial.begin(9600);
  //Wenn 4.8V
  pinMode(2,OUTPUT);
  //Wenn 4.7V
  pinMode(3,OUTPUT);
  //Wenn 1.5V
  pinMode(4,OUTPUT);
  //Sonderfunktion noch nicht aktiv
  pinMode(5,OUTPUT);
  //Schalter vor 4.8V
  pinMode(6,INPUT);
  //Schalter vor 4.7V
  pinMode(7,INPUT);
  //Schalter vor 1.5V
  pinMode(8,INPUT);
}

// loop läuft in dauerschleife
void loop() {
  // analog eingang a0/a1 auslesen
  int sensorValue = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  // analog eingang von 1023 auf 5.0MAX runterbrechen
  float voltage = sensorValue * (5.0 / 1023.0);
  float voltage1 = sensorValue1 * (5.0 / 1023.0);

 
  //Wenn Spannung an A1 größer gleich 1.5V dann
  if(voltage1 >= 1.5)
  {
    //Auslesen Schalterstatus für 1.5V
    int ZustandIn8;
    ZustandIn8 = digitalRead(8);
    //Wenn Schalterstatus == 1
    if(ZustandIn8 == 1)
    {
        //20Sek Verzögerung
        delay(20000);
        //Solange die Spannung größer als 1.0V ist
        while(voltage1 >= 1.0)
        {
          //Ausgang 4 schalten
          digitalWrite(4, HIGH);
        }
    }
  }

  //Wenn Spannung an A0 größer gleich 4.7V dann
  if(voltage == 4.7)
  {
    int ZustandIn7;
    ZustandIn7 = digitalRead(7);
    if(ZustandIn7 == 1)
    {
        delay(20000);
        while(voltage >= 4.1)
        {
          digitalWrite(3, HIGH);
        }
    }
  }

  //Wenn Spannung an A0 größer gleich 4.8V dann
  if(voltage == 4.8)
  {
    int ZustandIn6;
    ZustandIn6 = digitalRead(6);
    if(ZustandIn6 == 1)
    {
        delay(20000);
        while(voltage >= 4.3)
        {
          digitalWrite(2, HIGH);
        }
    }
  }


 
}


While ist leider nicht meine Stärke :D

Danke für eure Hilfe

HotSystems

Setze den Sketch bitte in Code-Tags, Quote-Tags macht den unlesbar.

Du solltest auf While-Schleifen verzichten und die Abfrage mit "if-Abfragen" erstellen.
Da du schon eine loop hast braucht es keine weiteren Schleifen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

tzudeml

Okay, ja mit if ist es womöglich auch machbar ja stimmt. So simple hab ich garnicht gedacht :D

Einfach dann if voltage >= 4.8
Ausgang HIGH
und if voltage <= 4.1
Ausgang LOW

oder?

Dann sollte er nurnoch permanent Spannung messen und dann passts vermutlich

HotSystems

Ja, so ist der Ansatz richtig
Allerdings solltes du die delays entfernen und durch millis mit hilfe der Funktion "BlinkWithoutDelay" ersetzen.
Die delays blockieren den Arduino.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

tzudeml

Passt, belese ich mich mal darüber, danke dir schonmal

Gute Nacht

HotSystems

Passt, belese ich mich mal darüber, danke dir schonmal

Gute Nacht
Ok, gerne.
Und bei Fragen einfach wieder melden. ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

chefin

Vieleicht noch einen "wichtigen" tip: bei deiner Teilung 5.0 /1023 kommen arg krumme Zahlen raus. Wenn du vergleichst, mach nie einen == draus, sondern immer ein <= oder >=, weil du bis hin zu periodischen Zahlen alles mögliche haben kannst.

Sonst passiert dir das eine Bedingung einfach nie erfüllt wird egal welche Spannung du einstellst beim testen.

combie

tip: bei deiner Teilung 5.0 /1023 kommen arg krumme Zahlen raus.
Muss es nicht 5.0/1024 heißen?

Das wäre mein Kritikpunkt an dem Ausdruck.
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

chefin

Nein, weil bei 5/1024*1023 ungleich 5 ist. Der höchstmögliche Eingangswert ist ja 1023. Und das sollte bei 5V erreicht werden. 1023 ist also schon richtig. Nur dann kommt die Gleichung auch wieder auf 5V

combie

Datenblatt

Siehe: 23.7 ADC Conversion Result
Dieses sagt: ADC = (VIN * 1024) / VREF
Somit muss ich also davon ausgehen, dass du schlauer bist, als der Hersteller.

Bitte schaue dich um....
Alle offiziellen Dokumentationen setzen 1024 ein.
Außerdem ist das schon öfter hier, und in anderen Foren, Thema gewesen.





Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Go Up