[Rpi] mcp3008 en ntc 10k thermistor

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Meulugar
  • Registratie: Juli 2002
  • Laatst online: 19:44

Meulugar

Vanuit het zonnige zuiden![PT]

Topicstarter
Ik zit met een uitdaging. Ik heb mij het leplazerus gezocht maar kom er niet helemaal uit. Ik heb een 10k ntc (10k ohm bij 25 graden) Dit ding heeft helaas geen linear verloop. Het gaat om deze sensor: http://imall.iteadstudio....-sensors/im120628010.html

ik heb mijn rasberry aangesloten op de MCP3008 op de volgende manier:
VDD 3.3V
VREF 3.3V
AGND GROUND
CLK GPIO11 (P1-23)
DOUT GPIO9 (P1-21)
DIN GPIO10 (P1-19)
CS GPIO8 (P1-24)
DGND GROUND
de NTC zit door middel van een voltage divider aangesloten op Ch0 (10k weerstand vanaf ch0 naar 3.3V)

ik ben inmiddels zover dat ik een output krijg uit de MCP3008, maar ik krijg het niet voor elkaar deze output om te zetten naar temperatuur of zelfs maar de weestand waarde.ik heb mij rot gezocht naar tutorials met de NTC maar alleen maken gebruik van een 3 wire analoge sensor in de vorm van de TMP35 of 36.

inmiddels ben ik zo ver dat ik door de bomen het bos niet meer zie. Adafruit heeft een tut mbt de ntc en 10k weerstand voor de arduino, maar mijn kennis mbt C is te weinig om deze te porten naar python.

Heeft iemand hier een tutorial of kan iemand mij opweg helpen om de bit waarde (tussen de 0 en 1023) om te zetten naar een temp waarde en / of weerstand?

Acties:
  • 0 Henk 'm!

  • Vuikie
  • Registratie: December 2003
  • Laatst online: 19:29
Het nadeel van NTC's is dat deze logaritmisch werken, dus of werk met de tabel die op de pagina staat van de website die jij noemt of je zal moeten gaan werken via de Steinhart formule: http://www.raspberrypi.or...iewtopic.php?f=63&t=31653

Voor het omzetten van de ADC waarde naar voltage kan je gewoon deze berekening gebruiken: Result_mV = ( Reference in mV / 1023) * Result

*edit*
Al het bovenste heb ik gewoon via Google gevonden...

[ Voor 16% gewijzigd door Vuikie op 16-07-2014 10:27 ]


Acties:
  • 0 Henk 'm!

  • Meulugar
  • Registratie: Juli 2002
  • Laatst online: 19:44

Meulugar

Vanuit het zonnige zuiden![PT]

Topicstarter
Vuikie schreef op woensdag 16 juli 2014 @ 10:24:
Het nadeel van NTC's is dat deze logaritmisch werken, dus of werk met de tabel die op de pagina staat van de website die jij noemt of je zal moeten gaan werken via de Steinhart formule: http://www.raspberrypi.or...iewtopic.php?f=63&t=31653

Voor het omzetten van de ADC waarde naar voltage kan je gewoon deze berekening gebruiken: Result_mV = ( Reference in mV / 1023) * Result

*edit*
Al het bovenste heb ik gewoon via Google gevonden...
Bovenstaande link heb ik inderdaad ook gevonden. En ik heb ook geplot dus de A B C en D waarde heb ik.

Ik zal eens rustig er voor gaan zitten, want ik snap de formules niet helemaal. (ook de bovenstaande).

de Ref is altijd 3.3 v dus (3300 /1023 ) maar vermenigvuldig je die daarna dan weer met de uitkomst? of is Result in dit geval de uitkomst van de Readadc() functie ?

ik zit nu op mijn werk, maar ik zal vanavond even voorbeeld van wat ik tot nu toe heb posten. In ieder geval bedankt voor je hulp.

Ik wacht ondertussen ook op mijn digitale temp sensor, maar tot die tijd zou het leuk zijn om ook dit werkend te krijgen ;)

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 20:52

Damic

Tijd voor Jasmijn thee

die result moet ADC_waarde zijn denk ik.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 22:40

memphis

48k was toen meer dan genoeg.

Waarom pak je niet een LM35D temperatuur sensor. Gaat tot 150 graden en is geheel ineair met 10mV/C

Er zijn mensen die mij een GOD vinden


Acties:
  • 0 Henk 'm!

  • Meulugar
  • Registratie: Juli 2002
  • Laatst online: 19:44

Meulugar

Vanuit het zonnige zuiden![PT]

