Forum: Compiler & IDEs Anfängerfrage: Temperaturgesteuerter Heizer


von Rocco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin eher ein blutiger Anfänger - also bitte habt etwas Nachsicht.

Ich möchte für meine Masterarbeit(Physik - bin also kein Elektroniker) 
ein Gerät bauen das die Temperatur zw. 2 Werten (z.B. Wert A: 30°C Wert 
B: 35°C)
wechselt.
Das Prinzip ist also:
-heize auf 35°C und halte die Temperatur x Sekunden
-schalte einen Lüfter an der über einen Kühlkörper das ganze wieder auf 
30°C bringt und halte die Temperatur für y Sekunden


Ich habe bisher einen "Roboter" gebaut bei dem ein Mega8 ein L297-L298 
Konstruckt betreibt. Mit diesem Roboter kann ich Objekte 
Tauchbeschichten. Das hat mir schon mal sehr geholfen. siehe Anhang.

Das ganze sollte auch irgendwie an einem Rechner hängen.
Ich habe einen alten Laptop mit inpout32.dll drauf und mit einer 
paralellen Schnittstelle (WinXP). Das ganze Funktioniert und ich kann 
sowohl LED's ansteuern als auch einzelne "Beinchen" auslesen.

Wie fange ich am besten an? Ich brauche eine möglichst schnelle Methode, 
da meine Zeit für die Masterarbeit leider sehr begrenzt ist :(

Vielen Dank

Rocco

von Düsendieb (Gast)


Lesenswert?

Soll die Steuerung auf dem PC erfolgen, brauchst Du zwei Thermostaten 
die bei 30 und 35 Grad mit kleiner Hysterese schalten. Die Kontakte 
werden mit dem PC eingelesen und die Steuerung erfolgt auf dem PC.

Normalerweise macht die Steuerung ein Thermostat alleine. Einstellung 35 
Grad mit 5 Grad Hysterese.

Dritte Möglichkeit Einsatz eine Controllers.


Was soll es werden?


Axel

von Dünnbrettboherer (Gast)


Lesenswert?

>Das Prinzip ist also:
>-heize auf 35°C und halte die Temperatur x Sekunden
>-schalte einen Lüfter an der über einen Kühlkörper das ganze wieder auf
>30°C bringt und halte die Temperatur für y Sekunden

Warum der Murks mit dem Lüfter? (Energieverschwendung)
Reduzier doch einfach die Heizleistung, wenn Du kühlen willst, bzw. 
schalt den Heizstrom ganz ab.
Stichwort: Temperaturregelung (PI-Regler,...)

Wenn Du Dich eh schon mit AVRs ("Ich habe bisher einen "Roboter" gebaut 
bei dem ein Mega8..."), dann sollte das doch größeres Problem für sein, 
oder? ;-)

von Rocco (Gast)


Lesenswert?

Hallo Düsendieb:
kannst du mir das mit dem Thermostaten etwas genauer erklähren - ich bin 
wirklich ein richtiger Anfänger und z.Z. platzt mir fast der Kopf weil 
ich im letzten Monat erst mit sowas angefangen habe.
Ein Thermostat zu lten sollte eigentlich gehen - auch mit Hysterese - so 
was habe ich schon mal für einen Lüfterregler für mein Aquarium diskret 
erledigt.

Das Problem ist das ich die beiden Temperaturen einfach und recht genau 
ändern mkönnen muss. so das ich eher eine Lösung brauch wo ich entweder 
den MegaX ständig neu programmieren - also die Temperaturwerte ändere - 
oder irgend etwas über den PC.


Hallo Dünnbrettbohrer:
selbstverständlich möchte ich das sich die Heizung abschaltet bevor der 
Lüfter angeht. Schon weil es zum Teil ein Umweltprojekt wird ;)
Nein im Ernst, ich möchte auf z.B. 35°C heizen und die Temperatur dann 
aus schalten und erst dann kühlen bis auf z.B. 30° und diese Temperatur 
dann wieder für eine bestimmte Zeit halten.

Leider ist das Programmieren ein echtes Problem für mich - ich habe mich 
schon mit LM75, DS18S20 und natürlich mit PTY... auseinander gesetzt. 
Ich schaffe es einfach nicht in der Zeit noch so ein Projekt aus dem 
Boden zu stampfen. Ich müste noch so viel mehr lesen und so lange herum 
probieren bis es klappt. Ich weis gar nicht wie lange ich gebraucht habe 
um den "Roboter" zu bauen - aber es war eine Ewigkeit.

fG Rocco

von Düsendieb (Gast)


Lesenswert?

z.B. UNIVERSAL THERMOSTAT UT 200 von Conrad für 39,95€

Da kann man die Ein und Ausschalttemp. einstellen.
An die Steckdose wird ein 230V Relais mit einem Öffner und einem 
Schließer Kontakt angeschlossen.

Der Schließer schaltet die Heizung, der Öffner den Lüfter.

PS. Stelle eine weitere Frage besser im µc Forum, da gibt es wesendlich 
mehr Antworten.


Axel

von Dünnbrettboherer (Gast)


Lesenswert?

>Nein im Ernst, ich möchte auf z.B. 35°C heizen und die Temperatur dann
>aus schalten und erst dann kühlen bis auf z.B. 30° und diese Temperatur
>dann wieder für eine bestimmte Zeit halten.

Das hört sich für mich wie Zweipunkt-Regelung an:
Zuerst Volldampf, bis 35°C erreicht sind, dann abschalten und warten bis 
30°C erreicht sind.
Wenn Du mit dem Auto einparkst, gibts Du ja auch nicht Vollgas, bis Du 
in der Parklücke stehst und machst dann ne Vollbremsung ;-)

Du könntest den Heizstrom reduzieren schon bevor die 35°C erreicht sind 
und intern schon die 30°C anfahren, da Deine Heizung noch "nachläuft", 
also 35°C auch mit verminderter Heizleistung erreicht werden 
(Wärmekapazität etc., müßtest Du halt experimentell ermitteln).
Schau mal bei Tante Gurgel vorbei und frag sie nach 
"Temperaturregelung"...

