Go Down

Topic: Mal wieder millis()..... ;) (Read 2110 times) previous topic - next topic

ht81

Teil 3:

Code: [Select]

void Backlight() // Loop für Backlight Steuerung (val>650 & val<550 als Hysterese)
{
 val = analogRead(analogPin);   // Den Analogen Pin einlesen und den Wert in "val" speichern (Bereich 0 - 1023)
 if (val >850) { // Wenn der "val" Wert >650
   for(fadeValue ; fadeValue >= 1; fadeValue -=1) { // Fade in von max zu min per increment in 5 Schritten:
     analogWrite(ledPin, fadeValue); // Schreibe PWM Wert von "fadeValue" auf den LED Pin          
     delay(30);  // Warte 30ms
   }
 }
 if (val <700) { // Wenn der "val" Wert >650
   for(fadeValue ; fadeValue <= 15; fadeValue +=1) { // Fade in von max zu min per increment in 5 Schritten:
     analogWrite(ledPin, fadeValue); // Schreibe PWM Wert von "fadeValue" auf den LED Pin          
     delay(30);  // Warte 30ms
   }
 }
 if (val >=550 && val <=650) { // Wenn der "val" Wert >650
   for(fadeValue ; fadeValue >= 20; fadeValue -=5) { // Fade in von max zu min per increment in 5 Schritten:
     analogWrite(ledPin, fadeValue); // Schreibe PWM Wert von "fadeValue" auf den LED Pin          
     delay(30);  // Warte 30ms
   }
 }
 if (val <=450) { // Wenn der "val" Wert <550
   for(fadeValue ; fadeValue <= 200; fadeValue +=5) { // Fade out von min zu max per decrement in 5 Schritten:
     analogWrite(ledPin, fadeValue); // Schreibe PWM Wert von "fadeValue" auf den LED Pin          
     delay(30);  // Warte 30ms
   }
 }
}



void UpdateMinMax() // Speicherung der minimalen und maximalen Temperatur / Luftfeuchte  
{
 if (temp_ti < temp_ti_min){ // Wenn Innen - Temperatur kleiner Innen - Temp. Min. Speicher
   temp_ti_min = temp_ti; // Dann Innen - Temp. abspeichern
 }
 if (temp_hi < temp_hi_min){ // Wenn Innen - Luftfeuchte kleiner Innen - Temp. Min. Speicher
   temp_hi_min = temp_hi; // Dann Innen - Temp. abspeichern
 }
 if (temp_ti > temp_ti_max){ // Wenn Innen - Temperatur größer Innen - Temp. Max. Speicher
   temp_ti_max = temp_ti; // Dann Innen - Temp. abspeichern
 }
 if (temp_hi > temp_hi_max){ // Wenn Innen - Luftfeuchte größer Innen - Temp. Max. Speicher
   temp_hi_max = temp_hi; // Dann Innen - Temp. abspeichern
 }    
 if (temp_to < temp_to_min){ // Wenn Aussen - Temperatur kleiner Aussen - Temp. Min. Speicher
   temp_to_min = temp_to; // Dann Aussen - Temp. abspeichern
 }
 if (temp_ho < temp_ho_min){ // Wenn Aussen - Luftfeuchte kleiner Aussen - Temp. Min. Speicher
   temp_ho_min = temp_ho; // Dann Aussen - Temp. abspeichern
 }
 if (temp_to > temp_to_max){ // Wenn Aussen - Temperatur größer Aussen - Temp. Max. Speicher
   temp_to_max = temp_to; // Dann Aussen - Temp. abspeichern
 }
 if (temp_ho > temp_ho_max){ // Wenn Aussen - Luftfeuchte größer Aussen - Temp. Max. Speicher
   temp_ho_max = temp_ho; // Dann Aussen - Temp. abspeichern
 }    
}


