Probleme mit LM35 / Temperaturmessung

Guten Tag,

Ich beschäftige mich seit ca. 3 Wochen mit Microcontrollern. Im Vorfeld habe ich mit der Thematik nicht all zu viel zu schaffen gehabt und bitte daher mein eventuell naiven Umgang mit der Materie zu entschuldigen. Vielen Dank :slight_smile:

Zum Projekt. Realisieren Möchte ich einen Kühlstellenregler der über Taster bedient werden kann. Soweit ich das von meiner Warte aus beurteilen kann funktioniert alles bis dato wie ich es mir vorstelle.

Aktuell beschäftigt mich jedoch ein Problem mit der Temperaturerfassung mittels LM35 für das ich bis jetzt nicht in der Lage war selbstständig eine Lösung zu erdenken. ( 99.9% wahrscheinlich durch mangelhaftes wissen bedingt).

Der Temperatur wert wird akkurat gelesen. Wird jedoch das Relais oder die Displaybeleuchtung geschaltet beeinflusst dies den gemessenen Temperaturwert im bereich von 1 bis 10K.

Ich vermute das dies an einem absinken der Spannung am 5V Pin liegt wenn Verbraucher geschlatet werden. Hier sinkt der wert von 5,0V auf bis zu 4,78V ab.

Versuche das Phänomen mittels analogReference() bei zu kommen sind gescheitert.

Untitled Sketch_Steckplatine.png zeigt eine grobe Übersicht der Verbraucher( Verwende Arduino MEGA habe diesen aber im Fritzing nicht gefunden. Daher ist die Verdrahtung nicht 1:1 abgebildet )

#include <LiquidCrystal.h>
#include <EEPROM.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define UP 30
#define DOWN 31
#define PLUS 32
#define MINUS 33
#define COMP 29
#define SAVE 28
#define LED 27
#define LIGHT 26
#define PROBE A0


int UPx;                        // Button UP
int DOWNx;                      // Button DOWN
int PLUSx;                      // Button +
int MINUSx;                     // Button -
int SAVEx = 1;                  // Button SAVE (Sollwert und Hysterese wird in EEPROM geschrieben)
int LEDx;                       // Button Displaylight on/off
int LEDs;                       // Displaylight Status on/off
int PROBEx;                     // Thermoresistor 
float PROBEy;                   // Temperaturdurchschnitt aus 5 Messungen
int menuPage = 0;               // Bei Start Menuseite 1 anzeigen
int WANTx = EEPROM.read(100);   // Sollwert bei Start aus EEPROM lesen
int HYSTx = EEPROM.read(101);   // Hysterese bei Start aus EEPROM lesen


//----------------\/--SETUP--\/------------------
void setup() {

Serial.begin(9600); 
lcd.begin(16, 2);


pinMode(UP, INPUT_PULLUP);
pinMode(DOWN, INPUT_PULLUP);
pinMode(PLUS, INPUT_PULLUP);
pinMode(MINUS, INPUT_PULLUP);
pinMode(COMP, OUTPUT);
pinMode(SAVE, INPUT_PULLUP);
pinMode(LED, INPUT_PULLUP);
pinMode(LIGHT, OUTPUT);
pinMode(PROBE, INPUT);

int LEDs = 0;

}
//----------------/\--SETUP--/\-------------------

