Temperaturanzeige und Potentiometer in 0.5 Schritten.

Hallo,

leider steh ich total auf dem Schlauch und komm einfach nicht auf die Lösung. Google spuckt auch nicht das aus was ich brauche.

Ich habe vor eine Temperatursteuerung mit 2 Potis zu bauen. der 1. Poti stellt ein wann die Heizung starten soll. Der 2. Poti die Abschalttemperatur.

Soweit funktioniert auch alles aber ich möchte das beide in ,5 Schritten verändert werden können und die Temperaturanzeige auch zb "25.5" anzeigt. Alternativ wäre auch zb "25.1-9" möglich.

als Temperatur bekomme ich zb "25.81" ausgegeben und bei den Potis aktuell "20" ohne weitere stellen..

Kann mir wer helfen?

#include <LiquidCrystal.h>

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

int sensorPin = 0;
int potPin1 = 1;
int potPin2 = 2;
int val3 = 10;
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
}

void loop() {
  int reading = analogRead(sensorPin);  
  float voltage = reading * 5.0;
  voltage /= 1024.0; 
  float temperatureC = (voltage - 0.5) * 100.0 ;
 
  lcd.setCursor(0, 0);
  lcd.print(temperatureC);
  
  int val1 = map(analogRead(potPin1),0,1023,10,30);
  int val2 = map(analogRead(potPin2),0,1023,10,30);
  
  if (val1 > val2) {
    val3 = val1 ;
  }
  else {
  val3 = val2;
  }
  lcd.setCursor(0,1);
  lcd.print(val1);
  lcd.setCursor(8,1);
  lcd.print(val3);
  
  
  
  
}

Danke im vorraus!

AndiIsl:
... als Temperatur bekomme ich zb "25.81" ausgegeben und bei den Potis aktuell "20" ohne weitere stellen..

Ohne mir Deinen Sketch angesehen zu haben: Kontrolliere doch mal, von welchem Typ die eingelesenen Daten sind. Es würde mich nicht wundern, wenn Du mal „float“ und mal „int“ benutzt.

HTH

Gregor

Ich verstehe dein Sketch nicht, da fehlt doch einiges, oder?

Naja ich würde aus:

int val1 = map(analogRead(potPin1),0,1023,10,30);

das hier machen:

int val1 = map(analogRead(potPin1),0,1023,100,300);

und dann später durch 10 teilen (float), dann hätte man eine Nachkommastelle.
0,5er Schritte hab ich noch nicht probiert.

Gruß

das mit float und int stimmt das sollte ich mal kontrollieren :smiley:

und zu dem sketch der ist auf jedenfall komplett :smiley: soweit funktioniert bei mir alles. danke schonmal für die nachkommastelle!

AndiIsl:
das mit float und int stimmt das sollte ich mal kontrollieren :smiley:

Was mir noch einfiel: Wenn Du nicht vorhast, ständig an den Potis zu drehen, solltest Du Trimmer benutzen.

Gruß

Gregor

Und warum eigentlich Poti, mit einem Drehimpulsgeber hast du eine deutlich bessere Wiederkehrgenauigkeit und kannst die Schritte selbst vorgeben.

HotSystems:
Und warum eigentlich Poti, mit einem Drehimpulsgeber hast du eine deutlich bessere Wiederkehrgenauigkeit und kannst die Schritte selbst vorgeben.

Mit Drehimpulsgebern hatte ich noch nie zu tun. Hast Du einen Link zur Hand?

Gruß

Gregor

gregorss:
Mit Drehimpulsgebern hatte ich noch nie zu tun. Hast Du einen Link zur Hand?

Einer von vielen, aber er funktioniert.
http://www.ebay.de/itm/like/331162170001?ul_noapp=true&chn=ps&lpid=106

Library suche ich dir noch raus und poste sie.

HotSystems:
...Library suche ich dir noch raus und poste sie.

Danke, nicht nötig! Ich möchte mir bald mal einen Drehimpulsgeber besorgen. Wenn es da Bibliotheken für gibt, finde ich die (oder frage hier).

Gruß

Gregor

Hatte mich falsch ausgedrückt.

Ich verwende diesen Code:

http://www.arduinoforum.de/arduino-Thread-Pins-am-Drehregler-Rotary-Encoder?pid=13314#pid13314

Kannste ja mal testen. Bei mit funktionier der super.

Hat mir Serenifly mal empfohlen. Er wird da sicher noch was zu schreiben.

HotSystems:
...
Pins am Drehregler (Rotary Encoder)
...

Danke!

Da fällt mir eine Sache auf: Es wird von /einem/ Rotationsencoder gesprochen, der an die Pins 2 und 3 angeschlossen wird.

Das müsste man doch obersimpel so umstricken können, dass nur /ein/ Interrupt-Pin benutzt wird (und somit /zwei/ Encoder möglich wären).

Aber ich möchte den Thread nicht „entführen“. Ich werde mir das genauer angucken, wenn ich so einen Rotationsencoder habe.

Gruß

Gregor

gregorss:
Da fällt mir eine Sache auf: Es wird von /einem/ Rotationsencoder gesprochen, der an die Pins 2 und 3 angeschlossen wird.

Das müsste man doch obersimpel so umstricken können, dass nur /ein/ Interrupt-Pin benutzt wird (und somit /zwei/ Encoder möglich wären).

Aber ich möchte den Thread nicht „entführen“. Ich werde mir das genauer angucken, wenn ich so einen Rotationsencoder habe.

