Sida 1 av 1

Billig och bra Fukt Sensor att använda till ATMEGA16

Postat: 3 juli 2007, 11:38:31
av lennie
Hej.
jag är ganska ny på avr och sensor hantering. Därför min fråga här.
Det jag letar efter är en Fukt sensor som fungerar bra ihop med ATMega16.
Efter många om och men lyckades jag få rätt på en DS18B20 Temp sensor med hjälp av er på detta forumet.
vill helst att fukt sensorn är lika enkel som den temp sensorn att hantera.
Några förslag på fukt sensor som jag kan använda? Och vad den kostar?
I framtiden skulle jag också behöva PH sensorer samt salt värde sensor.. så om ni känner till några bra sådana sensorer får ni gärna skriva vad dem heter till mig.
Tack på förhand.

Postat: 3 juli 2007, 14:30:22
av kimmi

Postat: 6 juli 2007, 23:09:48
av lennie
Hej

5 st SHT75 kom idag med schenker.
nu är det bara fram med labb kortet och börja leka lite.
Någon som har lite kod exempel till SHT75 sensorerna som man kan kolla lite på hur ni har pratat med dem. är som sagt väldigt ny på detta området...

Postat: 7 juli 2007, 00:13:24
av kimmi
Hi,
Du kan titta på denna link mikroElektronika

Postat: 9 juli 2007, 09:50:51
av Nisse
5 st SHT75 kom idag med schenker.

Får man fråga varifrån du köpte dom och vad dom kostade?

Fick en offert från Stork Automation för någon månad sedan, har den inte här, men priset var runt 250:- + moms stycket.

Mvh
Nisse

Postat: 9 juli 2007, 12:23:51
av lennie
Jag beställde mina ifrån Stork Automation. Fick betala 203 kr plus moms för dem.
Dock så har jag lite problem med dem. Men det beror inte på själva sensorerna. Utan min kunskap att kunna prata rätt med dem ifrån AVR :?

Postat: 9 juli 2007, 12:44:00
av kimmi
Hi Lennie,

er det til ATMega16 ?
och lcd på Port ?
Xtal ?

then i make a hex file for you to test

i test on rs232 and it works ok'

here is my code i used but in BascomAVR :

Kod: Markera allt

$regfile = "m16def.dat"
$hwstack = 40
$swstack = 20
$framesize = 60
$baud = 38400
$crystal = 14745600

'Routine to read the  SHT75 Humidity sensor chip
'Uses BascomAVR
'a .01 uf capacitor across VCC and Ground on the SHT75 really cleans up the data
'a pullup is required on "data" pin as shown in the data sheet

Dim Ctr As Byte
Dim Command As Byte
Dim Dis As String * 20

Dim Calc As Single
Dim Calc2 As Single
Dim Rhlinear As Single
Dim Rhlintemp As Single
Dim Tempc As Single
Dim Tempf As Single
dim Datavalue As Word
dim Databyte As Byte
dim i as byte
dim CRC as byte

dim acc as long
dim acc2 as long

dim T_Coeff1 as long
dim T_Coeff2 as long

dim RH_T_Coeff1 as long
dim RH_T_Coeff2 as long
dim C1_Long as long
dim C2_Long as long

dim RH_Temp as long
dim TC as integer
dim RH as integer
dim RH_T as integer

T_Coeff1 = -4000
T_Coeff2 = 1

C1_Long = 405
C2_Long = -28

Rh_t_coeff1 = 10                                            'not 1 because of check for round-off
RH_T_Coeff2 = 8

Const C1 = -4
Const C2 = 0.0405
Const C3 = -0.0000028
Const T1c = .01
Const T2 = .00008
Const T1f = .018

const WaitTime = 1

Sck Alias PortA.0
DataOut Alias PortA.1
DataIn Alias PinA.1

Declare Sub Getit()
declare sub Do_CRC(byval Add as byte)

PortA = 255                                                 'pull up all lines
Config PinA.0 = Output                                      'sck
Config PinA.1 = Output                                      'datain

print "Begin SHT test"

wait 1

gosub ResetSHT
print "do reset"
'gosub Write_status
'print "do status"

