Forum: Mikrocontroller und Digitale Elektronik Das ewige Thema... Temperaturmessung mit AVR und LCD!


von Alex (Gast)


Lesenswert?

Hallo, Leute, ich weiss, das Thema gab es schon oft genug, aber ich
brauche noch ein wenig hilfe!
Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben!
Möchte aber Temperatur messen.
Habe einen 16x2 LCD.
Was ich schon rausbekommen habe es wird ein DS1820 benötigt..
Wie sieht dann die Schaltung aus?!
Und mein grösstes Problem... Wie krige ich das hin, dass mein Atmega16
widerstand (oder soll ich einen Spannungsteiler bauer und dann die
Spannung messen??) in °C umrechnet??
Wie soll ich dann diesen Wert auf dem LCD wiedergeben??!
Kenne mich mit C nicht aus... arbeite in BAscom!
Danke für die Hilfe!

von Bernhard S. (bernhard)


Lesenswert?

Hallo Alex,

>Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben

Na, das ist doch schon was!!

>Was ich schon rausbekommen habe es wird ein DS1820 benötigt..

Du kannst auch mit einem einfachen Temperatursensor KTY oder ein LM35
verwenden.


>Wie soll ich dann diesen Wert auf dem LCD wiedergeben??!

Zuerst sollte Dein ATmega16 einen Analogwert (Spannung) messen und
diesen Wert auf dem Display darstellen können.

Alle weiteren Funktionen lassen sich darauf hin aufbauen und an Deine
Bedürfnisse (Sensoren) anpassen ;)

Bernhard

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Du kannst auch gleich einen digitalen Temperatursensor (z.B. SHT11)
benutzen.
Unter BASCOM sollte es aber auch problemlos möglich sein, einen
AD-Wandler (im AVR integriert) anzusprechen und dessen Messwert noch
etwas umzurechnen.
Es gibt von den BASCOM-Machern ein wunderschönes Handbuch zum Download
(ca. 32MB).
Der DS1820 ist ein 1Wire-Sensor, also digital.
Der spuckt seinen Messwert schon als °C aus, allerdings muß man da noch
etwas an der Anzeige "drehen".

>Wie sieht dann die Schaltung aus?!
Steht im Datenblatt...(des Sensors).

>Wie krige ich das hin, dass mein Atmega16
>widerstand (oder soll ich einen Spannungsteiler bauer und dann die
>Spannung messen??) in °C umrechnet??

Brauchst du bei einem digitalen Sensor gar nicht.


>Alles was ich kann, ist "Hallo World" auf dem LCD zu schreiben
Mit'm Filzer?

Übrigens müsste es entweder "Hello world" oder "Hallo Welt"
heissen...

von Alex (Gast)


Lesenswert?

Also ich war gerade in meinem Elektronikladen geradeeben...
hatte da eine schaltung mit Ds1820, Ds1994, Attiny12, 72HC164..
von den ganzen Teilen, die ich für die Schaltung brauche, würde ich nur
Attiny und 74.... bekommen... die anderen können sie nicht bestellen!
Was gibt es für eine Möglichkeit noch??
Gaht das mit einem PTC oder NTC? Oder Wird das schon viel zu ungenau???

von Alex (Gast)


Lesenswert?

Wie kann ich eine Spannung mit Atmega16 messen????????
Wie soll ich sie in °C unrechnen???
Das ist völlig dunkler Wald für mich!!!!!!
Habe mir extra 2 LCD besorgt 16x2 und 27x4 um jetzt endlich was zu
machen... aber ohne euch komme ich nicht weiter!!! BITTE!!!!!!!!

von akw (Gast)


Lesenswert?

Spannungen kannst du mit dem ADC messen. Umrechnung musst du im
Datenblatt deines Sensors schauen, wenn er pro Grad z.B. 10mV ausgibt
dürfte es ja nicht allzu schwer sein. Bei einen NTC/PTC musst du halt
nen Spannungsteiler bauen und daraus die Berechnung machen (je nach
widerstand).

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Wie kann ich eine Spannung mit Atmega16 messen????????

Mit dem AD-Wandler.

>Wie soll ich sie in °C unrechnen???

Das geht i.d.R. aus dem Datenblatt des Sensors hervor.

>!!!!!!!!

Unnötig viele Satzendezeichen sind ein Zeichen für Schizophrenie...

Vielleicht solltest du dich von Bascom lösen und dir mal die Tutorien
auf dieser Seite angucken (Links links oben!).

Und hör auf zu jammern! Das kommt nie gut an! Oder sind wir daran
schuld, dass du das (aus welchen Gründen auch immer) nicht hinbekommst?

von Alex (Gast)


Lesenswert?

