Hallo,
wenn es mit 750ms funktioniert, Deine jetzigen 800 kannste ruhig auf 750 absenken, würde bestätigen wie ich Deinen Programmablauf verstanden habe.
Du startest über "if t + Wartezeit <= now()" eine neue Messung. Wartest 100ms und liest die Temperaturwerte aus. Genauso funktioniert das aber nicht mit der benötigten Wartezeit.
Zwischen dem Befehl "Messung starten" und neue "Werte auslesen" müssen bei 12Bit besagte 750ms Wartezeit liegen. Weil der Sensor so viel Zeit für die interne Messung und Wandlung benötigt. Nach dem auslesen kannst Du meinetwegen sofort eine neue Messung starten.
Du kannst auch Deine 100ms beibehalten, wenn Du nur 9 Bit Auflösung einstellst. Dann ist der Sensor laut Datenblatt in 93ms fertig. Geht aber nur bei Deinem DS18B20. Ich habe den billigeren DS18S20, der nur 9 Bit in 750ms kann.
Hier folgt jetzt mein alter Testcode mit dem Bsp. der Library. Nach dem Befehl "Messung starten" wird sich der aktuelle millis Wert gemerkt und wenn der um die Zeitspanne vom eingestellten delay weiter ist, erst dann wird ausgelesen und sofort wieder eine neue Messung gestartet. Hat auch den Vorteil, dass man seinen Programm nicht blockiert.
// loop läuft unter 1ms
//
// Sample of using Async reading of Dallas Temperature Sensors
//
#include <SPI.h>
#include <DogLcdSPI.h> // für Hardware SPI angepaßte DogLcd.h
DogLcdSPI lcd(26, 27); // Pins für RS und CSB
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 3 on the Arduino
#define ONE_WIRE_BUS 3
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. DS18S20
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = { 0x10, 0x40, 0xDD, 0xC3, 0x2, 0x8, 0x0, 0xB4 };
DeviceAddress sensor2 = { 0x10, 0x8A, 0xB, 0xAC, 0x2, 0x8, 0x0, 0x2C };
float TempSensor1 = 0.0; // Zwischenspeicher zum auslesen und SD Card
float TempSensor2 = 0.0; // Zwischenspeicher zum auslesen und SD Card
unsigned long lastTempRequest = 0;
int delayInMillis = 750;
//float temperature = 0.0;
//
// SETUP
//
void setup(void)
{
Serial.begin(9600);
sensors.begin();
sensors.setResolution(sensor1, 9);
sensors.setResolution(sensor2, 9);
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
delayInMillis = 750;
lastTempRequest = millis();
SPI.begin();
// set up the LCD type and the contrast setting for the display
lcd.begin(DOG_LCD_M163); // EA-DOGM Display 3 zeilig
lcd.noCursor(); // Cursor nicht sichtbar
lcd.print(F("MEGA")); // Print a message to the LCD.
}
void loop(void)
{
if (millis() - lastTempRequest >= delayInMillis) // Wartezeit vorbei ?
{
TempSensor1 = sensors.getTempC(sensor1); // 1. Dallas Sensor auslesen (Device Adresse)
TempSensor2 = sensors.getTempC(sensor2); // 2. Dallas Sensor auslesen (Device Adresse)
TempToDisplay( 0,1,TempSensor1); // DS18S20 Temperaturwert Ausgabe auf Display (X,Y,Wert)
TempToDisplay(10,1,TempSensor2);
sensors.requestTemperatures();
lastTempRequest = millis();
}
// we can do usefull things here
}
// DS18S20 Ausgabe auf Display
void TempToDisplay(byte Spalte, byte Zeile, float Temp)
{
lcd.setCursor(Spalte,Zeile);
lcd.print(Temp,1);
lcd.write(0xDF); // ° Zeichen vom DOGM internen Zeichensatz
lcd.print(F("C"));
}