Forum: Mikrocontroller und Digitale Elektronik Arduino Temperatursteuerung, Prüfung alle 5 Minuten


von Maik (Gast)


Lesenswert?

Hi,
ich versuche gerade eine kleine Temperatursteuerung zu realisieren. 
Soweit so gut. Also das Grundprinzip läuft. Im Arduino ist eine 
Temperatur von 28°C voreingetellt (veränderbar)
1
int SetPoint = 28;
Bis zu dieser Temperatur schaltet ein Relay, ist die Temperatur 
erreicht, dann schaltet das Relay ab.
Nun ist es so, dass bei nur kleinen Veränderungen das Relay permanent 
nacheinander in kürzester Zeit auf und zu geht.
Wie kann ich das nun im Code so anpassen, dass nur alle 5 Minuten 
geprüft wird?
Ich habe da zwar eine Prüfung die nur alle Minuten durchgeführt wird, 
allerdings wird jetzt bis zur nächsten Prüfung (5 Minuten)
1
const long interval = 300000;
 durchgeheizt... Also gerne dann mal eben auch auf weit über die 
eingestellte Temperatur....
https://pastebin.com/nkHbhUCy

von MaWin (Gast)


Lesenswert?

Maik schrieb:
> Wie kann ich das nun im Code so anpassen, dass nur alle 5 Minuten
> geprüft wird?

Du solltest lesen was ein PID Regler ist und wie man den mit autotune 
auf einem uC umsetzt.

Ich weiss, ein sehr weiter Weg noch,   aber er hilft, damit du nicht von 
1 Sackgasse in die nächste läufst.

von Justin S. (Gast)


Lesenswert?

Das Stichwort ist "Hysterese". Du musst mit zwei Schwellen statt einer 
arbeiten: Deine Einschalttemperatur muss etwas höher liegen als Deine 
Ausschalttemperatur.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Maik schrieb:
> schaltet ein Relay
Schreib doch einfach Relais, das versteht auch jeder und es hört sich 
nicht so unkundig an.

> Wie kann ich das nun im Code so anpassen, dass nur alle 5 Minuten
> geprüft wird?
Bastle nicht an Symptomen herum. Sondern behebe das Problem.

> Ich habe da zwar eine Prüfung die nur alle Minuten durchgeführt wird,
> allerdings wird jetzt bis zur nächsten Prüfung (5 Minuten)const long
> interval = 300000;
> durchgeheizt...
> Also gerne dann mal eben auch auf weit über die eingestellte Temperatur
Also Programmfehler. Dein Regler (egal ob Zweipunkt mit oder ohne 
Hysterese oder auch PID) muss immer schneller abtasten als dein 
Regelstrecke sich ändern kann. Sonst bist du halt einfach immer zu spät 
dran.

> Nun ist es so, dass bei nur kleinen Veränderungen das Relay permanent
> nacheinander in kürzester Zeit auf und zu geht.
Dann taste einfach dauernd ab und schalt das Relais bei 27°C ein und bei 
29°C aus. Also so, dass du im Mittel deine gewünschten 28°C hast.

: Bearbeitet durch Moderator
von TomH (Gast)


Lesenswert?

So hoch mit PID-Regler muß man es aber auch nicht aufhängen... ist ja 
eigentlich eine Zweipunkt-Regelung.

Wenn ich den Code beim Überfliegen richtig verstanden habe, hast Du 
ursprünglich in einer Schleife alle 100ms die aktuelle Temperatur 
angezeigt, die Taster abgefragt und das Relais gesteuert.

Temperatur kommt von einem A/D-Wandler-Anschluß. Der Wert ist natürlich 
wackelig. Und so war er alle 100ms mal zu hoch und mal zu niedrig.

Jetzt hast Du die Reaktion des Relais auf 5min verlangsamt, unter 
Verwendung eines Timestamps oder wie auch immer man das nennt... finde 
ich persönlich ok, hätte ich auch so gemacht.

Dazu aber noch meine Ideen:

1. Müssen es jetzt gleich 5min statt der 100ms sein? Ein Kompromiß bei 
30s?

2. Nutze die schnelle Schleife, um den A/D-Wandlerwert zu mitteln. Dann 
tanzt er weniger.

3. Bau eine Hysterese ein. Abschalten bei X + 0,2°C, wieder Einschalten 
bei X - 0,2°C

