Temperatur mit LM35 messen.

Der Arduino hat  einem 10Bit A/D Wandler mit 6 analogen Eingängen .  Mit 10Bit kann er also eine Spannungen zwischen 0 und 5 Volt in einen digitaler Wert zwischen 0 und 1023 wandeln . Aus 5Volt werden also 1024 Einzelschritte. Wenn man jetzt 5V durch 1024 dividiert erhält man 0,004883 gerundet. Das ist der Abstand der Einzelschritte.

Thermometer mit LM35 gebaut von Johannes KrummDer LM35 hat einen Messbereich von 0 - 100°C der am mittlerem Pin als Spannung in 0,01V Schritten /°C ausgegeben wird. 5°C sind also 0,05V oder 28°C sind dann 0,280 V.

Zur Programmierung:

Ergebnis = analogRead(0)
Bei 28 °C wäre Ergebnis =     57

Temperatur = Ergebis *5 /1024
 Tempreatur wäre 0,2783 

Temperatur = Temperatur * 100
Ich muss das mit dem Komma ja noch hinbiegen.

Alles zusammengefastt in einer Zeile wäre dann
Ergebnis = analogRead(0) *5 / 1024*100

Mit Hilfe der Gleitkommafunktion des Ardunios kommt man auf ein sehr genaues Ergebnis. Der LM35 kann aber nur auf  0,5 °C genau messen.

Häufig gibt es Schwankungen von mehreren Grad von Messung zu Messung. Einige haben Klimmzüge gemacht und messen 20 mal und errechen dann den Durchschnitt. Ich habe heute mal einen Kerko 100nf direkt am LM35 angelötet. Jetzt misst das Ding genau. Die Messung funktioniert auch nur genau wenn die Betriebspannung geanu 5V ist. Bei Abweichungen sollte man auf die interne Referenzspannung zugreifen. Beim Atmege 328 sind das 1,1V . Die Formal zur Berechnung ist demenstprechend zu ändern.

Achtung externe Referenzspannung und Spannung von über 5V an den Eingängen lassen den Arduino in Rauch aufgehen

( Garantieverlust)

lm35dz


Vertauschen sie plus und minus nicht, dann werden die Dinger heiss.

Testprogramme unter dem Menupunkt Temperatur richtig messen.

 

Negative Temperaturen messen ist mit mehreren Klimmzügen möglich. Einfacher ist es aber mit einem LM335Z oder 1Wire Termometer wie zb. das  18B20.

 
 

Auspacken einschalten geht

Ja so einfach ist es.

Laden Sie bei Arduino die Software für Ihren PC runter und speichern Sie ihn in einem Verzeichnis.

Hier gibt es die Software   http://www.arduino.cc/

Entpacken Sie die Software im Verzeichnis.

Schließen Sie den Arduino über ein USB Kabel an.

Der Rest geht automatisch.


 

Falls nicht dann geht es so !

Projekt Digitaluhr mit Arduino Uno und DS1307

 

Den Bau des LCD-Shield mit nur 3 Pin sowie die Realtimeclock DS1307 habe ich bereits schon beschrieben.In diesem Projekt wurden die fertigen Shields dann nur noch zusammengesteckt. Das Programm habe ich erweitert so das sich die Uhr auch stellen lässt.

Uhrfertig Die Schaltung des Keypads habe ich bereits erläutert. Der Befehl anlogRead liefert je nach gedrückten Knopf einen anderen Wert. Im anhängenden Listing frage ich im Loop ab, ob überhaupt ein Knopf gedrückt wurde.  Wenn ja springt das Programm in die Setroutine und erhöht den Inhalt der zugehörigen Varible um 1 gemäß dem dem Wert von analogRead. Da der Wert ungenau ist und sich verändert habe ich nochmal durck 10 geteilt. Dann funktioniert es sicher.

Bei Nachbau oder Verwendung eines gekauften Shields müssen die Werte eventuell im Programm etwas angepasst werden. Leider ist für das Jahr ein Knopf zu wenig. Ich habe mir weitergeholfen in dem ich um das Jahr zu stellen eine Drahtbrücke von GND nach Digital 0 setzte. Der Taste für Minute setzt dann das Jahr um 1 vor.

 

 

Hier das Listing.Uhrvonoben

 

//Arduino 1.0+ Only
//Arduino 1.0+ Only
//aktuelle Version vom 31.03.2013 Johannes Krumm
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9);     // datapin, latchpin, clockpin
byte zero = 0x00; //workaround for issue #527
byte wert = 0;