Da bin ich überfragt,, kannst es ja mal probieren.
Und dann einen neuen Thread aufmachen.
Aber bis hier ist es sicher auch für den TO auch interessant.

@gregor: Pushbutton rotary encoder with only one pin? - Project Guidance - Arduino Forum

gregorss:
Das müsste man doch obersimpel so umstricken können, dass nur /ein/ Interrupt-Pin benutzt wird (und somit /zwei/ Encoder möglich wären).

Das verwendet keine externen Interrupts, sondern einen Timer Interrupt. Dann kannst du problemlos, regelmäßig mehrere Encoder abfragen (wobei man bei vielen Encodern irgendwann auf digitalRead() verzichten muss):

http://www.mikrocontroller.net/articles/Drehgeber#Dekoder_f.C3.BCr_Drehgeber_mit_wackeligen_Rastpunkten

Das ist avr gcc Code auf Timer0. Das muss man für den Arduino ändern:
http://forum.arduino.cc/index.php?topic=355824.msg2533172#msg2533172
Ist auch nichts anderes als in dem anderen Link, nur mit Timer2. Außerdem ist berücksichtigt, dass man auf Multi-Byte Variablen atomar zugreifen muss

Hey, das mit dem Drehgeber ist ja mal eine sehr gute Idee. Somit kann ich auch in 0.5 Schritten arbeiten.

Ganz großen Dank dafür!

AndiIsl:
Soweit funktioniert auch alles aber ich möchte das beide in ,5 Schritten verändert werden können und die Temperaturanzeige auch zb "25.5" anzeigt. Alternativ wäre auch zb "25.1-9" möglich.

als Temperatur bekomme ich zb "25.81" ausgegeben und bei den Potis aktuell "20" ohne weitere stellen..

Hallo,

um nochmal zum runden zurück zukommen. Um auf 0,5 Anzeige zu runden und darzustellen ist mehr Code notwendig. Man müßte Wertebereiche abfragen.

Um auf beliebige Nachkommastellen mathematisch korrekt zu runden war eine längere Suche notwendig.
Allerdings wird bei 5 am Ende ab dem 2. for Durchlauf nicht mehr richtig gerundet. Auf dem Papier stimmt aber alles. :o Könnte am ungenauen float liegen?
Aus 1.875 sollte 187.5 >> 188.0 >> 1.88 werden.

float y;

void setup() {
  Serial.begin(9600);
  
  
  for (float x=1.65; x<2.0; x=x+0.02)  {
    Serial.print(x); Serial.print('\t');
    y = ((int)(x * 10.0 + 0.5)) / 10.0;   
    Serial.println(y,1);
  }  

  Serial.println();

  for (float x=1.865; x<2.0; x=x+0.002)  {
    Serial.print(x,3); Serial.print('\t');
    y = ((int)(x * 100.0 + 0.5)) / 100.0; 
    Serial.println (y,2);
  }
  
}

void loop() {

}

AndiIsl:
Hey, das mit dem Drehgeber ist ja mal eine sehr gute Idee. Somit kann ich auch in 0.5 Schritten arbeiten.

Ganz großen Dank dafür!

Gerne...

Super, dass es dir gefällt.
War ja nur eine Alternative, aber ist deutlich stabiler und flexibler.

Hallo,

der macht wirklich aus einer 18.00 wieder eine Ganzzahl 17. Verstehe ich nicht.

float y;
int z;

void setup() {
  Serial.begin(9600);

  for (float x=1.65; x<2.0; x=x+0.02)  {
    Serial.print(x,2); Serial.print('\t');
    y = (x * 10.0 + 0.5); Serial.print(y,2); Serial.print('\t');
    z = (int) y;  Serial.print(z); Serial.print('\t');
    y = z / 10.0; Serial.print(y,1); Serial.println();
  }
  
}

void loop() {
}

1.65 17.00 17 1.7
1.67 17.20 17 1.7
1.69 17.40 17 1.7
1.71 17.60 17 1.7
1.73 17.80 17 1.7
1.75 18.00 17 1.7
1.77 18.20 18 1.8
1.79 18.40 18 1.8
1.81 18.60 18 1.8
1.83 18.80 18 1.8
1.85 19.00 18 1.8
1.87 19.20 19 1.9
1.89 19.40 19 1.9
1.91 19.60 19 1.9
1.93 19.80 19 1.9
1.95 20.00 19 1.9
1.97 20.20 20 2.0
1.99 20.40 20 2.0

Habe es auch so ähnlich wie du versucht zu lösen. Leider wie du nicht drauf gekommen.. Danke trotzdem!

Es geht doch, wenn ich es richtig verstehe, darum, einen analogen Meßwert 0 bis 1023 auf eine Temperatur 10 bis 30 Grad in Schritten von 0,5 Grad umzurechnen. Ich habe es mit Ganzzahlen probiert, wobei am Ende die zehnfache Temperatur errechnet wird, die dann bei der Ausgabe mit einem Dezimalkomma versehen wird:

void setup() {
  Serial.begin(115200);

  for (int reading = 0; reading < 1024; reading++)  {
    Serial.print(reading); Serial.print('\t');
    int temp2 = (((reading * 400UL / 1024UL) + 5) / 10 * 5) + 100; Serial.print(temp2); Serial.print('\t');
    int temp3 = temp2 / 10; Serial.print(temp3); Serial.print(',');
    int temp4 = temp2 % 10; Serial.print(temp4);
    Serial.println();
  }
}

void loop() {
}