login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Waarde converteren

Offline Oneday - 27/03/2011 20:17
Avatar van OnedayNieuw lid Hey,

ik lees via php met exec analoge waarde van temperatuursensoren uit, variërend van 0 tot 255.

Nu wil ik deze waarde omzetten naar een temperatuur in °C.

Bv: 64 --> 25°C
255 --> 50 °C

Dit zou ik met een array kunnen doen, maar ik zit met volgende hindernis:

64 --> 25 °c
maar 65 --> ook 25°C
(is niet zo méga nauwkeurig dus),
maar dit wil wel zeggen dat als ik 't met een array ga doen ik 255 keys heb, is er geen gemakkelijkere optie?

Dat ik bv zeg:

1°C --> waarde groter dan 0 en kleiner dan 10?

~Oneday

15 antwoorden

Gesponsorde links
Offline MiST - 27/03/2011 20:19
Avatar van MiST Lid Interpoleer? Beetje wiskunde kan af en toe geen kwaad me dunkt 
Offline avdg - 27/03/2011 20:22
Avatar van avdg PHP gevorderde http://nl.wikip...Fahrenheit
Offline Oneday - 27/03/2011 20:34 (laatste wijziging 27/03/2011 21:00)
Avatar van Oneday Nieuw lid
MiST schreef:
Interpoleer? Beetje wiskunde kan af en toe geen kwaad me dunkt 

Hoe doe ik dat dan? Nog nooit van gehoord. xD


Ff voorbeeldje:

heb volgende tabel bv:

Citaat:
10°C => 100
15°C => 108
20°C => 128
25°C => 146
30°C => 165
35 °C => 193

Dus wat ik nu wil kunnen bereiken is dat als ik 101 omzet ik ook op 10°C kom, en bij 148 op 25°C etc.
Offline lolll - 27/03/2011 21:19
Avatar van lolll Lid Wat is je formule om deze waarden te bereiken, want ik zie er niet echt een logica in 
Offline Oneday - 27/03/2011 21:20
Avatar van Oneday Nieuw lid
lolll schreef:
Wat is je formule om deze waarden te bereiken, want ik zie er niet echt een logica in 

Er zit ook geen logica in. 
Offline lolll - 27/03/2011 21:26
Avatar van lolll Lid Dus het gaat om waarden van 0-255 die je omzet naar °C maar enkel per 5°C ?
Offline Oneday - 27/03/2011 21:55
Avatar van Oneday Nieuw lid
lolll schreef:
Dus het gaat om waarden van 0-255 die je omzet naar °C maar enkel per 5°C ?

Klopt.
Offline MiST - 27/03/2011 21:57 (laatste wijziging 27/03/2011 22:01)
Avatar van MiST Lid Statistiek zet je een heel eind op weg. Doe een Lineaire regressie er een lineair verband is, dwz de uitvoer is een functie van de vorm y = a*x + b met a en b constanten.

Indien er een ander verband is zal je een andere regressiemethode moeten toepassen.

http://nl.wikip..._regressie

[url]http://www.wolframalpha.com/input/?i=linear+regression+[%28100%2C+10%29%2C+%28108%2C+15%29%2C+%28128%2C+20%29%2C+%28146%2C+25%29%2C+%28165%2C+30%29%2C+%28193%2C+35%29][/url]

Met andere woorden, de functie 0.262103*x - 14.1945 benadert de temperatuur in functie van x = (100->193). Erbuiten kan het ook nog kloppen, maar dat is niet met zekerheid te zeggen.

PS: ik heb hier maar snel even wat berekend om de methode uit te leggen, dit wil nog niet zeggen dat dit hier zomaar juist is. Dat moet je zelf uitzoeken ;)
Offline FrankL - 27/03/2011 21:58
Avatar van FrankL Lid Als waarde tussen die en die waarde zit ==> dat antwoord.

Dus een beetje met if en else gaan werken. Dat lijkt mij in deze het makkelijkst.
Offline Maarten - 28/03/2011 11:43
Avatar van Maarten Erelid http://networki...&id=31

