Pages: 1 [2]   Go Down
Author Topic: Mal wieder millis()..... ;)  (Read 1898 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Teil 3:

Code:
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
    }
}
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Teil 4:
Code:
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"
}
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Teil 5:
Code:
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
  }
}
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.... smiley-wink Ist zwar nicht so dolle der Code, aber funktioniert bis auf meinen Fehler.......
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 1
Posts: 89
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Pages: 1 [2]   Go Up
Jump to: