Problem Abfragen Inputs zu langsam

Hallo Forum,

ich habe ein Problem mit der Geschwindigkeit in der Abarbeitung der Inputs.
Das programm soll Besucher zählen mit Industrie-Lichtschranken die schnell genug
sind ( getestet ). Es begann mit 2 Lichtschranken, da bei der Konzeption nicht von Rück-
wärtsbegungen die Rede war, kamen noch 2 Stck hinzu. es sind noch andere Funktionen wie
Temperatur und Speichern auf SD vorhanden die funktionieren. Das Ganze läuft mit einem
Adafruit Shield RTC/SD.
Das Zählen funktioniert nur bei langsamen Bewegungen.

Meine Bitte : was kann man im Programm so strukturieren um den Teil der Zählung nicht
zu verlangsamen ? Ist denn die Struktur das Problem ?

Vielen Dank für Hinweise im voraus.

/*
******* BESUCHERZÄHLER *******
*/
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;
const int LS1 = 2; // DI2 = Lichtschranke 1
const int LS2 = 3; // DI3 = Lichtschranke 2
const int LS3 = 4; // DI4 = Lichtschranke 3
const int LS4 = 5; // DI5 = Lichtschranke 4
OneWire ds(6); // DI6 = 18B20
const int buttonPin1 = 7; // DI7 = Count up
const int buttonPin2 = 8; // DI8 = Count down
boolean Countup = 0; // Inc Besucher manuell (DI7)
boolean Countdown = 0; // Dec Besucher manuell (DI8)

int Sensor1; // Variable LS 1
int Sensor2; // Variable LS 2
int Sensor3; // Variable LS 3
int Sensor4; // Variable LS 4
boolean schmier1 = 0; // Merker LS 1 betätigt
boolean schmier2 = 0; // Merker LS 2 betätigt
boolean schmier3 = 0; // Merker LS 3 betätigt
boolean schmier4 = 0; // Merker LS 4 betätigt vor
boolean schmier5 = 0; // Merker LS 4 betätigt zurück
boolean Zeit = false; // Merker Zeit > 19:30
int counter = 0; // Besucher aktuell

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long Debounce=500;
long DelayTemp = 100;
long WrongLS12=2000; // Keine LS2 nach LS1
long WrongLS23=2000; // Keine LS3 nach LS2
long WrongLS34=2000; // Keine LS4 nach LS3

float AnzTempLow; // Anzeige min Temperatur
float AnzTempHigh; // Anzeige max Temperatur
float TempHigh = 8.0; // Startwert maxTemp n.Reset
float TempLow = 25.0; // Startwert minTemp n.Reset

File myFile;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float celsius; // Temperatur von Sensor
char dateString[7]; // Daten-String Datum

unsigned long interval_1=800;
unsigned long waitUntil_1=interval_1;
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// oder 0x3f
void setup()
{ // Void Setup
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(20,4);
pinMode(LS1, INPUT); // DI2
pinMode(LS2, INPUT); // DI3
pinMode(LS3, INPUT); // DI4
pinMode(LS4, INPUT); // DI5
pinMode(buttonPin1, INPUT); // DI7
pinMode(buttonPin2, INPUT); // DI8
pinMode(10, OUTPUT); // D010 (SD-Card )

// Zeile zum Setzen RTC
//RTC.adjust(DateTime(DATE, TIME));

} // Void Setup