von Rocco (Gast)


Lesenswert?

ok, das Ding ist echt perfekt.
Hast Du noch eine Idee wie ich die beiden Temperaturen eine betimmte 
Zeit halten kann?

Bisher kapiere ich es so:
Ausgangszustand: alls hat Raumtemperatur:
-Sonde mist Temp < 35°C  daraus follgt das das Relais schließt und der 
Heizer los legt bis eben 35°C erreicht sind

-Relais schaltet um so das der Öffner jetzt einen Stromkreis schließt 
und damit den Lüfter anschmeißt bis 30°C erreicht sind

Richtig?


fG Rocco

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> Leider ist das Programmieren ein echtes Problem für mich - ich habe mich
> schon mit LM75, DS18S20 und natürlich mit PTY... auseinander gesetzt.
> Ich schaffe es einfach nicht in der Zeit noch so ein Projekt aus dem
> Boden zu stampfen.

Das ist jetzt aber eine herbe Enttäuschung, dass du dir so wenig 
zutraust.

Also du geschrieben hast, du hättest bereits einen Roboter gebaut hab 
ich schon gedacht:
Wo ist das Problem? Noch ein Mega-8 Rechner. Den kennt er schon.
Da drann ein DS1820 als Temperatursensor (da gibts fertige Routinen in 
der Codesammlung, man braucht sie nicht kalibrieren) und 2 Releais 
ansteuern. Von mir aus die Zeitsteuerung mit _delays. Einstellen der 
Werte über UART vom PC aus.
Alles in allem eine Sache auf 1 Nachmittag, wenn ein simpler 2-Punkt 
Regler ausreicht. Selbst wenn man nur wenig Erfahrung hat.

von oszi40 (Gast)


Lesenswert?

Dünnbrettboherer schrieb:
> Zuerst Volldampf, bis 35°C erreicht

Wenn Rocco erst bei 35 Grad abschaltet, entsteht bestimmt noch
eine Temperaturspitze >35 Grad durch thermische Trägheit der Heizung!

von Karl H. (kbuchegg)


Lesenswert?

oszi40 schrieb:
> Dünnbrettboherer schrieb:
>> Zuerst Volldampf, bis 35°C erreicht
>
> Wenn Rocco erst bei 35 Grad abschaltet, entsteht bestimmt noch
> eine Temperaturspitze >35 Grad durch thermische Trägheit der Heizung!

dann stellt er halt seine Abschaltung auf 34 Grad ein und erhöht erst 
nach 1 Minute den Grenzwert auf 35 Grad.

Er hat ja noch gar nichts gesagt, wie genau seine Temperaturen sein 
müssen.

von Rocco (Gast)


Lesenswert?

Hallo Herr Buchegger,

ja ich weis das das alles nach Jammern und Klgen klingt.
Aber ich lese jetzt schon eine ganze weile etwas zu den 
unterschiedlichen Methoden und suche noch die richtige für mich.

Das mit dem DS1820 gefällt mir wirklich richtig gut. Mega8 wäre auch 
perfekt - weil ich den ja schon irgendwie kenne. Da ich wärend des 
Experiments die Temp. nicht ändern will würde es sogar recht einfach 
sein den Mega8 vorher mit neuen Temperaturen zu programmieren.

Wenn also irgend jemand einen Link hat, oder irgendwie so was schon 
gemacht hat würde ich mich sehr über die Hilfe freuen.


Alle Temperaturen bewegen sich irgendwo zw. 25°C und 45°C.
Delta T ist zw 2 und 20°C geplant. Wenn 2°C aufgrund irgendwelcher 
Harwarebeschränkungen nicht mgl. sind so geht auch ein Delta T ab 5°C.


Vielen vielen Dank für die Viele hilfe bis jetzt. Ich fühle mich schon 
wieder viel besser.

fG Rocco