//----------------\/--LOOP--\/--------------------
void loop(){

UPx = digitalRead(UP);
DOWNx = digitalRead(DOWN);
PLUSx = digitalRead(PLUS);
MINUSx = digitalRead(MINUS);
SAVEx = digitalRead(SAVE);
LEDx = digitalRead(LED);
PROBEx = analogRead(PROBE);

//---------------\/--DISPLAY LIGHT--\/-------------
if(LEDx < 1){
  delay(300);
    if(LEDs >= 1){LEDs = 0;}
  else{LEDs++;}   
}                                                  
if(LEDs > 0){                                      //  (---- Displaylight on/off
    digitalWrite(LIGHT, HIGH);                     
}
if(LEDs < 1){
    digitalWrite(LIGHT, LOW);
}
//---------------/\--DISPLAY LIGHT--/\-------------


//---------------\/--BUTTON INPUT--\/--------------
if(UPx < 1){
  delay(300);
  ++menuPage;
  if(menuPage == 3)
  menuPage = 0;
}
if(DOWNx < 1){
  delay(300);
  --menuPage;
  if(menuPage < 0)
  menuPage = 2;
}
if(PLUSx < 1){ 
 delay(300);                                        
  if(menuPage == 1){                                // (---- Menu Scrollen und Werte ändern
    ++WANTx;                                       
   }
  if(menuPage == 2){
    ++HYSTx; 
  }
}
if(MINUSx < 1){
 delay(50);
  if(menuPage == 1){
    --WANTx;
   }
  if(menuPage == 2){
    --HYSTx; 
  }
}
//---------------/\--BUTTON INPUT--/\--------------


// ----------------\/--NAVIGATE--/\----------------
if(menuPage == 0){
  roomTemp();
}

if(menuPage == 1){                                 
  wantTemp();                                       // (---- Menu Seiten 
}                                                   

if(menuPage == 2){ 
  hyst();
}
// ----------------/\--NAVIGATE--/\----------------


// ----------------\/--COMP RELAIS--/\-------------

if(PROBEy > WANTx){
  digitalWrite(COMP, HIGH);                         
}                                                   // (---- Relais Schaltlogik                                                                                                        
if(PROBEy <= (WANTx - HYSTx)){                     
  digitalWrite(COMP, LOW);
}

// ----------------/\--COMP RELAIS--/\-------------



// ------------\/--SAVE PARAMETERS--\/-------------
if(SAVEx < 1){ 
  
  
  
  lcd.clear();
  lcd.setCursor(6, 0);                              
  lcd.print("SAVE");                                // (---- Aktuelle Werte in EEPROM speichern
                                                    
  
  EEPROM.update(100, WANTx);                       
  EEPROM.update(101, HYSTx);
  
  delay(1000);
}
// ------------/\--SAVE PARAMETERS--/\-------------
}


//----------------\/--AVRAGE VAL--\/---------------
void avragePROBE(){
 float temp[5]; 
  temp[1]=(5.0 * 100.0 * analogRead(PROBE)) / 1024;
  delay(100);
  temp[2]=(5.0 * 100.0 * analogRead(PROBE)) / 1024;
  delay(100);
  temp[3]=(5.0 * 100.0 * analogRead(PROBE)) / 1024; // (---- Fühler Durchnittswert ermitteln
  delay(100);
  temp[4]=(5.0 * 100.0 * analogRead(PROBE)) / 1024;
  delay(100);
  temp[5]=(5.0 * 100.0 * analogRead(PROBE)) / 1024;
  delay(100);
 PROBEy = (temp[1]+temp[2]+temp[3]+temp[4]+temp[5])/5;

}
//----------------/\--AVRAGE VAL--/\---------------

//--------------\/--MENU ROOMTEMP--\/--------------
void roomTemp(){
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("Raumtemperatur");
  lcd.setCursor(4, 1);
  lcd.print(PROBEy);                                // (---- Menu Raumtemperatur
  lcd.setCursor(10, 1);
  lcd.print(char(223));
  lcd.print("C");
avragePROBE();
}
//--------------/\--MENU ROOMTEMP--/\--------------

//--------------\/--MENU WANTTEMP--\/--------------
void wantTemp(){
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("Sollwert");
  lcd.setCursor(5, 1);
  lcd.print(WANTx);                                 // (---- Menu Sollwert
  lcd.setCursor(8, 1);
  lcd.print(char(223));
  lcd.print("C");
  delay(150);
}
//--------------/\--MENU WANTTEMP--/\--------------

//--------------\/--MENU HYSTERESE--\/-------------
void hyst(){
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("Hysterese");
  lcd.setCursor(7, 1);
  lcd.print(HYSTx);                                // (---- Menu Hysterese                              
  lcd.setCursor(9, 1);
  lcd.print("K");
  delay(150);
}
//--------------/\--MENU HYSTERESE--/\-------------

Hi Shypa,
den PROBE-Eingang, Du hast A0 gewählt was völlig ok ist, darfst Du im Setup NICHT mit pinMode auf Input setzen.
Nachdem Du, wie Du es weiter oben gemacht hast der Variablen PROBE den Pin A0 zugewiesen hast, wird für den Analogeingang keine weitere Zuweisung benötigt. Einfach nur wenn der Sensorwert benötigt wird, mit analogRead abfragen.

LG Stefan

