Hife bei Sketch

Hallo,
ich bin Anfänger (seit fast 2 Wochen) und habe mir nachfolgenden Sketch "zusammengebastelt" :grinning:
Ich würde gerne, bei einem Sensor defekt den Wert "Fehler" angezeigt bekommen,
hierbei komme ich aber seit Stunden keinen Schritt weiter.
Vieleicht kann mir jemand weiterhelfen.
Andere Verbesserungvorschläge sind gerne gesehen.
Gruß Carsten

#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire  ds(A0); //pin für ds1820


//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28,0xea,0xcc,0x54,0x07,0x00,0x00,0x57 };
DeviceAddress sensor2 = { 0x28,0x0c,0xd3,0x54,0x07,0x00,0x00,0xdf };
DeviceAddress sensor3 = { 0x28,0x48,0x15,0x57,0x07,0x00,0x00,0x40 };

char sensor1Name[] = " Sensor 1 : ";
char sensor2Name[] = "Frostschutz Zone 1: ";
char sensor3Name[] = "Frostschutz Zone 2: ";


 
void setup(void) 
{
  Serial.begin(9600);
  
  pinMode (10,OUTPUT); //Ausgabe LED Pin 10 Frostschutz
  
  digitalWrite (11, OUTPUT); //Ausgabe LED Pin 11 Rück.- Ausblasluftregelung Zone 1
  
  pinMode (12,OUTPUT); //Ausgabe LED Pin 12 Rück.- Ausblasluftregelung Zone 2
   
  pinMode (13, OUTPUT); //Platine Spannungsversorgung an
  digitalWrite (13, HIGH); //Ausgabe LED Pin 13 Platine an
   
}
 
void writeTimeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //CONVERT T function call (44h) which puts the temperature into the scratchpad
  ds.write(0x44,1);
  //sleep a second for the write to take place
  delay(100);
}
 
void readTimeFromScratchpad(byte* address, byte* data)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //read the scratchpad (BEh)
  ds.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ds.read();
  }
}
 
float getTemperature(byte* address)
{
int tr;
byte data[12];

writeTimeToScratchpad(address);

readTimeFromScratchpad(address,data);

//put in temp all the 8 bits of LSB (least significant byte)
tr = data[0];

if (address[0] == 0x10) // DS18B20
{
//check for negative temperature
if (data[1] > 0x80)
{
tr = !tr + 1; //two’s complement adjustment
tr = tr * -1; //flip value negative.
}

//drop bit 0
tr = tr >> 1;

//COUNT PER Celsius degree (10h)
int cpc = data[7];
//COUNT REMAIN (0Ch)
int cr = data[6];

return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
else // DS18B20
{
return ((data[1] << 8) + tr) * (float)0.0625;
}
} 

 
void loop(void) 
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);
  float temp3 = getTemperature(sensor3);
  
 
  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.print(" ");  // Hier müssen wir ein wenig tricksen
  Serial.write(176);  // um das °-Zeichen korrekt darzustellen
  Serial.println("C");
 
  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.print(" ");  // Hier müssen wir ein wenig tricksen
  Serial.write(176);  // um das °-Zeichen korrekt darzustellen
  Serial.println("C");
 
  Serial.print(sensor3Name);
  Serial.print(temp3);
  Serial.print(" ");  // Hier müssen wir ein wenig tricksen
  Serial.write(176);  // um das °-Zeichen korrekt darzustellen
  Serial.println("C");
 
  
 
  Serial.println();
  delay(100);

  if 
  
  (temp2 >= 3 && temp2 <=7 || temp2 >= 18 && temp2 <= 22)
   
  {
    digitalWrite(12, HIGH);
    Serial.println("Ausblasregelung Zone 1");
  }
  else
  {
    digitalWrite(12, LOW);
    Serial.println("Rueckluftregelung Zone 1");
  }

   if

   (temp3 >= 3 && temp3 <=7 || temp3 >= 18 && temp3 <= 22)

   {
    digitalWrite(11, HIGH);
    Serial.println("Ausblasluftregelung Zone 2");
   }
   else
   {
    digitalWrite(11, LOW);
    Serial.println("Rueckluftregelung Zone 2");
   }
  
  if
  (temp1 <2)
  {
    digitalWrite(10,HIGH);
    Serial.println("Frostschutz Aktiv");
  }
    else
   {
      digitalWrite (10,LOW);
      Serial.println("Frostschutz Inaktiv");
    }
}

