Pages: [1]   Go Down
Author Topic: map() auch mit Nachkommastellen?  (Read 557 times)
0 Members and 1 Guest are viewing this topic.
Franken
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

habe einen industriellen Temp- und Feuchtefühler der mir 0-10V ausgibt (-20° - 80°C , 0 - 100% r.F).
Zum einlesen hab ich mir fix einen Spannungsteiler gebaut.
Hier der Code
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd (9, 8, 5, 4, 3, 2);

int temp_pin     = A1;
int hum_pin      = A2;


void setup()
{
  Serial.begin(9600);
  lcd.begin(20,4);
}



void loop()
{

 
 
  int temp_raw   = analogRead(temp_pin);
  int hum_raw    = analogRead(hum_pin);
 
  float temp_volt  = temp_raw * (5 / 1023.0);
  float hum_volt   = hum_raw  * (5 / 1023.0);
 
  float temp_val   = map (temp_raw, 0, 1023, -20,   80 );
  float hum_val    = map (hum_raw,  0, 1023,   0,   100);
 
 
  lcd.clear();

  lcd.setCursor(9,0);
  lcd.print("Temp, rF%");

  lcd.setCursor(0,1);
  lcd.print("Volt:");

  lcd.setCursor(9,1);
  lcd.print(temp_volt);

  lcd.setCursor(15,1);
  lcd.print(hum_volt);

  lcd.setCursor(0,2);
  lcd.print("Roh:");

  lcd.setCursor(9,2);
  lcd.print(temp_raw);

  lcd.setCursor(15,2);
  lcd.print(hum_raw);

  lcd.setCursor(0,3);
  lcd.print("Gemappt:");

  lcd.setCursor(9,3);
  lcd.print(temp_val);

  lcd.setCursor(15,3);
  lcd.print(hum_val);

 
  Serial.println("Rohwerte: Temp, rF%");
  Serial.println(temp_raw);
  Serial.println(hum_raw);
  Serial.println("gemappt:");
  Serial.println(temp_val);
  Serial.println(hum_val);
  Serial.println("Volt:");
  Serial.println(temp_volt);
  Serial.println(hum_volt);
  delay(500);
 
}

Alles simpel und soweit funktional.

Jedoch stellt sich mir die Frage: Wie kann ich meine ausgelesen und gemappten Werte mit Nachkommastellen versehen?
Eine Stelle würde genügen.

Hab schon Versucht:

Code:
 
float temp_val   = map (temp_raw, 0, 1023.0, -20.0,   80.0 );
float hum_val    = map (hum_raw,  0, 1023.0,   0.0,   100.0);

bekomm zwar zb. "25.00" angezeigt.. aber es bleibt bei "x.00"

Tipps?

Gruß
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mußt Du Dir halt selbst ausrechnen.

wenn Du den wert temp_raw durch 10,23 dividierst, bekommst Du werte von 0 bis 100. zieh' 20 ab und Du hast Die temperatur.
bei der feuchtigkeit mußt Du nichts abziehen.

gruß stefan
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 442
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

falls es Dir um die Anzeige der Vor- und Nachkommastellen geht, hilft villeicht folgender Mini-Sketch:

Code:
#include <stdio.h>
#include <stdlib.h>

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

void loop()
{
  char t[20];
  double x=12.3;
  int vk, nk;
 
  vk=(int) x;
  nk=x*10-vk*10;
  sprintf(t, "%d.%d", vk, nk);
  Serial.println(t);
}

Das gibt x mit einer Nachkommastelle über die serielle Schnittstelle aus. Betrifft das Deine Frage oder geht es Dir um die Berechnung?

Gruß,
Ralf
Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2449
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tipps?

Lineare Interpolation.

Formel bei Wikipedia: http://de.wikipedia.org/wiki/Interpolation_(Mathematik)#Lineare_Interpolation
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 442
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich glaube, es geht dem TO eher darum, wie er die Nachkommastellen anzeigen und von der Integer-Mathematik von map() wegkommen kann. Nicht so sehr darum, wie das Ergebnis zu berechnen ist, oder?

Gruß,
Ralf
Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Quote
Ich glaube, es geht dem TO eher darum, wie er die Nachkommastellen anzeigen und von der Integer-Mathematik von map() wegkommen kann. Nicht so sehr darum, wie das Ergebnis zu berechnen ist, oder?

macht das nicht das, was ich geschrieben habe?

gruß stefan
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 442
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Eisebaer: Ich denke nicht. So wie ich das verstehe, geht es ihm darum genau eine Nachkommastelle anzuzeigen. Also z.B. 24.1°C oder so ähnlich.

Gruß,
Ralf
Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

steh' ich jetzt auf dem schlauch? dürfte nicht mein tag sein, aber ich versteh's nicht.

er bekommt werte von 0 bis 1023 als integer. wenn er es mit map umrechnet, bekommt er wiederum integerwerte von -20 bis 80. dabei gehen die zwischenwerte flöten, weil map nur integer liefert.

wenn er jetzt aber den erhaltenen wert durch 10,23 dividiert, bekommt er doch diese zwischenwerte als dezimalstelle(n).

zb. 568 / 10,23 - 20 = 35,52

sorry, bin noch nicht lange munter...

gruß stefan
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 442
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

zb. 568 / 10,23 - 20 = 35,52
Genau ;-) Ich glaube halt er will nicht 35,52 sehen, sondern 35,5 - also eine Nachkommastelle. Kann aber auch sein, dass ich mich irre. Vielleicht warte ich am Besten mal, ob der TO sich nochmals äußert, wo genau "ihn der Schuh drückt".

Gruß,
Ralf
Logged

Es gibt 10 Arten von Menschen, die einen verstehen Binär, die anderen nicht...

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20230
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Map macht nur mit integer.
wenn die Zahlen nicht zu groß werden ( größer als ca 32000) dann kannst Du vor dem Map einfach mit 10 oder 100 multiplizieren und dann in ein float umwandeln und wieder dividieren.

Ansonsten machst du die bereichsumrechnung selbst wie Eisebaer vorschlägt.
Grüße Uwe
Logged

Offline Offline
Faraday Member
**
Karma: 80
Posts: 2741
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Formel von map ist in der Referenz angegeben:
http://arduino.cc/en/Reference/map

Code:
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Könnte man auch in float selbst implementieren wenn man den Divisor auf float castet und einen float zurück gibt
Logged

Franken
Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Leute! Hätte nicht mit so einer großen Resonanz gerechnet  smiley


Also vielleicht habe ich mich wirklich etwas undeutlich ausgedrückt:

Ich lese einen Analogwert von 0 - 1023 ein was dem Temperaturwert -20 - +80°C entspricht (Industrieller Temperaturfühler mit 0-10V Ausgang welcher über einen Spannungsteiler auf 0 - 5V umgewandelt wird)

Mit map() bekomm ich zwar die entspechenden Werte "umgerechnet" doch leider bei 24,5°C zb. halt nur 25°C angezeigt.

Mir geht es dabei weniger darum, wie viele Nachkommastellen angezeigt werden, sondern eher darum, wie ich überhaupt Nachkommastellen bekommen kann da ich mit map() ja allerhöchstens 24,00°C bekomme und keine Zehntelwerte.

Auf die Idee mit dem vorherigen dividieren bzw manuellem Umrechen bin ich gar nicht gekommen.  smiley-confuse

Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

na dann ist es ja einfach:

  float temp_val   = temp_raw / 10.23 - 20;
  float hum_val    = hum_raw / 10.23;


gruß stefan
Logged

Pages: [1]   Go Up
Jump to: