DS18S20 - gaaaaaanz einfach, aber was sind das für Werte ??? ANFÄNGER !!!

Moin moin,
als Anfänger musste ich natürlich gleich einen digitalen Temp.-Sensor anschliessen.
Hier habe ich mich dann doch ein bisschen übernommen, ein analoger hätte sicherlich schneller funktioniert :slight_smile:

Jedenfalls, die Beispiel-sketche waren mir alle zu mächtig, ich muss kein CRC ausgeben, keine HEX-Werte und ich
brauche auch nicht die Suche nach weiteren DS-Sensoren.
Jetzt bekomme ich immerhin ausgelesene Werte auf die serielle Schnittstelle :slight_smile:
Aber die kommen ja nicht in Grad Celsius oder Fahrenheit da raus. Muss man die jetzt einfach nur durch einen festen Wert teilen?
Sie liegen so um 50 bei Zimmertemperatur.

Immerhin ist es mir dann auch noch gelungen die eingebaute LED bei über/unterschreiten eines festen Wertes zu schalten freu

Projekt heißt übrigens: Wir basteln und eine Bierkühltruhe aus einer Bier-Gefrier-Truhe :-)))
(Später mit LCD-Display, mit Soll- und Ist-Wert-Anzeige sowie 2 Tastern um die Vorgabe zu verändern....

Gruß und Danke

Sehr geehrter Herr Anfänger zur weiteren Hilfe über diesem Forum ist dringlich anzuraten den Verwendeten Code in seinem Post per Codetags anzufügen, da sonst eine Hilfestellung sich als schwierig erweist.
Mit freundlichem Gruß
Dani

P.S.: 42

sorry, vergessen :slight_smile:

// Schalten der integrierten LED bei fest
// eingestellter TEMP (zb. 52)
// (Ausgabe des DS18S20)
// NICHT Grad Celsius

// 26.9.13

int led = 13;
#include <OneWire.h>
OneWire ds(2); // on digital pin 2
void setup(void) {Serial.begin(9600);}

void loop(void) {
pinMode(led, OUTPUT);
float temperature = getTemp();

Serial.println(temperature);

if (temperature > 52) {digitalWrite(led, HIGH);}
else {digitalWrite(led, LOW);}

delay(100); //just here to slow down the output so it is easier to read
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println();
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes
data = ds.read();

  • }*

  • ds.reset_search();*

  • byte MSB = data[1];*

  • byte LSB = data[0];*

  • float tempRead = ((MSB << 8) | LSB); //using two's compliment*

  • float TemperatureSum = tempRead / 1;*

  • return TemperatureSum;*

}

PS: Hier scheint mir auch noch eine if-Abfrage drin zu stecken welche weitere Sensoren sucht. Ist
mir aber leider (so auf die Schnelle) nicht gelungen diese zu löschen.

Ich habe doch nur einen einzigen Sensor :-))

Zu erst einmal, halte dich mit dem Titel etwas zurück. Desweiteren den Sketch immer innerhalb eines [code] [/code] Containers senden (* weglassen)

/* 
TWTemp Version 1.0 vom 14.06.2013 

8038 bytes

Thomas Wenzlaff http://www.wenzlaff.de

Temperature Sensor DS18B20 an Digitalen Port Pin 2 wie folgt verbunden
Links=Masse, 
Mitte=Data, 
Rechts=+5V, 
3300 to 4700 Ohm Widerstand von +5V nach Data.

Es wird erst die Adresse des 1-Wire-Device ausgegeben und dann wird die Temperaturmessung gestartet.

*/

/* Benötigte Bibliotheken importieren */
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

void setup() 
{
delay(1000);
Serial.begin(9600);
Serial.println("Temperatur Messprogramm");
Serial.println("TWTemp 1.0 vom 14.06.2013");
Serial.println("http://www.wenzlaff.de");
delay(1000);

sensors.begin();/* Inizialisieren der Dallas Temperature library */

adresseAusgeben(); /* Adresse der Devices ausgeben */

Serial.print("Starte Temperatur abfragen ...");
}

void loop() 
{
Serial.println();

sensors.requestTemperatures(); // Temp abfragen

Serial.print(sensors.getTempCByIndex(0) );
Serial.print(" Grad Celsius");
}

void adresseAusgeben(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  Serial.print("Suche 1-Wire-Devices...\n\r");// "\n\r" is NewLine 
  while(ourWire.search(addr)) {
    Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n\r");
      return;
    }
  }
  Serial.println();
  ourWire.reset_search();
  return;
}

Teste den mal. Du kannst dann die die Seriellen Ausgaben auskommentieren. Bis du als Ausgabe nur noch dieses erhältst

Serial.print(sensors.getTempCByIndex(0) );
Serial.print(" Grad Celsius");

.

Nach weiteren Adresse würde ich immer Suchen lassen. Was ist, wenn der Sketch verloren geht, dein Projekt soweit läuft, jedoch nur der Sensor defekt ist?