Do                                                          'continually  read the tempfature and humidity
    Command = &B00000011
    Call Getit                                              'Get the temperature, puts result in "Datavalue" for us
    'DataValue = 10000
       '
    'floating point
    Tempf = T1f * Datavalue
    Tempf = Tempf - 40

    Tempc = T1c * Datavalue                                 'get celcius  for later calculations and for "the rest of the world"
    Tempc = Tempc - 40

    'do integer arithmetic to get TC
    acc = DataValue
    acc = acc * T_Coeff2
    acc = acc + T_Coeff1
    acc2 = acc / 10                                          'find last digit
    acc2 = acc2 * 10
    acc2 = acc - acc2
    acc = acc / 10

    TC = acc
    if acc2 > 4 then incr TC

    Command = &B00000101
    Call Getit                                               'get the humidity
    DataValue = 1000

    'floating point
    Calc = C2 * Datavalue
    Calc2 = Datavalue * Datavalue                           'that "2" in  the datasheet sure looked like a footnote for a couple days, nope it means "squared"!
    Calc2 = C3 * Calc2

    Calc = Calc + C1
    Rhlinear = Calc + Calc2

    'correct for T
    Calc = T2 * Datavalue
    Calc = Calc + T1c
    Calc2 = Tempc - 25
    Calc = Calc2 * Calc
    Rhlintemp = Calc + Rhlinear

    'do integer arithmetic to get RH
    acc = DataValue
    acc = acc * C1_Long                                      'first part

    acc2 = DataValue
    acc2 = acc2 * acc2
    acc2 = acc2 / 1000
    acc2 = acc2 * C2_Long                                    'second part

    acc = acc + acc2
    acc = acc / 100

    Acc = Acc - 400                                         'subtract constant

    acc2 = acc / 10                                          'find last digit
    acc2 = acc2 * 10
    Acc2 = Acc - Acc2                                       'first non-significant digit

    Rh = Acc / 10                                           'RH not  compensated for T
    if acc2 > 4 then incr RH                                 'round up?

    'correct RH for T
    acc = DataValue
    acc = acc * RH_T_Coeff2
    acc = acc / 100
    acc = acc + RH_T_Coeff1                                  'RH part

    acc2 = TC
    acc2 = acc2 * 10
    acc2 = acc2 - 2500                                       'T part
    acc2 = acc * acc2                                        'RH part*T part
    acc2 = acc2 / 1000                                       'rescale

    acc = RH * 10                                            'put in long
    Acc = Acc + Acc2                                        'add T  correction to RH

    Rh_t = Acc / 10                                         'T-corrected  RH (*10)
    acc2 = acc / 10                                          'find last digit
    acc2 = acc2 * 10
    Acc2 = Acc - Acc2                                       'first non-significant digit
    if acc2 > 4 then incr RH_T                               'round up?

    Dis = Fusing(tempc , "###.#")
    Print Dis ; "C " ;
    print " (" ; TC ; ")";

    Dis = Fusing(Rhlinear , "##.#")
    Print ", RH " ; Dis ; "%" ;
    print " (" ; RH ; ")";

    Dis = Fusing(rhlintemp , "##.#")
    Print ", RH(T) " ; Dis ; "%" ;
    print " (" ; RH_T ; ")";

    Print " spacing " ; WaitTime ; " secs"

   Wait WaitTime
Loop


Sub Getit()
    gosub Start_Transmission
    gosub Send_Byte
    Do_CRC Command
    gosub Read_Byte
    Do_CRC DataByte

    Datavalue = Databyte
    Shift Datavalue , Left , 8

    gosub Tick_Ack
    gosub Read_Byte
    Do_CRC DataByte

    Datavalue = Datavalue + Databyte

    gosub Tick_Ack
    Shiftin Datain , Sck , Databyte , 3                     'get CRC in reversed order (LSB first)

    if CRC <> DataByte then print "BAD CRC " ; CRC ; " " ; DataByte ; " " ;

    gosub End_Transmission
End Sub