void ShowMin() // Minimale Temp. / Luftfeuchte auf LCD darstellen
{
 tempupdate = 0; // Tempupdate auf 0 setzten
 lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
 lcd.print("           "); // Text "          "
 lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
 lcd.print("Min:"); // Text "Min:"
  if (temp_ti_min < 0.0){ // Wenn Temp. < 0.0°C
   if (temp_ti_min <= -10.0){ // Wenn Temp. <= -10.0°C
     lcd.setCursor(9,1); // Cursorbeginn auf Zeichen 9, Zeile 2
   }
   else{
     lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
   }
 }
 else if (temp_ti_min < 10.0){ // Wenn Temp. < 10.0°C
   lcd.setCursor(11,1); // Cursorbeginn auf Zeichen 11, Zeile 2
 }
 else { // Sonst normale Ausgabe
   lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
 }
 lcd.print(temp_ti_min,1); // Min. Temp. darstellen und auf 1 Stelle begrenzen
 lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
 lcd.print("C "); // Text "C "
 lcd.setCursor(17,1); // Cursorbeginn auf Zeichen 17, Zeile 2
 lcd.print(temp_hi_min,0); // Min. Luftfeuchte darstellen und ohne Nachkommastelle darstellen
 lcd.print("%"); // Text ("%")
 lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
 lcd.print("           "); // Text "          "
 lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
 lcd.print("Min:"); // Text "Min:"
 if (temp_to_min < 0.0){ // Wenn Temp. < 0.0°C
   if (temp_to_min <= -10.0){ // Wenn Temp. <= -10.0°C
     lcd.setCursor(9,3); // Cursorbeginn auf Zeichen 9, Zeile 4
   }
   else{
     lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 10, Zeile 4
   }
 }
 else if (temp_to_min < 10.0){ // Wenn Temp. < 10.0°C
   lcd.setCursor(11,3); // Cursorbeginn auf Zeichen 11, Zeile 4
 }
 else { // Sonst normale Ausgabe
   lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 10, Zeile 4
 }
 lcd.print(temp_to_min,1); // Min. Temp. darstellen und auf 1 Stelle begrenzen
 lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
 lcd.print("C "); // Text "C "
 lcd.setCursor(17,3); // Cursorbeginn auf Zeichen 17, Zeile 4
 lcd.print(temp_ho_min,0); // Min. Luftfeuchte darstellen und ohne Nachkommastelle darstellen
 lcd.print("%"); // Text ("%")
 sensors.requestTemperatures(); // Temp Werte holen lassen
 delay(1000); // Werte für 1s darstellen
 buttonState = digitalRead(analogPin1); // Min. Taster überwachen
 if (buttonState == HIGH) {  // Wenn Min. Taster nicht gedrückt ist normale Anzeige  
   lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
   lcd.print("            "); // Trick um "Min:" Text zu löschen ohne "lcd.clear" aufzurufen
   InTemperature(); // Ausgabe des Temp. Wertes vom "InTemperature"
   lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 17, Zeile 2
   HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
   lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
   lcd.print("            "); // Trick um "Min:" Text zu löschen ohne "lcd.clear" aufzurufen
   OutTemperature(); // Ausgabe des Temp. Wertes vom "OutTmperature"
   lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 17, Zeile 4
   HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityOutside"
 } else { // Wenn Min. Taster noch immer gedrückt wird, dann alle gespeicherten Werte zurücksetzten
   tempupdate = 1; //Tempupdate auf 1 setzten um nach Anzeige ein Update des Screens zu erzeugen
   temp_ti_min = 100; // Min. Temp. Inside auf 100 zurücksetzten (Trick damit geupdated wird.)
   temp_hi_min = 100; // Min. Hum. Inside auf 100 zurücksetzten (Trick damit geupdated wird.)
   temp_to_min = 100; // Min. Temp. Outside auf 100 zurücksetzten (Trick damit geupdated wird.)
   temp_ho_min = 100; // Min. Hum. Outside auf 100 zurücksetzten (Trick damit geupdated wird.)
   lcd.clear(); // Anzeige löschen
   lcd.setCursor(2,1); // Cursorbeginn auf Zeichen 2, Zeile 2
   lcd.print("Stored Min. data"); // Text "Stored Min. data"
   lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
   lcd.print("deleted!"); // Text "deleted!"
   delay(2000); // 2s den Text anzeigen
   }
}

ht81

Teil 4:
Code: [Select]