Topicstarter
memphis schreef op woensdag 16 juli 2014 @ 14:36:
Waarom pak je niet een LM35D temperatuur sensor. Gaat tot 150 graden en is geheel ineair met 10mV/C
Ik heb tzt de verkeerde besteld. een DS18B20 is onderweg vanuit China.

Maar het is mij inmiddels gelukt met hulp van hierboven. Voor de geintresseerde hier zijn de plot waarden welke ik gebruikt heb voor deze sensor:
After 4 iterations the fit converged.
final sum of squares of residuals : 2.02982e-08
rel. change during last iteration : -1.00715e-06

degrees of freedom (FIT_NDF) : 146
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 1.17911e-05
variance of residuals (reduced chisquare) = WSSR/ndf : 1.39029e-10

Final set of parameters Asymptotic Standard Error
======================= ==========================

A = 0.0027762 +/- 1.269e-06 (0.04571%)
B = 0.000244759 +/- 1.382e-06 (0.5645%)
C = 2.36688e-06 +/- 3.613e-07 (15.27%)


correlation matrix of the fit parameters:

A B C
A 1.000
B -0.262 1.000
C -0.001 -0.914 1.000

Acties:
  • 0 Henk 'm!

  • Meulugar
  • Registratie: Juli 2002
  • Laatst online: 19:44

Meulugar

Vanuit het zonnige zuiden![PT]

Topicstarter
ok, ik zat flink fout. Om te beginnen had ik compleet verkeerd geplot. Ik heb geplot met kOHM waarden ipv OHM waarden. Terwijl er notabena voor gewaarschuwd word in het topic :+

ik heb het nu bijna helemaal werkend. Maar het er zat nog een fout in het berekenen van de weerstand. Volgens mij heb ik dat nu gecorrigeerd maar dat kan ik pas vanavond testen. Ik vergat de interne schakelweerstand van de ADC eraf te trekken. Hieronder mijn script. Voor een groot deel bij elkaar geraapt en aangepast.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/python
# -*- coding: utf-8 -*-

import spidev
import time
import math
from time import strftime
import string

spi = spidev.SpiDev()
spi.open(0, 0)

#fuction that can read the adc
def readadc(adcnum):
# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([1, 8 + adcnum << 4, 0])
    adcout = ((r[1] & 3) << 8) + r[2]
    return adcout

#thermistor reading function
def get_volt(adc):
    volts = (3.3 / 1024) * adc
    return volts

def get_ohm(v):
    Rd = 10000
    Rth = (3.3 - v) / v * Rd
    Rth = Rth - 1000
    return Rth


def ohm_to_celsius(x):
  #with the values from gnuplot
  A = 0.00613599       
  B = -0.00153976      
  C = 0.000204462      
  D = -7.59476e-06

  r = math.log(x)
  return 1.0 / (A + B*r + C*r**2 + D*r**3) - 273.15
while True:
  adc1=readadc(0)
  volt1=get_volt(adc1)
  ohm=get_ohm(volt1)
  result=ohm_to_celsius(ohm)
  print (ohm,result)
  time.sleep(60)


de omslag van ohm naar temp klopt (de ohm waarde welke ik terugkrijg komt overeen met de temp in de datasheet van de sensor) Maar de volt naar Ohm zit er naast. Als ik de datasheet van de mcp3008 erbij pak zie ik daar dat de Rss een impedantie van 1kOhm heeft. die heb ik er dus af getrokken.

Vanavond even testen met kokend water. Gister kwam ik toen op negatieve temperaturen uit :+ Ik heb helaas geen multimeter bij de hand. Anders kon ik de imput vrij makkelijk verifieren met de multimeter.
output:
weerstand temp
(7584.392014519055, 31.40541599466792)
(7618.181818181816, 31.283825728063334)
(7584.392014519055, 31.40541599466792)
Mijn gecorrigeerde plot:
After 7 iterations the fit converged.
final sum of squares of residuals : 2.59466e-07
rel. change during last iteration : -5.78842e-06

degrees of freedom (FIT_NDF) : 145
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 4.23016e-05
variance of residuals (reduced chisquare) = WSSR/ndf : 1.78942e-09

Final set of parameters Asymptotic Standard Error
======================= ==========================

A = 0.00613599 +/- 0.0001921 (3.13%)
B = -0.00153976 +/- 7.49e-05 (4.864%)
C = 0.000204462 +/- 9.522e-06 (4.657%)
D = -7.59476e-06 +/- 3.928e-07 (5.172%)


correlation matrix of the fit parameters:

A B C D
A 1.000
B -0.990 1.000
C 0.967 -0.993 1.000
D -0.938 0.976 -0.995 1.000
Pagina: 1