Hallo,
mal was neues? Spannungsverluste durch Software regeln :wink:
Ausführliche Beschreibungen zur verwendeten Hardware könnten für uns von nutzen sein.
Ein Schaltplan oder ein aussagekräftiges Foto der Verdrahtung könnte auch helfen.
Wenn Du einen Aktor dazu schaltest, und die Spannung bricht ein- könnte es ein Spannungsversorgungsproblem
sein. Aber ohne ausreichende Info....
Gruß und Spaß
Andreas

Der Arduino verwendet standartmäßig die 5V als Referenzspannung für den AD/Converter. Ist diese Spannung nicht 5V ist die AD/Wandlung falsch.
Lösungen:

  1. interne Spannungsreferenz nutzen, Je nach modell 1,1V 2,56V oder beides.
  2. mit "secret voltmeter" Code die 1,1V referenz messen und daraus die Versorgungsspannung errechnen
  3. externe Referenz verwenden (3,3V Spannungsstabilisator auf Arduino oder Zenerdiode oder Referenzspannungsbaustein) an Aref Pin anschließen.

der LM35 kann nur positive °C Temperaturen messen. Für Messung auch negativer Temperaturen brauchst Du den LM335 oder ein anderes Temperaturmeßsystem.

Grüße Uwe

uwefed:
der LM35 kann nur positive °C Temperaturen messen. Für Messung auch negativer Temperaturen brauchst Du den LM335 oder ein anderes Temperaturmeßsystem.

Zum Beispiel wäre auch ein digitaler Temperatursensor DS18B20 möglich.
Der kann von -55 bis +125°C eingesetzt werden und liefert seine Daten direkt digital aus.

Gruß, Katsumi

Dann ist also mit dem LM35 und Arduino zusammen keine brauchbare Temperaturmessung und Regelung realisierbar? Oder wieso braucht er jetzt nen anderen Sensor?

Ist sonst ein bisschen wie: Ich möchte mit meinem Madzda von München nach Berlin fahren - welches ist der beste Weg - Antwort: nimm nen BMW, der ist schneller.

Ich meine, die Komponenten hat er ja, nen Sketch hat er auch gepostet, also müsste es doch möglich sein, auf dieser Basis das ganze stabil zum laufen zu bringen. Zumindest hab ich bis jetzt noch keine Antwort gefunden, in der es hiess: vergiss es , mit diesen Komponenten ist das nicht möglich.

LG Stefan

Deltaflyer:
Dann ist also mit dem LM35 und Arduino zusammen keine brauchbare Temperaturmessung und Regelung realisierbar? Oder wieso braucht er jetzt nen anderen Sensor?

Die Infos, die der TO gegeben hat, sind wie so oft, leider etwas mager.

Deshalb kann man immer nur raten und allgemeine Hinweise geben. Wir wissen nicht, in welchem Temperaturbereich er messen will und was er mit den gemessenen Werten anfangen will. Das ist geheim.

Gruß Tommy

Deltaflyer:
Dann ist also mit dem LM35 und Arduino zusammen keine brauchbare Temperaturmessung und Regelung realisierbar? Oder wieso braucht er jetzt nen anderen Sensor?

...

Zumindest hab ich bis jetzt noch keine Antwort gefunden, in der es hiess: vergiss es , mit diesen Komponenten ist das nicht möglich.

Natürlich ist das Möglich, der TO hats ja auch hinbekommen.

Aber jeder Aufbau hat seinen Vorzüge und Nachteile.

Im dem Falle:
der LM35 liefert eine - von der Versorgung unabhängige - absolute Spannung.
Der Arduino hat einen - von der Versorgung abhängigen - AD-Wandler

Sprich: wenn sich die Versorgungsspannung des Arduino ändert, ändert sich die gemessene Temperatur.

Wenn man damit leben kann - gut.
:slight_smile:

Wenn nicht, dann muß man was ändern.
Eine der genannten Optionen ist ein anderer Temperatursensor, der sein Signal digital ausgibt. Damit umgeht man die Fehlerquelle AD-Wandler.
Oder man sorgt für eine entsprechend stabile, genaue Versorgung, die nicht einknickt, wenn die Displaybeleuchtung angeht. Oder man misst die Versorgungsspannung zurück, oder, oder, oder.

Aber warten wir doch mal, bis sich der TO wieder meldet, vielleicht verrät er uns ja seine Schaltung.