4. Nutze die Zeit, die das delay(100) braucht, zum Mitteln des 
A/D-Wandlerwertes.

Gruß
Tom.

von Maik (Gast)


Lesenswert?

TomH schrieb:
> 3. Bau eine Hysterese ein. Abschalten bei X + 0,2°C, wieder Einschalten
> bei X - 0,2°C

Ok, ja dass macht natürlich Sinn... Warum kommt man selber nicht auf 
solche Gendanken.

Also Grob vereinfacht:

Wenn IST Temperatur kleiner SOLL Temperatur, dann schalte Relais ein.

Sonst, Wenn IST Temperatur größer als (Soll Temperatur +1 Grad), dann 
schalte Relais aus.

Trifft beides nicht zu, warte 100ms und prüfe erneut

von Jester (Gast)


Lesenswert?

Maik schrieb:
> Trifft beides nicht zu, warte 100ms und prüfe erneut

Warte N Sekunden und mittle währenddessen die gemessenen Temperaturwerte 
- und prüfe dann erneut.

Statt (Soll Temperatur +1 Grad) würde ich (Soll Temperatur +X Grad) 
schreiben, das X parametrisierbar machen.

N und X sind abhängig von deinem Aufbau.

von Super (Gast)


Lesenswert?

Lothar M. schrieb:
> Schreib doch einfach Relais,

Und bitte nicht Relaise,

