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);
}
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.
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?
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.
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):
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
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.
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: