Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
f11:technik:arduino:programme:1-wire-temperatursensor [2013/03/03 23:12]
dd7dka angelegt
f11:technik:arduino:programme:1-wire-temperatursensor [2019/09/29 12:03] (aktuell)
Zeile 1: Zeile 1:
 ====== 1-Wire Temperatursensor ====== ====== 1-Wire Temperatursensor ======
  
-Hier ein Beispiel wie man einen 1-Wire Temperatursensor auslesen kann. Verwendet wird die 1-Wire Library von PJRC.+Hier ein Beispiel wie man einen 1-Wire Temperatursensor auslesen kann. Verwendet wurde ein DS1820 von Dallas.
  
-Das Datenblatt und die Beschaltung des Dallas DS1820 ist hier beschrieben: [[f11:technik:arduino:datasheets:1-wire-thermometer-ds1820|1-Wire digital Thermometer]]+Benötigte zusätzliche Library: 
 +  * 1-Wire Library von PJRC [[f11:technik:arduino:libraries:start|Arduino Libraries]]
  
-===== 1-Wire Library =====+Das Datenblatt und die Beschaltung des Dallas DS1820 ist hier beschrieben: 
 +  * [[f11:technik:arduino:datasheets:1-wire-thermometer-ds1820|1-Wire digital Thermometer]]
  
-  PJRC 1-Wire Library: [[http://www.pjrc.com/teensy/td_libs_OneWire.html]]+<code c oneWire-Temperatursensor.ino> 
 +/** 
 + Dieses Programm liest einen DS1820 1-Wire Temperatursensor aus. 
 +*  In diesem Fall ist nur ein Sensor angeschlossenFür mehreren Sensoren am 1-Wire Bus  
 +*  muss der Quelltext modifiziert werden. 
 +*/
  
-===== Beispielprogramm =====+#include <LiquidCrystal.h> 
 +#include <OneWire.h>
  
-<code oneWire-Temperatursensor.ino>+LiquidCrystal lcd(12, 8, 7, 4, 2, 1); // init LCD, Ports an eigene Verdrahtung anpassen! 
 +OneWire sensor(10); // init OneWire Sensor an Port 10 
 + 
 +/* 
 +  Beispiel für eine Adresse eines DS1820. 
 +  Achtung: Jeder Baustein hat eine eigene 8 Byte Adresse! 
 +  Wenn man die Adresse weis und nur einen Baustein anspricht kann diese 
 +  Adresse auch vorgegeben werden. 
 +*/ 
 +//byte addr[8] = {0x10, 0x59, 0x87, 0x77, 0x2, 0x8, 0x0, 0xCE}; // 8 byte array für die Adressen 
 +byte addr[8]; // 8 byte array für die Adressen 
 + 
 +byte data[12]; // 12 byte array für Daten. Der DS1820 liefert aber nur 9. 
 +byte i; 
 + 
 +int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; 
 +char buf[20]; 
 + 
 +void setup() { 
 +  Serial.begin(9600); 
 +  lcd.begin(16, 2); 
 +  sensor.search(addr); // suche ersten 1-Wire Sensor und schreibe gefundene Adresse in addr 
 +  sensor.reset_search(); // reset search, nächster search() Aufruf würde wieder bei erstem Sensor starten 
 +
 + 
 +void loop() { 
 +  /* Sensor Adresse ausgeben (optional)*/ 
 +  Serial.print("Address: "); 
 +  for (i = 0; i 8; i++) { 
 +    Serial.print(addr[i], HEX); 
 +    Serial.print(" "); 
 +  } 
 +  Serial.println(); 
 + 
 +  /* Sensordaten ausgeben */ 
 +  sensor.reset(); // Reset des 1-Wire Bus. Vor jeder Kommunikation mit einem Sensor nötig 
 +  sensor.select(addr); // Sensor mit Adresse ansprechen 
 +  sensor.write(0x44,1); // Starte Kommunikation bei Spannungsversorgung über Vdd/GND Pins (nicht per 1-Wire Bus siehe Datenblatt) 
 +  delay(1000); 
 +  sensor.reset(); 
 +  sensor.select(addr); 
 +  sensor.write(0xBE); // schreibt Sensordaten in Scratchpad (Speicherbereich für Sensordaten) 
 +   
 +  sensor.read_bytes(data, 9); // einlesen von 9 Datenbytes. Der DS1820 liefert nur 9. 
 +  /* einlesen der Daten optional auch so möglich */ 
 +  //for (i = 0; i < 9; i++) { // 9 Datenbyte 
 +    //data[i] = sensor.read(); 
 +  //} 
 +   
 +  /* Testausgabe der Rohdaten auf 1. Zeile des LCD und Seriell (optional) */ 
 +  lcd.setCursor(0,0); 
 +  Serial.print("Data: "); 
 +  for (i = 0; i < 9; i++) { // 9 Datenbyte 
 +    lcd.print(data[i], HEX); 
 +    Serial.print(data[i], HEX); 
 +    Serial.print(" "); 
 +  } 
 +  Serial.println(); 
 +  // Ende Testausgabe 
 + 
 +  /* Umwandlung in Celsius Darstellung mit Nachkomma und Vorzeichen aus Beispielcode http://playground.arduino.cc/Learning/OneWire */ 
 +  LowByte = data[0]; 
 +  HighByte = data[1]; 
 +  TReading = (HighByte << 8) + LowByte; 
 +  SignBit = TReading & 0x8000;  // test most sig bit 
 +  if (SignBit) { // negative 
 +    TReading = (TReading ^ 0xffff) + 1; // 2's comp 
 +  } 
 +  Tc_100 = (TReading*100/2);     
 +   
 +  Whole = Tc_100 / 100;  // separate off the whole and fractional portions 
 +  Fract = Tc_100 % 100; 
 +   
 +  /* sprintf() schreibt in Variable buf den String "%c%d.%d\337C     " wobei: 
 +     %c (character) durch Vorzeichen + oder ersetzt wird 
 +     %d mit Temperatur aus Variable Whole 
 +     %d mit Temperatur (Nachkommastellen) aus Variable Fract 
 +     \337 ist ASCII Code für Celsius-Kringel ° 
 +     C für Celsius 
 +  */ 
 +  sprintf(buf, "%c%d.%d\337C     ", SignBit ? '-' : '+', Whole, Fract < 10 ? 0 : Fract); 
 +   
 +  lcd.setCursor(8,1); 
 +  lcd.print(buf); 
 +  Serial.println(buf); 
 +}
  
 </code> </code>
f11/technik/arduino/programme/1-wire-temperatursensor.1362348764.txt.gz · Zuletzt geändert: 2019/09/29 12:01 (Externe Bearbeitung)
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0