von U.R. Schmitt (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> lles in allem eine Sache auf 1 Nachmittag, wenn ein simpler 2-Punkt
> Regler ausreicht.

Das wage ich zu bezweifeln. Ich denke Ihr redet gerade etwas aneinander 
vorbei.
Er will zunächst das System auf 35° aufheizen, dann die Temperatur für 
eine zeit T1 möglichst genau halten, dann mittels eines Ventilators auf 
30° abkühlen und auch hier wieder die Temperatur halten.
Er braucht also -wenn ich ihn richtig verstanden habe- eine 
Temperaturregelung, zumindest mit einem PI Regler dem man via Software 
verschiedene Sollwerte vorgeben kann und der je nach Unter oder 
Übertemperatur die Heizung oder den Lüfter anwirft und eine einfache 
Ablaufsteuerung mit den Zeitkonstanten.
Nichts unlösbares wenn man mit einem µC halbwegs umgehen kann, aber es 
scheint mir, daß er bei seinem ersten Projekt gebastelt und Code kopiert 
hat ohne richtig zu verstehen was und wie er es gemacht hat.

von U.R. Schmitt (Gast)


Lesenswert?

Rocco schrieb:
> Da ich wärend des
> Experiments die Temp. nicht ändern will würde es sogar recht einfach
> sein den Mega8 vorher mit neuen Temperaturen zu programmieren.

Ach so er braucht natürlich auch noch ein paar Tasten und ein Display um 
die Parameter wie untere und obere Temperatur und die Zeitkonstanten 
einzugeben.

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> Alle Temperaturen bewegen sich irgendwo zw. 25°C und 45°C.
> Delta T ist zw 2 und 20°C geplant. Wenn 2°C aufgrund irgendwelcher
> Harwarebeschränkungen nicht mgl. sind so geht auch ein Delta T ab 5°C.

Verzeih. Ich bin heut nicht besonders gut drauf.
Wie genau muss jede einzelne Temperatur eingehalten werden?

Wenn du also 35° einstellst, wie genau muüssen die 35° gehalten werden 
und welches Heizelement steht dir überhaupt zur Vefügung? Welche Masse 
willst du heizen? Wie lange muss die Temperatur gehalten werden?

Ich versuch abzuschätzen welchen Aufwand du in das halten der Temperatur 
stecken musst. Dort liegt der Knackpunkt. Das umstellen der Temperatur 
bzw. das Ein/Ausschalten von Heizung und Lüfter sind nicht das Problem.

von Karl H. (kbuchegg)


Lesenswert?

U.R. Schmitt schrieb:
> Karl heinz Buchegger schrieb:
>> lles in allem eine Sache auf 1 Nachmittag, wenn ein simpler 2-Punkt
>> Regler ausreicht.
>
> Das wage ich zu bezweifeln. Ich denke Ihr redet gerade etwas aneinander
> vorbei.

Kann sein.

> Er braucht also -wenn ich ihn richtig verstanden habe- eine
> Temperaturregelung, zumindest mit einem PI Regler dem man via Software
> verschiedene Sollwerte vorgeben kann und der je nach Unter oder
> Übertemperatur die Heizung oder den Lüfter anwirft

Kann auch sein.
Muss aber nicht. Mit ein bischen Glück ist seine Gesamtsystem so, dass 
man mit der Vorgabe einer Solltemperatur auskommt. Liegt isttemp 
kleiner, wird die Heizung eingeschaltet. Ist die Isttemp größer wird der 
Lüfter eingeschaltet.
Kommt auf den kompletten Regelkreis an, ob das ausreicht oder nicht, 
bzw. welche Abweichungen von der Solltemperatur erlaubt sind.

> und eine einfache
> Ablaufsteuerung mit den Zeitkonstanten.

Die ist das geringste Problem. Geb ich dir völlig recht

> Nichts unlösbares wenn man mit einem µC halbwegs umgehen kann, aber es
> scheint mir, daß er bei seinem ersten Projekt gebastelt und Code kopiert
> hat ohne richtig zu verstehen was und wie er es gemacht hat.

Wenn er die Hardware alleine Aufbauen kann, sprechen wir ihn durch den 
Rest auch noch durch :-)
Die DS Routinen gibts vom PeDa fertig in der Codesammlung. Der Rest 
(wenns so einfach geht) ist eine einfache Logik, dazu noch eine "Uhr" 
und er kann fürs erste weiterexperimentieren.
Display und Tasten wären schön, kommt drauf an wie wichtig das fürs 
erste ist.

von Dünnbrettbohrer (Gast)


Lesenswert?

> Dünnbrettboherer schrieb:
>> Zuerst Volldampf, bis 35°C erreicht
>Wenn Rocco erst bei 35 Grad abschaltet, entsteht bestimmt noch
>eine Temperaturspitze >35 Grad durch thermische Trägheit der Heizung!

Eben mit diesem Beispiel wollte ich ja die Notwendigkeit einer Regelung 
erklären!
Ist mir schon klar, daß gerade im Bereich von Temperaturregelungen, die 
thermische Trägheit, oder auch Wärmekapazität genannt, voll zuschlägt...

von Rocco (Gast)


Lesenswert?

Hallo Herr Schmitt,

im Prinzip verstehen Sie das richtig. Es gibt 2 Temperaturen die über 
eine gewisse Zeit gehalten werden müssen.
Knöpfe und display brauche ich nicht - ich programiere einfach den Mega8 
vor dem nächsten experiment mit neuen Werten für Zeit und Temp.

Bisher finde ich die elektrischen Thermostate für
Heizkörper nicht mal schlecht. So wie ich es verstehe schraubt man diese 
einfach an den Heizkörper und hat ein Zeitschaltuhr und eine Min und Max 
Temperatur. Was haltet Ihr davon? Das könnte man doch bestimmt entspr. 
umbasteln. Ich dachte den Stellmotor schaltet entspr. Schalter an und 
aus.

Ich dachte da an den hier:
http://cgi.ebay.de/SPARPAKET-4-STUCK-ENERGIESPAR-THERMOSTAT-SPART-30-/350394646313?pt=Systemkomponenten_Heizung&hash=item519525ff29

Der ist sogar auf 0.5°C genau (ob das stimmt oder nicht weis ich 
allerdings nicht)

Ich müsste noch den Thermofüler ausfindig machen und nach draus verlegen 
und die Temp im Display mit einem geeichten Thermometer 
vergleicht....oder?

Ansonsten finde ich ja auch das hier echt toll:
http://www.elv.de/Universal-Thermostat-UT-200,-Komplettbausatz/x.aspx/cid_74/detail_10/detail2_22053/refid_GoogleBase
 - nur habe ich keine Idee wie ich das mit der Haltezeit (0 bis 10 
Minuten) hinbekomen soll?!

von Düsendieb (Gast)


Lesenswert?

was heißt Haltezeit? wie lange die Temperatur zwischen 30 und 35 bleibt, 
hängt von der thermischen Kapazität des Heizgutes ab.

Ein Blatt Papier ist bestimmt schneller ausgekühlt als eine Bleiplatte

von Rocco (Gast)


Lesenswert?

Hallo,

mal fix Zusammenfassen:

es wäre schon schön wenn die Temp. +- 0,5°C genau gehalten wird.
Heizen will ich einen Block aus Aluminium - etwa (bxtxh)20x20x5cm mit 
ein 15 Bohrungen drin für die Probenaufnahme. aber auch da bin ich 
eigentlich ungebunden. Die Proben sind in kleinen (Durchmesser 1,5cm, 
Höhe 3cm) verschraubbaren Glasgefäßen. Also wäre auch ein wasserbad mit 
Tauchsieder und Kupferspirale mit Kühlwasser mgl...