En om per tien af te ronden -> vermenigvuldigen/delen met 10 en afronden?
Allemaal zo ver niet zoeken 
Offline Oneday - 28/03/2011 17:07
Avatar van Oneday Nieuw lid
Maarten schreef:
http://networki...;amp;id=31

En om per tien af te ronden -> vermenigvuldigen/delen met 10 en afronden?
Allemaal zo ver niet zoeken 

Maar het is helemaal geen Fahrenheit --> Celsius omzetter?

@MiSt: Ik ga jouw manier zodra eens proberen. 
Offline Maarten - 30/03/2011 13:36 (laatste wijziging 30/03/2011 13:37)
Avatar van Maarten Erelid @Oneday: ha sorry, ik had het misgelezen, my mistake. Op dat uur van de dag ben ik niet altijd even wakker.
Anyway, je kan het nog steeds simpel oplossen volgens mij?

Stel even hypothetisch:
  1. 0 => min temp (bv. - 20)
  2. 255 => max temp (bv. + 30)


Dit wil zeggen dat je, als je op de graad af wilt afronden, 50 schijven hebt voor de temperatuur, en 255 voor de inputwaardes.
Dit zou willen zeggen:
255/ 50 = 5,1
Per 5 waardes heb je dus een temperatuurverschil.

Dus je neemt je inputwaarde:
  1. 0 / 5,1 -> 0
  2. 10 / 5,1 -> 2
  3. 3 / 5,1 -> 0,58 (-> 1)
  4. 144 / 5,1 -> 28,24 (-> 28)


Alleen ligt de minimale waarde hier niet op 0 maar op -20, dus trek er gewoon nog eens 20 van af
  1. IN: 0 => OUT: -20
  2. IN: 10 => OUT: -18
  3. IN: 3 => OUT: -19
  4. IN: 144 => OUT: 8


In een generieke vorm wil dit dus zeggen (psuedo, ben .NET developer en PHP wat verleerd )
  1. out = ROUND(in / (255 / (MAXIMALE_WAARDE - MINIMALE_WAARDE))) - MINIMALE_WAARDE


En nu kan het best zijn dat ik er weer compleet naast zit, maar volgens mij is het niet moeilijker dan dat? 
Offline Oneday - 30/03/2011 15:41
Avatar van Oneday Nieuw lid
Maarten schreef:
@Oneday: ha sorry, ik had het misgelezen, my mistake. Op dat uur van de dag ben ik niet altijd even wakker.
Anyway, je kan het nog steeds simpel oplossen volgens mij?

Stel even hypothetisch:
[..code..]

Dit wil zeggen dat je, als je op de graad af wilt afronden, 50 schijven hebt voor de temperatuur, en 255 voor de inputwaardes.
Dit zou willen zeggen:
255/ 50 = 5,1
Per 5 waardes heb je dus een temperatuurverschil.

Dus je neemt je inputwaarde:
[..code..]

Alleen ligt de minimale waarde hier niet op 0 maar op -20, dus trek er gewoon nog eens 20 van af
[..code..]

In een generieke vorm wil dit dus zeggen (psuedo, ben .NET developer en PHP wat verleerd )
[..code..]

En nu kan het best zijn dat ik er weer compleet naast zit, maar volgens mij is het niet moeilijker dan dat? 

Dit zou inderdaad werken moesten de waarden lineair verlopen, helaas is dat niet zo. 
Offline ArieMedia - 30/03/2011 16:58 (laatste wijziging 30/03/2011 17:01)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
  1. function calcOptions($gelezen_waarde) {
  2. $max = 255;
  3. $maxgraden = 50;
  4. $min = 0;
  5. $mingraden = 0;
  6. $aantal_opties = $max - $min;
  7.  
  8. $stapgrootte = ($maxgraden - $mingraden) / $aantal_opties;
  9.  
  10. return round(($gelezen_waarde * $stapgrootte), 0);
  11. }
  12.  
  13. echo calcOptions(64);


Is dit het, of denk ik te simpel? 

Edit: of nu nog met interval per 5? 
Offline Maarten - 30/03/2011 17:02
Avatar van Maarten Erelid Wat een gestoorde temperatuursensor.. zat er geen manual bij met pseudocode?
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.22s