Unterschiede im Code für Uno / Nano 33 BLE

Hallo zusammen,

Aufbau und Code funktionieren für meinen UNO wunderbar. Wenn ich allerdings den gleichen Code auf den Nano 33 BLE hochladen will, erscheint eine Fehlermeldung.

"dtostrf" not declared in this scope.

Komischerweise erschien die beim Kompilieren für den UNO auch, der Upload hat aber funktioniert. Beim Nano gibt es die gleiche Fehlermeldung beim Kompilieren und hochladen.

Ich dachte eigentlich, dass beide Boards den gleichen Code vertragen, ist das nicht korrekt?

Muss ich zum Beseitigen des Fehlers eine spezielle Bibliohtek einbinden?
Beim Googeln stoße ich auf stdlib.h

/**
 *  test ard-tsiclib by reading the temperature every second
 *  and output the measured data to the serial port
 */

#include "TSIC.h"       // include the library
#include <SPI.h>
#include <SD.h>

// instantiate the library, representing the sensor
TSIC Sensor1(5, 2,TSIC_50x);
TSIC Sensor2(6, 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 = 0;
float Temperatur_C1 = 0;
float Temperatur_C2 = 0;

int buttonApin = 9;
int ledPin = 7;
bool status;

char T1char[15];
char T2char[15];

int Messzeit = 15;
//Messzeit in Sekunden

File myFile;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(ledPin, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);  
  status = false;
  
  Serial.print("Initializing SD card...");

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

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

  Serial.println("Creating example.txt...");
}

void loop() {

  if (digitalRead(buttonApin) == LOW) {
    digitalWrite(ledPin, HIGH);
    status = true;
  }
  if (status == true) {
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.println("Hier beginnt eine neue Messung:");
  myFile.println("Zeit [s], Temperaturen T1, T2 [°C]");
  
  for (int i=0; i <= Messzeit; i++) {
    
  if (Sensor1.getTemperature(&temperature)) {
    Serial.print("uint_16: ");
    Serial.println(temperature);
    Temperatur_C1 = Sensor1.calc_Celsius(&temperature);
    Serial.print("Temperature1: ");
    Serial.print(Temperatur_C1);
    Serial.println(" °C");
    dtostrf(Temperatur_C1,3,1,T1char);
  }
  if (Sensor2.getTemperature(&temperature)) {
    Serial.print("uint_16: ");
    Serial.println(temperature);
    Temperatur_C2 = Sensor2.calc_Celsius(&temperature);
    Serial.print("Temperature2: ");
    Serial.print(Temperatur_C2);
    Serial.println(" °C");
    dtostrf(Temperatur_C2,3,1,T2char);
  }
  Serial.println(i);
  myFile.print(i);
  myFile.print(" , ");
  myFile.print(T1char);
  myFile.print(" , ");
  myFile.println(T2char);
  
  delay(1000);    // wait 1 seconds
  }
  myFile.println("Ende der Messung");
  myFile.close();
  digitalWrite(ledPin, LOW);
  status = false;
  }
}

Prima, dass du wiedermal auf Fragen nicht reagierst.

So langsam glaube ich, das ist bei dir System.

dtostrf() gibt es nur auf AVRs. Das ist ein Workaround weil da printf() aus Speichergründen nicht mit Float geht. Der Nano 33 BLE hat einen ARM Prozessor. Da kannst du einfach printf() verwenden.
Man kann mit Compile-Schaltern auch mehrere Prozessoren in einem Code erschlagen

Allerdings stellt sich hier immer noch die Frage wieso die hier nicht einfach Serial.print() verwendest. dtostrf()/printf() braucht man nur wenn man Zahlen auf eine konstante Breite formatieren muss

Also gibt es Unterschiede im Code, gut zu wissen.
In diesem Fall geht es mir ja darum, dass ich Werte auf eine SD-Karte schreiben möchte.
myFile.print() scheint nun aber auch zu funktionieren. Der Fehler lag wohl vorher woanders, aber ich meine damit zuerst Probleme gehabt zu haben.

Anschlussfrage: Warum werden im seriellen Monitor teils Messwerte übersprungen? In diesen Momenten wird nur meine Zählervariable i ausgegeben. In der .txt auf der SD sind die Daten dann aber trotzdem vorhanden.
Noch komischer: Der gleiche Code auf dem Uno hat gestern dazu geführt, dass eine Temperaturvariable von Sensor1 auch in die Wertetabelle von Sensor 2 geschrieben wurde (sowohl im seriellen Monitor als auch auf der SD). Laut Code sollte das doch durch die andere Variablenbezeichnung nicht passieren dürfen, oder?

Nochmal der neue Code

/**
 *  test ard-tsiclib by reading the temperature every second
 *  and output the measured data to the serial port
 */

#include "TSIC.h"       // include the library
#include <SPI.h>
#include <SD.h>

// instantiate the library, representing the sensor
TSIC Sensor1(5, 2,TSIC_50x);
TSIC Sensor2(6, 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 = 0;
float Temperatur_C1 = 0;
float Temperatur_C2 = 0;

int buttonApin = 9;
int ledPin = 7;
bool status;

char T1char[15];
char T2char[15];

int Messzeit = 15;
//Messzeit in Sekunden

File myFile;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(ledPin, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);  
  status = false;
  
  Serial.print("Initializing SD card...");

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

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

  Serial.println("Creating example.txt...");
}

void loop() {

  if (digitalRead(buttonApin) == LOW) {
    digitalWrite(ledPin, HIGH);
    status = true;
  }
  if (status == true) {
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.println("Hier beginnt eine neue Messung:");
  myFile.println("Zeit [s], Temperaturen T1, T2 [°C]");
  
  for (int i=0; i <= Messzeit; i++) {
    
  if (Sensor1.getTemperature(&temperature)) {
    Serial.print("uint_16: ");
    Serial.println(temperature);
    Temperatur_C1 = Sensor1.calc_Celsius(&temperature);
    Serial.print("Temperature1: ");
    Serial.print(Temperatur_C1);
    Serial.println(" °C");
    
  }
  if (Sensor2.getTemperature(&temperature)) {
    Serial.print("uint_16: ");
    Serial.println(temperature);
    Temperatur_C2 = Sensor2.calc_Celsius(&temperature);
    Serial.print("Temperature2: ");
    Serial.print(Temperatur_C2);
    Serial.println(" °C");
  
  }
  Serial.println(i);
  myFile.print(i);
  myFile.print(" , ");
  myFile.print(Temperatur_C1);
  myFile.print(" , ");
  myFile.println(Temperatur_C2);
  
  
  delay(1000);    // wait 1 seconds
  }
  myFile.println("Ende der Messung");
  myFile.close();
  digitalWrite(ledPin, LOW);
  status = false;
  }
}

Nachtrag:
Solange ich am UNO nur einen von 2 Sensoren laufen habe, werden teilweise die Messerte von Sensor 1 auf Sensor 2 übertragen.
Wenn beide angeschlossen sind, scheinen die Ergebnisse zu passen.

Gleicher Code am NANO:
Totale Katastrophe, Messwerte werden nicht eingelesen (im neuesten Code wird dann eine "0" geschrieben) oder sie sind schlicht falsch.

Kann das mit der Spannung zu tun haben? Ich entnehme sie dem 5 V Pin des passend gelöteten NANO 33 BLE.

Hier ein Bild der Messwerte
(Auch wenn es in der Tabelle so wirkt, es waren zwei zeitlich versetzte Messungen (UNO, NANO, T1,T2), Unterschiede der Temperaturen im 20er Bereich sind passend.