void ShowMax() // Maximale Temp. / Luftfeuchte auf LCD darstellen
{
  tempupdate = 0; // Tempupdate auf 0 setzten
  lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
  lcd.print("           "); // Text "          "
  lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
  lcd.print("Max:"); // Text "Max:"
   if (temp_ti_max < 0.0){ // Wenn Temp. < 0.0°C
    if (temp_ti_max <= -10.0){ // Wenn Temp. <= -10.0°C
      lcd.setCursor(9,1); // Cursorbeginn auf Zeichen 9, Zeile 2
    }
    else{
      lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
    }
  }
  else if (temp_ti_max < 10.0){ // Wenn Temp. < 10.0°C
    lcd.setCursor(11,1); // Cursorbeginn auf Zeichen 11, Zeile 2
  }
  else { // Sonst normale Ausgabe
    lcd.setCursor(10,1); // Cursorbeginn auf Zeichen 10, Zeile 2
  }
  lcd.print(temp_ti_max,1); // Max. Temp. darstellen und auf 1 Stelle begrenzen
  lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
  lcd.print("C "); // Text "C "
  lcd.setCursor(17,1); // Cursorbeginn auf Zeichen 17, Zeile 2
  lcd.print(temp_hi_max,0); // Max. Luftfeuchte darstellen und ohne Nachkommastelle darstellen
  lcd.print("%"); // Text ("%")
  lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
  lcd.print("           "); // Text "          "
  lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
  lcd.print("Max:"); // Text "Max:"
  if (temp_to_max < 0.0){ // Wenn Temp. < 0.0°C
    if (temp_to_max <= -10.0){ // Wenn Temp. <= -10.0°C
      lcd.setCursor(9,3); // Cursorbeginn auf Zeichen 9, Zeile 4
    }
    else{
      lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 10, Zeile 4
    }
  }
  else if (temp_to_max < 10.0){ // Wenn Temp. < 10.0°C
    lcd.setCursor(11,3); // Cursorbeginn auf Zeichen 11, Zeile 4
  }
  else { // Sonst normale Ausgabe
    lcd.setCursor(10,3); // Cursorbeginn auf Zeichen 10, Zeile 4
  }
  lcd.print(temp_to_max,1); // Max. Temp. darstellen und auf 1 Stelle begrenzen
  lcd.print(char(223)); // Erstelle mit char(223) das ° Zeichen
  lcd.print("C "); // Text "C "
  lcd.setCursor(17,3); // Cursorbeginn auf Zeichen 17, Zeile 4
  lcd.print(temp_ho_max,0); // Max. Luftfeuchte darstellen und ohne Nachkommastelle darstellen
  lcd.print("%"); // Text ("%")
  sensors.requestTemperatures(); // Temp Werte holen lassen
  delay(1000); // Werte für 1s darstellen
  buttonState2 = digitalRead(analogPin2); // Min. Taster überwachen
  if (buttonState2 == HIGH) {  // Wenn Min. Taster nicht gedrückt ist normale Anzeige 
    lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
    lcd.print("            "); // Trick um "Max:" Text zu löschen ohne "lcd.clear" aufzurufen
    InTemperature(); // Ausgabe des Temp. Wertes vom "InTemperature"
    lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 17, Zeile 2
    HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
    lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
    lcd.print("            "); // Trick um "Max:" Text zu löschen ohne "lcd.clear" aufzurufen
    OutTemperature(); // Ausgabe des Temp. Wertes vom "OutTmperature"
    lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 17, Zeile 4
    HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityOutside"
  } else { // Wenn Max. Taster noch immer gedrückt wird, dann alle gespeicherten Werte zurücksetzten
    tempupdate = 1; //Tempupdate auf 1 setzten um nach Anzeige ein Update des Screens zu erzeugen
    temp_ti_max = 0; // Max. Temp. Inside auf 0 zurücksetzten (Trick damit geupdated wird.)
    temp_hi_max = 0; // Max. Hum. Inside auf 0 zurücksetzten (Trick damit geupdated wird.)
    temp_to_max = 0; // Max. Temp. Outside auf 0 zurücksetzten (Trick damit geupdated wird.)
    temp_ho_max = 0; // Max. Hum. Outside auf 0 zurücksetzten (Trick damit geupdated wird.)
    lcd.clear(); // Anzeige löschen
    lcd.setCursor(2,1); // Cursorbeginn auf Zeichen 2, Zeile 2
    lcd.print("Stored Max. data"); // Text "Stored Min. data"
    lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
    lcd.print("deleted!"); // Text "deleted!"
    delay(2000); // 2s den Text anzeigen
    }
}