Ist sonst ein bisschen wie: Ich möchte mit meinem Madzda von München nach Berlin fahren - welches ist der beste Weg - Antwort: nimm nen BMW, der ist schneller.

Nimm den Mazda, da bekommst Du weniger Strafzettel. :wink: :wink:
Wer hat gesagt daß es mit dem Arduino nicht geht?
Man muß es nur richtig machen. Lösungen habe ich ja schon beschrieben.
Grüße Uwe

Entschuldigt das ich so spät antworte.

Erstmal danke für die vielen Hilfen. Das mit dem LM35 werde ich wohl auf einen anderen sensor umbauen. Um aber nicht alle Infos schuldig zu bleiben poste ich mal eine handgeschmierte Skizze der Schaltung.

Ich habe auch versucht die ausgegebene Spannung über einen Analogen Eingang aus zu lesen und diesen Wert als Berechnungsgrundlage für die am LM35 gemessene Temperatur zu nutzen. Der Erfolg hat sich leider nicht eingestellt.

Funfakt: Habe später dann noch aus unachtsamkeit 5V und GND pin gebrückt. Jetzt läuft die mühle auf 7.62V..... habe mir neue spannungswandler bestellt. Der alte ist in Rauch auf gegangen.

Ich bin jedoch positiv überrascht. Ich hätte nach knapp 3 wochen als Anfänger mit mehr defekter Hardware gerechnet .

Bekomme das mit dem Handy leider nicht besser hin. Bin auf Montage :confused:

Der Mega hat eine 2,56V interne Referenzspannung. Warum nimmst du nicht die?

Hat nichts geholfen. Für jeden zugeschalteten verbraucher ändert sich der gemessene temperaturwer um ca. 1.7 °C

Was mich halt auch sehr aus dem konzept bringt ist die Tatsache das bei angezogenem Relais und eingeschalteter Hintergrund LED des LCD1602 Displays zwischen PIN 5V und GND keine 5V mehr anliegen sondern nur noch 4.7V.

Und da der LM35 dann keine 5V mehr bekommt sondern nur 4.7V gibt er auch ein anderes Analoges Signal zurück.

Ich habe dann verucht die formel (denn ich messe ja ein mit 10bit aufgelöstes Signal 0-1023) so zu schreiben das sie nicht mehr von einem festen 5V signal aus geht sondern diese Variable variabel ist (haha) bin aber gescheitert.

Bin mir sicher das Uwe mir den absoluten Tipp gegeben hat. Aktuell versuche ich noch das geheimniss dahinter zu verstehen. Wird schon irgendwie klappen. Wie bereits gesagt.

Wie gesagt. Habe erst 3 Wochen kontakt mit der Materie.

Welchen Bereich hat den die Spannung, die vom lm35 kommt?

Hallo,
was soll dieses dämliche Gequatsche hier?

