Sekundenintervalle ungenau

Hi

Wenn man statt
startzeit = millis();
-->
startzeit+=INTERVALL;
schreibt, verschleppt sich auch nicht der Zeitpunkt.
Da in die IF erst eingeprungen wird, wenn die Differenz-Berechnung mit millis() übereinstimmt, muß millis vorher ja schon 'umgesprungen' sein - wie lange Das her ist, steht in den Sternen.
Wenn die loop() über eine halbe Millisekunde Durchlaufzeit benötigt, könnte die erneute Startzeit-Zuweisung mit einem neuen millis()-Wert erfolgen.
Auch muß millis() erneut ausgelesen werden, während INTERVALL wohl konstant sein wird, spart wieder etwas Zeit. Somit zwei Vorteile - man spart Zeit und das nächste Match ist IMMER INTERVALL Millisekunden auseinander - selbst, wenn die loop() verspätet hier ankommt, der darauf folgende Aufruf bleibt im Zeitmuster.

MfG

Es können beliebig viele verschiedene Zyklen gleichzeitig laufen, wenn alle ihre eigene Startzeit-Variable haben ( combies "Nebenläufigkeit").

Ja, so ist es in etwa gemeint.

Der Nebeneffekt:
Plötzlich hat man mehrere einfachere, weitgehend unabhängige, PAP nebeneinander.
Das macht die Sache einerseits viel übersichtlicher, andererseits muss man sich einem Kopf um die Kommunikation zwischen diesen Fäden machen.

andererseits muss man sich einem Kopf um die Kommunikation zwischen diesen Fäden machen

... die wiederum erheblich einfacher als bei "richtigem" Multithreading ist, weil man ja weiß, wann von einem zum anderen "Nebenlauf" gewechselt wird.

Aber das eigentliche Problem "Sekundenintervalle ungenau" ist schon längst gelöst. Spätestens mit postmasters Hinweis auf
    startzeit+=INTERVALL;

So, ich musste etwas länger rumprobieren, habe aber die Grundidee übernommen, denke ich:
Jedenfalls funktioniert es, wie ich es mir vorgestellt habe! :smiley:
Danke an alle für die Hilfe!

#include <TSIC.h>
#include <SPI.h>
#include <SD.h>

// instantiate the library, representing the sensor
TSIC Sensor1(5, 2, TSIC_50x);
TSIC Sensor2(6, 2, TSIC_50x);
TSIC Sensor3(7, 2, TSIC_50x);// Signalpin, VCCpin, Sensor Type
//TSIC Sensor1(4);    // only Signalpin, VCCpin unused by default
//TSIC Sensor1(4, NO_VCC_PIN, TSIC_50x);    // external powering of 50x-Sensor
//TSIC Sensor1(4, 2, TSIC_30x);    // Signalpin, VCCpin, Sensor Type
//TSIC Sensor2(5, 2, TSIC_50x);  // Signalpin, VCCpin, Sensor Type NOTE: we can use the same VCCpin to power several sensors

uint16_t temperature;
float Temperatur_C1 = 0;
float Temperatur_C2 = 0;
float Temperatur_C3 = 0;
int Vcount = 1;

int buttonApin = 9;
int buttonBpin = 10;
int ledPin = 8;
bool status = false;

uint32_t starttime;
uint32_t counter;
uint32_t difference;

File myFile;

void setup() {
  Serial.begin(9600);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
  pinMode(ledPin, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);    

Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  if (SD.exists("FS.txt")) {
    Serial.println("FS.txt exists.");
  } else {
    Serial.println("FS.txt doesn't exist.");
  }

  Serial.println("Creating FS.txt...");

}

void messen()
{   

    difference = millis() - starttime;
    if (difference >= 1000) {
  if (Sensor1.getTemperature(&temperature)) {
    Temperatur_C1 = Sensor1.calc_Celsius(&temperature);
  }
  if (Sensor2.getTemperature(&temperature)) {
    Temperatur_C2 = Sensor2.calc_Celsius(&temperature);
  }
    if (Sensor3.getTemperature(&temperature)) {
    Temperatur_C3 = Sensor3.calc_Celsius(&temperature);
  }
    Serial.print(counter);
    Serial.print("\t");
    Serial.print(Temperatur_C1, 1);
    Serial.print("\t");
    Serial.print(Temperatur_C2, 1);
    Serial.print("\t");
    Serial.print(Temperatur_C3, 1);
    Serial.print("\t");
    Serial.println(millis());

    myFile.print(counter);
    myFile.print("\t");
    myFile.print(Temperatur_C1, 1);
    myFile.print("\t");
    myFile.print(Temperatur_C2, 1);
    myFile.print("\t");
    myFile.print(Temperatur_C3, 1);
    myFile.print("\t");
    myFile.println(millis());
    
    counter += 1;
    starttime += 1000;
    Temperatur_C1 = 0;
    Temperatur_C2 = 0;
    Temperatur_C3 = 0;
    
    if (digitalRead(buttonBpin) == LOW) {
    digitalWrite(ledPin, LOW);
    status = false;

    myFile.println("Ende der Messung");
    myFile.close();
    
    Serial.println("Ende der Messung");
    Vcount += 1;
    }
} 
}

void loop(){
  if (digitalRead(buttonApin) == LOW) {
  digitalWrite(ledPin, HIGH);
  status = true;
  Serial.print("\nStart der ");
  Serial.print(Vcount);
  Serial.println(". Messung:");
  Serial.print("Counter [s]");
  Serial.print("\t");
  Serial.print("Temperatur T1 [°C]");
  Serial.print("\t");
  Serial.print("Temperatur T2 [°C]");
  Serial.print("\t");
  Serial.print("Temperatur T3 [°C]");
  Serial.print("\t");
  Serial.println("Arduino Laufzeit [ms]");
  
  myFile = SD.open("FS.txt", FILE_WRITE);
  myFile.print("\nHier beginnt die ");
  myFile.print(Vcount);
  myFile.println(". Messung der Führungsscheibe:");
  myFile.print("Messdauer [s]");
  myFile.print("\t");
  myFile.print("Temperatur T1 [°C]");
  myFile.print("\t");
  myFile.print("Temperatur T2 [°C]");
  myFile.print("\t");
  myFile.print("Temperatur T3 [°C]");
  myFile.print("\t");
  myFile.println("Laufzeit Arduino [ms]");
  
  counter = 0;
  starttime = millis();
  }
  while (status == true){
    messen();
}
}

Fleißaufgabe:

Weiß jemand, warum ich als Dateiname "example", "Messung", "FS", aber nicht "Messung_Fuehrungsscheibe" oder "Fuehrungsscheibe" nehmen konnte?

Weil die SD-Lib nur 8.3-Dateinamen kann?

Gruß Tommy

Fleißaufgabe:

Es gibt Lösungen.