Womit ich heize und kühle ist also noch offen. Ihr könnt also vom 
Aquariumheizer bis zum Tauchsieder gern alles vorschlagen. Ich bau auch 
eine Wasserkühlung ein wenns sein muss.
Unsere Werksatt an der Uni ist recht gut ausgestattet ;)


fG Rocco

von Rocco (Gast)


Lesenswert?

Haltezeit heißt wie lange entweder die 35 oder die 30°C gehalten werden 
sollen. die aufheizzeit und abkühlzeit ist nicht wirklich wichtig, 
wichtig ist nur das es recht schnell geht.

von Rocco (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Die DS Routinen gibts vom PeDa fertig in der Codesammlung. Der Rest
> (wenns so einfach geht) ist eine einfache Logik, dazu noch eine "Uhr"
> und er kann fürs erste weiterexperimentieren.

Wo finde ich das?

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:
> Karl heinz Buchegger schrieb:
>> Die DS Routinen gibts vom PeDa fertig in der Codesammlung. Der Rest
>> (wenns so einfach geht) ist eine einfache Logik, dazu noch eine "Uhr"
>> und er kann fürs erste weiterexperimentieren.
>
> Wo finde ich das?

In der "Codesammlung", Suchbegriff DS1820

von Simon L. (simon_l)


Lesenswert?

Hi,

ich glaube diene Anforderungen würden fast genau einer Regelung für 
einen Reflow-Ofen entsprechen. Diese Heizt auf einen Wert X hält diese 
Temp für einige Minuten, usw. Meist kann man sie "frei" programmieren. 
Ich weis nur nicht in wieweit die Sensoren dieser Regelungen für 
Temperaturen unter 100°C ausgelegt sind. Du musst aber Aufpassen, die 
fertigen billigen Geräte haben teilweise eine schlechte Regelung.

Gruß Simon

von Karl H. (kbuchegg)


Lesenswert?

Ich würde3 zum Wasserbad tendieren.
Mit einem Sprudler drinnen (Motor mit Schiffschraube), kann man dafür 
sorgen, dass die Wassertemperatur einigermassen homogen ist.
In einem Alublock hast du immer das Problem, dass ein Temperaturanstieg 
immer erst mit einer Verzögerung bei den Proben ankommt. Da wirds dann 
mit einer Regelung vermutlich schon schwerer und es führt kein Weg mehr 
an einem PID Regler vorbei

von Karl H. (kbuchegg)


Lesenswert?

> +- 0,5°C

Das ist schon recht eng

von Rocco (Gast)


Lesenswert?

wie sieht es mit einem Peltierelement aus? Zusammen mit einer H-Brücke 
wäre das ein recht guter Heiz-Kühler...
die Probenflaschen sind ja nur etwa 1cm mit einer flüsigkeit gefüllt und 
sollten sich, wenn das Peltier-Elemet z.B. an einer Aluplatte montiert 
ist, schnel genug erwärmen und abkühlen - jedenfals für meine Zwecke.

von Rocco (Gast)


Lesenswert?

+- 1°C wäre auch OK

von Rocco (Gast)


Lesenswert?

Was haltet Ihr von dem Bild im Anhang?
Als Thermostate würde ich 2Stck von ELV nehmen wie ich sie oben schon 
verlinkt habe.
Das Heizthermostat würde ich mit Tmin=34°C und Tmax=35°C einstellen.
Das Kühlthermostat würde ich mit Tmin=29°C und Tmax=30°C einstellen.

Danach würde das Heizthermostat und das Kühlthermostat jeweil ein Relais 
die ganze Zeit schalten. Nun überbrückt eine Zeitschaltuhr, an die ein 
Relais mit Schließer und Öffner angeschlossen ist, entweder den 
Stromkreis vom Heizthermostat zum Peltierelement oder vom Kühlthermostat 
zum Peltierelement.

Ich weis das in der "Haltezeit" nun auch die Aufheizzeit mit drin 
steckt. aber diese Aufheizzeit könnte ich ja in einem Vorabexperiment 
ermitteln und raus rechnen.

Damit müsste ich mir eigentlich nur noch einen Kopf über ein entspr. 
Peltierelement und eine entspr. Zeitschaltuhr machen.

Die Zeitschaltuhr werde ich mit Sicherheit programmieren - schon weils 
Spaß macht.

Die Ansteuerung eines Peltierelements ist wieder so eine Sache....
Hat damit schon jemand Erfahrungen?

fG Rocco

von Rocco (Gast)


Angehängte Dateien:

Lesenswert?

Und wie immer ist der Anhang erst im zweiten Post

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:
> Was haltet Ihr von dem Bild im Anhang?
> Als Thermostate würde ich 2Stck von ELV nehmen wie ich sie oben schon
> verlinkt habe.
> Das Heizthermostat würde ich mit Tmin=34°C und Tmax=35°C einstellen.
> Das Kühlthermostat würde ich mit Tmin=29°C und Tmax=30°C einstellen.

ALso wenn dir der Ansatz mit derartigen Thermostaten zusagt, dann dürfte 
eine simple 2-Punkt Regelung bei dir auch funktionieren und wir sollten 
uns keine Sorgen um irgendwelche Regelungen machen :-)


