Arduino als Thermometer

2 Juli 2010 von Oli82 Kommentieren »

Vor einiger Zeit habe ich mir einen Arduino Nano gekauft und bisher nur die Samples nach programmiert.

Bei der Hitze macht aber programmieren überhaupt keinen Spaß! Außer man will wissen, wie warm es wirklich ist.

Also bauen wir uns einen Digitalen Thermometer 😉

Was braucht man?

  • Einen digitalen Temperatursensor  DS18B20 (Datenblatt)
  • Ein LCD Display
  • Ein Arduino Board
  • Einen Taster
  • Je einen 1k, 4.7k und 10k Widerstand

Ich habe das ganze auf einen Breadboard aufgebaut, da Löten ja noch mehr Hitze verursacht 😉

Die Schaltung

LCD Display

LCD PINArduino Pin
1 (VSS)Arduino GND Pin
2 (VDD)Arduino +5V Pin
3 (contrast)1k gegen Arduino GND Pin
4 RSArduino Pin D113
5 R/WArduino Pin D11
6 EnableArduino Pin D10
7 NCNC
8 NCNC
9 NCNC
10 NCNC
11 Data 4Arduino Pin D5
12 Data 5Arduino Pin D4
13 Data 6Arduino Pin D3
14 Data 7Arduino Pin D2
15 Backlight "+"Arduino Pin D13
16 Backlight GNDArduino GND Pin

DS18B20 Temperatur Sensor

DS18B20 PinArduino Pin
1Arduino GND Pin
2Arduino Pin D8
4,7k gegen 5V
3Arduino +5V Pin

Die Software

Zuerst benötigt man die OneWire Protokoll Libraries.

Diese müssen in das Arduino -> libraries Verzeichnis entpackt werden. Sollte die Arduino SDK gerade laufen, muss die Arduino Software neu gestartet werden.

Hier der Code des Thermometers:

// LCD Thermometer
// http://www.oli82.de

#include
#include

// Schaltung:
// * Taster an pin D6 von +5V
// * 10K Widerstand an pin D6 von GND
// rs (LCD pin 4) zu Arduino pin D12
// rw (LCD pin 5) zu Arduino pin D11
// enable (LCD pin 6) zu Arduino pin D10
// LCD pin 15 zu Arduino pin D13
// LCD pins d4, d5, d6, d7 zu Arduino pins D5, D4, D3, D2

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13;    // pin D13 Schaltet das Backlight

OneWire  ds(8);        // ds18b20 pin #2 (mittlerer pin) zu Arduino pin D8

byte i;
byte present = 0;
byte data[12];
byte addr[8];

int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100;

const int buttonPin = 6;     // Nummer des Taster-Pins

int buttonState = 0;         // Variable fuer das lesen des Status des Tasters
int state = LOW;      // Setze den Tasterstatus
int reading;
int previous = HIGH;    //Setze den letzten Status des Tasters

long time = 0;
long debounce = 200;   // entprellzeit time

void setup() {
  pinMode(backLight, OUTPUT);   // initialisiere den BACKLIGHT pin als output
  pinMode(buttonPin, INPUT);    // initialisiere den Taster pin als einen input
  lcd.begin(4,16);              // reihen, spalten.  nehme 2,16 fuer ein 2x16 LCD, usw.
  lcd.clear();                  // LCD leeren/loeschen
  lcd.setCursor(0,0);           // setze den cursor zu column 0, row 0

    if ( !ds.search(addr)) {
      lcd.clear(); lcd.print("No more addrs");
      delay(1000);
      ds.reset_search();
      return;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      lcd.clear(); lcd.print("CRC not valid!");
      delay(1000);
      return;
  }
}

void getTemp() {
  int foo, bar;

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }

  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;   SignBit = TReading & 0x8000;  // test most sig bit      if (SignBit) {     TReading = -TReading;   }   Tc_100 = (6 * TReading) + TReading / 4;    // multipliziere mit (100 * 0.0625) or 6.25   Whole = Tc_100 / 100;          // separate off the whole and fractional portions   Fract = Tc_100 % 100;   if (Fract > 49) {
    if (SignBit) {
      --Whole;
    } else {
      ++Whole;
    }
  }

  if (SignBit) {
    bar = -1;
  } else {
    bar = 1;
  }

}

void printTemp(void) {
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("-www.Oli82.de-");
  lcd.setCursor(2,1);
  lcd.print("Termperatur: ");
  lcd.setCursor(2,2)
  if (SignBit) {
     lcd.print("-");
  }
  lcd.print(Whole);
  lcd.print("\xDF" "C");

}

void loop(void) {
  getTemp();
  printTemp();
  delay(1000);
  reading = digitalRead(buttonPin);

  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();
  }

  digitalWrite(backLight, state);

  previous = reading;
  }

Hier nochmal als LCD_Thermometer

Die Funktion

In der ersten Zeile und zweiten Zeile des Displays wird ein Festtext angezeigt. Die dritte Zeile des LCD zeigt dann zweistellig die Temperatur.

Durch den Taster kann die Hintergrundbeleuchtung ein- und ausgeschaltet werden.

Werbung

Schreibe einen Kommentar


Deprecated: Function set_magic_quotes_runtime() is deprecated in /www/htdocs/w00b99e6/blog/counter/counter.php on line 61

Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /www/htdocs/w00b99e6/blog/counter/includes/mysql.class.php on line 165

Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /www/htdocs/w00b99e6/blog/counter/includes/mysql.class.php on line 165

Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /www/htdocs/w00b99e6/blog/counter/includes/mysql.class.php on line 165

Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /www/htdocs/w00b99e6/blog/counter/includes/mysql.class.php on line 165

Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /www/htdocs/w00b99e6/blog/counter/includes/mysql.class.php on line 165

Deprecated: Function set_magic_quotes_runtime() is deprecated in /www/htdocs/w00b99e6/blog/counter/counter.php on line 1794