Der LM 35 funktioniert an tausenden von Arduino`s.
Wenn der TO andere Hardware zusätzlich betreibt- und der LM 35 funktioniert nicht mehr,
dann liegt hier ein SpannungsVersorgungsFehler oder ein VerdrahtungsFehler vor. Punkt.

Also sollte der TO doch erst einmal seine Verdrahtung und/oder seine SpannungsVersorgung in Ordnung
bringen.

Also es ist ein Arduino Mega vorhanden, wenn dieser mit ausreichend Spannung versorgt wird, dann liefert
der an seinem 5V Ausgang 5V. Immer!
Schließt man an diesem Ausgang einen LM 35 an, dann wird dieser immer- mit 5V versorgt.
Hör auf...

Nun besorge Dir erst einmal eine SpannungsVersorgung für den Mega, die mindestens 7,5V bei 500mA
liefern kann.
Wenn Du den Mega mit richtiger Spannung versorgst, den BlinkSketch laufen läßt- dann liegen an dem
5V Ausgang 5V an.

Nun nimmst Du Dein Display und verdrahtest es richtig mit dem Mega und stellst auf diesem einen
beliebigen Text da.
Auch jetzt liegen am 5V Ausgang 5V an- da hat sich nichts gerührt.

Falls Du das widererwartend geschafft haben solltest, dann verbindest Du Deine Taster richtig mit dem Mega.
Auch jetzt liegen am 5V Ausgang 5V an- da hat sich nichts gerührt.

Nun schreibst Du Dir einen Sketch:
Wenn Taster 1 gedrückt- Ausgabe Display "Taster 1"
.....
Wenn Taster X gedrückt- Ausgabe Display "Taster X"
Auch jetzt liegen am 5V Ausgang immer 5V an- da hat sich nichts gerührt.

Nun verdrahtest Du Dein Relays richtig mit dem Mega.
Auch jetzt liegen am 5V Ausgang 5V an- da hat sich nichts gerührt.

Nun schreibst Du Dir einen Sketch:
Wenn Taster 1 gedrückt- Ausgabe Display "Taster 1 und Relays on"
wenn nicht gedrückt, Ausgabe Display "Relays off"
Auch jetzt liegen am 5V Ausgang 5V an- da hat sich nichts gerührt.

Nun verdrahtest Du Deinen LM 35 (Plus am 5V Ausgang des Mega) richtig mit dem Mega.
Auch jetzt liegen am 5V Ausgang 5V an- da hat sich nichts gerührt.
Nun spielst Du einen LM 35 BeispielSketch auf den Mega.
Über den seriellen Monitor werden richtige Werte ausgegeben.
Wenn Du es bis hier her geschafft hast, dann ist der Rest Geschichte.
Gruß und Spaß
Andreas

Ist doch schön gezeichnet.

Die versorgungsspannung sollte konstant sein aber aus diversen Gründen kann es schon Spannungseinbrüche geben.

Und da der LM35 dann keine 5V mehr bekommt sondern nur 4.7V gibt er auch ein anderes Analoges Signal zurück.

Das ist völlig falsch.
Der LM35 gibt immer die gleiche Spannung aus, unabhängig von der Versorgungsspannung. Das Problem ist die Referenzspannung, die der Arduino verwendet um zu wissen was ein Analogwert von 1023 ADC sind.
Verwende die interne Referenzspannung analogReference() - Arduino Reference

analogReference(INTERNAL2V56);

und dann zur Umrechnung:

float Spannung = analogRead(analogpin) *2.56 /1023.0
float Temperatur = Spannung/100.0;

Grüße Uwe

Deltaflyer:
Dann ist also mit dem LM35 und Arduino zusammen keine brauchbare Temperaturmessung und Regelung realisierbar? Oder wieso braucht er jetzt nen anderen Sensor?

Wurde einfach nur deshalb vorgeschlagen weil er Steuerung für eine Kühlung baut. Der LM35 liefert bisher durch Spannungseinbrüche der als Referenz genutzen 5V Betriebspannung falsche Werte und kann ohne negative Spannungsquelle nur von 2° bis 150°C messen.

ElEspanol:
Welchen Bereich hat den die Spannung, die vom lm35 kommt?

Wenn ich das Datenblatt des LM35 so anschaue, reicht die interne 2,56V Referenz des Mega problemlos.
Der LM35 liefert 10mV/°C und ist bis 150°C tauglich. Also maximal 1,5V am A0.

Gruß, Katsumi

Hallo,
ich weiß auch nicht, was es für einen Sinn macht, den an Aref zu betreiben.
Das Ding ist ein SchätzEisen…

±0,75°C in seinem Bereich. Das sind 1,5°C.
Da wirst Du mit Aref oder einer anderen Zauberei nicht genauer.
Gruß und Spaß
Andreas

Shypa:
Das mit dem LM35 werde ich wohl auf einen anderen sensor umbauen.

Dann nimm auf alle Fälle einen mit digitalem Ausgang, z.b. den DS18B20. Für den den gibts ausreichend Tutorials und Beispiele und mit +/-0,5°C sollte er ausreichend genau sein.

Ich habe jetzt die hier angebotenen Lösungsansätze jeweils an 3 Verschiedenen Boards getestet.

UNO
UNO
MEGA

Jeweils komme ich zu den gleichen Ergebnissen. Zusätzlich habe ich ein anderes Multimeter verwendet um meine Aussage " ... zwischen 5V und GND liegen keine 5V an ... zu überprüfen.

Ich denke ich kaufe einen Carell Regler für 50€ und komme besser weg.

Vielen Dank an alle !

Grüße

Shypa:
Ich denke ich kaufe einen Carell Regler für 50€ und komme besser weg.

Wieder ein gutes italienisches Produkt. :wink: :wink: :wink: :wink:

@Shypa
Hast Du es mit der internen überhaupt Referenz versucht??

Grüße Uwe