So ungefähr:
1
struct timeTable {
2
  Zeitdauer
3
  Temperatur
4
};
5
6
struct timeTable times [] = {
7
   { 100,   35 },
8
   { 500,   30 },
9
   { 100,   35 },
10
   { 500,   36 }
11
}
12
13
aktuellerTimeTableEintrag
14
nochZuWarten
15
16
...
17
18
int main()
19
{
20
21
  aktuellerTimeTableEintrag = 0
22
  nochZuWarten = times[aktuellerTimeTableEintrag].Zeitdauer
23
  SollTemperatur = times[aktuellerTimeTableEintrag].Temperatur
24
25
  while( 1 ) {
26
27
    IstTemperatur = DS1820 abfragen
28
29
    if( IstTemperatur > SollTemperatur + 0.5 )
30
      Kühlung ein
31
    else if( IstTemperatur < SollTemperatur - 0.5 )
32
      Heizung ein
33
    else {
34
      Heizung aus
35
      Kühlung aus
36
    }
37
38
    _delay_ms( 1000 )
39
    nochZuWarten --;
40
41
    if( nochZuWarten == 0 ) {
42
      aktuellerTimeTableEintrag++;
43
      if( aktuellerTimeTableEintrag == 4 )
44
        aktuellerTimeTableEintrag = 0
45
46
      nochZuWarten = times[aktuellerTimeTableEintrag].Zeitdauer
47
      SollTemperatur = times[aktuellerTimeTableEintrag].Temperatur
48
    }
49
  }

> Die Zeitschaltuhr werde ich mit Sicherheit programmieren - schon weils
> Spaß macht.

Dann kannst du den Rest auch gleich programmieren.
Was anderes machen deine Thermostaten auch nicht

von Rocco (Gast)


Lesenswert?

würde ich wirklich gern machen wenn ich nicht zu blöd wäre so einen 
Temperatursensor abzufragen. Ich lese da was von Registern auslesen und 
verstehe leider Bahnhof :(
Ich habe mir das bischen was ich kann echt mühselig selber 
zusammengedichtet. Und besonders Umfangreich ist mein Fachwissen über 
Programieren in der kurzen Zeit nicht geworden.

Auch Dein Code muss ich Stück für Stück googlen.

C++ ist aber schon mal positiv, weil ich wenn überhaupt nur davon Ahnung 
habe. Ich finde zwar öfter was vieleicht brauchbares, aber es ist leider 
alles in Bascom oder in dieser prozessornahmen Sprache von der mir 
gerade der Name nicht einfällt.

PS.: Ich habe ja auch noch den Laptop mit Druckerschnittstelle den ich 
schon mal ein bischen programmiert habe. Das geht recht einfach mit:
outp(0x378,1)
outp(0x378,2)
outp(0x378,4)
outp(0x378,8)
outp(0x378,16)
outp(0x378,32)
outp(0x378,64)
outp(0x378,128)

und einlesen über:
in = inp(0x379);

Damit ist es wirklich einfach eine Bestimmte Zeit einen Pin und dannach 
einen anderen ein- bzw auszuschalten - und die Uhr wäre fertig.

Aber wie ich damit den Tempsensor einlese bis die Temp in einer Variable 
steht weis ich wirklich noch nicht.
Aber grundlegend würde ich mich schon für den Onewire Temperatursensor 
entscheiden. Ich lese da noch was über den LM75 - ds ist ein twowire 
Temp. Sensor - das ist mir echt zu hoch.


fg Rocco


fG Rocco

von Rocco (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> ALso wenn dir der Ansatz mit derartigen Thermostaten zusagt, dann dürfte
> eine simple 2-Punkt Regelung bei dir auch funktionieren und wir sollten
> uns keine Sorgen um irgendwelche Regelungen machen :-)

ja, eine Regelung brauche ich nicht wirklich. Entschuldigung wenn ich 
das geschrieben habe, aber ich kene mich nicht so gut mit den richtigen 
Fachwörtern aus. Da passiert das manchmal das ich vom Auto rede und das 
Moped meine.

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:
> würde ich wirklich gern machen wenn ich nicht zu blöd wäre so einen
> Temperatursensor abzufragen. Ich lese da was von Registern auslesen und
> verstehe leider Bahnhof :(

Wie schon gesagt: Codesammlung
(So wie es hier ein µC+Elektronik Forum gibt, gibt es auch eine 
Codesammlung)
http://www.mikrocontroller.net/forum/codesammlung

> Auch Dein Code muss ich Stück für Stück googlen.

Autsch

Dabei hab ich schon so primitiv das Programm angedeutet wie ich nur 
konnte.

> C++ ist aber schon mal positiv, weil ich wenn überhaupt nur davon Ahnung
> habe.

Eher nicht. Wenn ich deine vorherige Aussage für bare Münze nehme.

> Ich finde zwar öfter was vieleicht brauchbares, aber es ist leider
> alles in Bascom

Dann machs in BASCOM.
Ist doch keine Schande. Du findest alle Elemente dort wieder.
Schleifen, Vergleiche, bischen Rechnen, ....
Sogar eine DS1820 Abfrage ist meines Wissens in BASCOM schon vorhanden.


> PS.: Ich habe ja auch noch den Laptop mit Druckerschnittstelle den ich
> schon mal ein bischen programmiert habe. Das geht recht einfach mit:
> outp(0x378,1)
> outp(0x378,2)
> outp(0x378,4)
> outp(0x378,8)
> outp(0x378,16)
> outp(0x378,32)
> outp(0x378,64)
> outp(0x378,128)

Vergiss den Dreck.
Auf einem µC programmiert man anders.

> Damit ist es wirklich einfach eine Bestimmte Zeit einen Pin und dannach
> einen anderen ein- bzw auszuschalten - und die Uhr wäre fertig.

Moment.
Ich geh immer noch davon aus, dass das Ganze ohne PC sondern mit einem 
Mega8 realisiert werden soll. Sagtest du nicht, mit dem hättest du schon 
mal was gemacht?

> Aber wie ich damit den Tempsensor einlese

Noch mal: Dafür gibts fertigen Code!



Ich geh jetzt raus.
Das ist mir jeztt ehrlich gesagt zu anstrengend. Für einen Diplomanden, 
der in bälde in die Industrie geht und dort als Spezialist anhand seiner 
Diplomarbeit eingestellt wird (die dann auch: Aufbau und Programmierung 
einer Steuerung bzw. Regelung umfasst), ist mir das jetzt im Moment 
etwas zu wenig, was ich da sehe.

Verschalte deine Thermostaten mit der Uhr. Wird sicher Eindruck machen 
bei der Verteidigung deiner Masterarbeit. Was red ich da von Dplomand. 
Master ist ja das Doktorat.

von Rocco (Gast)


Lesenswert?

Ich habe mit Programmieren, Schalten, Steuern, Messen eigentlich nichts 
am Hut!
Ich mache etwas mit pyroelektrischen Kristallen.
Es ist nur nahezu unmöglich diese Kristalle regelmäßig in Folge 
bestimmten Umweltbedingungen auszusetzen.

Es kommt auch nicht darauf an mit der Schaltung irgendwie Eindruck zu 
machen.

Das mit dem Laptop erwähne ich nur, fals es da einfacher für mich wäre 
das ganze umzusetzen.

fG Rocco

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> Das mit dem Laptop erwähne ich nur, fals es da einfacher für mich wäre
> das ganze umzusetzen.

Auf einem Pc ist die Ansteurung von externer Hardware niemals einfacher 
als auf einem extra dafür abgestelltem µC. Es sei dann man hat eine 
zugekaufte Schnittstellenkarte und der Hersteller hat sich um die 
Details gekümmert.

Auf einem PC musst du immer mit dem Betriebssystem kämpfen, damit dieser 
dich auf die Schnittstelle zugreifen lässt, wie du das gerne möchtest. 
Denn genau das muss ein Betriebssystem normalerweise verhindern: Das 
jedes dahergelaufene Programm sich einfach so an der Hardware zu 
schaffen macht!

Auf einem µC hast du kein Betriebssystem. Da ist dein Programm 
alleiniger Herr im Haus.

von Rocco (Gast)


Lesenswert?

ja, stimmt, das mit dem PC ist ekine gute Idee - lese ich auch gerade

was ich so in der Codesammlung finde ist leider nicht besonders gut 
nachvollziehbar.

ich suche eigentlich eher eine fertige Routine die ich mit include <> 
einfüge, damit ich in der main nur noch den Sensor abfragen brauche.

Ich sitz bestimmt auf meinen augen - aber ich finde einfach keine 
einfache Lösung die Anfängerfreundlich (=gut erklährt oder dokumentiert) 
ist

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> was ich so in der Codesammlung finde ist leider nicht besonders gut
> nachvollziehbar.

Es reicht doch, wenn sie funktioniert :-)

> ich suche eigentlich eher eine fertige Routine die ich mit include <>
> einfüge

mit include fügt man sowieso keine Routinen ein.
Die werden extra kompiliert und dazugelinkt.


OK. Du hast recht, hab mir in der Codesammlung noch mal schnell ein paar 
Projekte angesehen. Da ist kaum eines dabei, das nach dem simplen 
Strickmuster

1
int main()
2
{
3
4
   init_ds1820();
5
6
   while( 1 ) {
7
8
     wert = read_from_ds1820();
9
10
     mach was mit wert
11
   }
12
}

geht. Das liegt daran, dass man prinzipiell mehrere Sensoren 
gleichzeitig anhängen kann und die auseinanderhalten muss. Und dann 
wirds ein klein wenig komplizierter.


Ich poste dir heute abend oder irgendwann am Wochenende ein 
Beispielprojekt, das auf die simple Art funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:
> Ich habe mit Programmieren, Schalten, Steuern, Messen eigentlich nichts
> am Hut!

Warum baust du es dann?
Oder besser gefragt: Warum nimmst du dir eine Diplomarbeit, bei der du 
das musst?
(das werde ich nämlich nie verstehen, warum man sich bei einer seiner 
wichtigsten Arbeiten, nämlich der Diplomarbeit, auf ein Gebiet wagt, von 
dem man nicht den Hauch eines Schimmers hat. In der Industrie würde ich 
dich wegen sowas feuern)

> Ich mache etwas mit pyroelektrischen Kristallen.
> Es ist nur nahezu unmöglich diese Kristalle regelmäßig in Folge
> bestimmten Umweltbedingungen auszusetzen.

Es gibt doch sicherlich auch fertige Klimaschränke

von Rocco (Gast)


Lesenswert?

Herr Buchegger:

warum ich mir gerade das ausgesucht habe ist recht einfach - es klang 
nicht weiter kompliziert und in der Zeit machbar. Es war allerdings 
nicht klar das bestimte Geräte nicht da sind. Ich habe leider keinen 
Thermocycler - oder etwas ähnliches auftreiben können. Und wenn dann 
nicht für einen akzeptablen Preis ;)

Nun könnte ich wirklich alles immer im Wasserbad erwärmen, dabei stehen 
und die Zeit und Temperatur messen, alles ins kalte Wasser, versuchen da 
die Temp. kostant zu halten etc. Und dann das ganze etwa 10x pro Probe 
wiederholen. Das ist wirklich nicht schaffbar, geschweige denn 
einigermaßen vergleichbar.

Ich bin Ihnen wirklich für Ihre Geduld mit mir sehr dankbar. Und vielen 
Dank für Ihre Hilfe. Ich bin freue mich schon sehr auf Ihren Code.

fG Rocco

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> Nun könnte ich wirklich alles immer im Wasserbad erwärmen, dabei stehen
> und die Zeit und Temperatur messen, alles ins kalte Wasser, versuchen da
> die Temp. kostant zu halten etc.

Mal ne Frage:
Würde das zum Erfolg führen, wenn man das händisch macht?

Ich versuch immer noch abzuschätzen, ob der Ansatz was taugt.
Denn eines ist klar. Das ist der simpelst mögliche Regler. Ein sog. 2 
Punkt Regler. Wenn der bei einer Einstellung von 35 Grad exakt die 35 
Grad halten kann, dann ist das ..... Zufall. Die Temperatur wird immer 
etwas um diesen Wert (samt eingestellter Hysterese) schwanken. Wenn man 
das verhindern will, dann reicht einfaches Ein/AUsschalten meistens 
nicht mehr, sondern man muss die Wärmequelle feiner ansteuern und vor 
allen Dingen einen komplizierteren Regler-Algorithmus nehmen. Zb einen 
PID Regler.
Das ist aber wiederrum nicht so einfach, denn der Regler muss an die 
Regelstrecke angepasst werden. Und genau da möchte ich dich eigentlich 
nicht reinjagen, wenns nicht sein muss.

> Und dann das ganze etwa 10x pro Probe
> wiederholen. Das ist wirklich nicht schaffbar, geschweige denn
> einigermaßen vergleichbar.

Das ist schon klar.

> Dank für Ihre Hilfe. Ich bin freue mich schon sehr auf Ihren Code.

Kein Thema.

von Rocco (Gast)


Lesenswert?

Hmm also wenn es schwankt (Hysterese) macht das nicht wirklich was. also 
so ein Grad hoch und runter ist nicht schlimm, etwas mehr meinetwegen 
auch.

Ich messe ja eh mit einem geeichten datenlogger mit (dafür hat das Geld 
gerade noch gereicht ;))