void ShowActual () // Aktuelle Temperatur und Luftfeuchte darstellen
{
  tempupdate = 0; // Tempupdate auf 0 setzten
  if((millis() - prev) > interval) { // Delay mit Millis damit der µC nach andere Dinge paralell abarbeiten kann
    prev = millis(); // Aktuelle millis Zeit in "prev" speichern
    lcd.setCursor(0, 1); // Cursorbeginn auf Zeichen 0, Zeile 2
    lcd.print(char(1)); // Zeichne (char(1)) "update"
    sensors.requestTemperatures(); // Temp Werte holen lassen
    InTemperature(); // Ausgabe des Temp. Wertes vom "InTemperature"
    lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 17, Zeile 2
    HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
    lcd.setCursor(0, 1); // Cursorbeginn auf Zeichen 0, Zeile 2
    lcd.print(char(2)); // Zeichne (char(2)) "del"
    lcd.setCursor(0, 3); // Cursorbeginn auf Zeichen 0, Zeile 4
    lcd.print(char(1)); // Zeichne (char(1)) "update"
    sensors.requestTemperatures(); // Temp Werte holen lassen
    OutTemperature(); // Ausgabe des Temp. Wertes vom "OutTemperature"
    lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 17, Zeile 4
    HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
    lcd.setCursor(0, 3); // Cursorbeginn auf Zeichen 0, Zeile 4
    lcd.print(char(2)); // Zeichne (char(2)) "del"   
  }
}

void ShowActualClock () // Aktuelle Temperatur und Luftfeuchte darstellen
{
  tempupdate = 0; // Tempupdate auf 0 setzten
  lcd.clear(); // LCD löschen
  lcd.setCursor(0, 0); // Cursorbeginn auf Zeichen 0, Zeile 1
  lcd.print("Wohnzimmer:"); // Text "Wohnzimmer:"
  lcd.setCursor(0, 2); // Cursorbeginn auf Zeichen 0, Zeile 3
  lcd.print("Aussen:"); // Text "Aussen:"
  sensors.requestTemperatures(); // Temp Werte holen lassen
  InTemperature(); //Ausgabe des Temp. Wertes vom "InTemperature"
  lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 17, Zeile 2
  HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
  OutTemperature(); // Ausgabe des Temp. Wertes vom "OutTemperature"
  lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 17, Zeile 4
  HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityOutside"
}

ht81

Teil 5:
Code: [Select]

void digitalClockDisplay() // Uhrzeit Ausgabe auf LCD
{
  tempupdate = 1; // Tempupdate auf 1 setzten
  UpdateMinMax();
  time_t DCFtime = DCF.getTime(); // Prüfen ob neue Zeit vorhanden ist
  if (DCFtime!=0) {
    setTime(DCFtime); // Neue Zeit setzten
  }
  lcd.setCursor(0,0); // Cursorbeginn auf Zeichen 0, Zeile 1
  lcd.print("                    "); // Text "                    "
  lcd.setCursor(0,1); // Cursorbeginn auf Zeichen 0, Zeile 2
  lcd.print("     "); // Text "     "
  if (hour() < 10){
  lcd.setCursor(7,1); // Cursorbeginn auf Zeichen 7, Zeile 2
  } else {
      lcd.setCursor(6,1); // Cursorbeginn auf Zeichen 6, Zeile 2
  }
  lcd.print(hour()); // Stunden
  printDigits(minute()); // : Minuten
  printDigits(second()); // : Sekunden
  lcd.print("       "); // Text "       "
  lcd.setCursor(0,2); // Cursorbeginn auf Zeichen 0, Zeile 3
  if (day() < 10 && month() < 10){ // Wenn Tag < 10 und Monat < 10   
    lcd.print("      "); // Text "      "
  } else if (day() > 10 && month() < 10 || day() < 10 && month() > 10 ){ // Wenn Tag > 10 und Monat < 10 oder Tag < 10 und Monat > 10
      lcd.print("     "); // Text "     "
    } else { // alles andere
        lcd.print("    "); // Text "    "
      }
  lcd.print(day()); // Tag
  lcd.print("."); // Text "."
  lcd.print(month()); // Monat
  lcd.print("."); // Text "."
  lcd.print(year()); // Jahr
  lcd.print("       "); // Text "       "
  lcd.setCursor(0,3); // Cursorbeginn auf Zeichen 0, Zeile 4
  lcd.print("                    "); // Text "                    "
}

