SMT160-30
SMT160-30
Hej, jag behöver lite hjälp. Jag har kopplat in en SMT160-30 till parallellporten.Och när jag läser av porten så växlar värdet mellan 120 och 248, det ska väl stämma?? Om det är rätt så hur gör jag om värdet till en vettig temperatur? Har läst i databladet men det är rena grekiskan för mej! Har även sök på forumet. Men jag får det inte att funka. Skulle vara snällt om någon ville visa hur man räknar ut det? Min matte är inte speciellt bra, som ni kanske märker! Kanske blev lite otydligt? Men hoppas ni förstår.
Tackar! Men jag har redan kollat på det! Och jag blev inte så mycket klokare av det
Det jag ville veta var bara hur ekvationen ska vara. Någon kanske vill visa lite kod hur man får fram temperaturen? Jag skriver själv i c# och använder inpout32.dll för att kommunicera med porten http://www.logix4u.net/.

Har inte fått något meddelande. Jaja, jag kanske var lite otydlig iaf?
Så jag försöker igen
Så här står det i databladet.
D.C. = 0,32+0,00470*t D.C. = duty cycle
t = Temperature in C
Alltså det jag inte förstår är att när jag läser av porten så får jag ju alltid samma värden 248 och 120. Vad ska jag göra med dessa? Lika ekvationen? Hur använder jag den om jag vill få fram temperaturen? För det står ju att "duty cycle" är lika med 0,320+0,00470*t? Var får jag temperaturen ifrån? Det är ju den jag vill få reda på? Hur ska jag läsa av sensorn? Om jag läser nu så växlar ju värdet mellan 248 och 120, har det inget med saken att göra? Eller ska man läsa hur många pulser den sänder ut och göra något med dessa? Haha.. det är säkert väldigt enkelt, så ni får ursäkta men jag är helt ny på detta
Så jag försöker igen

D.C. = 0,32+0,00470*t D.C. = duty cycle
t = Temperature in C
Alltså det jag inte förstår är att när jag läser av porten så får jag ju alltid samma värden 248 och 120. Vad ska jag göra med dessa? Lika ekvationen? Hur använder jag den om jag vill få fram temperaturen? För det står ju att "duty cycle" är lika med 0,320+0,00470*t? Var får jag temperaturen ifrån? Det är ju den jag vill få reda på? Hur ska jag läsa av sensorn? Om jag läser nu så växlar ju värdet mellan 248 och 120, har det inget med saken att göra? Eller ska man läsa hur många pulser den sänder ut och göra något med dessa? Haha.. det är säkert väldigt enkelt, så ni får ursäkta men jag är helt ny på detta

- Schnegelwerfer
- Inlägg: 1863
- Blev medlem: 8 november 2004, 13:46:56
Det du vill göra är att mäta den Duty-Cycle som givaren ger. Signalen kommer att se ut som en fyrkantvåg, och du vill mäta den tid i varje period som signalen är hög. Du måste alltså i ditt program mäta tid istället för att bara läsa av porten direkt.
Anledningen att du nu får två olika värden är att den ingång du kopplat sensorn till växlar. Det du vill göra är att mäta tiden mellan när parallellporten växlar värde från 248 till 120 och tvärtom.
Det här blev lite rörigt, men jag hoppas du förstod något i alla fall.
Anledningen att du nu får två olika värden är att den ingång du kopplat sensorn till växlar. Det du vill göra är att mäta tiden mellan när parallellporten växlar värde från 248 till 120 och tvärtom.
Det här blev lite rörigt, men jag hoppas du förstod något i alla fall.
Min Delphi kod
Hoppas du förstår, hör av dig om inte. Man kör alltså en loop under 0.5 sek
enl nedan sedan räknar på hur många pulser som var höga.
Pinne skall vara någon av 10 11 12 13 15
Const K1 = 0.32 ;
Const K2 = 0.0047 ;
//************************************************
Function GetTemp(AddrVal :Integer ; Pin :Integer) :
Single;StdCall ;
Var
cntHigh : Integer ;
totNumOfSamp : Integer ;
inSignal : Byte ;
smartSign : Byte ;
Mask : Byte ;
halfSek : Dword ;
Begin
Case Pin of
10: Mask := 64 ;
11: Mask := 128 ;
12: Mask := 32 ;
13: Mask := 16 ;
15: Mask := 8 ;
End ;
halfSek := GetTickCount + 500 ;
cntHigh := 0 ;
For totNumOfSamp := 1 TO 100000000 do begin
inSignal := DlPortReadPortUchar(AddrVal) ;
smartSign := inSignal And Mask ;
If smartSign = Mask Then inc(cntHigh) ;
If GetTickCount > halfSek Then Break ;
End ;
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
GetTemp := (cntHigh/totNumOfSamp - K1)/K2;
End;
End.
enl nedan sedan räknar på hur många pulser som var höga.
Pinne skall vara någon av 10 11 12 13 15
Const K1 = 0.32 ;
Const K2 = 0.0047 ;
//************************************************
Function GetTemp(AddrVal :Integer ; Pin :Integer) :
Single;StdCall ;
Var
cntHigh : Integer ;
totNumOfSamp : Integer ;
inSignal : Byte ;
smartSign : Byte ;
Mask : Byte ;
halfSek : Dword ;
Begin
Case Pin of
10: Mask := 64 ;
11: Mask := 128 ;
12: Mask := 32 ;
13: Mask := 16 ;
15: Mask := 8 ;
End ;
halfSek := GetTickCount + 500 ;
cntHigh := 0 ;
For totNumOfSamp := 1 TO 100000000 do begin
inSignal := DlPortReadPortUchar(AddrVal) ;
smartSign := inSignal And Mask ;
If smartSign = Mask Then inc(cntHigh) ;
If GetTickCount > halfSek Then Break ;
End ;
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
GetTemp := (cntHigh/totNumOfSamp - K1)/K2;
End;
End.
C# och Get Tickcount
Jag använder GetTickcount 0.5 sek för att det är optimal samplingstid.
Du kan testa att köra en For Loop 100 000 varv, det borde funka.
Men visst har Ni GetTickcount i C#
Du kan testa att köra en For Loop 100 000 varv, det borde funka.
Men visst har Ni GetTickcount i C#
Senast redigerad av SvenPon 5 april 2005, 10:10:41, redigerad totalt 1 gång.
Formel
C = (cntHigh/totNumOfSamp - K1)/K2;
Dvs (antal höga / antal samplingar - 0.32 )/0.0047
Om du kör mot pinne 11 som är inverterad måste Vi omvandla
cntHigh först
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
C = (cntHigh/totNumOfSamp - K1)/K2;
K1 och K2 är till för att SMT160-30 egentligen lämnar Fahrenheit
Dvs (antal höga / antal samplingar - 0.32 )/0.0047
Om du kör mot pinne 11 som är inverterad måste Vi omvandla
cntHigh först
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
C = (cntHigh/totNumOfSamp - K1)/K2;
K1 och K2 är till för att SMT160-30 egentligen lämnar Fahrenheit
Kalibrering
Ytterligare en info.
Av någon underlig anledning så har jag funnit att vid kalibrering
så får man minska C med 1.1 grader för att det skall bli helt korrekt.
Celsius = C - 1.1
Av någon underlig anledning så har jag funnit att vid kalibrering
så får man minska C med 1.1 grader för att det skall bli helt korrekt.
Celsius = C - 1.1