void loop()
{
DateTime now = RTC.now();
Sensor1 = digitalRead(LS1);
Sensor2 = digitalRead(LS2);
Sensor3 = digitalRead(LS3);
Sensor4 = digitalRead(LS4);
Countup = digitalRead(buttonPin1);
Countdown = digitalRead(buttonPin2);
unsigned long currentMillis = millis();

// ******************************************
// BEREICH ZÄHLER
// ******************************************

// Merker setzen wenn 19:30:01 Uhr >> Zählen unterbinden
if ((now.hour()==19)&&(now.minute()==30)&&(now.second()==1))
Zeit = true;
// Merker rücksetzen um
if ((now.hour()==19)&&(now.minute()==33)&&(now.second()==1))
Zeit = false;

// Merker setzen wenn LS 1 betätigt
if ((Sensor1==1)&&(Sensor2==0))
{
schmier1 = 1;
previousMillis1= currentMillis;
}
// Merker setzen wenn LS 2 betätigt
if ((Sensor2==1)&&(schmier1==1))
{
schmier2 = 1;
schmier1 = 0;
previousMillis2= currentMillis;
}
// Merker setzen wenn LS 3 betätigt
if ((Sensor3==1)&&(schmier2==1))
{
schmier3 = 1;
schmier2 = 0;
previousMillis3= currentMillis;
}
// Merker setzen wenn LS 4 betätigt
if ((Sensor4==1)&&(schmier3==1))
{
schmier4 = 1;
schmier3 = 0;
}
// Merker setzen wenn LS 4 betätigt als
// Rückwärtsbewegung und Sensor 1 war betätigt
if ((Sensor4==1)&&(schmier1==1))
{
schmier1 = 0;
}
// Merker rücksetzen wenn LS 3 betätigt nach
// Rückwärtsbewegung und LS4 war betätigt
if ((Sensor3==1)&&(schmier5==1))
{
schmier5 = 0;
schmier1 = 0;
}
// Zähler hochzählen +1
if ((schmier4==1)&&(Sensor4==0))
{
counter+=1;
delay(80);
schmier4 = false;
}
// Abfrage Zeit keine Betätigung LS 2 >> Reset Merker
if ((Sensor2==0)&&(schmier1==1)
&&(currentMillis - previousMillis1 > WrongLS12))
{
schmier1 = false;
}
// Abfrage Zeit keine Betätigung LS 3 >> Reset Merker
if ((Sensor3==0)&&(schmier2==1)
&&(currentMillis - previousMillis2 > WrongLS23))
{
schmier2 = false;
}
// Abfrage Zeit keine Betätigung LS 4 >> Reset Merker
if ((Sensor4==0)&&(schmier3==1)
&&(currentMillis - previousMillis3 > WrongLS23))
{
schmier3 = false;
}
//
// Manuelles Zählen Besucher
//
if (Countup==true)
{ // loop Count up manuell
counter = counter + 1;
delay(300);
} // loop Count up manuell
//
if (Countdown==true)
{ // loop Count down manuell
counter = counter - 1;
delay(300);
} // loop Count down manuell
//
// Bereich Temperaturerfassung und Ermittlung min / max
//
if ( !ds.search(addr)) {
ds.reset_search();
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44,0); // start conversion, with parasite power off
// chip present
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
delay(300);
for ( i = 0; i < 9; i++) { // we need 9 bytes of data
data = ds.read(); }
_ celsius = ((data[1] << 8) + data[0] ) * 0.0625; // 12Bit = 0,0625 C per Bit_

  • if (celsius > TempHigh ){*
  • TempHigh = celsius; }*
  • if (celsius < TempLow)*
  • TempLow = celsius;*
    //
    // Ende Temperatur
    //
  • sprintf_P(dateString, PSTR("%02d.%02d.%02d"), now.day(), now.month(), now.year());*
    //
    // Ausgabe auf LCD
    //
  • lcd.setCursor(2,0);*
    // Führende Leerstelle Tage einfügen wenn unter 10
  • if((now.day())<10)*
  • lcd.print(' '); *
  • lcd.print(now.day());*
  • lcd.print(".");*
  • lcd.print(now.month());*
  • lcd.print(".");*
  • lcd.print(now.year());*
  • lcd.print(" ");*
    // Führende Null Stunden einfügen wenn unter 10
  • if((now.hour())<10)*
  • lcd.print('0');*
  • lcd.print(now.hour());*
  • lcd.print(":");*
    // Führende Null Minuten einfügen wenn unter 10
  • if((now.minute())<10)*
  • lcd.print('0');*
  • lcd.print(now.minute());*
  • lcd.setCursor(1,1);*
  • lcd.print("Temperatur: ");*
  • lcd.print(celsius,1);*
  • lcd.print(" ");*
  • lcd.write(223);*
  • lcd.print("C");*
  • lcd.setCursor(0,2);*
  • lcd.print("min: ");*
    // Führende Null Temperatur einfügen wenn unter 10
  • if((TempLow)<10)*
  • lcd.print('0');*
  • lcd.print(TempLow,1);*
  • lcd.print(" max: ");*
    // Führende Null Temperatur einfügen wenn unter 10
  • if((TempHigh)<10)*
  • lcd.print('0');*
  • lcd.print(TempHigh,1);*
  • lcd.setCursor(3,3);*
  • lcd.print("Besucher: ");*
  • lcd.print(counter);*
  • // Nachführende Leerzeichen einfügen wenn unter 10*
  • if (counter<10)*
  • lcd.print(" ");*
    //
    *// SD Karte beschreiben um 20:30:01 *
    //
  • if ((now.hour()==20)&&(now.minute()==30)&&(now.second()==1))*
    // if (((now.minute()==5)||(now.minute()==35))&&
    // ((now.second()==0)||(now.second()==1)))
  • { // loop SD Karte beschreiben*
  • SD.begin(10); *
  • myFile = SD.open("Daten.txt", FILE_WRITE);*
  • if (myFile)*
  • { // loop SD Karte geöffnet*
  • myFile.print(dateString); *
  • myFile.print(","); *
  • myFile.print(TempLow,1);*
  • myFile.print(",");*
  • myFile.print(TempHigh,1);*
  • myFile.print(",");*
  • myFile.println(counter);*
  • myFile.close();*
  • delay(1500); *
    } // loop SD Card geöffnet
    } // loop SD Card beschreiben
    //
    // Werte rücksetzen jeden Tag um 08:30:00 + 08:30:01
    //
  • if ((now.hour()==8)&&(now.minute()==30)&&((now.second()==0)||(now.second()==1)))*
  • { // Reset Werte*
  • TempHigh = 8.0;*
  • TempLow = 25.0;*
  • counter = 0;*
  • Zeit = false;*
  • } // Reset Werte*

} // Void loop
Gruss olmuk

