Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
f11:technik:arduino:programme:1-wire-temperatursensor [2013/03/03 23:32]
dd7dka
f11:technik:arduino:programme:1-wire-temperatursensor [2019/09/29 12:03] (aktuell)
Zeile 10: Zeile 10:
  
 <code c oneWire-Temperatursensor.ino> <code c oneWire-Temperatursensor.ino>
 +/**
 +*  Dieses Programm liest einen DS1820 1-Wire Temperatursensor aus.
 +*  In diesem Fall ist nur ein Sensor angeschlossen. Für mehreren Sensoren am 1-Wire Bus 
 +*  muss der Quelltext modifiziert werden.
 +*/
 +
 +#include <LiquidCrystal.h>
 +#include <OneWire.h>
 +
 +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.1362349935.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