void printDigits(int digits) // Funktion um die : zwischen Std. / Min. / Sek. darzustellen
{
  lcd.print(":"); // Text ":"
  if(digits < 10) // Wenn Stunden weniger 10
      lcd.print('0'); // setzte 0 voran
      lcd.print(digits); // Ausgabe Digits
}


void SwitchButton () // Uhrzeit / Temperatur Taster überwachen
{
  int reading = digitalRead(analogPin3); // Taster einlesen
  if (reading != lastbuttonStateClock2) { // Prüfen ob Taster gedrückt wurde
    lastDebounceTime = millis(); // Debounce Timer reset
  }   
  if ((millis() - lastDebounceTime) > debounceDelay) {
    buttonStateClock = reading;
  } 
  lastbuttonStateClock2 = reading;
  if(buttonStateClock != lastbuttonStateClock) {
    lastbuttonStateClock = reading;
    buttonCount++;
  }
  if(buttonCount % 4==0) { // ButtonCount mit Mudolo zwischen 0 und 1 toggeln
    screen = 1; // setzt Screen auf 1
  }
  else {
    screen = 0; // oder Screen auf 0
  }
}


void loop(void) // Diese Loop wird ständig wiederholt
{
  Backlight(); // Aufruf der "Backlight" Loop
  UpdateMinMax(); // Min. und Max. Temp. / Luftfeuchte ermitteln und speichern
  SwitchButton(); // Uhrzeit / Temperatur Taster überwachen und Screen toggeln
  buttonState = digitalRead(analogPin1); // Min. Taster überwachen
  buttonState2 = digitalRead(analogPin2); // Max. Taster überwachen

  if (buttonState == HIGH && screen == 0 && tempupdate == 0) { // Wenn kein Taster gedrückt ist und Tempupdate = 0
    ShowActual(); // dann aktuelle Werte darstellen
  }     
  if
    (buttonState == LOW && screen == 0 && tempupdate == 0) {  // Wenn Min. Taster gedrückt ist und Tempupdate = 0   
    ShowMin(); // zeige Minimale Temperaturen und Luftfeuchte
  }
  if
    (buttonState2 == LOW && screen == 0 && tempupdate == 0) { // Wenn Max. Taster gedrückt ist und Tempupdate = 0   
    ShowMax(); // zeige Maximale Temperaturen und Luftfeuchte
  }
  if (screen == 1 ) { // Wenn kein Taster gedrückt ist und Screen == 1
    digitalClockDisplay(); // dann aktuelle Uhrzeit und Datum darstellen
  }
  if (screen == 0 && tempupdate == 1) { // Wenn kein Taster gedrückt ist, Screen == 0 und Tempupdate = 1
    ShowActualClock(); // dann zurück zur Temperaturanzeige aber vorher den Screen löschen
  }
}

ht81

So, das ist mein gesamter Code bis jetzt. Wie gesagt, eigentlich ist es schon fertig, bis auf den Fehler den ich gelegentlich bekomme. Alle Sensoren befinden sich auf dem Steckbrett und sollten demnach relativ identische Werte liefern. Ich habe öfters mal im Code versucht durch Tricks ein lcd.clear() zu vermeiden, da dadurch die Anzeige "flackert". Ich denke ihr werded schon sehen wo ich wie was gemacht habe.... ;) Ist zwar nicht so dolle der Code, aber funktioniert bis auf meinen Fehler.......

ht81

So, inzwischen konnte ich folgendes beobachten. Ich habe alle meine "verzögerungen" auskommentiert. Ebenso die DS18B20 und habe anschließend die Loop so aufgebaut das nur noch NONSTOP DHT11 & DHT22 ohne jede verzögerung ausgelesen werden. Und siehe da......der Fehler ist zu sehen. Also scheint es wohl wirklich ein Timing Problem zu sein.......

Ich probiere jetzt mal deinen Code nochmals anderst einzubinden um den Interval entsprechend zu erhöhen....

ht81

Also, ich habe trotz dem neuen Code von Dir immernoch das Problem. Ich habe im Moment die Verzögerung von 4s drin, jedoch hilft das auch nicht. Noch irgend eine andere Idee? Was kann man da noch machen?

Go Up