Code sollte immer im Code-Tag stehen (Editor -> #)
Das deine Abfragen zu langsam sind, wird mit dem Sketch deutlich! Schau dir auf jedenfall erst einmal das Tutorial BlinkWithoutMillis an.

/*
******* BESUCHERZÄHLER *******
*/
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;
const int LS1 = 2;           // DI2 = Lichtschranke 1
const int LS2 = 3;           // DI3 = Lichtschranke 2
const int LS3 = 4;           // DI4 = Lichtschranke 3
const int LS4 = 5;           // DI5 = Lichtschranke 4
OneWire  ds(6);              // DI6 = 18B20
const int buttonPin1 = 7;    // DI7 = Count up
const int buttonPin2 = 8;    // DI8 = Count down
boolean Countup = 0;         // Inc Besucher manuell (DI7)
boolean Countdown = 0;       // Dec Besucher manuell (DI8)

int Sensor1;                 // Variable LS 1
int Sensor2;                 // Variable LS 2
int Sensor3;                 // Variable LS 3
int Sensor4;                 // Variable LS 4
boolean schmier1 = 0;        // Merker LS 1 betätigt
boolean schmier2 = 0;        // Merker LS 2 betätigt
boolean schmier3 = 0;        // Merker LS 3 betätigt
boolean schmier4 = 0;        // Merker LS 4 betätigt vor
boolean schmier5 = 0;        // Merker LS 4 betätigt zurück
boolean Zeit = false;        // Merker Zeit > 19:30
int counter = 0;             // Besucher aktuell

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long Debounce=500;
long DelayTemp = 100;
long WrongLS12=2000;       // Keine LS2 nach LS1
long WrongLS23=2000;       // Keine LS3 nach LS2
long WrongLS34=2000;       // Keine LS4 nach LS3

float AnzTempLow;          // Anzeige min Temperatur
float AnzTempHigh;         // Anzeige max Temperatur
float TempHigh = 8.0;      // Startwert maxTemp n.Reset
float TempLow = 25.0;      // Startwert minTemp n.Reset

File myFile;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float celsius;             // Temperatur von Sensor
char dateString[7];        // Daten-String Datum

unsigned long interval_1=800;
unsigned long waitUntil_1=interval_1;
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// oder 0x3f
void setup()
{ // Void Setup
	Serial.begin(9600);
	Wire.begin();
	RTC.begin();
	lcd.begin(20,4);
	pinMode(LS1, INPUT);         // DI2
	pinMode(LS2, INPUT);         // DI3
	pinMode(LS3, INPUT);         // DI4
	pinMode(LS4, INPUT);         // DI5
	pinMode(buttonPin1, INPUT);  // DI7
	pinMode(buttonPin2, INPUT);  // DI8
	pinMode(10, OUTPUT);         // D010 (SD-Card )

	// Zeile zum Setzen RTC
	//RTC.adjust(DateTime(__DATE__, __TIME__));

} // Void Setup

void loop()
{
	DateTime now = RTC.now();
	Sensor1 = digitalRead(LS1);
	Sensor2 = digitalRead(LS2);
	Sensor3 = digitalRead(LS3);
	Sensor4 = digitalRead(LS4);
	Countup = digitalRead(buttonPin1);
	Countdown = digitalRead(buttonPin2);
	unsigned long currentMillis = millis();
	
	// ******************************************
	// BEREICH ZÄHLER
	// ******************************************

	// Merker setzen wenn 19:30:01 Uhr >> Zählen unterbinden
	if ((now.hour()==19)&&(now.minute()==30)&&(now.second()==1))
	Zeit = true;
	// Merker rücksetzen um
	if ((now.hour()==19)&&(now.minute()==33)&&(now.second()==1))
	Zeit = false;
	
	// Merker setzen wenn LS 1 betätigt
	if ((Sensor1==1)&&(Sensor2==0))
	{
		schmier1 = 1;
		previousMillis1= currentMillis;
	}
	// Merker setzen wenn LS 2 betätigt
	if ((Sensor2==1)&&(schmier1==1))
	{
		schmier2 = 1;
		schmier1 = 0;
		previousMillis2= currentMillis;
	}
	// Merker setzen wenn LS 3 betätigt
	if ((Sensor3==1)&&(schmier2==1))
	{
		schmier3 = 1;
		schmier2 = 0;
		previousMillis3= currentMillis;
	}
	// Merker setzen wenn LS 4 betätigt
	if ((Sensor4==1)&&(schmier3==1))
	{
		schmier4 = 1;
		schmier3 = 0;
	}
	// Merker setzen wenn LS 4 betätigt als
	// Rückwärtsbewegung und Sensor 1 war betätigt
	if ((Sensor4==1)&&(schmier1==1))
	{
		schmier1 = 0;
	}
	// Merker rücksetzen wenn LS 3 betätigt nach
	// Rückwärtsbewegung und LS4 war betätigt
	if ((Sensor3==1)&&(schmier5==1))
	{
		schmier5 = 0;
		schmier1 = 0;
	}
	// Zähler hochzählen +1
	if ((schmier4==1)&&(Sensor4==0))
	{
		counter+=1;
		delay(80);
		schmier4 = false;
	}
	// Abfrage Zeit keine Betätigung LS 2 >> Reset Merker
	if ((Sensor2==0)&&(schmier1==1)
	&&(currentMillis - previousMillis1 > WrongLS12))
	{
		schmier1 = false;
	}
	// Abfrage Zeit keine Betätigung LS 3 >> Reset Merker
	if ((Sensor3==0)&&(schmier2==1)
	&&(currentMillis - previousMillis2 > WrongLS23))
	{
		schmier2 = false;
	}
	// Abfrage Zeit keine Betätigung LS 4 >> Reset Merker
	if ((Sensor4==0)&&(schmier3==1)
	&&(currentMillis - previousMillis3 > WrongLS23))
	{
		schmier3 = false;
	}
	//
	// Manuelles Zählen Besucher
	//
	if (Countup==true)
	{ // loop Count up manuell
		counter = counter + 1;
		delay(300);
	} // loop Count up manuell
	//
	if (Countdown==true)
	{ // loop Count down manuell
		counter = counter - 1;
		delay(300);
	} // loop Count down manuell
	//
	// Bereich Temperaturerfassung und Ermittlung min / max
	//
	if ( !ds.search(addr)) {
		ds.reset_search();
		return;
	}
	ds.reset();
	ds.select(addr);
	ds.write(0x44,0);          // start conversion, with parasite power off
	// chip present
	present = ds.reset();
	ds.select(addr);
	ds.write(0xBE);
	delay(300);
	for ( i = 0; i < 9; i++) {  // we need 9 bytes of data
	data = ds.read(); }
	celsius =  ((data[1] << smiley-cool + data[0] ) * 0.0625;  // 12Bit = 0,0625 C per Bit

	if (celsius > TempHigh ){
	TempHigh = celsius; }
	if (celsius < TempLow)
	TempLow = celsius;
	//
	// Ende Temperatur
	//
	sprintf_P(dateString, PSTR("%02d.%02d.%02d"), now.day(), now.month(), now.year());
	//
	// Ausgabe auf LCD
	//
	lcd.setCursor(2,0);
	// Führende Leerstelle Tage einfügen wenn unter 10
	if((now.day())<10)
	lcd.print(' ');
	lcd.print(now.day());
	lcd.print(".");
	lcd.print(now.month());
	lcd.print(".");
	lcd.print(now.year());
	lcd.print("  ");
	// Führende Null Stunden einfügen wenn unter 10
	if((now.hour())<10)
	lcd.print('0');
	lcd.print(now.hour());
	lcd.print(":");
	// Führende Null Minuten einfügen wenn unter 10
	if((now.minute())<10)
	lcd.print('0');
	lcd.print(now.minute());
	lcd.setCursor(1,1);
	lcd.print("Temperatur: ");
	lcd.print(celsius,1);
	lcd.print(" ");
	lcd.write(223);
	lcd.print("C");
	lcd.setCursor(0,2);
	lcd.print("min: ");
	// Führende Null Temperatur einfügen wenn unter 10
	if((TempLow)<10)
	lcd.print('0');
	lcd.print(TempLow,1);
	lcd.print("  max: ");
	// Führende Null Temperatur einfügen wenn unter 10
	if((TempHigh)<10)
	lcd.print('0');
	lcd.print(TempHigh,1);
	lcd.setCursor(3,3);
	lcd.print("Besucher: ");
	lcd.print(counter);
	// Nachführende Leerzeichen einfügen wenn unter 10
	if (counter<10)
	lcd.print("   ");
	//
	// SD Karte beschreiben um 20:30:01
	//
	if ((now.hour()==20)&&(now.minute()==30)&&(now.second()==1))
	//    if (((now.minute()==5)||(now.minute()==35))&&
	//    ((now.second()==0)||(now.second()==1)))
	{ // loop SD Karte beschreiben
		SD.begin(10);
		myFile = SD.open("Daten.txt", FILE_WRITE);

		if (myFile)
		{  // loop SD Karte geöffnet
			myFile.print(dateString);
			myFile.print(",");
			myFile.print(TempLow,1);
			myFile.print(",");
			myFile.print(TempHigh,1);
			myFile.print(",");
			myFile.println(counter);
			myFile.close();
			delay(1500);
		} // loop SD Card geöffnet

	} // loop SD Card beschreiben

	//
	// Werte rücksetzen jeden Tag um 08:30:00 + 08:30:01
	//
	if ((now.hour()==8)&&(now.minute()==30)&&((now.second()==0)||(now.second()==1)))
	{ // Reset Werte
		TempHigh = 8.0;
		TempLow = 25.0;
		counter = 0;
		Zeit = false;
	} // Reset Werte
	
} // Void loop

Helf mir mal bitte auf die Sprünge bezüglich der Formatierung.
Die delays für das manuelle Zählen sind nur als eine Art debouncing

Musste mein Edit oben aufgrund der Zeichenlänge unterbrechen, hier die Fortsetzung

Desweiteren solltes du Teile deiner loop in sinnvolle Funktionen unterteilen. Alles untereinander zu schreiben ist sehr unübersichtlich.

So, ich versuche nun mal die Punkte nach einander aufzulisten, die du in deiner loop dringend ändern solltest

  1. Abfragen kann man wie in deinem Fall auch kürzer zusammenfassen, des weiteren sind auch nicht so viele Klammern notwendig.
	// Zähler hochzählen +1
	if ((schmier4==1)&&(Sensor4==0))
	{
		counter+=1;
		delay(80);
		schmier4 = false;
	}

=>

	// Zähler hochzählen +1
	if (schmier4 && !Sensor4)
	{
		counter++; // wenn du nur um einen Wert erhöhen möchtest, reicht ++, +=X kann man verwenden, wenn jedesmal der Wert um 2 oder mehr erhöht werden soll.
		delay(80); // <- Das sollte raus
		schmier4 = false;
	}
  1. Wie in 1. schon angemerkt. Die delays solltest du vermeiden. Dieses stoppen deinen MCU für die Zeit von delay.
	if (Countup==true)
	{ // loop Count up manuell
		counter = counter + 1;
		delay(300);
	} // loop Count up manuell
	//
	if (Countdown==true)
	{ // loop Count down manuell
		counter = counter - 1;
		delay(300);
	} // loop Count down manuell

Auch wenn diese Codeabschnitt nur manuell ausgeführt wird, 300ms delay ist zu viel. Zum Taster entprellen reicht deutlich weniger. Mache ein richtiges Entprellen. Entweder über Hardware oder Software. -> Debounce
4. Handelt es sich bei dem ds. um einem DS18B20 oä.? Wenn ja, diesen muss man micht jeden Durchlauf abfragen. Des weiteren schau dich hier im Forum um. Dort gab es inzwischen schon mehrere Lösungen, das komplett ohne delay zu machen.
5. Displayausgaben sollte du nicht häufiger als 1mal die Sekunde aktualisieren.
6. SD Karte das gleiche, delay raus. Du kannst dir einen Flag setzen. PseudoCode if(Zeit == 20:30:01 && !flag) { flag =1; /* SD Operationen */} else if(Zeit == 20:31:00 && flag) {flag = 0;}

Letztes Edit zum Schluss:
Es sollte immer versucht werden, die loop schnellstmöglich zu durchlaufen <1ms. Dann bekommst du auch keine Probleme mit den Digitalen Eingängen. Es werden dann keine mehr verpasst und Interupts sind für sowas dann unnötig.

Wie immer sehr rege und sofort!! danke
Mache doch noch viele Anfänger-Fehler.
Wie könnte denn eine Abfrage des 18BS20 nicht bei jedem Durchlauf aussehen ?
Habe Deinen Hinweis zur Recherche verstanden - gib mir mal nen Ansatz

olmuk:
Wie könnte denn eine Abfrage des 18BS20 nicht bei jedem Durchlauf aussehen ?

Das Auslesen durch eine Abfrage von millis() Verzögern. Wie andere zeitgesteuerte Sachen auch.

Wenn du dir auch gleich das Zwangs-Delay ersparen willst (weil die Zeit zwischen Anfordern und Ende der Wandlung 93-750ms dauert), verwende diese Library:
http://www.milesburton.com/Dallas_Temperature_Control_Library

Dann kann man das machen:

const unsigned long TEMP_POLLING_INTERVAL = 1000UL;

OneWire oneWire(10);
DallasTemperature sensors(&oneWire);

DeviceAddress sensorList[] = 
{	
         { 0x28,0x68,0x2A,0xA4,0x05,0x00,0x00,0xAB },
         { 0x28,0x82,0x38,0xA5,0x05,0x00,0x00,0x3D }	
};
float temperatures[2];

void setup()
{	
  Serial.begin(115200);
  sensors.begin();
  sensors.setWaitForConversion(false);      //macht die Abfrage nicht-blockierend
  sensors.setResolution(10);
}

void loop()
{
    if(readTemperatureSensors())
    {
         Serial.println(temperatures[0]);
         Serial.println(temperatures[1]);
         Serial.println();
    }
}

bool readTemperatureSensors()
{
	static unsigned long previousRequestMillis;
	static unsigned long previousPollingMillis;
	static bool dataRequested;

	if(dataRequested == true && millis() - previousRequestMillis > 190)      //Delay anpassen wenn man eine andere Auflösung verwendet! 9 Bit = 94ms, 10 Bit = 188ms, 11 Bit = 375ms, 12 Bit = 750ms
	{
		temperatures[0] = sensors.getTempC(sensorList[0]);
		temperatures[1] = sensors.getTempC(sensorList[1]);
		dataRequested = false;
		return true;
	}
	
	if(dataRequested == false && millis() - previousPollingMillis > TEMP_POLLING_INTERVAL)
	{
		previousPollingMillis = millis();

		sensors.requestTemperatures();
		dataRequested = true;
		previousRequestMillis = millis();
	}

	return false;
}

@ sschultewolter : blink without millis könnte interessant werden :stuck_out_tongue:
Erst mal vielen Dank - ich baue um und teste am Wochenende
Gruss olmuk