ResetSHT:
    Config PinA.0 = Output                                   'sck
    Config PinA.1 = Output                                   'datain
    'PortA.0 = 1                                              'set pull-up
    'PortA.1 = 1                             'set pull-up
    Set Dataout
    For Ctr = 1 To 12
       Set Sck
       Waitus 2
       Reset Sck
       Waitus 2
    Next Ctr
return

Start_Transmission:
    Set Sck
    Config PinA.1 = Output
    Reset Dataout
    Reset Sck
    Set Sck
    Set Dataout
    Reset Sck
    CRC = 0
return

End_Transmission:
    Config PinA.1 = Output
    Set Dataout
    Set Sck
    Reset Sck
return

Send_Byte:
    Config PinA.1 = Output
    Shiftout Dataout , Sck , Command , 1

    Set Sck                                                 'check transmision OK
    'click one  more off
    Reset Sck
    for i = 1 to 255
       if PinA.1 = 0 then exit for
       waitms 1
    next
return

Read_Byte:
    Config PinA.1 = Input
    Shiftin Datain , Sck , Databyte , 1                      'get the MSB
return

Tick_Ack:
    Reset Sck
    Config PinA.1 = Output
    Reset Dataout
    Set Sck
    Reset Sck
    Set Dataout
return

Write_status:
    gosub Start_Transmission

    Command = &B00000110
'   Do_CRC Command                                           'add to CRC
    gosub Send_Byte
    gosub Tick_Ack

    Command = &B00000000                                    'Switch to 12  bit resolution
    Do_CRC Command                                           'add to CRC
    gosub Send_Byte
    gosub Tick_Ack

'   Command = CRC
'   gosub Send_Byte                                          'send CRC

'   gosub End_Transmission
return

sub Do_CRC(byval Add as byte)
    for i = 7 to 0 step -1
       if Add.i = CRC.7 then
          shift CRC , left , 1
          CRC.0 = 0
       else
          shift CRC , left , 1
          CRC.0 = 1
          CRC.4 = not CRC.4
          CRC.5 = not CRC.5
       end if
    next
end sub

End

Postat: 9 juli 2007, 12:59:55
av Nisse
Jag har lyckats prata med min SHT11 från AVR. Dock är inte programmet det snyggaste. Jag gjorde ett quick´n dirty programm för att kolla att det funkade. Ska skriva om hela rasket och få med ordentlig kontroll av ACK-signaler osv.

Det jag bävar för sedan är att få till matematiken för att omvandla till grader celsius och %-RH i assembler.

Mvh
Nisse

Postat: 13 juli 2007, 19:13:11
av lennie
kimmi skrev:Hi Lennie,

er det til ATMega16 ?
och lcd på Port ?
Xtal ?

then i make a hex file for you to test

i test on rs232 and it works ok'

here is my code i used but in BascomAVR :

Kod: Markera allt

.........
Hej.

Ursäkta att jag inte hört av mig på ett tag. den har varit mycket senaste tiden. åker på semester om en vecka och det är mycket som ska fixas på jobbet innan jag åker.
Men sambon jobbar hela helgen så den ska gå åt AVR saker för min del..

Jag använder en Glcd. och den sitter ansluten på.
PORTD, 2, 3, 4, 5, 7, 6, PORTA
den koden är tagen ifrån mikrobasic. vet inte riktigt hur det funkar med glcd i C
När det gäller SHT75 sensorn så är den kopplad. DATA PC6 & SCK PC7
Och det är en Atmega16 jag använder.
vad menar du med Xtal ?

Postat: 16 juli 2007, 15:39:11
av lennie
Någon som lever och vill hjälpa mig lite 

Postat: 18 juli 2007, 04:41:05
av kimmi
Hej ,
Jag använder en Glcd. och den sitter ansluten på.
PORTD, 2, 3, 4, 5, 7, 6, PORTA
Ja fint , men jeg er inte på C Code ( ME BASIC ) 8)
så du får tala om lite mere om LCD pin & port på AVR

Hvilken type glcd KS0108 , T6963C , SED ? evt it link til datasheet

Oh ja Xtal = krystal in Mhz

Lite C Code
Jo det er til SHT11 men funkar oxå på SHT75 ..