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 PIN Arduino Pin
1 (VSS) Arduino GND Pin
2 (VDD) Arduino +5V Pin
3 (contrast) 1k gegen Arduino GND Pin
4 RS Arduino Pin D113
5 R/W Arduino Pin D11
6 Enable Arduino Pin D10
7 NC NC
8 NC NC
9 NC NC
10 NC NC
11 Data 4 Arduino Pin D5
12 Data 5 Arduino Pin D4
13 Data 6 Arduino Pin D3
14 Data 7 Arduino Pin D2
15 Backlight "+" Arduino Pin D13
16 Backlight GND Arduino GND Pin
DS18B20 Temperatur Sensor
DS18B20 Pin Arduino Pin
1 Arduino GND Pin
2 Arduino Pin D8
4,7k gegen 5V
3 Arduino +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.