Hallo
Ich möchte das ein Atmega 328p alle 168750 millisekunden die Temperatur
mithilfe eines lm35 misst. Das ganze funktioniert auch, allerdings nur
bis 0°C. Wie kann ich negative Temperaturen messen? Ich habe es so
versucht: http://forum.arduino.cc/index.php?topic=22114.0
Allerdings bekomme ich auch keine negativen Werte.
>Wie kann ich negative Temperaturen messen? Ich habe es so>versucht: http://forum.arduino.cc/index.php?topic=22114.0>Allerdings bekomme ich auch keine negativen Werte.
Zeig deinen kompletten Code und keine Links auf irgendein Forum.
>Wie kann ich negative Temperaturen messen?
Indem du dem LM35 negative Spannungsversorgung spendierst.
Die Beschaltung für Minustemperaturen ist im Datenblatt beschrieben.
Der LM50 kann übrigens ohne eine negative Spannungsversorgung
auch Minustemperaturen messen.
Hallo Roman,
Roman B. schrieb:> Habs gelesen. Aber wie werte ich das dann aus? Der atmega kann> doch keine negative Spannung messen, oder?
Die Spannung an A5 wird doch auch nicht negativ, sie wird nur niedriger
als die an A4! A4 liegt ja durch die zwei Dioden (Figure 18) schon bei
ca. 1.2V, dadurch hast du genug Luft nach unten. Beachte aber Figure 7:
Durch die geringere Versorgungsspannung von nur noch 3.8V ist bei 125°
Schluss.
LG, Sebastian
Roman B. schrieb:> Wenn mein Code fehlerfrei ist, wieso bekomme ich dann immer noch Werte> um die 16°C, wenn ich die Platine ins Gefrierfach lege?
Entschuldigung für die Ungenauigkeit: Nach erneutem messen komme ich auf
werte zwischen 36°C und 99°C.
Roman B. schrieb:> Oh! hab das ganze kontrolliert: Ich habe 1N4148 Dioden verbaut.> Liegt es> vielleicht daran?
Nein, daran liegt es nicht. Was genau ist mit A4 und mit A5 bei dir
verbunden? Skizziere uns mal genau deine Schaltung, der Forumsbeitrag
lässt da Raum für Interpretationen ...
Und: Speichere die Resultate von analogRead(A4) und analogRead(A5) mal
zwischen und gib die Werte auf der seriellen Schnittstelle aus. Was
sieht du da?
LG, Sebastian
Roman B. schrieb:> Serielle Schnittstelle hab ich nicht zur Verfügung:(
Warum nicht?
Ich dachte, die hat jeder Arduino?
Sowas ist natürlich leichtsinnig, wenn man versucht ohne eine
Möglichkeit zur Ausgabe auszukommen.
Ich schätze mal, dass analogRead einen unsigned Wert lieferen wird,
wodurch du natürlich im Regen stehst, wenn
1
.....analogRead(A5)-analogRead(A4)....
ein "negatives" Ergebnis liefert, weil der Wert von A4 größer als der
Wert von A5 ist. Der Ausdruck sollte dann zwar eigentlich negativ sein,
da es sich dabei aber um einen unsigned-Ausdruck handelt, kann er nicht
negativ sein sondern wird enorm positiv sein. Was dir dann den ganzen
weiteren Rest zusammen haut.
Ist aber nur eine Schätzung. Als Arduino Programmierer weißt du besser
als ich, welchen Datentyp analogRead eigentlich liefert.
Im Zweifel hätte man halt einfach ein paar Zwischenergebnisse auf einer
seriellen Schnittstelle ausgegeben und sich die Werte angesehen. Dann
wäre das Problem schnell klar. Aber, leider, leider ....
Du hast ja aber noch das EEPROM. Viel Spass beim Abspeichern und
Auswerten der Werte darüber.
Weil ich eine Platine mit einem Atmega 328p Mikrocontroller
zusammengelötet habe und keinen Arduino Verwende! Aber wieso können 2
unsignedd Werte wenn sie subtrahiert werden, nicht negativ werden? Ich
darf nur das Ergebnis nicht unsigned abspeichern!
Hi,
>werte zwischen 36°C und 99°C.
du hast nicht zufällig die Pullups aktiv?
Mache mal auch 18K von A5 nach GND.
Aus dem Datenblatt: "Choose R1 = −VS/50 μA"
Übrigens reichen auch 0,6V= 1x1N4148 für -60°C..ok -40°C
Ein Spannungsteiler 220R/9,1K vor A4/5 und Vref=5,00V machen die Sache
recht linear.
Viel Erfolg, Uwe
Ich hab schon 18k von A5 nach GND.
Könntest du mir das mit den Pullups und dem Spannungsteiler etwas näher
erklären? Ich hab noch nicht so viel Ahnung.
Hi,
>Ich hab schon 18k von A5 nach GND.
ahh, gut.
Naja, man kann den Eingängen interne Pullups spendieren. Wenn die an
sind
werden halt die Eingänge nach Vcc gezogen. Schlage mich nicht aber waren
die nicht so 20-40K????
Kannste aber recht einfach testen, LM35 ab, und dann A4/A5 einzeln
anzeigen lassen, müssen 0 sein.
Spannungsteiler:
Vref=5V->/1023=4,8875mV/LSB * 2 = 9,775mV
Dein LM35 hat 10mV/°C 10mV/9320*9100 = 9,7639mV
Wenn du also den ADC Wert /2 teilst haste eine Auflösung von 1°C sonst
ist 1 LSB halt 0,5°C wert.
Also 220R zwischen LM-Out und A5 und von A5->GND 9,1K
-> bei 100°C hast du einen Fehler von 0,011mV. Ist doch nicht schlecht
oder? Übrigens ist dann bei 0,6V auch der "Choose R1 = −VS/50 μA"
gleich mit erschlagen.
Viel Erfolg, Uwe
Karl Heinz schrieb:> Ich schätze mal, dass analogRead einen unsigned Wert lieferen wird,
1
intanalogRead(uint8_tpin)
Roman, hast du einen Arduino irgendwo? Wenn ja, kannst du TX des
Atmega328P mit sagen wir Pin3 des Arduino verbinden und über
SoftwareSerial von dort einlesen und über Serial an den PC weitergeben?
Lg, Sebastian
PS: GND verbinden nicht vergessen ...
Ja ich hab einen Arduino und diesen Vorschlag halte ich für eine gute
Idee. Das probier ich mal aus. Wenn ich den Spannungsteiler verwende,
kann ich dann negative Temperaturen messen?
Hallo Roman,
speichere die Resultate von analogRead(A4) und analogRead(A5) mal
zwischen und gib genau diese Werte, separat, auf der seriellen
Schnittstelle aus. Dann sehen wir ob es an A4, A5 oder der Berechnung
liegt.
LG, Sebastian
Hallo
Sorry das ich die letzten 2 Tage nicht online war.
Nein ich habs nicht gelöst. Ich habe momentan dei Platine mit dem
Arduino verbunden, jedoch funktioniert auch die Serialverbindung nicht!
Arduino Code:
1
#include <SoftwareSerial.h>
2
3
SoftwareSerial mySerial(10, 11); // RX, TX
4
5
void setup()
6
{
7
// Open serial communications and wait for port to open:
8
Serial.begin(9600);
9
while (!Serial) {
10
; // wait for serial port to connect. Needed for Leonardo only
11
}
12
mySerial.begin(4800);
13
}
14
15
void loop() // run over and over
16
{
17
if (mySerial.available())
18
Serial.write(mySerial.read());
19
}
Atmega Code:
1
#include <EEPROM.h>
2
float temp;
3
void setup(){
4
pinMode(13,OUTPUT);
5
pinMode(8,OUTPUT);
6
digitalWrite(8,0);
7
Serial.begin(9600);
8
}
9
int addr=0;
10
void loop(){
11
if(digitalRead(8)==0){
12
digitalWrite(13,1);
13
int a4,a5;
14
a4=analogRead(A4);
15
a5=analogRead(A5);
16
Serial.print("A4: ");
17
Serial.print(a4);
18
Serial.print(" - A5:");
19
Serial.println(a5);
20
temp=(5 * (a5 - a4) * 100) / 1023;
21
temp+=55.0;
22
int t=temp*100.0;
23
int h=t%100;
24
t=t-h;
25
t=t/100;
26
EEPROM.write(addr,t);
27
EEPROM.write(addr+1,h);
28
addr+=2;
29
if(addr>1023)addr=0;
30
digitalWrite(13,0);
31
delay(1000);
32
}
33
}
Schaltung:
Atmega Pin 2--> Arduino Pin 11
Atmega Pin 3--> Arduino Pin 10
Vcc und GND sind verbunden!
Hat noch jemand einen Tipp für mich?
Hallo Roman,
läuft der Atmega überhaupt? Blink doch mal eine LED.
Hast du einen Logikanalyser den du mal an Atmega Pin 3 und GND hängen
könntest?
LG, Sebastian
Der Atmega läuft da ich ja Temperaturen über 0 grad recht genau messen
kann. Ich habe leiderkeinen Logikanalyser (genauer gesagt: ich weiß
nicht einmal was das ist:( )
Und wofür ist diese Gechichte mit if(digitalRead(8)==0) gut? Wenn das
nicht der Fall ist wird nie gemessen oder serielle Ausgabe erzeugt ...
LG, Sebastian
Das dient dazu, das nicht neuer Werte ins eeprom bei der Auswertung
geschrieben werden und die ursprünglichen Messwerte verfälscht. Es dient
der Überprüfung, pb eine Drahtbrücke eingesteckt ist.
Hallo Roman,
Roman B. schrieb:> Der Atmega läuft da ich ja Temperaturen über 0 grad recht genau messen> kann.
Du bekommst doch aber keine Daten über die serielle Leitung mehr. Welche
Hinweise hast du denn stattdessen das der Atmega immer noch läuft?
Roman B. schrieb:> Es dient> der Überprüfung, pb eine Drahtbrücke eingesteckt ist.
Drahtbrücke nach VCC? Dann produzierst du aber einen Kurzschluss, oder?
LG, Sebastian
Nein ich produziere keinen Kurzschluss. Ich weiß, dass der atmega. noch
läuft, weil ich dieWerte aus dem eeprom auslesen kann(isp) und diese
sich von messung zu messung ändern.
Roman B. schrieb:> Ich weiß, dass der atmega. noch> läuft, weil ich dieWerte aus dem eeprom auslesen kann(isp) und diese> sich von messung zu messung ändern.
Hallo Roman,
wenn das Debuggen über die serielle Schnittstelle nicht funktionert:
Schreib doch mal die Rohwerte a4 und a5 ins eeprom, und lies diese aus.
Hallo
habe das Programm jetzt geändert. ABer wie kann ich jetzt wieder auch
die Werte rückschließen? Ich kenne mich mit Bitmanipulationen nicht aus.
Oder soll ich einfach das Hexfile posten?
?
Wie hast du denn die anderen Werte aus dem EEPROM ausgelesen?
Das ist doch jetzt auch nichts anderes. An 2 hintereinanderfolgenden
Bytes im EEPROM steht jeweils 1 Byte einer 16 Bit Zahl. Mehr ist das
doch nicht. Genau gleich wie vorher auch. Nur dass jetzt andere Zahlen
im EEPROM stehen.
Kann mir jetzt jemand sagen, was ich falsch gemacht habe oder woran es
liegt, dass ich keine negativen Werte lesen kann? Ich weiß nämlich nicht
mehr weiter!
Hallo Roman,
momang, momang, erst müssen wir das hex-File dekodieren. In der
Zwischenzeit poste uns bitte den exakten Sourcecode mit dem genau dieses
hex-File im Eeprom generiert wurde.
LG, Sebastian
Die beiden 1N4148 müssen die Spannung an A4 auf etwa 1.2V bringen.
Kannst du das nachmessen? Bei 1.2V müsste analogRead(A4) so ungefähr 245
zurückliefern. Irgendetwas ist grundsätzlich falsch.
LG, Sebastian
Nein, nein, eine reicht. Dann ergibt sich an A4 eine Spannung von ca.
0.7V. Dies entspricht einem analogRead(A4)-Wert von 0.7/5.0*1023 = 143.
Das stimmt ja fast mit den ersten Paar Werten im Eeprom überein. Ich
schätze du hast so ca. 7 Minuten gemessen und dann das Eeprom
ausgelesen? Der erste noch nicht überschriebene Wert könnte also (145,
146) sein, das entspricht (0.709V, 0.714V). Der letzte saubere Wert wäre
dann (158, 159) entsprechend (0.772V, 0.777V).
Jetzt frage ich mich a) warum steigt die Spannung an A4 in den vier
Minuten der aufgezeichneten Messung um 60mV an?
Und natürlich b) Warum ist A5 um 5mV höher als A4 wenn der Sensor im
Gefrierfach liegt und also ja bei -18° um 180mV niedriger als A4 liegen
sollte?
LG, Sebastian
Hallo Roman,
hast du ein Voltmeter? Kannst du mal händisch die Spannungen an A4 und
A5 messen? Bei verschiedenen Temperaturen (Gefrierfach, 0°C Eiswasser,
Raumtemperatur)?
Und kannst du diesen 18k-Widerstand mal durchmessen?
LG, Sebastian
A5 Raumtemperatur 0.7V
A4 Raumtemperatur 0.48V
A5 Gefrierfach nach 5min 520mV
A4 Gefrierfach nach 5min 530mV
Ich hoffe, dass du mit diesen Daten weiterhelfen kannst.
Hallo Roman,
Roman B. schrieb:> A5 Raumtemperatur 0.7V> A4 Raumtemperatur 0.48V>> A5 Gefrierfach nach 5min 520mV> A4 Gefrierfach nach 5min 530mV
Wenn ich das Datenblatt des LM35 und deine Schaltung richtig verstehe,
sollte A4 konstant bei ca. 0.7V liegen, und A5 sollte bei A4+10mV/°C
liegen.
Bei Raumtemperatur liegt A5 tatsächlich 22°C*10mV = 0.22V über A4. A4
liegt aber bei nur 0.48V. Hier ist also schon was falsch.
Beim Gefrierfach liegt dann A4 bei 0.53V, und A5 bei 0.52V, also nur
10mV <=> -1°C unter A4. Das ist tatsächlich recht warm für ein
Gefrierfach. Hast du noch ein normales Thermometer zur Messung der
effektiven Temperatur des Sensors im Gefrierfach?
Roman B. schrieb:> Widerstand: 17.27 Ohm laut MessgerätRoman B. schrieb:> 17Ohm, 5k, 19k,12k,7k
Ich würde an deiner Stelle 1. den 18k-Widerstand noch einmal ausserhalb
der Schaltung ausmessen, und 2. die Messungen noch einmal wiederholen,
aber diesmal ohne den Atmega, also nur mit der Messung der Spannungen an
A4 und A5 bei verschiedenen Temperaturen. Wenn die dann eher so wie
erwartet sind liegt es an dem Atmega, wenn die immer noch so seltsam
sind liegt es am LM35 oder dem Schaltungsaufbau.
LG, Sebastian
Bevor ich meine Schaltung wieder zerlege und den Widerstand. nachmesse
habe ich noch eine Verständnisfrage: Durch die Diode wird die Spannung
um 0.7 V angehoben, oder? Kann ich dann nicht einfach den Wert von A5
einlesen, als int speichern und dann (1023/5000)*700 abziehen? Kann man
das Ganze so vereinfachen?
Wenn du die Spannung an A4 kennst und sie konstant ist, dann kannst du
das im Prinzip machen.
Leider ist dir die genaue Vorwärtsspannung deiner 1n4148 a) nicht
bekannt (Serienstreuung), und b) ist sie nicht konstant sondern hängt
vom Stromfluß und der Temperatur ab. Datenblätter sind in
https://en.wikipedia.org/wiki/1N4148 verlinkt. Bedenke, dass du pro
Fehler von 0.01V einen Fehler von 1°C hast!
LG, Sebastian
Aber wenn die Vorwärtsspannung der Diode von der Temperatur abhängt,
kann man dann nicht gleich daraus.einen Temperatursensor bauen? Wäre
doch einfacher.
Das ist keine so gute Idee. Die Abhängigkeit ist nicht linear und auch
nicht definiert.
Wenn es einfach sein soll würde ich immer einen DS18B20 nehmen ...
LG, Sebastian