Go Down

Topic: DS18S20 - gaaaaaanz einfach, aber was sind das für Werte ??? ANFÄNGER !!! (Read 946 times) previous topic - next topic

ticki

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 :-)

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 :-)
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

volvodani

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
0x2B | ~ 0x2B = 0xFF  
(Shakespeare)

ticki

sorry, vergessen :-)

// 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;
 
}

ticki

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 :-))

sschultewolter

#4
Aug 27, 2013, 11:49 am Last Edit: Aug 27, 2013, 11:54 am by sschultewolter Reason: 1
Zu erst einmal, halte dich mit dem Titel etwas zurück. Desweiteren den Sketch immer innerhalb eines [*code] [*/code] Containers senden (* weglassen)

Code: [Select]
/*
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

Code: [Select]
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?
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Go Up