Wie merkst du denn, dass ein Sensor defekt ist?

Dein Sketch erscheint mir recht kompliziert, ohne ihn genauer angesehen zu haben. wieso benutzt du nicht überall die Funktionen der Lib?

was soll hier passieren?

digitalWrite (11, OUTPUT); //Ausgabe LED Pin 11 Rück.- Ausblasluftregelung Zone 1

Hallo,
ich habe den Sketch wie nachfolgend geändert.
Hier habe ich jetzt das Problem das wenn ich einen Sensor abziehe, die Temperatur gleich mit einem der anderen ist. Hier sollte jedoch am besten der "Wert" Fehler an dem jeweilige Sensor anstelle der Temperatur stehen. Und wenn die Temperaturen unter-40 und über +45°C liegen.

#include <OneWire.h> 
#include <DallasTemperature.h>

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28,0xea,0xcc,0x54,0x07,0x00,0x00,0x57 };
DeviceAddress sensor2 = { 0x28,0x0c,0xd3,0x54,0x07,0x00,0x00,0xdf };
DeviceAddress sensor3 = { 0x28,0x48,0x15,0x57,0x07,0x00,0x00,0x40 };

char sensor1Name[] = "DAC Sensor: ";
char sensor2Name[] = "Frostschutz Zone 1: ";
char sensor3Name[] = "Frostschutz Zone 2: ";

// Der DS18B20 ist mit Pin A0 verbunden 
#define PIN_DS18B20 A0 

// oneWire-Instanz anlegen 
OneWire oneWire(PIN_DS18B20); 

// DS18B20-Instanz anlegen 
DallasTemperature ds18b20(&oneWire); 

// Funktion: setup() 
void setup() 
{ 
 Serial.begin(9600);
 ds18b20.begin(); 

 pinMode (10,OUTPUT); //Ausgabe LED Pin 10 Frostschutz
 
 digitalWrite (11, OUTPUT); //Ausgabe LED Pin 11 Rück.- Ausblasluftregelung Zone 1
 
 pinMode (12,OUTPUT); //Ausgabe LED Pin 12 Rück.- Ausblasluftregelung Zone 2
  
 pinMode (13, OUTPUT); //Platine Spannungsversorgung an
 digitalWrite (13, HIGH); //Ausgabe LED Pin 13 Platine an
 
} 

// Funktion: loop() 
void loop() 
{ 
 // Temperatur vom DS18B20 holen 
 ds18b20.requestTemperatures(); 
 float temp1 = ds18b20.getTempCByIndex(0);
 float temp2 = ds18b20.getTempCByIndex(1); 
 float temp3 = ds18b20.getTempCByIndex(2);
 
 // ... und ausgeben
 Serial.print(sensor1Name);
 Serial.print(temp1);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C");

 Serial.print(sensor2Name);
 Serial.print(temp2);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C");

 Serial.print(sensor3Name);
 Serial.print(temp3);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C"); 

 Serial.println();
 delay(500);

 if (temp2 >= 3 && temp2 <=7 || temp2 >= 18 && temp2 <= 22)
 {
   digitalWrite(12, HIGH);
   Serial.println("Ausblasregelung Zone 1");
 }
 else
 {
   digitalWrite(12, LOW);
   Serial.println("Rueckluftregelung Zone 1");
 }

  if

  (temp3 >= 3 && temp3 <=7 || temp3 >= 18 && temp3 <= 22)

  {
   digitalWrite(11, HIGH);
   Serial.println("Ausblasluftregelung Zone 2");
  }
  else
  {
   digitalWrite(11, LOW);
   Serial.println("Rueckluftregelung Zone 2");
  }
 
 if
 (temp1 <2)
 {
   digitalWrite(10,HIGH);
   Serial.println("Frostschutz Aktiv");
 }
   else
  {
     digitalWrite (10,LOW);
     Serial.println("Frostschutz Inaktiv");
   }
}