das ist wir quietschen mit Tafelkreide;-(

von Super (Gast)


Lesenswert?

if temperatur < Schaltpunkt then relais = 1
if temperatur > Schaltpunkt + Hysterese then relais = 0

von Forist (Gast)


Lesenswert?

Maik schrieb:
> https://pastebin.com/nkHbhUCy

Wichtige Regeln - erst lesen, dann posten!
...
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

von Forist (Gast)


Lesenswert?

Maik schrieb:
> Wenn IST Temperatur kleiner SOLL Temperatur, dann schalte Relais ein.
>
> Sonst, Wenn IST Temperatur größer als (Soll Temperatur +1 Grad), dann
> schalte Relais aus.

Dann dürfte deine Ist-Temperatur im Mittel 0.5K höher als deine 
Soll-Temperatur sein.

von Justus (Gast)


Lesenswert?

Justin S. schrieb:
> Das Stichwort ist "Hysterese".
Das ist die einzig sinnvolle Antwort - kurz und bündig.

Wenns nur ein Regler werden soll:
https://www.amazon.de/Temperatur-Regler-Thermostat-Temperaturschalter-50-110-C/dp/B00NBT0Q10
6,70 Euro

von Paul (Gast)


Lesenswert?

Forist schrieb:
> Maik schrieb:
>> https://pastebin.com/nkHbhUCy
>
> Wichtige Regeln - erst lesen, dann posten!
> ...
> Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Dann hat er doch alles richtig gemacht, oder?
Warum meckert hier der "Forist"?

von Forist (Gast)


Lesenswert?

Paul schrieb:
> Dann hat er doch alles richtig gemacht, oder?

Den Unterschied zwischen Dateianhang und Link kennst du?
Mit Verfallsdatum des Links wird dieser Thread unbrauchbar - du 
verstehen?

von Paul (Gast)


Lesenswert?

Forist schrieb:
> Paul schrieb:
>> Dann hat er doch alles richtig gemacht, oder?
>
> Den Unterschied zwischen Dateianhang und Link kennst du?
> Mit Verfallsdatum des Links wird dieser Thread unbrauchbar - du
> verstehen?

Das Hauptaugenmerk liegt bei "Längeren Sourcecode nicht im Text 
einfügen", und genau das tat er. Lediglich du ziehst dich an dem Link 
hoch...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul schrieb:
> Das Hauptaugenmerk liegt bei "Längeren Sourcecode nicht im Text
> einfügen", und genau das tat er.
Nein, da gibt es zwei "Hauptaugenmerker":
1. Posts kompakt halten (soweit hast du das richtig verstanden)
UND
2. die Dateien beim Post und hier auf dem Server speichern und eben 
nicht auf einem morgen toten Link

> Lediglich du ziehst dich an dem Link hoch...
Nein, ich klicke auch nicht unnötigerweise auf Links, wo ich nicht weiß 
was sich dahinter versteckt. Was wenn einer übermorgen die Domain kauft 
und Blödsinn damit anstellt?

von Manfred (Gast)


Lesenswert?

Maik schrieb:
>> 3. Bau eine Hysterese ein.
> Ok, ja dass macht natürlich Sinn...
Ja.
> Warum kommt man selber nicht auf solche Gendanken.
Weil Internet denkfaul macht.

Paul schrieb:
> Warum meckert hier der "Forist"?

Weil er sonst nichts weiter beitragen kann.

Jester schrieb:
> Warte N Sekunden und mittle währenddessen die gemessenen Temperaturwerte
> - und prüfe dann erneut.

Genau, durch Mittelung mehrerer Meßwerte wird er den 1-Bit-Wackler der 
A/D weitestgehend los. Ob der überhaupt relevant ist, hängt natürlich 
von der Auflösung ab. Egal, wenn der Arduino sonst nichts zu tun hat, 
tut eine Mittelwertbildung nicht weh.

> Statt (Soll Temperatur +1 Grad) würde ich (Soll Temperatur +X Grad)
> schreiben, das X parametrisierbar machen.

"Warte N Sekunden" habe ich bei meiner Lötstation dynamisch gestaltet: 
Ich habe einen Wert "Temperaturanstieg pro Zeit" ausgeguckt und heize 
unterschiedlich lange, abhängig von der Differenz zwischen Ist und Soll.

von Manfred (Gast)


Lesenswert?

Lothar M. schrieb:
> 2. die Dateien beim Post und hier auf dem Server speichern und eben
> nicht auf einem morgen toten Link

Ja, dann helfe ich mal aus:
1
//=================================================================
2
//                  INIT
3
//=================================================================
4
#include <Wire.h>
5
#include <LiquidCrystal_I2C.h>
6
7
LiquidCrystal_I2C lcd(0x27, 16,2); //
8
9
const int LED_RED=10; 
10
const int LED_GREEN=11; 
11
const int RELAY=12; 
12
13
//buttons for up and down
14
const int up_key=3;
15
const int down_key=2;
16
17
int SetPoint=28;
18
int heater = 0;
19
20
unsigned long previousMillis = 0; 
21
const long interval = 300000;  // 5 minutes
22
//=================================================================
23
//                  SETUP
24
//=================================================================
25
void setup(){
26
  Serial.begin(9600);
27
  //Serial.print("boot \n");
28
  pinMode(LED_RED,OUTPUT);
29
  pinMode(LED_GREEN,OUTPUT);  
30
  pinMode(RELAY,OUTPUT);  
31
  pinMode(up_key,INPUT);
32
  pinMode(down_key,INPUT);
33
  
34
  digitalWrite(up_key,HIGH);
35
  digitalWrite(down_key,HIGH);
36
37
  lcd.init();
38
  lcd.backlight();
39
   
40
  digitalWrite(LED_GREEN,HIGH);  //Green LED Off
41
  digitalWrite(LED_RED,LOW);     //Red LED On
42
  digitalWrite(RELAY,LOW);       //Turn off Relay
43
  delay(2000);
44
  lcd.clear();
45
46
  //add special char °
47
  byte Celsius[8] = {B11100,B10100,B11100,B0000,B00000,B00000,B00000,B00000}; 
48
  lcd.createChar(0, Celsius);
49
50
51
}
52
//=================================================================
53
//                  LOOP
54
//=================================================================  
55
void loop(){
56
  double Temperature = ((5.0/1024.0) * analogRead(A0)) * 10; 
57
58
  lcd.setCursor(0,0);
59
  
60
  lcd.print("T.  IST: ");    
61
  //Serial.print("T.  IST: ");
62
  
63
  //Serial.print(Temperature);
64
  //Serial.print('\n');
65
  lcd.print(Temperature, 0);
66
67
  lcd.write((uint8_t)0);
68
  //Serial.print(" C");
69
  lcd.print("C");
70
  
71
//key input
72
  if(digitalRead(down_key)==LOW)
73
  {
74
    if(SetPoint>0)
75
    {
76
      SetPoint--;    
77
    }
78
  }
79
  if(digitalRead(up_key)==LOW)
80
  {
81
    if(SetPoint<150)
82
    {
83
      SetPoint++;
84
    }
85
  }
86
87
//Display Set point on LCD
88
  lcd.setCursor(0,1);
89
  lcd.print("T. SOLL: ");
90
  //Serial.print("T. SOLL: ");
91
  
92
  lcd.print(SetPoint);
93
  //Serial.print(SetPoint);
94
  
95
  lcd.write((uint8_t)0);
96
  //Serial.print(" C");
97
  lcd.print("C");
98
99
//Check Temperature is in limit
100
unsigned long currentMillis = millis();
101
102
  if (currentMillis - previousMillis >= interval) {
103
    previousMillis = currentMillis;
104
105
    if(Temperature > SetPoint)
106
    {
107
       digitalWrite(RELAY,LOW);    //Turn off heater
108
       digitalWrite(LED_RED,LOW);
109
       digitalWrite(LED_GREEN,HIGH);  //Turn on Green LED
110
       
111
      Serial.print("Turn off heater \n");
112
    }
113
    else
114
    {
115
      digitalWrite(RELAY,HIGH);    //Turn on heater
116
      digitalWrite(LED_GREEN,LOW);
117
      digitalWrite(LED_RED,HIGH);  //Turn on RED LED  
118
      
119
      Serial.print("Turn on heater \n");
120
    }
121
  }
122
123
    delay(100); //Update at every 100mSeconds
124
}
125
//=================================================================

von Joachim B. (jar)


Lesenswert?

Manfred schrieb:
> Ja, dann helfe ich mal aus:

Scrollradmörder!
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

siehe Regeln

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Manfred schrieb:
> delay(100); //Update at every 100mSeconds
Ich habe den Programmfehler gefunden!

Ich frage mich: warum um alles in der Welt verwendet man ein delay() 
OBWOHL man die Zeiten ja soweiso mit millis() kontrolliert?
Und ich antworte mir: weil man wieder mal nicht so weit mitgedacht hat, 
dass man versteht, was das eine und was das andere macht. Und vor allen 
WIE es das macht.

Mein Ansatz wären jetzt ein paar Änderungen:
1
const long interval = 100;  // 100 ms
2
:
3
:
4
//  double Temperature = ((5.0/1024.0) * analogRead(A0)) * 10; 
5
  int Temperature = (50*analogRead(A0))/1024; 
6
:
7
:
8
    if(Temperature > SetPoint)
9
    {
10
:
11
:
12
      Serial.print("Turn off heater \n");
13
    }
14
15
//    else
16
    if(Temperature < SetPoint)
17
    {
18
:
19
:
20
      Serial.print("Turn on heater \n");
21
    }
22
:
23
//    delay(100); //Update at every 100mSeconds
Weil ich das Ganze nicht unnötigerweise mit einer Temperatur im 
Fließkommaformat mache, muss ich auch keine explizite Hysterese 
einbauen, weil ich die +-1°C Hysterese durch die Abfrage if-kleiner und 
if-größer automatisch bekomme.
Dass die Berechnung des Temperaturwerts dazuhin noch Rechenzeit spart, 
ist ein netter Nebeneffekt.

: Bearbeitet durch Moderator
von PittyJ (Gast)


Lesenswert?

Ich habe vor Jahren mal einen PID Regler für eine Temperatursteuerung 
implementiert.
Eine gute Beschreibung ist auf
https://rn-wissen.de/wiki/index.php/Regelungstechnik#PID-Regler

Und lässt man die Theorie mal weg, dann ist der Regler ein 3-Zeiler.
Man muss etwas spielen, das P I und D für seine Anwendung zu ermitteln, 
und das wars.

von Schlaumaier (Gast)


Lesenswert?

Ich würde mit 2 Temperaturen arbeiten.

Min_temp + Max_temp.

Dann nur noch

if milli() > alt_milli + Laufzeit_in_milli then
  Wert = Lese_temperatur

  if wert < min_temp then heizung = an
  if Wert > max_temp then Heizung = aus

  alt_milli = milli()
end if

Dann spart man sich den ganzen Theater und muss nur 2 Variablen 
eingeben.

Das ganze in einer Ewigkeitsschleife.

Bei Dauerbetrieb muss noch eine Überlauf_zeile eingefügt werden für 
Milli()

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Schlaumaier schrieb:
> Bei Dauerbetrieb muss noch eine Überlauf_zeile eingefügt werden für
> Milli()
Nein, bei korrekter Anwendung von milli() braucht man das nicht (wenn 
man davon ausgeht, dass deine milli() Funktion in etwa das tut und 
zurückgibt wie die Arduino millis() Funktion).

Und das hier ist eben einfach falsch und macht beim Überlauf Probleme:
1
   if  milli() > alt_milli + Laufzeit_in_milli  then
Mit einer kleinen Umformung dieser Ungleichung geht es problemlos auch 
beim Überlauf:
1
   if  milli() - alt_milli > Laufzeit_in_milli  then
Einfach mal drüber nachgrübeln...

: Bearbeitet durch Moderator
von noiasca (Gast)


Lesenswert?

Lothar M. schrieb:
> Weil ich das Ganze nicht unnötigerweise mit einer Temperatur im
> Fließkommaformat mache, muss ich auch keine explizite Hysterese
> einbauen, weil ich die durch die Abfrage if-kleiner und if-größer
> automatisch bekomme.

statt dessen brauchst du dann zusätzliche Code für die Ausgaben von Soll 
und Isttemperatur. Je nach dem wie geschickt du dich anstellst vieleicht 
sogar Division und/oder ein Modulo.

Wenn man mit aller Gewalt etwas Speicher sparen will, würde ich das 
special character eliminieren und das Grad Zeichen von Position 0xDF aus 
dem LCD Character ROM nehmen.

Wobei bei all diesen "guten Ratschlägen" soll der Thread Owner 
überlegen, was er mit den "gewonnen" Resourcen machen soll. Das Programm 
muss ja eh fast nichts machen und ob da im loop 100ms für nichts 
verbraten werden ist dann auch schon egal.

von Schlaumaier (Gast)


Lesenswert?

Lothar M. schrieb:
> if  milli() - alt_milli > Laufzeit_in_milli  then
> Einfach mal drüber nachgrübeln...

hihi hab ich sogar. Aber meine Lösung ist nit so Fein wie deine. ALSO 
DANKE DAFÜR. !!!

Aber der Code ist aus den Bauch raus geschrieben .

Und er funktioniert bei einer Steuerung von mir ausgezeichnet die auch 
mit IR-Befehlen arbeitet. Allerdings ist die nicht für Dauerbetrieb 
gemacht, weshalb ich bei den Tippen des Code an meine Steuerung gedacht 
habe.

Aber wie oben erwähnt wäre meine Code-Zeile ne extra Zeile und nicht so 
fein wie deine.

Und JA ich dachte auch an Arduinos. Wobei ich denke das so eine einfache 
Sache, mehr oder weniger auf allen anderen Systemen läuft.

Ich habe allerdings in den Code noch eine Key-Board-Abfrage und ein 
Display-Anzeige drin.

Da kann ich die Variable Laufzeit_in_milli während der Laufzeit des 
Codes ändern, und die Änderung in den kleinen Permanentspeicher des 
Arduinos ablegen.

Wäre vielleicht für den TO auch ein Idee. Dann bracht er den Chip nicht 
neu zu Flashen wenn er andere Zeiten braucht.

Sind nur ca. 20-30 Zeilen mehr .

ps. : ich hasse Delay und setze es nur ein wenn irgend ein Teil nicht in 
die Hose kommt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

noiasca schrieb:
> Das Programm muss ja eh fast nichts machen
Schon, aber man lernt an kleinen Projekten für große Projekte.

Und wenn man bei kleinen Projekten Murks lernt, dann beherrscht man den 
bei großen Projekten ganz besonders gut.

von hmm (Gast)


Lesenswert?

Hallo,

so könnte ein Zweipunktregeler mit Hysterese aussehen.

values.abschalt = untere Schwelle

values.zuschalt = oberer Schwelle

values.batterie_spg -> deine Temperatur
1
    if(values.batterie_spg < values.abschalt){
2
      values.ausgang = 0;
3
      values.untere_schwelle_erreicht = 1;
4
      values.status = F("bitte laden."); // "Relais AUS"
5
    }
6
7
    // untere Schwelle überschritten
8
    // wird nachgeladen
9
    if(values.batterie_spg > values.abschalt && 
10
       values.untere_schwelle_erreicht && 
11
       values.batterie_spg < values.zuschalt){          
12
          values.status = F("am laden.");  // Relais noch aus
13
    }
14
15
    // Laden fertig
16
    if(values.batterie_spg > values.zuschalt){
17
      values.untere_schwelle_erreicht = 0;
18
      values.ausgang = 1;
19
      values.status = F("ok.");     // Relais wieder zuschalten
20
    }

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

hmm schrieb:
> values.abschalt = untere Schwelle
>
> values.zuschalt = oberer Schwelle
Das war nicht unbedingt das glücklichste Händchen bei der Vergabe der 
Variablennamen für eine Heizung...

Denn wenn die aktuelle Temperatur über der oberen Schwelle ist, dann 
muss die Heizung nicht zugeschaltet sondern vielmehr abgeschaltet 
werden.

Und genausowenig muss sie abgeschaltet, sondern zugeschaltet werden, 
wenn die Temperatur unter der unteren Schwelle ist.

Abgesehen davon gibt es hier eben keine untere und keine obere Schwelle, 
sondern nur eine Solltemperatur und eine Hysterese.

: Bearbeitet durch Moderator
von Axel R. (axlr)


Lesenswert?

PittyJ schrieb:
> für seine Anwendung zu ermitteln,
> und das wars.

Blöd nur, wenn man zwar aktiv heizen, aber nicht kühlen kann. Dann 
brauchts zwei Parameter-Sätze.
Ich musste eine 400V/4KW (quadratisch 40cm Kantenlänge) Herdplatte 
befeuern und dort stehen 35Liter 'Destillat' im passend großen Topf 
drauf. "Halten Sie die Temperatur auf 78°C". Da kommt man schon ins 
Grübeln. schon die Zeiten für den Regler zu ermitteln, dauern "Tage", 
weil das schon gefühlt ne Ewigkeit dauert, bis es dann mal warn ist.. ;) 
die fertigen China-Regler, die man ja so als Einschub kaufen kann, sind 
garnicht für solch lange Regelzeiten ausgelegt.
Aber wahrscheinlich hab ich mich /wir uns auch einfach nur zu doof 
angestellt. Na jedenfalls: rein hardwaretechnisch ging das am Ende, aber 
die Reglerparameter haben wir schlussendlich über den Haufen geworfen 
und am Anfang einen fetten Überschwinger in Kauf genommen.
Was ich sagen wollte: Elektronik und Reglungstechnik sind zwei komplette 
paar unterschiedliche Schuhe.
Viel Erfolg aber weiterhin, ich lese interessiert mit.
Lieben Gruß,
Äxl, DG1RTO