void setup(){
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.clear();
 
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}

   
void loop(){
  printDate();
  delay(1000);
// Hier werden die Tasten abgefragt und deren Wert angezeigt. Sprung nach Settime
 if (analogRead(0)<1010){settime();lcd.setCursor(9,0);lcd.print(analogRead(0));}else {lcd.setCursor(9,0);lcd.print("    ");}
}
// Wenn dieser Teil auskommentier ist wird die Zeit gesezt. Nach dem ersten setzten muss diese Teil
// wieder einkommentiert werden, sonst wird die Zeit nach jedem Reset oder Start wieder so zurückgesetzt.
// Der auskommentierte Teil kann auch ganz geloescht werden. Die Zeit lässt sich ja per Taste setzen.
/*void setDateTime(){

  byte second =      45; //0-59
  byte minute =      10; //0-59
  byte hour =       22; //0-23
  byte weekDay =     6; //1-7
  byte monthDay =    23; //1-31
  byte month =       3; //1-12
  byte year  =       13; //0-99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}*/

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  lcd.setCursor(0,1);
  if (monthDay<10)
  {lcd.print("0");}
  lcd.print(monthDay);
  lcd.print(".");
  lcd.print(month);
  lcd.print(".");
  lcd.print(year);
  lcd.setCursor(0,0);
   if (hour < 10)                  // correct hour if necessary
  {
    lcd.print("0");
    lcd.print(hour);
  }
  else
  lcd.print(hour);
  lcd.print(":");
   if (minute < 10)                  // correct minute if necessary
  {
    lcd.print("0");
    lcd.print(minute);
  }
  else
  lcd.print(minute);
  lcd.print(":");
    if (second < 10)                  // correct second if necessary
  {
    lcd.print("0");
    lcd.print(second);
  }
  else
  lcd.print(second);
 
   switch (weekDay)                      // Ausgabe des Wochentages
 {
 
    case 1:
      lcd.setCursor(8,1);
      lcd.print("Montag ");
      break;
    case 2:
       lcd.setCursor(8,1);
      lcd.print("Dienstag");
      break;
    case 3:
    lcd.setCursor(8,1);
      lcd.print("Mittwoch");
      break;
    case 4:
    lcd.setCursor(8,1);
      lcd.print("Donnerst");
      break;
    case 5:
    lcd.setCursor(8,1);
      lcd.print("Freitag ");
      break;
    case 6:
    lcd.setCursor(8,1);
      lcd.print("Samstag ");
      break;
    case 7:
    lcd.setCursor(8,1);
      lcd.print("Sonntag ");
      break;
  }
}
void settime(){
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
 
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
 
if (analogRead(0)/10==0){minute=minute+1; if (minute>=60){minute=0;}}
if (analogRead(0)/10==14){hour=hour+1; if (hour>=24){hour=0;}}
if (analogRead(0)/10==33){month=month+1; if (month>=12){month=0;}}
if (analogRead(0)/10==50){monthDay=monthDay+1; if (monthDay>=31){monthDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)!=LOW){weekDay=weekDay+1; if (weekDay>=8){weekDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)== LOW){year=year+1;if (year>30){year=0;} }
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}

 

 

Der DS18b20  ist ein 12Bit Temperatursensor mit 1Wirebus. Im Gegenteil zu anderen wie z.B LM35 kann aus ihm die gemessene Temperatur direkt ausgelesen werden. Zusätzlich speichert er die min. und die max. Temperatur sowie hat eine programmirbare Alarmfunktion. Die Spannungsversorgung erfolg über die Datenleitung kann aber auch über den 3. Anschluß erfolgen, Im 1Wirebus ist es möglich mehrere Sensoren an einem Bus getrennt von einander auszulesen. Ideal für Haussteuerungen.

Mit dem 18b20 kann die Temperatur mit 9 - 12 Bit ausgewertet werden was 0,0625°C enstpricht. Der in vielen Beiträgen beschriebene DS18S20 kann nur 9Bit was nur 0,5°C entspricht. Hier wird viel von den Authoren im Internet verwechselt und auch falsch beschrieben.

DS18B20DS18b20anschluss

Sollen mehr als nur ein Sensor angeschlossen werden so geschieht das parallel zum 1. . Der Widerstand ist dann nicht mehr erforderlich. Die einzelenen Sensoren werden dann anhand der Seriennummern identifiziert.

Der 1Wire Bus lässt sich als Bus, Stern oder auch Baumstruktur Installiern.
Als Bus sind 300m mögkich, anders sind es immer noch 100m.

 

 

 

 

 

 

 

Termometerprogramm als Beispiel.

Aufpassen: Es werden zwei ähnliche Module abgeboten. Der hier beschriebene HC-SR04 hat 4 Pins. 5V GND Trig und Masse.

HC-SR04

  1. Betriebspannung: 5V DC
  2. Ruhestromt: <2mA
  3. Abstrahlwinkel: <15°
  4. Messbereich: 2cm – 500 cm
  5. Auflösung: 1 cm
  6. Ultrasonic Frequency: 40kHz

Auf de Arduino Seiten findet man ohne grosses suchen einen Anschlussplan und einen Test-Sketch der Entfernung misst und über serialPrint ausgibt

Wer schon in den Exampels rum gesucht hat wird wird auch das Progrämmchen zur Tonerzugung gefunden haben. Es wäre doch mal eine schöne Aufgabe den Rückwärtspiepser zu programmieren.

 

hc-sr04diagramm

Die Funktion ist anhand des Zeitdiagramms leicht zu verstehen.

  • Setzte den "Trigger Pin" am Sensor für 10µs auf high. Dadurch wird die Sensorfunktion gestartet.
  • 8 40kHz Impulse werden gesendet Der Echopin geht nach dem senden von low auf high.
  • Der 40Khz Ton wird vom nächsten Objekt Refelktiert.
  • Wenn der Sensor ein Echo empfängt wechselt der "Echopin" auf Low.
  • Die Distance zum Object wird aus der länge der Zeit berechent in der der Echopin high ist.
  • Wird er Ton nicht von einem Hindernis reflektiert. Dann geht der Echopin nach 38ms auf low. (Timeout)




     
 

Login Form