von Rocco (Gast)


Lesenswert?

Hallo,

bei Conrad um die Ecke ist der DS1821 verfügbar. Den würde ich ger 
nehmen.

Ich hoffe man verzeiht mir wenn ich alles in die main packe.

Ich würde gern erklären wie ich das ganze hier verstehe und dann meine 
Umstzung etwas später posten.

Ich möchte den DS1821 gern im 1SHOT Modus betreiben. Er soll auch nicht 
als Thermostat dienen.

follgend Reihenfollge habe ich mir dabei gedacht:

Dabei ist der Transmitterpin in meinem Bsp. A0 und der Receiverpin B0.

1. Reset (A0 auf low für >480s danach wieder auf high)
2. B0 einlesen (Fals Ds1821 das Reset empfangen hat sendet er nach 
15...60µs ein low für 60...240µs)
3. Read initialisieren (A0 low für min 1µs und anschließend wieder auf 
high)
4.B0 einlesen und in einer Variablen speicher(direkt nachdem A0 wieder 
auf high ist gibt der DS1821 seine Daten innerhalb von 15µs)
5.ich solte jetzt soetwas wie 00011001 in einer Variablen stehen haben. 
Damit kann ich jetzt die Temp ausrechnen.

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

OK.
Ich hab dir was zusammengestellt.