von hmm (Gast)


Lesenswert?

Schon klar, dass sollte nur ein Beispiel für ein Zweipunkt regeler mit 
Hysterse sein. Den kann er ja leicht anpassen.
Bau gerade ein Tiefenentladeschutz für ne Batterie.
Gru0

von PittyJ (Gast)


Lesenswert?

Axel R. schrieb:
> PittyJ schrieb:
>> für seine Anwendung zu ermitteln,
>> und das wars.
>
> Blöd nur, wenn man zwar aktiv heizen, aber nicht kühlen kann. Dann
> brauchts zwei Parameter-Sätze.

Doch das geht. Für eine Anwendung habe ich ein Peltierelement benutzt. 
Das kann kühlen oder heizen.
Je nach Vorzeichen im PID-Regler habe ich dann auf Heizen oder Kühlen 
gestellt.

von EAF (Gast)


Lesenswert?

Lothar M. schrieb:
> //  double Temperature = ((5.0/1024.0) * analogRead(A0)) * 10;
Das hat den Vorteil, dass es wenigstens Funktioniert.
 double Temperature = ((5.0*10/1024.0) * analogRead(A0));
Zudem ist er nicht (ganz) so teuer, wie es aussieht, da (5.0*10/1024.0) 
zur Kompilezeit aufgelöst werden kann

Lothar M. schrieb:
> int Temperature = (50*analogRead(A0))/1024;
Das führt hingegen (auf 8Bit AVR) schnurstracks ins Versagen

Etwas besser:
int Temperature = (50L*analogRead(A0))/1024;

von Schlaumaier (Gast)


Lesenswert?

EAF schrieb:
> Lothar M. schrieb:
>> int Temperature = (50*analogRead(A0))/1024;
> Das führt hingegen (auf 8Bit AVR) schnurstracks ins Versagen

Ist alles eine Frage was der Sensor zurück-Liefert.

Und DAS steht im Datenblatt.

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.