RTC läuft "holprig"

Guten Morgen

Nachdem ich nun die RTC mit LCD zum Laufen gebracht habe, und auch 3 Temperatursensoren (2x DS18B20, 1x DHT22) anzeigen kann, habe ich das Problem, dass die RTC etwas holprig läuft. D.h., die Zeit stimmt grundsätzlich, nur springt die Anzeige manchmal bei 2 sec, manchmal erst bei 3 sec weiter, also nicht im Sekundentakt.

Wie muss ich die Uhr einbinden, damit sie flüssig läuft (bzw. flüssig angezeigt wird)? Ich nehme an, dass hier der restliche Code "stört", also für die Verzögerungen sorgt.

Hallo,
lösche doch einfach den restlichen Code der stört.
Es könnte auch etwas bringen, alle "delay´s" zu löschen.
Gruß und Spaß
Andreas

Sicher stört der restliche Code.
Zeig uns mal den sketch.
Grüße Uwe

Na ja, wenn ich den restlichen Code lösche, habe ich ja nur die Uhr :sob:

[code]

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DHT.h>
#include <DS3232RTC.h>
#include <Time.h>

DHT dht;

#define ONE_WIRE_BUS 8    

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

LiquidCrystal lcd(12, 11, 4, 5, 6, 7);

DeviceAddress Probe01 = { 0x28, 0xFF, 0x82, 0xEF, 0x35, 0x16, 0x03, 0x9C }; // "4"
DeviceAddress Probe02 = { 0x28, 0xFF, 0x83, 0x62, 0x35, 0x16, 0x03, 0x15 }; // "5"

void setup(){

  setSyncProvider(RTC.get);   
  
  sensors.begin();
  sensors.setResolution(Probe01, 10);
  sensors.setResolution(Probe02, 10);
 
  lcd.begin (20,4);  // 20 characters, 4 lines
  lcd.print("Initialisierung....");
  delay(1000);
  lcd.clear();

    dht.setup(9);

}


void loop(){

  printLCD();
  
  sensors.requestTemperatures(); 

  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperatur = dht.getTemperature();
  
  lcd.setCursor(0, 0);
  lcd.print("T1: ");
  lcd.setCursor(5, 0);
  lcd.print("T2: ");
  lcd.setCursor(10, 0);
  lcd.print("T3: ");
  lcd.setCursor(15, 0);
  lcd.print("RelF");

  lcd.setCursor(0,1);
  displayTemperature(Probe01);
  lcd.setCursor(5,1);  
  lcd.print(temperatur, 1);
  lcd.setCursor(10,1);
  displayTemperature(Probe02);
  lcd.setCursor(15, 1);
  lcd.print(humidity, 1);
  
}

void displayTemperature(DeviceAddress deviceAddress){

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00){
    lcd.print("Temperature Error");
   } 
   else{
   lcd.print(tempC,1);
   
   }
}

void printLCD() {
    lcd.setCursor(12,3);
    print_Digits(hour());
    lcd.print(":");
    print_Digits(minute());
    lcd.print(":");
    print_Digits(second());
}

void print_Digits(int digits) {
    if(digits < 10)
      lcd.print('0');
    lcd.print(digits);
}

[/code]

buffalo64:
void loop(){
delay(dht.getMinimumSamplingPeriod());

Das ist dein Übeltäter. Hier bleibt der Code einfach eine Sekunde oder mehr stehen. Du musst die DHT-Abfrage mit Millis steuern. Schau dir das Beispiel BlinkwithoutDelay an.

OK, danke. Ist hier überhaupt ein Delay notwendig? Ich habe es jetzt versuchsweise auskommentiert und es funktioniert jetzt sowohl die Uhr als auch die Temperaturanzeige.

Die Sensoren haben verschiedene Aktualisierungsintervalle. Sie könnten durch zu häufige Abfrage durcheinander kommen oder der erhöhte Energieverbrauch durch die Abfragen lässt die Sensoren sich leicht erwärmen und damit falsch messen. Deshalb sollte man sie nur alle ein bis zwei Sekunden auslesen.

Hallo,
wenn Du es über millis() machst, dann weißt Du nie wann gemessen wird.
Mache es doch über eine Abfrage:

If (Sekunden == 0)
dann messen

Dann weißt Du, das zu jeder vollen Minute gemessen wird.
Dieses "dann messen" setzt Du dann noch in eine logische Abfrage, so-
das nur 1x gemessen wird, wenn Sekunde == 0 ist.
Übers SensorTiming brauchst Du Dich dann nicht mehr kümmern.
Gruß und Spaß
Andreas

Die Zeitanzeige brauchst du doch auch nur jede Sekunde einmal.
OK, gibt Leute, die den Doppelpunkt blinken lassen

void loop() {
 int current = millis();
 if ( current & 0x1ff == 0) { // alle 512 ms 
   printLCD (current & 0x200); // abwechselnd true/false
   if (current & 0x3F00 == 0) { // alle 16 sec
      getTempAndDisplay(); 
   }
   delay (2); // damit millis() danach sicher einen anderen Wert hat
 }
}
void printLCD(bool blink) {
    lcd.setCursor(12,3);
    print_Digits(hour());
    lcd.print(":");
    print_Digits(minute());
    lcd.print(blink ? ":" : " "); // kann man natürlich auch mit if / else schreiben
    print_Digits(second());
}

Gegenvorschlag, der keine extra Statusprüfung braucht, ob in dieser Sekunde schon was gemacht wurde

Ok,danke, schaue ich mir genauer an.

Alle Sekunden für die Temperatur ist mir zu selten, da muss ich schauen, wie ich den Abfrageintervall derSensoren auf erstmal 10 sek. bekomme.

Heute ist das Arduino Kochbuch gekommen ;D , da müsste ich dann auch besser weiter kommen. ....

Hallo,
vielleicht so:

int Modulo;

Modulo = Sekunden % 10;
if (Modulo == 0)
{
messen
}

Hier wird alle 10 Sekunden gemessen, weil die Sekunden, geteilt durch 10-
den Rest 0 (nul) ergibt. D.h. die Stelle nach dem Komma ist 0.
Gruß und Spaß
Andreas

P.S. was macht dieser HEX-Mist da eigentlich. Ist das jetzt eine neue Mode?
Das fällt mir in Sketchen immer öfter auf.

SkobyMobil:
P.S. was macht dieser HEX-Mist da eigentlich. Ist das jetzt eine neue Mode?
Das fällt mir in Sketchen immer öfter auf.

Das stört nur Leute, die keine Ahnung haben was Modulo (und vielleicht sogar Hex) bedeutet.

Ist das jetzt eine neue Mode

Ist eher etwas altmodisch, und passt daher gut zu so kleinen Controllern (und mir).
Ansonsten, danke Whandall. :wink:


den Rest 0 (nul) ergibt. D.h. die Stelle nach dem Komma ist 0.

Das brauche ich sicher nicht zu verstehen. Welches Komma?

SkobyMobil:
Hier wird alle 10 Sekunden gemessen, weil die Sekunden, geteilt durch 10-
den Rest 0 (nul) ergibt. D.h. die Stelle nach dem Komma ist 0.

Die Stelle nach dem komma ist bei intger-Variablen eigentlich immer null.

Grüße Uwe