Das ganze basiert auf den DS1820 Routinen, die PeDa in der Codesammlung 
veröffentlicht hat. Ich habs so umgebaut, dass du zwar nur 1 DS1820 
benutzen kannst, dafür hast du aber auch weniger Arbeit mit dem 
drumherum. Um dir das Leben (vermeintlich) einfacher zu machen, habe ich 
alles in 1 Source Code File zusammenkopiert. Lediglich die LCD-Routinen 
fehlen. Ich hab das LCD aber nicht ausgebaut, damit du in der 
Hautpschleife siehst, was du mit dem Wert machen kannst. Der Wert, den 
du von den DS1820 Routinen bekommst ist nämlich das 16-fache der 
Temperatur (dadurch hat man ein paar Kommastellen).

Das Programm ist getestet und funktioniert.
Am ANfang des Programms findest du ein paar #define, die angeben an 
welchem Pin der DS1820 angeschlossen ist (W1_PIN et all)

Das main ist ganz unten und macht nichts anderes als den DS1820 im 1 
Sekundentakt auszulesen und das Messergebnis auf dem LCD auszugeben. 
Alle LCD Sachen sind mit einem #ifdef LCD_TEST gekapselt, so dass du sie 
leicht entfernen kann.

F_CPU setzen nicht vergessen!


(Das Programm ist schnell zusammengestellt und ich hab nicht auf gute 
Form geachtet)

von Rocco (Gast)


Lesenswert?

wow, Sie sind echt großartig.

Vielen vielen Dank dafür.

Ich werde gelich anfangen das duchzuforsten.

Ich melde mich dann und berichte wie weit ich komme.

fG Rocco

von Rocco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe versucht so viel wie möglich von dem Code zu verstehen - das 
ist mir nicht überall gelungen.

Dazu habe ich den größten Teil bereits Kommentiert. Ich weis das es 
unüblich ist jede Zeile zu kommentieren, aber es hilft mir sehr beim 
Verstehen.

Ich würde mich freuen wenn Sie mich verbessern und ergänzen würden.

Vielen Dank dafür

Rocco

von Rocco (Gast)


Lesenswert?

Ach so,

kann ich mit dem Programm genau so den DS18S20 betreiben oder sogar den 
DS1821?

Danke Rocco

von Karl H. (kbuchegg)


Lesenswert?

Rocco schrieb:

> Ich würde mich freuen wenn Sie mich verbessern und ergänzen würden.

Zu den Fragen

Du versuchst das noch auf zu niedrigem Level zu verstehen.

Besorge das Datenblatt zum DS1820 und lies es. Insbesondere den 
Abschnitt, wie man ihn programmiert.

In aller gebotener Kürze:
  Man sagt dem IC, dass er eine Messung durchführen soll
  (start_meas() macht das, und das Kommando, welches man zum IC
   überträgt, heißt CONVERT_T)

  und danach holt man sich das Ergebnis ab (indem man dem IC ein
  READ Kommando schickt. Der IC reagiert gibt die zuletzt gemessene
  Temperatur raus)


Der interessante Teil sind die Kommandos und wie der IC darauf reagiert 
und nicht welches Bitgewackle dazu notwendig ist. Wie FAX funktioniert 
kann man auch nicht verstehen, wenn man auf der Ebene Kupferkabel, 
Verstärker und Übertragungsfrequenzen ansetzt.


uint8_t w1_reset( void );
  // löst am DS1820 einen Reset aus

uint8_t w1_bit_io( uint8_t b );
  // schreibt ein Bit in den IC, gleichzeitig wird ein Bit
  // vom IC empfangen

uint8_t w1_byte_wr( uint8_t b );
  // benutzt w1_bit_io um nacheinander 8 Bit zum IC zu schicken
  // bzw. umgekehrt gleichzeitig 8 Bit vom IC zu holen