Ich möchte das jetzt mit einem NTC machen!
Sind die alle gleich, oder unterschiedlich?
Nahmen wir an, ich habe schon einen Spannungswandler.
LCD hängt bei mit am port B.
Wie soll ich weiter vorgehen?!
Mit "AD-Wandler" sagt mir leider nichts :(((
Kann mir das vielleicht jemand etwas genauer erklähren?

von Karl heinz B. (kbucheg)


Lesenswert?

> Geht das mit einem PTC oder NTC?

Klar geht das auch.
Soll das jetzt für dich einfach nur ein Übungsbeispiel sein,
oder soll das eher was professionelles werden?

Für ein Übungsbeispiel tuts ein PTC/NTC reichlich.

Zum Anfang würde ich mal an deiner Stelle die Temperatur
vergessen.
Irgendwo wirst du schon noch ein Poti rumliegen haben.
Das schliesst du so an:

 +   o----------+
                |
               ---
               | |
               | |
             <--------------- zum ADC Pin deiner µC
               | |
               | |
               ---
                |
 GND o----------+

Also als ganz normaler Spannungsteiler. Der Wert der Potis
ist zunächst mal relativ unkritisch. Du kannst 10k nehmen oder
100k oder 4.7k. Irgendwas in dem Bereich.
Worum es geht: Mit dem Poti kannst du eine variable Spannung
an den ADC Eingang des µC legen. Deine Aufgabe ist es jetzt
diese Spannung mit dem ADC zu messen und eine entsprechende
Ausgabe auf dem LCD zu machen.
Konzentriere dich zunächst mal darauf einfach nur den Wert
vom ADC direkt auf das LCD zu kriegen. Danach überlegst du dir
wie du den ADC Wert umrechnen musst, damit tatsächlich die
am Eingang anliegende Spannung als Volt-Zahl angezeigt wird.

Warum diese Vorstufe:
Nun, weil ein NTC oder PTC zusammen mit einem 2.-ten Widerstand
auch nichts anderes als ein Spannungsteiler ist. Nur drehst du
halt nirgendwo, sondern der Spannungsteiler reagiert auf die
Temperatur und ändert so die Spannung am ADC Eingang. Von dor
weg ist dann wieder alles gleich: Du musst die Spannung am ADC
messen, umrechnen und anzeigen. Das hast du aber bereits mit dem
Poti geübt wie man das macht.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wie soll ich weiter vorgehen?!

Indem du 2 Dinge studierst:
1) Das Datenblatt deines µC.
   Damit kriegst du raus, welcher Pin an welchem Port ein
   ADC Eingang ist

2) Das Bascom Handbuch
   Dort ist beschrieben, wie man den ADC Schaltkreis im µC
   dazu bewegt, die Spannung an genau diesem Pin abzunehmen
   und in einen Zahlenwert umzuwandeln.

von Alex (Gast)


Lesenswert?

Danke Karl Heinz Buchegger!!!

"Deine Aufgabe ist es jetzt
diese Spannung mit dem ADC zu messen und eine entsprechende
Ausgabe auf dem LCD zu machen.
Konzentriere dich zunächst mal darauf einfach nur den Wert
vom ADC direkt auf das LCD zu kriegen."

Wie soll ich da machen? ich verstehe schon, was ich machen soll, aber
wie...
Tutorials beschreiben das nicht.
Bin auch in programmieren ein Anfänder. Wolle aber jetzt richtig
anfangen damit, und brauche ERSTMAL ein wenig hilfe.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wie soll ich da machen?

Schon mal ins Bascom Handbuch geschaut?
Das gibts auch online
http://avrhelp.mcselec.com/bascom-avr.html

Schlage ich jetzt dort die Befehlsreferenz auf und scrolle
mal so drüber, dann fällt mir zb. der Befehl
CONFIG ADC
auf.
Super! Da kommt das Stichwort ADC schon mal vor. Wähle ich den
Befehl an, dann erscheint mir rechts ein komplettes Beispiel,
dass offensichtlich den ADC konfiguriert und abfrägt.

War doch nicht so schwer, oder?

von Alex (Gast)


Lesenswert?

Soweit bin ich schon:
Habe einen POti am ADC eingang.
mas soll ich jetzt machen`?

von akw (Gast)


Lesenswert?

Hast du es nur angeschlossen oder kannst du den ADC jetzt auch schon
auslesen? WEnn nicht, dann --->
http://avrhelp.mcselec.com/bascom-avr.html
Bei Suche adc eingeben und den Code aus "Config ADC" einfach nur
kopieren und anpassen!!

von Alex (Gast)


Lesenswert?

Ich habe das hier bei Roboternetz gefunden:

' Die gemessene Spannung wird in der Variablen W gespeichert.
' Channel ist der Pin, an dem die Spannung gemessen werden soll.

$baud = 9600
$crystal = 1000000
$regfile "m32def.dat"
Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Do
  W = Getadc(channel)
  Print "ADC-Pin " ; Channel ; ": Wert " ; W
  Incr Channel
  If Channel > 7 Then Channel = 0
  Waitms 800
Loop
End

Soweit ich es mit SCHON klar...
aber ich sehe ja das Ergebniss nicht.. was muss noch im Programm
stehen, damit ich das auf LCD bekomme?
Ich weiss nicht, wie ich das kombinieren soll!

P.S. ich komme mir eurer Hilfe ganz gut voran. Danke!

von Karl heinz B. (kbucheg)


Lesenswert?

> ich komme mir eurer Hilfe ganz gut voran

Das denke ich nicht.

Aber was solls.
Ich denke du kannst etwas auf dem LCD ausgeben?
Schon mal in der BASCOM Hilfe
http://avrhelp.mcselec.com/bascom-avr.html
(warum poste ich das überhaupt, du schaust ja anscheinend
sowieso nicht rein), den Befehl LCD nachgeschlagen?
Da kann man auch Variablen angeben!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>was muss noch im Programm stehen, damit ich das auf LCD bekomme?
>Print "ADC-Pin " ; Channel ; ": Wert " ; W

Leitet "Print" die Ausgabe nicht an das LCD?
Dann wird es wohl irgendwo eine Einstellung geben, die dafür sorgt.

>(warum poste ich das überhaupt, du schaust ja anscheinend sowieso
>nicht rein)

Karl Heinz, du bist ein viel zu netter Mensch! ;)

von Alex (Gast)


Lesenswert?

Doch, ich guck da schon rein...
LCD habe ich auch teilweise geguckt...mein problem ist Ich weiss nicht
WIE ich den gemessenen Wert auf LCD anzeigenlassen soll.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Print "ADC-Pin " ; Channel ; ": Wert " ; W

wird (vermutlich) zu
LCD "ADC-Pin " ; Channel ; ": Wert " ; W

von Alex (Gast)


Lesenswert?

Wenn ich das also richtig verstehe, lautet das Programm so:


 $regfile = "m16def.dat"
 $crystal = 16000000

 Config Lcd = 16 * 2

 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Do
  W = Getadc(channel)
  Print "ADC-Pin " ; Channel ; ": Wert " ; W
  Incr Channel
  If Channel > 7 Then Channel = 0
  Waitms 800
Loop
End


Richtig????

von Karl heinz B. (kbucheg)


Lesenswert?

LCD initialisieren
ADC initialisieren

Do
  W = Getadc(channel)
  LCD W
  Waitms 800
Loop

Hab jetzt kein BASCOM da, aber so sollte es gehen.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wenn ich das also richtig verstehe, lautet das Programm so:

Wo wird in diesem Program die Ausgabe gemacht?
Wahrscheinlich hier:

Print "ADC-Pin " ; Channel ; ": Wert " ; W

Wenn du jetzt nachschlägst, was PRINT macht, so kommt da raus,
dass der die Ausgabe auf die serielle Schnittstelle macht.
Du willst aber nicht auf die serielle Schnittstelle, du willst
auf das LCD. Also wirst du wohl diesen Teil gegen eine Ausgabe
auf das LCD ersetzen muessen. Und der Befehl dafür heist bei
BASCOM sinnigerweise LCD. In der Hilfe steht auch, dass sich
LCD gleich wie PRINT verhält.

Aber Achtung: das nächste Problem wartet schon :-)
Dein Lcd hat nicht unbegrenzt Platz zur Anzeige.
Da alle 7 ADC Kanäle in dieser Form auszugeben wird nicht unbedingt
sinnvoll sein.

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Anlage bitte gucken! :(((

von Karl heinz B. (kbucheg)


Lesenswert?

Ich sehe in deinem Programm nirgends wo 'W' definiert wurde!
Auch die Variable 'channel' wird nirgends vereinbart.

Warum hast du denn das rausgeschmissen? Ein bischen
mitdenken musst du schon.

Dim W As Word , Channel As Byte
Channel = 0

Versuch wenigstens den Code zu verstehen und tippe ihn nicht
einfach nur ab. Sonst kommst du nicht weiter.

von Alex (Gast)


Lesenswert?

Aber Achtung: das nächste Problem wartet schon :-)
Dein Lcd hat nicht unbegrenzt Platz zur Anzeige.
Da alle 7 ADC Kanäle in dieser Form auszugeben wird nicht unbedingt
sinnvoll sein.

Genau!!!
Aber ich habe zumindestens was auf dem Display!!!!!!!!!!!!!!!!!
Was muss ich ändern, damit nur ein pin, PA0 abgelesen wird?

von Karl heinz B. (kbucheg)


Lesenswert?

Auch das
START ADC
fehlt.

von Alex (Gast)


Lesenswert?

ich habe jetzt das hier:

 $regfile = "m16def.dat"
 $crystal = 16000000

 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Do
  W = Getadc(channel)
  Lcd "ADC-Pin " ; Channel ; ": Wert " ; W
  Incr Channel
  If Channel > 7 Then Channel = 0
  Waitms 800
Loop
End

aber er fragt alle pins am port A ab! ich brauche ja nur A0.
Wie löse ich das Problem?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

W = Getadc(0)

Das das so schwer?

von johnny.m (Gast)


Lesenswert?

Und das
> Incr Channel
> If Channel > 7 Then Channel = 0
kann dann auch weg...

von Alex (Gast)


Lesenswert?

Leute, versteht mich bitte nicht falsch, ich bin ein Totaler anfänger!
Jetzt habe ich alles was davor war begriffen!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>ich bin ein Totaler anfänger!

12 Jahre alt?

von Alex (Gast)


Lesenswert?

Sooooo...
es klappt jetzt FAST alles
Der Wert ändert sich!
Aber Avr schreibt mit Display voll mit " "Pin 0 Wert 192"
Ich brauche das je nur einmal auf einer zeile!
Wo ist das Problem?

von Karl heinz B. (kbucheg)


Lesenswert?

> ich brauche ja nur A0.

Noch mal: versuch wenigstens zu verstehen was da in deinem
Programm vor sich geht.
Wenn er alle Pins abfrägt, dann musst du dir halt mal den Abfrage-
Befehl genauer anschauen. Wwelcher da wäre GETADC.

Wie wird GETADC in deinem Pgm verwendet?

 W = Getadc(channel)

Aha. Was passiert mit channel? Was ist channel überhaupt.
Wieder in der Hilfe nachgeschaut: Das ist der Pin der
abgefragt wird. Die Zahl die in channel steht, bestimmt also
welcher ADC abgefragt wird. Was passiert mit channel.

  Incr Channel
  If Channel > 7 Then Channel = 0

Aha. Bei jedem Schleifendurchlauf wird channel um 1 erhöht
(incr channel). Ist der Wert 7 erreicht, wird channel wieder auf
0 gesetzt und beim nächsten Schleifendurchlauf wird daher
wieder der ADC Kanal 0 abgefragt.

Wenn du nur den ADC 0 abfragen willst, dann wirst du das wohl
ändern müssen. Am einfachsten ist es, du vergisst den ganzen
Hack-Mack mit channel und sagst dem µC was du willst.
Du willst: einfach immer nur den Kanal 0 abfragen. Also:

   W = getadc( 0 )

anstelle von

   W = getadc( channel )

Alternativ hätte man die Variable channel auch beibehalten können
und einfach nur dafür sorgen müssen, dass channel einfach immer
nur den Wert 0 enthält:

Channel = 0
Do
  W = Getadc(channel)
  Lcd "ADC-Pin " ; Channel ; ": Wert " ; W
  Waitms 800
Loop

So. Jetzt wird channel in der Schleife nicht mehr verändert und
behält daher in jedem Schleifendurchlauf den Wert 0, der ihm
vor der Schleife zugewiesen wurde.

von Alex (Gast)


Lesenswert?

>12 Jahre alt?

ehrlich? 13! :(

von Karl heinz B. (kbucheg)


Lesenswert?

> Ich brauche das je nur einmal auf einer zeile!
> Wo ist das Problem?

Das Problem ist, das LCD immer fortlaufend auf das LCD schreibt.
Das ist ganz praktisch wenn man mehrere Texte ausgeben will.
Aber in deinem Fall möchtest du das nicht.
Du möchtest, dass dein Text immer in der 1. Zeile, 1. Spalte
beginnt.

Schau mal in der Hilfe nach dem Befehl: LOCATE

von Alex (Gast)


Lesenswert?

>Schau mal in der Hilfe nach dem Befehl: LOCATE
Danke bin am Probieren

von Karl heinz B. (kbucheg)


Lesenswert?

Und studier mal das Beispiel, welches in der Hilfe
bei LCD angegeben ist. Da sind noch eine Menge anderer
interessanter Dinge enthalten.

Studieren heist nicht: abklopfen und laufen lassen (kann es auch
heissen). Studieren heist: Programmtext durchlesen, den Kommentar
zu jedem Befehl durchlesen und die Befehle die dann immer noch
unklar sind in der Hilfe nachschlagen.

von Alex (Gast)


Lesenswert?

Ich glaube es selbst kaum, aber es funktioniert!!!
habe da aber Zahlen z.B. 355, die sich mit dem Widerstand vom Poti
verändern!
Was sind das für Zahlen?
Wie mache ich daraus eine Spannung oder Temperatur, was ich eigentlich
wollte?!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Was sind das für Zahlen?
Dezimalzahlen.

Der Wert spiegelt die Stellung deines Poti zum Vollauschlag wider.
Wenn du das Poti voll aufdrehst, sollte 1023 oder (in die andere
Richtung gedreht) 0 angezeigt werden.

von Alex (Gast)


Lesenswert?

>Der Wert spiegelt die Stellung deines Poti zum Vollauschlag wider.
Wenn du das Poti voll aufdrehst, sollte 1023 oder (in die andere
Richtung gedreht) 0 angezeigt werden.

Danke tut er tatsächlich!

Wie mache ich daraus eine Spannung oder Temperatur, was ich eigentlich
wollte?!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Wie mache ich daraus eine Spannung oder Temperatur, was ich
>eigentlich wollte?!
Durch etwas Rechnen...
Dazu besorgst du dir einen Temperatursensor (kann auch ein NTC sein),
der bei einer bestimmten Temperatur entweder eine bestimmte Spannung
abgibt (LM75 heisst wohl einer von der Sorte) oder einen bestimmten
Widerstand hat (NTC).
Zu beiden gibt es ein Datenblatt, in dem beschrieben ist, wie sich der
Sensor bei welcher Temperatur verhält. Bei NTC hat man meist eine
Temperatur-Widerstandskurve gegeben.

von Alex (Gast)


Lesenswert?

ok, und wie bringe ich dem AVR bei, dass wenn die Spannung z.B. 2,0 Volt
ist, dass es 20°C sind?
und was ist mit 2,2 Volt? Muss man das alles per hand schreiben? Oder
wie geht das?

von johnny.m (Gast)


Lesenswert?

Der ADC teilt die Referenzspannung in 1024 gleiche Teile. Wenn Du das
Poti zwischen VCC (z.B. 5 V) und GND angeklemmt hast, dann entspricht
"0" 0V und 1023 5V*1023/1024, also ca. 4,995V. Aufgrund der
Funktionsweise des ADC fehlt oben immer ein LSB (also ein 1024tel bei
10 Bit Auflösung). Der Wert 1023 bedeutet also eigentlich, dass die
Spannung größer oder gleich 4,995V ist. Die Formeln für die Berechnung
des Spannungswertes stehen im Datenblatt vom AVR. Wenn Du einen
Temperatursensor anschließt, musst Du eben noch die Kennlinie des
Sensors berücksichtigen. Die wiederum findet sich im Datenblatt des
Sensors. Wenn Du einen NTC o.ä. in einem Spannungsteiler verwendest,
wird das etwas komplizierter.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Etwas rechnen (Dreisatz):

2,0V entspricht 20°C
2,2V entspricht x°C

von Alex (Gast)


Lesenswert?

ok, ich glaube ich gehe euch allen schon auf den Sack, aber die Letzte
Frage habe ich noch:
Wo soll ich im Programm angeben, dass er bei  2.0 Volt , also sagen wir
mal beim "Wert" den ich jetzt habe 338 z.B. 20°C anzeigen soll???
Noch was.. NTC´s sind ja bestimmt nicht linear.
Muss man da fast jeden Wert ausschreiben, oder wie geht das?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Kennst du EVA?
_E_ingabe _V_erarbeitung _A_usgabe.

Eingabe: Messwert einlesen
Verarbeitung: aus 338 20°C machen
Ausgabe: 20°C ausgeben.

Johnny.m hat die Berechnungsgrundlage ja schon hingeschrieben.

>ok, ich glaube ich gehe euch allen schon auf den Sack

Das kann man so nicht sagen; nur die Pausen zwischen deinen Fragen sind
zu kurz...Das wirkt, als hättest du gerne eine fertige Lösung
präsentiert bekommen.

von Karl heinz B. (kbucheg)


Lesenswert?

> Muss man das alles per hand schreiben?

Jaaaaa.
Das nennt man programmieren.
Und das ist das was du versuchst zu machen.
Also gewöhn dich daran.

von johnny.m (Gast)


Lesenswert?

Wie ich schon sagte: Kennlinien gibts im Datenblatt des NTC, meist steht
da auch ne Formel dabei, die Du nur in Dein Programm einbauen musst.
Wenn Du den NTC in einem Spannungsteiler betreibst, musst Du natürlich
den Festwiderstand mit einrechnen. Da Du aber weißt, welchen Widerstand
der NTC bei einer bestimmten Temperatur hat, ist das dann auch kein
großes Problem mehr (U(T) = U_ref * R_NTC(T) / (R_NTC(T) + R) mit R =
Festwiderstand, R_NTC(T) = temperaturabhängiger Widerstand des NTC und
U_ref = Referenzspannung bzw. Spannung über dem Spannungsteiler)

von smartie (Gast)


Lesenswert?

Kennlinie kann man mit excel ne Tabelle erstellen und die dann ins Flash
packen, mit dem Z-Register kann man bei Atmel recht einfach auf solche
Tabellen zugreifen (braucht man aber ein paar Assembler-Befehle zu).
Oder man nimmt kleine Fehler in Kauf und unterstellt eine lineare
Kennlinie, dann multipliziert man den Meßwert mit einem Linearfaktor
und addiert einen Offset drauf.

Es gibt auch neue ATtinys mit integriertem Temperatursensor
ATtiny 24/44/84 und 25/45/85.

von johnny.m (Gast)


Lesenswert?

Ach ja, und das R_NTC(T) errechnet sich dann eben nach der Formel im
Datenblatt. Die Formel musst Du dann nach der Temperatur auflösen (weiß
jetzt natürlich nicht, wie weit Deine mathematischen Kenntnisse gehen,
aber wenn Du nicht weiterkommst, kannste Dich ja noch mal melden), so
dass Du dann eine Formel wie T = f(ADC_Wert) bekommst...

von Karl heinz B. (kbucheg)


Lesenswert?

> Wo soll ich im Programm angeben, dass er bei  2.0 Volt , also sagen
> wir mal beim "Wert" den ich jetzt habe 338 z.B. 20°C anzeigen
> soll???

beschränk dich erst mal darauf, dass bei einem ADC Wert
von 338 in der Anzeige 2.0 Volt stehen soll.

Also:
Bei einem ADC Wert von 0, liegen da 0 Volt an
Bei einem ADC Wert von 1023, liegen 4,995 Volt an.

Weiters nehmen wir mal an, es gibt einen linearen Zusammenhang:

   V = A * k + d

V ... Volt
A ... Wert vom ADC

Die Frage ist also: wie gross ist k? Wie gross ist d?

Nun wir kennen 2 Werte-Paare

  0    = 0 * k + d
4,995  = 1023 * k + d

Das sind 2 Gleichungen in 2 Unbekannten (k, d). Das muesste doch
mit dem Teufel zugehen, wenn wir daraus k und d nicht bestimmen
könnten.
Aus der ersten Gleichung folgt sofort:  d = 0
Dieses d in die 2. Gleichung eingesetzt ergibt

    4,995 = 1023 * k

oder
           4,995
    k = -----------  = 0.00488
           1023

Also lautet der Zusammenhang zwischen ADC Wert und Volt

    V = A * 0.00488 + 0

Das + 0 können wir uns in die Haare schmieren :-)

Jetzt liegt es an dir, diese Umrechnung in dein Programm zu
integrieren. Definiere dir eine Variable die das Ergebnis aufnimmt
(Aufpassen: Da sind Kommazahlen im Spiel, also wird das eine FLOAT
Variable sein muessen) und lass das mal berechnen. Das Ergebnis
gibst du dann am LCD aus.
Wenn wir richtig gerechnet haben, dann muesste am LCD dieselbe
Voltzahl stehen, die dir auch ein Multimeter am ADC Eingang
anzeigt. (Na ja, mehr oder weniger :-)

von johnny.m (Gast)


Lesenswert?

Schau mal hier:
http://www.sprut.de/electronic/temeratur/temp.htm#ptc
Da steht eine Temperaturmessung mit einem (preiswerten) KTY81-Sensor
beschrieben. Wenn Du den Festwiderstand wie angegeben wählst, hast Du
eine fast lineare Kennlinie. Das vereinfacht die Berechnung noch mal
erheblich.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Das + 0 können wir uns in die Haare schmieren :-)

Falls (inzwischen) noch genug vorhanden sind...

von Alex (Gast)


Lesenswert?

>Verarbeitung: aus 338 20°C machen

Genau das ist das Problem!!!
Ich kann was machen, was ich sehen kann.. zum beispiel mit einem Messer
die Wurst schneiden :)))))))
An welcher Stelle soll ich das machen und vor allem WIE?

Habe jetzt sowas:

 $regfile = "m16def.dat"
 $crystal = 16000000

 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Cls
Locate 1 , 1
Lcd "    Alex"
Locate 2 , 1
Lcd "   Test"
Cursor Blink
Waitms 1000
Cursor Off

Cls
Do
  W = Getadc(channel)
  Lcd "TEMP out" ; Channel ; "=" ; W
  Locate 1 , 1
  Waitms 60
Loop

von Karl heinz B. (kbucheg)


Lesenswert?

> FLOAT Variable sein muessen

Tschuldigung.
Das heist in BASCOM gar nicht FLOAT. Dort heist es
entweder SINGLE oder DOUBLE.
SINGLE  Einfache Fliesskommagenauigkeit
DOUBLE  Erhöhte Fliesskommagenauigkeit.

von johnny.m (Gast)


Lesenswert?

Du darfst halt nicht "W" direkt ausgeben, sondern musst es erst
umrechnen. Also die Berechnung (Formel) zwischen dem "W =
Getadc(channel)" und dem "Lcd "TEMP out" ; Channel ; "=" ; W".
Wenns ne Spannung zwischen 0 und 5V bei 10 Bit Auflösung sein soll,
dann einfach was in der Art
W = W * 5V / 1024
(weiß jetzt nicht, ob das in BASCOM-Syntax so geht, aber mit BASCOM
kenne ich mich halt net aus...)

von johnny.m (Gast)


Lesenswert?

Ach ja, "W" muss dann natürlich ein anderer Datentyp sein. Um
Fließkommageschichten zu vermeiden, kannst Du den ADC-Wert vorher mit
1000 multiplizieren. Dann bekommst Du die Anzeige in Millivolt.

von Karl heinz B. (kbucheg)


Lesenswert?

>An welcher Stelle soll ich das machen und vor allem WIE?

Na an welcher Stelle wird das wohl passieren muessen.
(Du musst besser nachdenken)
* Kannst du die Umrechnung machen bevor du den Wert vom ADC
hast? Nein. Wohl kaum. Also wird diese Umrechnung iregendwann
nach dem holen des Wertes vom ADC passieren muessen.
* Kannst du die Umrechnung machen, nachdem du den Wert auf das
LCD ausgegeben hast? Können tust du schon. Nur ist das dann halt
sinnlos. Denn der Wert wurde ja bereits ausgegeben. Nach der
Ausgabe kannst du rechnen so vil du willst, hilft aber alles
nichts, denn der Wert steht schon am LCD.

Also wirst du wohl die Umrechnung zwischen
  * Wert vom ADC holen
  * Wert auf LCD ausgeben machen muessen

Wo ist das in deinem Programm
(enttäusch mich jetzt nicht, das musst du einfach finden. Ansonsten
ist Hopfen und Malz verloren).

von Alex (Gast)


Lesenswert?

danke! Ich werde mal zusehen, dass ich ein kty81 bekomme!
DANKE erstmal an alle! Ich melde mich noch!
Alex!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>DANKE erstmal an alle!

Gern geschehen. Was man nicht so alles für die Jugend tut.

>Ich melde mich noch!

War das jetzt eine Drohung? ;-)

von Karl heinz B. (kbucheg)


Lesenswert?

> W = W * 5V / 1024
> (weiß jetzt nicht, ob das in BASCOM-Syntax so geht, aber mit
> BASCOM kenne ich mich halt net aus...)

soviel ich weiss, geht das in BASCOM so nicht.
Du kannst in einer Anweisung immer nur eine Berechnung machen
(Keine Ahnung warum die das so gemacht haben. Ich kann mir ehrlich
nicht vorstellen, dass der Parser bzw. Codegenerierung deswegen
einfacher wird)

Man muesste das also so machen


   V = W * 5
   V = V / 1024

V muss natürlich vorher als neue Variable deklariert werden.
Irgendwas in der Art

DIM V as SINGLE

oder so.

von Alex (Gast)


Lesenswert?

Hallo, Hier bin ich wieder! Und schon mit einem neuem problem...
Habe mir einen NTC genommen. weiss aber nicht wie ich das anschliessen
soll.
Die richtwerte erstmal: -10°C - 1kOhm , +20°C - 2,3kOhm , +50°C -
5kOhm.
Soll es denn so sein, dass bei -10°C am ADC-pin z.B. 0,5 Volt anliegen,
und bei +50°C 4,5 Volt???????
Wie kriege ich das so hin, dass ich mit dem NTC die Spannung fast von 0
Volt auf 5 Volt regeln kann???
Weiss das jemand? Stecke an dieser stelle echt tief fest!

von Karl heinz B. (kbucheg)


Lesenswert?

Ist doch ganz einfach:
Du brauchst einen Spannungsteiler. Einer der beiden Widerstände
in dem Spannugnsteiler ist der NTC. Ohne Spannungsteiler geht
gar nichts, weil du sonst keine variable Spannung erzeugen
kannst.

Wie gross die Spannung am Abreifpunkt nun tatsächlich ist,
hängt natürlich vom Verhältnis der Widerstände ab und natürlich
davon welche Spannungen an den beiden Enden des Spannungsteilers
anliegen.

Wenn dir also der Bereich 0.5V bis 4.5V nicht gefäält, dann
könnte man an den Enden des Spannungsteilers einfach eine
andere Versorgung anschliessen.
Eine andere Möglichkeit wäre, vom Ausgang des Spannungsteilers
eine konstante Offsetspannung mit einem OP zu subtrahieren und
danach deie Spannung in den Bereich 0 bis 5V zu spreizen (wieder
mit einem OP, der als Verstärker verschaltet ist).

Aber: Das lohnt alles nicht. Dein ADC hat genug Auflösung um aus
dem Bereich 0.5 bis 4.5V noch was ordentliches zu machen. Und ob
der NTC so genau ist, dass der tatsächlich jedes 1/10 Grad
sauber auflöst, steht auch noch in den Sternen. Mal ganz von
der Nichtlinearen Kennlinie abgesehen.

Merke: Nur weil auf irgendeinem Display 6 Nachkommastellen angezeigt
werden, heist das noch lange nicht dass der Wert auch tatsächlich
so genau gemessen wurde.

von johnny.m (Gast)


Lesenswert?

"Regeln" kannst Du da gar nichts...

Das was Du beschreibst, ist eben der Nachteil der (im Aufbau dafür sehr
einfachen) Konfiguration mit einem einfachen Spannungsteiler: Du kannst
prinzipbedingt nicht den kompletten Messbereich ausnutzen, weil Dein
NTC weder ganz auf 0 Ohm runter geht (für 0 V) noch auf unendlich rauf
(wäre für 5 V erforderlich), außer, Du versorgst den Teiler mit einer
anderen Spannung (wie von Karl Heinz beschrieben), was es aber
erforderlich macht, den ADC-Eingang zusätzlich gegen Überspannung
abzusichern. Du musst den Wertebereich eben skalieren und kannst z.B.
die 0°C-Spannung (bzw. der Einfachheit halber direkt den entsprechenden
ADC-Ausgangswert) von Deinem Wandlungsergebnis abziehen. Die Skalierung
kann dann weitgehend linear erfolgen (vorausgesetzt, die Genauigkeit
genügt Dir...).

Alternativ wäre es möglich, den NTC in einer Brückenschaltung zu
betreiben und die Differenzspannung zu messen (entweder mit einem OP
verstärken oder direkt über einen der Differenz-Eingänge des Mega16).
Dann kommste auch bis auf 0 runter, und je nachdem, welche
Referenzspannung Du verwendest, kannst Du den Messbereich beliebig
ausnutzen. Das ist aber erheblich aufwändiger.

Mit der Teiler-Methode verlierst Du eben u.U. 20% Deines Messbereiches
(vorausgesetzt, Du willst tatsächlich nur von -10 bis +50°C messen...),
aber überleg mal, ob das nicht vielleicht gar nicht mal so schlimm ist.

BTW: Das was Du beschreibst scheint mir eher ein PTC zu sein und kein
NTC (Widerstand nimmt mit steigender Temperatur zu -> positiver
Temperaturkoeffizient)

von Alex (Gast)


Lesenswert?

Also ich habe jetzt mal mit Kältespray und Lötkolben am NTC rumgespielt/
experementiert...
Bei der ges.Spng von 5,5 V, geht beim Abkühlen die spannung auf 5,3
Volt...
Beim Arwärmen auf 1,0V
aber das sind die Extremwerte..
Habe einen 2.2kOhm in Reihe zum NTC!
Was meint ihr.. reicht das???

von Klaus (Gast)


Lesenswert?

Lieber Fragesteller,
liebe geduldige Beantworter,

ich brauche Eure Freigabe für diesen Thread.
Ich möchte dies als Buch herausgeben.
Titel noch unklar, aber das Buch soll beschreiben, was der Unterschied
zwischen einem "inschinörmässigen" Vorgehen und einem Wirren
drauflostippen ist.
Im Sinne von: Erst (selbst) nachdenken, dann machen. Und auch ein
bischen selbst recherchieren.

von Alex (Gast)


Lesenswert?

Kann mir mal einer die Icq nummer geben?
also, der, der mir helfen könnte!
ICh BRAUCHE die Hilfe!!!
Ode schreibt mich an, alle,die mir helfen möchten! BITTE!
168419332

von Karl heinz B. (kbucheg)


Lesenswert?

> Was meint ihr.. reicht das???

Die Frage kann dir keiner beantworten.
Den die Frage lautet eigentlich: Reicht Dir das?

Mal ein bischen überschlagsmässig rechnen:
Du hast einen Spannungshub von 1.0 bis 5.3 Volt
Bei 5.5 wäre Vollausschlag, da würde der ADC 1023 melden.
Also meldet er bei 1.0 Volt

    5.5  ...   1023
    1.0  ...    x
   -----------------
           1023 * 1.0
     x = -------------- = 186
              5.5

Dementsprechend kommen bei 5.3 Volt raus

    5.5  ... 1023
    5.3  ...  x
  -----------------
         1023 * 5.3
    x = ------------ = 986
             5.5

Dein ADC hat also einen Wertebereich von 986 - 186 = 800
Werten.
Nun weiss ich nicht, welche Temperaturen du mit dem Kältespray bzw.
dem Lötkolben erzielt hast. Das eine ist Arschkalt das andere
ist Aua. Aber beides ist nichts womit man mal ein bischen rechnen
könnte. Ausser der simplen Rechnung: zwischen 'brrr' und 'Aua'
liegen am ADC 800 verschiedene Werte.

Wenn du das nächste mal Versuche machst, nimm irgendwas was
du reproduzieren kannst: zb. Eiswasser ( 0°C) und kochendes
Wasser ( ~100°C ). Dann kann man aus den dabei gemessenen Werten
auch ermitteln, wie gross die Auflösung werden wird.

von akw (Gast)


Lesenswert?

Mein gott wo liegt denn dein Problem?
Klemm den Spannungsteiler an den ADC und dann kannst du nachlesen wie
du das dann berechnen muss und zwar hier:

http://de.wikipedia.org/wiki/Spannungsteiler

Einfach einlesen, Wert umrechnen, anzeigen, Fertig!
Schritt 1 und 3 dürftest du ja wohl noch schaffen, oder hast du ja
schon. Bei 2 musst du dein Köpfchen halt bisschen anstrengen.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

@Klaus: mit 13 geht man noch nicht indschenjörmässig vor...

von Alex (Gast)


Lesenswert?

Danke, Karl Heinz Buchegger!!!
Nun kommt die Frage, bei der bestimmt alle sagen: "OH NEIN!!!!"
Ich habe jetzt wie du ausgerechnet hast 800 werte!
Ich kenne leider Syntax von Bascom nicht!
Aber ich weiss schon an welche Stelle das Ganze soll!
Wie schreibe ich dass Wert 530 18°C antspricht?
Ich weiss was ich machen muss, aber wie gesagt Syntax ist das problem.
Wenn mir jemand paar beispiele schreibt, dann kann ich auch alleine
weiter.
also 150  entspricht ca. 120°C
     980  -------------- -40°C
Wie mache ich das jetzt?
Seit bitte nicht böse, ist ja keine Absicht, dass ich so nerve!

von Karl heinz B. (kbucheg)


Lesenswert?

Scroll  mal ein wenig rauf.
Weiter oben hab ich dir den Rechengang schon mal angegeben.
War damals für Spannungen. Ist aber hier genau dasselbe,
kommen halt nur andere Zahlenwerte vor.

(Es läuft auf das Lösen 2-er Gleichungen in 2 Unbekannten
hinaus um damit eine Umrechnungsgleichung aufzustellen.
2 Gleichungen in 2 Unbekannten lösen kannst du doch, oder?)

von Alex (Gast)


Lesenswert?

ja, kann ich! Soll ich diese gleichung dann ins programm irgendwie
integrieren?
Das problem ist ja PTC ich nicht linear.. oder ist das nicht sooo
schlimm?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Guck mal, wo er nichtlinear ist. Ist der vielleicht in einem Bereich
nichtlinear, wo dich die Temperatur eh nicht interessiert?
Sonst gibt es so nette Sachen wie Linearisierung mit Hilfe
irgendwelcher Polynome...
Eine andere Möglichkeit wäre die Verwendung einen annäherend linearen
Temperatursensor (kty8x, LM135 oder wie der heisst).

von Alex (Gast)


Lesenswert?

Ich habe keine Ahnung! Habe da schon alles mögliche probiert!
Das letzte sah bei mir so aus:


 $regfile = "m16def.dat"
 $crystal = 16000000

 Config Lcd = 16 * 2
 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4

Config Adc = Single , Prescaler = Auto
Start Adc
Dim W As Word , Channel As Byte
Channel = 0
Cls
Locate 1 , 1
Lcd "    Alex"
Locate 2 , 1
Lcd "   Test"
Cursor Blink
Waitms 1000
Cursor Off

Cls
Do
  W = Getadc(channel)
  DIM V as SINGLE
   V = 100 * 800
   V = V * 150

  Lcd "TEMP out" ; Channel ; "=" ; V
  Locate 1 , 1
  Waitms 60
Loop



Kann das mal jemand korrigieren?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

V = 100 * 800
   V = V * 150
Lcd "TEMP out" ; Channel ; "=" ; V

Dürfte 12000000 anzeigen...und zwar konstant.

von Alex (Gast)


Lesenswert?

irgendwas mit 12000000 habe ich auch!
Was ist das aber für ein Wert???
Bin schon echt am verrecken mit der ganzen Sache... hatte von 2 minuten
Hammer in der Hand.. ohne Witz!

von akw (Gast)


Lesenswert?

Ich weiß zwar nicht was du da rechnest, aber ich sehe, dass die Variable
W in deiner Berechnung gar nicht vorkommt. Was willst du damit
bezwecken?

von Alex (Gast)


Lesenswert?

>ich sehe, dass die Variable
W in deiner Berechnung gar nicht vorkommt.

Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.

von akw (Gast)


Lesenswert?

Was denn für ein Fehler? Zeig doch erst mal W auf dem LCD an statt
irgendnem Scheiß den du garnicht brauchst.

von Alex (Gast)


Lesenswert?

W  hatte ich schon.. diese dezimalzahl, oder was das auch immer war!
Ich habe da schon alles mögliche probiert.. komme nicht weiter!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.

Das liegt vielleicht daran, dass SINGLE Zwölfmillionen nicht abbilden
kann; dazu ist der Wertebereich von SINGLE zu klein.

Die Geradengleichung y=m*x+b ist dir bekannt?

von Branko Golubovic (Gast)


Angehängte Dateien:

Lesenswert?

Wenn du als PTC ein KTY81 nimmst ist die Temperatur-Spannung verlauf von
-20°c bis ca. 100°C linear. Siehe genau der Anhang.
Jede Temperatur Änderung von 0,5°C bewirkt das sich ADC-Wert
um 1 ändert. Ich habe mit dem BASCOM nie gearbeitet, aber dein Code
sollte ungefähr so aussehen:
….
Do
  W = Getadc(channel)
  W=W-NULLPUNKT
  Lcd "TEMP out" ; Channel ; "=" ; W/2 // Temperatur als Ganzzahl
  Lcd "."      // Dezimalpunkt
  Lcd 5*(W%2)      // Nachkommastelle(in 0,5 Schritte)
  Lcd "°C "      // °C Anzeige
  Locate 1 , 1
  Waitms 60
Loop
……
 NULLPUNK ist Wert welche ADC liefert bei 0°C(Siehe Anhang).
Aref Spannung ist mit einem Trimmerpoti einzustellen. Richtige wert
steht in die Tabelle.
Bei mir ist KTY81-110(1Kohm bei 25°C); R=2,7Kohm 1%;NULLPUNKT=300 und
Aref=3,95V.
Am ende hast du Temperaturanzeige von -20°C bis ca. 100°C mit Auflösung
von 0,5°C.

Grüß Branko

von akw (Gast)


Lesenswert?

Rechne erst W in Volt um. Wie das geht steht mehrfach oben. Aber weil
ich ja so sozial bin geb ich dir nochmal nen Denkanstoß:

W = 0 -> 0 Volt
W= 1023 -> 5 Volt

Dann machst du es so, dann hast du Volt.

V = 5/1023
V = V*W

Dann schaust du halt im DAtenblatt deines Sensors welchen Widerstand er
bei wieviel Grad hat.
Dannach berechnest du den Spannungsteiler d.h. wie viel Volt bei
welcher Temperatur am ADC anliegen.

Dannach musst ja nur noch schauen was am ADC anliegt und die passende
Temperatur aufs LCD schreiben.

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

@Branko

Habe ich probiert! Guck mal bitte Anhang.

von johnny.m (Gast)


Lesenswert?

Ich kenne die Kommentarzeichen in Basic nicht, aber die meisten der
Fehler beziehen sich anscheinend darauf, dass der Compiler die
Kommentare nicht als solche erkennt. Also ist "//" anscheinend nicht
korrekt. Außerdem scheint NULLPUNKT nirgends definiert zu sein...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Kommentare in Basic werden vermutlich nicht mit // eingeleitet. Das ist
C/C++-Syntax.

von akw (Gast)


Lesenswert?

Man jetzt mal ehrlich hast du dir mal überlegt erst mal ein klein
bisschen programmieren zu lernen? Dir ist schon klar das variablen erst
mal deklariert werden müssen??

@Branko: Kommentare macht man in Bascom mit ' nicht mit Slash, aber
kannst du ja nicht wissen.

Aber Alex: Nur Codeschnipsel kopieren funktioniert einfach nicht,
überleg doch bitte ein wenig. Mach das was ich dir gesagt hab.

von Alex (Gast)


Lesenswert?

ich glaube ich geschäftige mich schon viel zu lange heute damit.. seit
07.30 oder so... kann das ganze nicht mehr sehen! Es geht einfach
nicht! Immer wieder neue Fehler!
falls jemand noch eine Idee hat > reinschreiben.. ich habe für heute
echt keine Lust mehr!
Danke!!!!

von Henrik J. (Gast)


Lesenswert?

Ich denke auch, dass du schon zu lang davor hängst. Erstmal ne Nacht
drüber schlafen.

Das mit der NULLPUNKT Variable stimmt natürlich. Und es hängt damit
nicht an deiner "W" Variable. Am besten immer alle Fehlermeldungen
lesen. Und ganz wichtig. Von oben beginnen. Meist bedingen alle
weiteren Fehlermeldungen die erste.

von Alex (Gast)


Lesenswert?

> Man jetzt mal ehrlich hast du dir mal überlegt erst mal ein klein
bisschen programmieren zu lernen? Dir ist schon klar das variablen
erst
mal deklariert werden müssen??

Mal genz ehrlich:
Ich bin 13 jahre alt, ich habe erst "gestern" erfahren was eine
Variable ist.... ich versuche es.... aber nicht alles bringt mich
weiter.. was ich schon mal geschafft habe, dann habe ich es begriffen,
und kann es noch mal selber machen..
Wenn es so einfach für einen ist.. dann kopier doch meine Code, und
ändere da 3 zeilen, so dass es funktioniert!
Ich bin nicht zu Faul, ich habe schon alles mögliche probiert... bis
ich auf englich 2 Stunden lang mit Wörterbuch verstanden was ADC
überhaupt ist.. hatte ich schon kein Bock mehr.. ich habe es übersetzt,
aber erst verstanden, als ich das gemacht habe!
Das meiste was die Leute hier schreiben, sagt mir überhaupt nichts!
Nicht darum, weil es falsch ist.. ich bin noch zu Jung, oder ich weiss
nicht sonst was...
Erst wenn ich eine Funktionierende Zeile habe, dann kann ich schon
nachdenken, wie sie entstanden ist, und wo das ganze herkommt!
Für mich ist das schwer, eine Zeile selbst zu schreiben, weil ich
Syntax GARNICHT kenne!
Bascom Handbuch lesen??? 700 seiten auf Englich , nein,
danke!!!!!!!!!!!

von akw (Gast)


Lesenswert?

Ja eins hab ich noch zu sagen:

Tut mir Leid, aber mit dem was du im Moment fabrizierst musst du morgen
warscheinlich auch gar nicht erst anfangen.

Warum lässt du dir nichts sagen? Es ist doch wohl klar, dass wenn du
nur irgendwelche Pseudo Code Schnipsel kopierst, die irgendjemand hier
reinschreibt kopierst und nciht selber überlegst nicht weiterkommst.

Es ist doch wirklich nicht so schwer, ich habe das Gefühl du hast dir
deinen eigenen Thread noch nicht mal komplett durchgelesen, sonst
hättest du nämlich bemerkt, dass die Lösung hier schon mehrfach steht.
Darum mal n Tip:

Lesen, dann überlegen, das hier ist wohl eins der einfachsten Projekte
und ich denk echt nicht das du so blöd bist und nicht einfach mal
normal überlegen kannst, dann würdest du nämlich auch auf die Lösung
kommen.

Nochmal: So kommst du nciht weiter!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Bascom Handbuch lesen??? 700 seiten auf Englich , nein,

Das wäre für mich ein Grund, auf C oder so umzusteigen. Denn einerseits
gibt es dazu hier auf der Seite ein Tutorium und C ist wesentlich
verbreiteter als BASCOM.
Nachteil ist natürlich, dass man keine vorgefertigten Funktionsblöcke
hat.
Um Englisch wirst du nicht herumkommen, wenn du mit Elektronik weiter
"rumspielen" willst.

von akw (Gast)


Lesenswert?

Also meiner Meinung nach ist es für Bascom nicht mal (unbedingt) nötig
ein Handbuch zu lesen. Ich weiß nicht ob du schonmal mit Bascom
gearbeitet hast, aber es ist echt simpel. Ich arbeite auch vorwiegend
damit und hab auch kein Handbuch gelesen und bekomm alles auf die
Reihe. Wenn man sich mal ein paar fertige Programme anschaut erklärt es
sich sozusagen von selbst. Und wenn ich mal garnicht weiterkomm gibts ja
immer noch die Onlinehilfe.

von Nico M. (hannover)


Lesenswert?

Hallo,
also wenn du es ganz simpel haben möchtest, nimm nen TWI fähigen Sensor
z.B den DS1621. Und dann brauchst du nur noch zwei Widerstände und die
passenden Befehle in BASCOM und schon kannst du wunderbar die
Temperatur auslesen.

Gruß
Nico

von Nico M. (hannover)


Lesenswert?

Huch,
da waren andere schon schneller. Also wenn du noch gar nicht so richtig
programmieren kannst, würde ich erstmal ein paar Programme für PC's
schreiben. Damit du erstmal überhaupt ein Gefühl fürs Programmieren
bekommst. Nimm da meinetwegen Pascal, Basic oder Delphi sind seh gute
Einsteigersprachen. Und dann wenn du dich damit ausreichend befasst
hast, kannst du entweder ne "mächtigere" Sprache wie C/C++/C# lernen
oder dich halt mir BASCOM un Mikrocontroller Programmierung befassen.
Wobei du natürlich auch einen Mikrocontroller in C programmieren
kannst. Es gibt da auch sehr gute Bücher für den Programmiereinstieg.
Z.B Delphi für Kids oder Turbo Pascal für Kids <- Sind echt nicht übel
diese Bücher wenn auch die Beipiele meist nicht sehr produktiv sind.
Aber man lern die Programmiersprache kennen. Und auch für C++ gibt es
ein Buch namens C++ für Kids.

Gruß
Nico

von Kunz von Kaufungen (Gast)


Lesenswert?

Irgendwie ein toller Thread! Fehlt nur noch das Erfolgserlebnis. Wird
schon werden...

von Karl heinz B. (kbucheg)


Lesenswert?

Oh Mann

> Sobald ich da irgendwo W habe, schreibt mir Bascom einen Fehler.

Aha. Und deshalb lässt du sie einfach weg.
Mann. V berechnet sich aus W. Also muss in deiner Formel das
W auch in irgendeiner Form vorkommen! Ein Computer ist auch nur
ein Mensch!

Das ist doch nicht so schwer.
Hast du das Gleichungssystem mitlerweile (am Papier) gelöst?
Welche Werte kriegst du für k und für d?

Sagen wir mal, du hast ausgerechnet, dass k gleich 0.5 ist
und d gleich 20 ist.

Dann programmierst du in BASCOM:

  V = 0.5 * W
  V = V + 20

Und das wars dann schon. Für 0.5 bzw. 20 musst du natürlich
die Zahlen einsetzen, die du ausgerechnet hast.

Falls du die Werte nicht bestimmen kannst, dann helf ich dir auch
damit. Aber dann brauch ich von dir für 2 Temperaturen den
gemessenen ADC-Wert (also das W). Also für welche Temperatur x
hat der ADC welchen Wert y ausgespuckt.

von Karl heinz B. (kbucheg)


Lesenswert?

Jungs.
Können wir uns darauf einigen erst mal Themen wie Linearisierung
der Kennline aussen vor zu lassen? Alex hat auch so schon genug
Schwierigkeiten. Hier gehts nicht darum, dass er ein Präzisions-
instrument baut, sondern dass sein µC was Sinnvolles macht, das
einigermassen richtige Ergebnisse liefert. Wenn ihm das Teil
im Zimmer 24 Grad anzeigt und draussen vor dem Fenster 5 Grad,
(und der Fehler nicht größer als ein Paar Zerquetschte ist)
dann sollten wir das schon als Erfolg werten.

Was wir Alex beibringen muessen, ist die ganz banale Schleife

  Schleife
     Werte vom Sensor lesen
     Sensorwerte in die benötigte Zieldimension umrechnen
     Ergebnisse ausgeben
  End Schleife

Anscheinend hat er da mehr als nur ein Paar Schwierigkeiten mit
Dingen die Euch und mir noch nicht mal ein Lächeln kosten.

von mike (Gast)


Lesenswert?

also ich bewundere hier manche,mit welcher gedult sie die
dinge erklären.nur ist es hier bestimmt noch keinen aufgefallen,
entschuldigt die direktheit, das die grundkenntnisse noch nicht
vorhanden sind.
an meiner strelle würde ich mir das bascom handbuch unters
kopfkissen legen und es studieren und alles nach und nach
ausprobieren.von einfachen sachen wie z.b. "hallo welt" bis
einfaches lauflicht und eben zu diesem vorhaben ,ein termometer.
also alex,von nichts kommt nichts.denke darüber mal nach,
bin selbst am anfang und am lernen.manche sachen gehen halt
nicht so schnell.auch ist es mit viel arbeit verbunden,bis man
am ziel ist.
ein tipp suche hier im forum mal nach "einfacheslauflicht"
,"thermometer,bascom".

gruß mike

von Nico M. (hannover)


Lesenswert?

Also ich finde, nach dem ich alles nocheinmal gelesen habe, nach wie vor
er sollte erstmal ein bisschen nochmale PC programme schreiben, muss ja
nichts extrem aufwendiges sein. Aber so lernt man unabhängig der
Eigenschaften eines uC erstmal Programmieren. Und dann kann man seine
Kenntnisse auf uC's ausweiten. Also ich finde das ist der bessere Weg
als gleich beides auf einmal zu machen Elektrotechnik und Programmieren
lernen. Ich habe selber ca. 3 Jahre in C++ programmiert und mich dann
erst als ich mit der Ausbildung angefangen habe, mit Elektrotechnik
beschäftigt.

von Karl H. (kbuchegg)


Lesenswert?

> nach wie vor er sollte erstmal ein bisschen nochmale PC programme
> schreiben,

Da geb ich dir grundsätzlich recht. Das kann durchaus auch auf
dem PC ein BASIC sein, auch wenn BASCOM mit einem normalen BASIC
nicht allzuviel gemein hat. Aber die Möglichkeiten die auf
dem PC vorhanden sind, ich denke da zb. an Debugging Möglichkeiten,
sind schon ein enormer Vorteil gegenüber allem was man auf einem
µC hat. Da ist Debugging oft mehr ein Stochern im Nebel.

Alex hat halt momentan das Problem so wie alle Neulinge, dass
er gleichzeitig allgemeine Programmiertechniken, eine spezifische
Programmiersprache, English, Aufbau eines µC und seiner speziellen
Hardware und auch noch etwas Elektronik lernen muss.

Wenn davon 2 Dinge wegfallen könnten (µC und Elektronik) wäre
schon einiges gewonnen und die Aufgabe leichter.

von Karl H. (kbuchegg)


Lesenswert?

Was auch wichtig für ihn wäre: Literatur.
Ich kenn aber kein deutsches BASCOM Programmierbuch.

von Paul Baumann (Gast)


Lesenswert?

... aber ich.
1. AVR Mikrocontroller Lehrbuch von Roland Walter (sehr gut)
2. Programmieren mit Bascom-Avr von Claus Kühnel

Das erstere habe ich hier und kann es sehr empfehlen.

MfG Paul

von akw (Gast)


Lesenswert?

@Karl Heinz

>BASCOM mit einem normalen BASIC nicht allzuviel gemein

Naja, ich find schon das es eingiges gemein hat, der ganze Syntax und
so passt ja schon. Naja, also ic komm auch aus der Basic Ecke (hab
schon einige PC Programme geschrieben) und das erleichterte mir die
Sache am Anfang schon ungemein.

von Henrik J. (Gast)


Lesenswert?

Ihr habt meinen Respekt.

Ich habe keine Geduld einem 13 jährigen Hyperaktiven die Grundsätze der
Elektronik und Programmierung anhand eines fortgeschrittenen Beispiels
zu erklären.

von Karl heinz B. (kbucheg)


Lesenswert?

Jeder hat mal angefangen.
Und am Anfang ist es schwierig, weil du 20 Sachen gleichzeitig
lernen bzw. berücksichtigen musst.
Besonders schwer ist es wenn man so wie Alex ins kalte Wasser
springt und ohne Literatur an die Sache rangeht. Ein Buch
hat den Vorteil, dass es von 0 weg die Dinge systematisch
aufbaut. Das hat aber den vermeintlichen Nachteil, dass die
ersten Kapitel extrem fad sind und sich praktisch nichts am
Rechner rührt, weil es da um Dinge wie 'Was sind Variablen',
'Wie werden Berechnungen angestellt' und solch grundlegende
Dinge geht. Genauso sehen dann auch die ersten Programme aus:
extrem fad.
Aber da muss er durch.

von Florian (Gast)


Lesenswert?

Wie wäre es mit einem Experimentier-Board, bei dem so was alles schon
als Beispiel dabei ist? Das spart Frust und kostet weniger, als sich
die Nächte um die Ohren zu schlagen.
Elektor hat so was zum Beispiel.
http://www.elektor.de/Default.aspx?tabid=28&year=2006&month=5&art=5550740&PN=On&SearchText=
Ist zwar dann in C, aber dafür ist da ein funktionierendes LCD und auch
eine einfache Temp.messung als kostenloses Download verfügbar.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

@Florian:
Das ist unsportlich. Den einfachen Weg gehen kann jeder.
Alex hat einfach nur das Problem, dass er etwas hyperaktiv ist und auf
Krampf Erfolg haben muß/will. Würde er es etwas ruhiger angehen, würde
es vermutlich mehr bringen.

von Florian (Gast)


Lesenswert?

Na anscheinend kann halt nicht jeder den einfachsten Weg gehen ;-)
Deshalb mein Schubser in diese Richtung. Manchmal ist es nicht nur
einfacher, sondern auch kostengünstiger und vor allem nervenschonender
erst zu investieren und dann zu lernen. Vor allem angesichts des
Umstandes, das bisher >100 Beiträge nicht gereicht haben, das Thema zu
klären.
Aber ich gestehe: Ich erfinde das Rad auch immer wieder gerne neu.

von Alex (Gast)


Lesenswert?

> Falls du die Werte nicht bestimmen kannst, dann helf ich dir auch
damit. Aber dann brauch ich von dir für 2 Temperaturen den
gemessenen ADC-Wert (also das W). Also für welche Temperatur x
hat der ADC welchen Wert y ausgespuckt.

18°C - 571 (ADC Wert)
0 °C - 800 (Adc Wert)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

T= -0,08°C*N + 64°C

T Temperatur in °C
N ADC-Wert
Kannst du durch Einsetzen deiner Werte überprüfen.
Es wird mit gewissen Rundungsfehler funktionieren.

Habt ihr in der Schule schon die Geradegleichung (y=m*x+b)?

von Alex (Gast)


Lesenswert?

> Habt ihr in der Schule schon die Geradegleichung (y=m*x+b)?

Nein, leider noch nicht! :(
Ich probiere deine formel jetzt aus! :)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Dass du die in BASCOM erst zerlegen mußt, ist dir klar, oder?
BASCOM kann AFAIK immer nur eine Berechnung pro Zeile.

von Alex (Gast)


Lesenswert?

> Dass du die in BASCOM erst zerlegen mußt, ist dir klar, oder?
BASCOM kann AFAIK immer nur eine Berechnung pro Zeile.

Habe es jetzt so stehen:

Do
  W = Getadc(0)
  Dim T As Single
T = -0.08 * W
T = W + 64
  Lcd "Pin " ; Channel ; ":°C" ; T
  Locate 1 , 1
  Waitms 60
Loop

Kommt leider  "-C639.0" raus :(((
Passt irgendwie nicht! :((((
"°C" musste ich rauslassen, Bascom versteht es so nicht!
Was mache ich falsch?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>T = -0.08 * W
>T = W + 64

Muss ja auch

T = -0.08 * W
T = T + 64

heissen!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Noch was zur Verschönerung:

Lcd "Pin " ; Channel ; " "; T ; ":°C"

von inoffizieller WM-Rahul (Gast)


Lesenswert?

und 60ms sind relativ wenig. Nimm lieber 1000ms (falls das geht).
So schnell kommt die Temperatur nämlich nicht hinterher...

von Alex (Gast)


Lesenswert?

Ja, danke!!!
Endlich!!! Zwar noch bisschen ungenau, aber ich sehe schon Zahlen, die
passen können! Kannst du mir noch kurz schreiben, wie du gerechnet
hast, damit ich dass etwas genauen einstellen kann???
Sieht aber schon viel besser aus! Danke!

von Karl heinz B. (kbucheg)


Lesenswert?

> 18°C - 571 (ADC Wert)
> 0 °C - 800 (Adc Wert)

ok.
Wie ich schon mal ausgeführt habe:
Wir postulieren einen linearen Zusammenhang. Das heist es gibt
eine lineare Gleichung

    y = k * x + d

sodass, wenn wir den ADC Wert für x einsetzen, wir den Temperatur
Wert aus dieser Gleichung (das y) erhalten.

Die Frage ist daher, wie gross ist k und wie gross muss d sein, damit
wenn du für x 571 einsetzt, als Ergebnis 18 rauskommt und wenn man
für x 800 einsetzt dann auch 0 rauskommt.

Setzen wir einfach mal ein was wir haben. Wir haben ja 2 x/y
Paare, die du gemessen hast:

  18 = k * 571 + d        und
   0 = k * 800 + d

Die 2.te Gleichung lässt sich ganz leicht so umformen, dass wir
einen Ausdruck für k erhalten:

  0 = k * 800 + d              | -d
 -d = k * 800 + d - d          | + d - d   ergibt 0
 -d = k * 800                  | / 800
 -d / 800 = k * 800 / 800      | * 800 / 800 ergibt 1
 -d / 800 = k

k ist also -d / 800

das setzen wir mal in die 1. Gleichung ein:

18 = (-d/800) * 571 + d

Super. 1 Gleichung mit nur noch 1 Unbekannten.
Da lösen wir doch gleich mal die Klammer auf

         -d * 571
  18 =   --------   +  d

und bringen auf gemeinsamen Nenner

         -d  571      800  d
  18 =  ---------- + ----------
           800          800

Jetzt können die Brüche addiert werden

          800  d  - 571  d
  18 =  ----------------------
               800

das d herausheben

          d * ( 800 - 571 )
  18 =  ---------------------
               800

und 800 - 571 ausrechnen:

          d * 229
  18 =  ----------
           800

die ganze Gleichung mal 800 (damit der Bruch wegfällt)

               800  d  229
  18 * 800 =  ----------------
                   800

( 800 / 800 auf der rechten Seite ist ja gerade 1 ), gekürzt macht das


  18 * 800 = d * 229                 | / 229
  18 * 800 / 229 = d * 229 / 299     | * 229 / 299 ergibt 1
  18 * 800 / 229 = d

rechne ich das links vom = mal aus, dann ergibt sich 62.882
Diesen Wert benutze ich jetzt um k zu bestimmen. k war ja:
  k = -d / 800
  k = -62.882 / 800
oder als Zahl: -0.0786

Somit lautet die Gleichung:

   y = -0.0786 * x + 62.882

Machen wir mal die Probe: setzen wir mal einen ADC Wert von 571 ein:

   y = -0.0786 * 571 + 62.882

ausgerechnet ergibt das

   y = 18.0014

also so wir wir das wollen. Du hast ja gemessen, dass bei einem
ADC Wert von 571 es tatsächlich 18 Grad hat. Dass wir nichtgenau 18
erhalten liegt daran, dass ich zwischendurch bei der Berechnung von
d ein paar Kommastellen unter den Tisch hab fallen lassen.
Was ist mit dem anderen gemessenen Wert?

   y = -0.0786 * 800 + 62.882
   y = -62.88 + 62.882
   y = 0.002

also de fakto 0

sagen wir mal dein ADC liefert dir einen Wert von 320. Welcher
Temperatur entspricht das? Wir benutzen  wieder die Gleichung

   y = -0.0786 * 320 + 62.882

und erhalten: y = 37.73
Ein ADC Wert von 320 entspricht also grob einer Temperatur von 37.7
Grad.
Was ist bei einem ADC Wert von 1016? Wieder: In die Gleichung
eingesetzt:

  y = -0.0786 * 1016 + 62.882

und erhalten: y = -16.9756
Also bereits empfindlich kalte -17.0 Grad

von Alex (Gast)


Lesenswert?

sooo! An dieser Stelle sage ALLEN Danke schön!!!
Ich bin mir jetzt sichen, ich komme jetzt alleine weiter!!!
VIELEN VIELEN DANK!!!!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Ich bin mir jetzt sichen, ich komme jetzt alleine weiter!!!
Versprochen? ;-)

von Fabian Knapp (Gast)


Lesenswert?

wie wärs mal mit buch kaufen und lesen und am besten assembler mal
bisschen was machen anstatt gleich bascom wenn man nicht weiss was ein
ad wandler ist...

von Alex (Gast)


Lesenswert?

> Versprochen? ;-)

ich werde alles mögliche tun, um dieses Versprechen zu halten! :)))

von Alex (Gast)


Lesenswert?

sorry, leute.. es gibt noch was... finde selbst nicht.
Wie kann ich die Variable "T" für temperatur auf 2 stellen nach komma
begrenzen?
Danke!

von Karl H. (kbuchegg)


Lesenswert?

Schau dir mal den Befehl FORMAT an.

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Wäre ich froh gewesen, wenn ich mit 13 solche Unterstützung bekommen
hätte, wie man sie jetzt (und hier) bekommen kann/bekommt.
Mit 13 hatte ich einen Apple ][...
(den habe ich immer noch...)

@Alex: Stell dir das Bascom-Manual wie ein grosses Vokabelheft vor...
Leg es dir am besten unters Kopfkissen, dann wandert das Wissen über
Nacht in deinen Kopf...;-)

von Thomas Gründer (Gast)


Lesenswert?

Das englische Manual zu Bascom ist für einen 13jährigen eine zu harte
Nuss; über altersgerechte Lektüre sollten sich einige Member mehr
Gedanken machen. Empfehlenswert sind daher ausschließlich
deutschsprachige Bücher, wie sie bereits von Kühnel und R. Walter
angesprochen wurden.
Den Ansatz, erst einmal am PC zu programmieren kann ich aus
didaktischer Sicht nicht nachvollziehen. In Zeiten von grafischen
Oberflächen wird niemand mehr freiwillig mit TurboPascal
experimentieren, moderne Sprachen setzen jedoch schon fast die
Einarbeitung in GUIs voraus. Das empfinde ich als wesentlich komplexer
als die Programmierung mit Bascom.
Viel entscheidender für das weitere Vorankommen in der µC-Thematik sind
gute bis sehr gute Elektronikkenntnisse: Ich habe mir den gesamten
Thread durchgelesen, da fiel mir schon auf, dass der Fragesteller kaum
in der Lage war, einen Spannungsteiler zu berechnen. Und der nächste
kommt an und erzählt was von OpAmps und Offset...
Viel wichtiger wäre da eher die Empfehlung eines verständlichen
Elektronikbuches, beispielsweise "Der leichte Einstieg in die
Elektronik" von Bo Hanus oder etwas anspruchsvoller "Grundwissen
Elektronik" von Burkhard Kainka, Martin Häßler und Hans-Werner
Straub.
Programmieren lernt man nicht vom 4.10 bis zum 5.10.06, in zwei Tagen
hat man auch nicht die komplette Bascom-Syntax drauf.
Ich habe mit 14 Jahren mit GW-Basic am PC programmieren gelernt. Da
habe ich auch nur kompletten Code abgetippt, den ich aus der
(deutschsprachigen) Referenz entnommen habe. Wieder und wieder, bis ich
kapiert habe, was ich mache und dann nach Wochen bzw. Monaten auch erste
eigene Sachen programmieren konnte.
Viel wichtiger ist es doch, das Interesse für "unser Hobby" zu
wecken. Wenn die Anfrage von Alex nur für ein einmaliges Projekt sein
sollte ohne Ausblick auf eine weitere Beschäftigung mit der Thematik,
so verstände ich auch das Anliegen, ein fertiges Programm serviert zu
bekommen.

von Alex (Gast)


Lesenswert?

Liebe Leute!!!!!
ich weiss, das ist jetzt ein wenig blöd, aber....
ich wollte meine Temp. ergebnisse etwas verfeinert.. und habe mein ADC
wert bei raum temp aufgenommer.. war ca. 317 bei 19°C
und 100°C (koch.Wasser) 400
Habe ein 81-110 genommen!

so habe ich gerechnet:


T= k x W + d

19°C  -  317 ADC
100°C -  400 ADC

19= k * 317 + d  / -d
19 - d = k * 317 / 317
(19-d)/317 = k

100 = ( ( 19 - d ) : 317 ) * 400 + d
'klammer auflösen
100 = ( 0,06 - 0,0031d ) * 400 +d
'nochmal auflösen
100 = 24 - 1,2618d + d
'd zusammenfassen
100 = 24 - 0,2618d  /-24
76 =  -0,2618d
d = -290,298

k = (19 + 290,298) / 317   ' "-"+"-" ergibt ja "+"
k = 0,9757


soweit ok....

programm rauf... zeigt er mir bei meiner Raumtemp 16°C an
Kältespray kann nur bis -55°C abkühler.. er zeigt aber -103 an!!!

Habe ich irgendwo in der Rechnung Fehler gemacht??
Ich kann leider bei 0°C kein ADC wert messen.. 0°C ist ja so eine
sache......

Bitte!!!!!!!!!

Danke!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Habe ein 81-110 genommen!

Kty81-110?
Hast du dir mal die Kennlinie deines Sensors im Datenblatt angeguckt?

Deine Werte sind übrigens richtig.

von Alex (Gast)


Lesenswert?

da hat mir mal jemand geschrieben, dass 81-110 von -20°C bis 100°C
ziemlich lienear ist!
Wenn sie richtig sind.. wieso habe ich raumtemp. von 15°C?

von Karl heinz B. (kbucheg)


Lesenswert?

> 19°C  -  317 ADC
> 100°C -  400 ADC

Delta Temp:   100 - 19  = 89
Delta ADC:    400 - 317 = 87

d.h. du hast pro ADC Wert ziemlich etwas weniger als 1 Grad.
Das deckt sich auch mit dem k Wert von 0.97 (etwas weniger
als 1 Grad).

Nun musst du aber schon einen sehr guten ADC Aufbau haben, damit
dir der ADC nicht durch Rauschen +/- 1 oder +/- 2 ausgibt.
Leider wirkt sich aber ein ADC Fehler von +/- 2 bei dir schon
als fast ein ganzes Grad aus.

Merke: Wer misst, misst viel Mist!

Du darfst dem ADC die letzte Stelle nicht glauben. Wenn du 5
mal misst, kriegst du jedesmal ein anderes Ergebnis. Wie gesagt:
ausser du hast einen extrem guten ADC Aufbau (hardware).

Ändere also deinen Spannungsteiler, so ab dass sich der ADC
Wert um mindestens 5, besser 10 Einheiten pro Grad ändert.
Dein ursprünglicher Spannungsteiler mit einem viel kleineren
k war da wesentlich besser.

von Karl heinz B. (kbucheg)


Lesenswert?

> 0°C ist ja so eine sache......

Wieso?
Sensor in einen Plastikbeutel.
In ein Glas etwas Wasser und ein paar Eiswürfel. Ne Zeitlang
warten, dann hat das Wasser ~0°C. Den eingepackten Sensor
in das Wasser hängen und du hast deinen Wert für 0°C

von Thorsten (Gast)


Lesenswert?

An deiner Berechnung ist grundsätzlich nichts dran auszusezten. Trotzdem
denke ich, dass der Berechnungsweg nicht gerade der einfachste ist.
Meiner Meinung nach ist folgender Weg einfacher:


 19 °C  - 317 ADC
100 °C  - 400 ADC

Daraus ergeben sich die Geradengleichungen:

 19 = 317 * k + d
100 = 400 * k + d

Jetzt zieht man einfach die erste Gleichung von der zweiten ab:

100 - 19 = (400 * k + d) - (317 * k + d)

Löst man die Klammern auf, ergibt sich:

100 - 19 = 400 * k + d - 317 * k - d

Das ergibt:

81 = 83 * k

Also ist k = 81 / 83 = 0,9759

Um d zu berechnen, k einfach in eine der beiden Formeln einsetzen:

19 = 317 * 0,9759 + d

Also ist d = 19 - 317 * 0,9759 = -290,36


Für beliebige Messwerte ergibt sich damit folgende Rechenvorschrift:

gemessenene Werte:
T1 - ADC1
T2 - ADC2

k = (T2 - T1) / (ADC2 - ADC1)

d = T1 - k * ADC1 = T2 - k * ADC2


Ich hoffe, dass dir das ganze vielleicht die Rechnung ein wenig
erleichtert

von Thomas (Gast)


Lesenswert?

> Meiner Meinung nach ist folgender Weg einfacher...

Danke!!!! Ist echt VIEL einfacher und schneller! :))))

von Thomas (Gast)


Lesenswert?

> Nun musst du aber schon einen sehr guten ADC Aufbau haben, damit
dir der ADC nicht durch Rauschen +/- 1 oder +/- 2 ausgibt.
Leider wirkt sich aber ein ADC Fehler von +/- 2 bei dir schon
als fast ein ganzes Grad aus.

Ja, das verstehe ich ja auch...
als ich den einfachen PTC mit dem KTY81-110 ersetzt habe, habe ich
schon gesehen, dass der ADC wert sich nicht so breit verändert!
Widerstand anders dimensioniert.. > das selbe ergebniss...
Kann man das irgendwie anpassen?
damit sich der ADC wenigstens um 500 ändert??
Sonst ich das ja echt so, dass adc wert von 1 schon 1°C ausmacht.. und
das ist schon tatsächlich VIEL zu ungenau... leider!

von Kunz von Kaufungen (Gast)


Lesenswert?

Es ist ein Genuss die Beiträge von Karl Heinz Buchegger zu lesen. Sie
sind fachlich kompetent und lesefreundlich geschrieben, im Gegensatz
zum abgewrackten Deutsch von Thomas(22:13).

von Alex (Gast)


Lesenswert?

Hallo!
Thomas, wer bist du?
blos das selbe problem habe ich auch! :) baust du das auch? Wie weit
bist du schon?
Karl Heinz Buchegger ist echt spitze! :) danke!
Wenn jemand dem Thomas eine Antwort gibt, hilft mir auch weiter! :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.