@ ardubu

if(temp3 >= 3 && temp3 <=7 || temp3 >= 18 && temp3 <= 22)
  {
   digitalWrite(11, HIGH);
   Serial.println("Ausblasluftregelung Zone 2");
  }
  else
  {
   digitalWrite(11, LOW);
   Serial.println("Rueckluftregelung Zone 2");

Code Tags bitte nicht vergessen

Für die Ausgabe kannst du dir übrigens einfach eine Funktion schreiben:

void printSensor(const char* name, float temp)
{
  Serial.print(name);
  Serial.print(temp);
  Serial.println(" \xB0" "C");
}

Dann muss man das nicht zig mal wiederholen

pinMode (10,OUTPUT); //Ausgabe LED Pin 10 Frostschutz

digitalWrite (11, OUTPUT); //Ausgabe LED Pin 11 Rück.- Ausblasluftregelung Zone 1

digitalWrite erwartet pin, HIGH oder LOW nicht OUTPUT
außerdem wäre es sinvoll die Ausgänge mit Variablen zu versehen, wenn die Namen sinnvoll gewählt sind, läßt sich der code leichter verstehen.

wenn du über den index ausliest, bekommst du bei nicht existierenden Sensoren immer den Wert vom höchsten Sensor. Und wenn der 1. ausfällt, ist der 2. dann der erste und du bekommst Chaos

Hallo, danke erstmal an alle!

@ardubu, hab`s koregiert und geordnet. Manchmal ist es besser mal ne rund drüber zu schlafen.

@Serenifly, für mich als Anfänger ist der Sketch so leichter zu verstehen.

@ EIEspanol
Ich bekomme bei meinem zuerst geposteten Sketch immer exakt den fehelnde Sensor angezeigt.
Dessen Wert zeigt dann den Wert -0,06°C da diese Temperatur im möglichen liegt könnte es hierdurch Fehlfunktionen geben wass nicht passieren darf.
Hier nochmal der Sketch der mit Ausnahme der -0,06°C Anzeige bei abgezogenem Fühler funktioniert.
Ich bitte um Nachsicht da ich mich erst seit ein paar Tagen mit der Materie befasse.

#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds(A0); //pin für ds1820

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28,0xea,0xcc,0x54,0x07,0x00,0x00,0x57 };
DeviceAddress sensor2 = { 0x28,0x0c,0xd3,0x54,0x07,0x00,0x00,0xdf };
DeviceAddress sensor3 = { 0x28,0x48,0x15,0x57,0x07,0x00,0x00,0x40 };

char sensor1Name[] = "DAC Sensor: "; //PIN 10
char sensor2Name[] = "Frostschutz Zone 1: "; //PIN 11
char sensor3Name[] = "Frostschutz Zone 2: "; //PIN 12

void setup(void) 
{
 Serial.begin(9600);
 
 pinMode (10,OUTPUT);//Ausgabe LED Pin 10 Rück.- Ausblasluftregelung Zone 1

 pinMode (11, OUTPUT);//Ausgabe LED Pin 11 Frostschutz Zone 1
 digitalWrite (11, LOW); 
 
 pinMode (12,OUTPUT); //Ausgabe LED Pin 12 Frostschutz Zone 2
 digitalWrite (11, LOW);
  
 pinMode (13, OUTPUT); //Platine Spannungsversorgung Ext. LED
 digitalWrite (13, HIGH); //Ausgabe Ext. LED Pin 13 Platine an
  
}

void writeTimeToScratchpad(byte* address)
{
 //reset the bus
 ds.reset();
 //select our sensor
 ds.select(address);
 //CONVERT T function call (44h) which puts the temperature into the scratchpad
 ds.write(0x44,1);
 //sleep a second for the write to take place
 delay(100);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
 //reset the bus
 ds.reset();
 //select our sensor
 ds.select(address);
 //read the scratchpad (BEh)
 ds.write(0xBE);
 for (byte i=0;i<9;i++){
   data[i] = ds.read();
 }
}

float getTemperature(byte* address)
{
int tr;
byte data[12];

writeTimeToScratchpad(address);

readTimeFromScratchpad(address,data);

//put in temp all the 8 bits of LSB (least significant byte)
tr = data[0];

if (address[0] == 0x10) // DS18B20
{
//check for negative temperature
if (data[1] > 0x80)
{
tr = !tr + 1; //two’s complement adjustment
tr = tr * -1; //flip value negative.
}

//drop bit 0
tr = tr >> 1;

//COUNT PER Celsius degree (10h)
int cpc = data[7];
//COUNT REMAIN (0Ch)
int cr = data[6];

return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}
else // DS18B20
{
return ((data[1] << 8) + tr) * (float)0.0625;
}
} 


void loop(void) 
{
 float temp1 = getTemperature(sensor1);
 float temp2 = getTemperature(sensor2);
 float temp3 = getTemperature(sensor3);
 

 Serial.print(sensor1Name);
 Serial.print(temp1);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C");

 Serial.print(sensor2Name);
 Serial.print(temp2);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C");

 Serial.print(sensor3Name);
 Serial.print(temp3);
 Serial.print(" ");  // Hier müssen wir ein wenig tricksen
 Serial.write(176);  // um das °-Zeichen korrekt darzustellen
 Serial.println("C");

 

 Serial.println();
 delay(1000);

 if 
 
 (temp1 >= 3 && temp1 <=7 || temp1 >= 18 && temp1 <= 22)
  
 {
   digitalWrite(12, HIGH);
   Serial.println("Ausblasregelung Zone 1");
 }
 else
 {
   digitalWrite(12, LOW);
   Serial.println("Rueckluftregelung Zone 1");
 }

  if

  (temp2 <2)

  {
   digitalWrite(11, HIGH);
   Serial.println("Frostschutz Zone 1 Aktiv");
  }
  else
  {
   digitalWrite(11, LOW);
   Serial.println("Frostschutz Zone 1 Inaktiv");
  }
 
 if
 (temp3 <2)
 {
   digitalWrite(10,HIGH);
   Serial.println("Frostschutz Zone 2 Aktiv");
 }
   else
  {
     digitalWrite (10,LOW);
     Serial.println("Frostschutz Zone 2 Inaktiv");
   }
}

Was mach ich mit den Code Tags falsch?
Beim ersten Post hats funktioniert bei den anderen nicht mehr.

Was mach ich mit den Code Tags falsch?

Meine Glaskugel sagt: More - Modify - Markieren , dann </>
keine Ahnung, was das heissen soll, Merkwüdige Mischung verschiedener sprachen ;)

das übern index auslesen habe ich beim überfliegen falsch gesehen.

Mach doch ne zusatzabfrage rein, ob der jeweilige Sensor überhaupt existiert.

Hallo wir benötigen Ihre Hilfe.
Wir müssen einen Segelwindenservo (RS-10) mit dem Arduiono und einer externen Stromquelle programmieren , doch trotz vieler Recherche bekommen wir ihn nicht ans laufen.
Kann uns jemand helfen und den Sketch aufschreiben?
Wir würden uns freuen.

Dafür solltest du einen eigenen Thread aufmachen und nicht diesen hier kapern.

Vrgiss nicht einen aussagekräftigen Titel, nicht so nichtssagend wie dieser hier. Dann wird dir auch geholfen.