uint8_t w1_byte_rd( void );
  // liest ein Byte vom DS1820

void w1_command( uint8_t command );
  // übertragät ein Kommando zu IC


Die Abfrage
  if( W1_IN & ( 1 << W1_PIN ) ) {
ist sowas wie eine kleine Fehlererkennung. Am I2C Bus muss extern ein 
Pullup Widerstand angeschlossen werden. Ist der Pin daher auf Eingang 
geschaltet, dann muss es nöglich sein, bei inaktivem Bus einen High 
Pegel auszulesen. Das ist kein 100% Fehlerabfrage, aber es ist zumindest 
ein bischen was. Wird der Pin als 0 gelesen, dann stimmt etwas in der 
externen Verschaltung nicht und start_meas liefert dann FALSE zurück.

von Rocco L. (kaufparkangucker)


Angehängte Dateien:

Lesenswert?

Leider funktioniert der Quellcode nicht 100%ig

An C0 des Mega8 hängt der DS18S20.

Ich habe am Port B 8 LED's angeschlossen über die ich die Temperatur 
ausgeben möchte.
die ersten vier LED's haben die Werte
1°C  2°C  4°C  8°c
die zweiten vier LED's haben die Werte
10°C  20°C  40°C  80°C

Somit wollte ich die Temperatur immer, je nach dem welche LED's 
leuchten, addieren um die aktuelle Temperatur zu wissen.

Die LED's verändern zwar ihre Konstelation wenn ich den DS18S20 anfasse, 
aber ich werde nicht schlau daraus

z.Z. leuchten bei Raumtemp von etwa 21°C follgende LED's
B0, B1, B4, B5, B7


viele Grüße

Rocco

von Artur H. (hohoho)


Lesenswert?

Mich wundert gerade, dass überhaupt LEDs leuchten ...
du liest die 16-Bit-Temperatur in die Variable tempDigital,
schreibst dann nur noch die unteren 8 Bit in tempLED,
um diese wieder in eine 16-Bit-Variable t zu pressen.

Daraus ergibt sich aber, dass die oberen 8 Bit von t immer 0 sind.
Somit bringt die Zeile
1
t = (t >> 1) | (t & 0xFF00);
nur den Shift um 1 nach rechts.

Du Teilst also das untere Byte der Temperatur durch 2, und gehst davon 
aus, dass dies der Wert in Grad Celsius ist.
Karl Heinz Buchegger hat oben aber schon geschrieben, dass die Variable 
das 16-fache der Temperatur enthält.

Zudem stimmt noch etwas an der Bitmaske p nicht. Diese sollte vor dem 
if-Konstrukt auf 0 gesetzt werden, sonst werden alte LED-Zustände 
beibehalten.

Oder um es mal kurz zu machen ( hier nur der teil in der 
do-while-Schleife ):
1
// Kommando an den Sensor (Messung starten)
2
    // >>Notiz>> Wir gehen einfach von einem Erfolg aus <<
3
    start_meas();
4
5
    // Temperatur vom Sensor holen
6
    tempDigital = read_meas_fast();
7
8
      t = tempLED >> 4; // durch 16 teilen
9
10
     p = 0;
11
12
     //Konfiguration der Pins für LEDs setzen
13
     if(t >= 80) { p |= (1<<7); t -= 80; } //Pin7 für 80°C setzen
14
     if(t >= 40) { p |= (1<<6); t -= 40; } //Pin6 für 40°C setzen
15
     if(t >= 20) { p |= (1<<5); t -= 20; } //Pin5 für 20°C setzen
16
     if(t >= 10) { p |= (1<<4); t -= 10; } //Pin4 für 10°C setzen
17
     if(t >= 8)  { p |= (1<<3); t -= 8;  } //Pin3 für 8°C  setzen
18
     if(t >= 4)  { p |= (1<<2); t -= 4;  } //Pin2 für 4°C  setzen
19
     if(t >= 2)  { p |= (1<<1); t -= 2;  } //Pin1 für 2°C  setzen
20
     if(t >= 1)  { p |= (1<<0); t -= 1;  } //Pin0 für 1°C  setzen
21
22
   PORTB = p;

von Rocco L. (kaufparkangucker)


Angehängte Dateien:

Lesenswert?

also ich habe jetzt noch mal daran herum gefummelt und es schein nicht 
durch 16 sondern durch 8 geteilt zu werden damit es funzt!

Im anhang der Code - vieleicht wirft ja trotzdem nochmal einer einen 
Blick darauf?

fG Rocco

von Karl H. (kbuchegg)


Lesenswert?

UNd hier
1
               t = read_meas_fast();
2
        t = t/8;
3
4
                // Temperatur in Grad Celsius:
5
                tC = (t >> 1) | (t & 0xFF00);

wird nach der Division durch 8 noch einmal durch den >> 1 durch 2 
dividiert (*). In Summe also Division durch 16

Lass doch den Mist, wenn du ihn nicht brauchst! Wozu soll denn das 
überhaupt gut sein? tC ist bei dir ein int8_t damit ist alles was du da 
an den oberen 8 Bit rumfmmelst sowieso für die Katz!

Schreib Code so einfach wie du nur kannst (gilt auch für den Rest)
1
                t = read_meas_fast();
2
                t = t/16;
3
4
                if(t < 0)
5
                  t = -t; //Vorzeichen entfernen

und die Variable tC schmeisst du überhaupt raus. Die braucht in 
Wirklichkeit kein Mensch!

(*) wobei dann bei negativen Zahlen sogar noch etwas Falsches raus 
kommt. Schieben ist nicht immer äquivlent mit Dividieren. Wenn du 
Dividieren willst dann schreib auch Dividieren und tricks dich nicht 
selbst damit aus schlauer sein zu wollen als dein Compiler. Ob dein Code 
jetzt 200 µs früher oder später an die Stelle kommt an der er 1 Sekunde 
lang Däumchen dreht, ist auch schon egal.

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.