zaterdag 30 juli 2011

source code wireless sensor

Hierbij de source:

'****************************************************************
'*  Name    : 12f683.BAS                                        *
'*  Author  : VoXiT-Pro                                         *
'*  Notice  : Copyright (c) 2011                                *
'*          : All Rights Reserved                               *
'*  Date    : 29-7-2011                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device = 12F683

Config MCLRE_ON, INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BOD_ON

Xtal 4

ADCON0 = 0

CMCON0 = 7 ' comparators off
ANSEL = 0  ' all inputs digital
WPU = 0

OPTION_REG = %10000000 ' Pull-ups = off
GPIO = 000000       ' All outputs = 0 on boot
TRISIO = 111101     ' gpio.1 output rest input

INTCON = $90 ' Enable INTE interrupt   (GPIO.2 pen5 = int)
OPTION_REG.6=0 

Symbol zender       = 1
Symbol ds1820       = GPIO.0
Symbol zendout      = GPIO.1
Symbol startman     = $55
Symbol dataman      = $aa

Dim tempture As Word
Dim teller As Byte
Dim manchestin As Byte
Dim manchestout As Word
Dim tempdata As Bit
Dim manchesttl As Word
Dim manchestth As Word
Dim manchestck As Word
Dim manchestzd As Word
Dim checksum As Byte
Dim C_remain As Byte   
Dim C_per_c As Byte   
Dim Dum    As Byte

manchestin = zender
Call manchesterdata
manchestzd = manchestout

On Interrupt GoTo Meting 'Enable interrupts

Main:
@sleep
GoTo Main


Disable ' Disable interrupts in the handler

' data omzetten naar manchester
' invoer een byte
' output een word

manchesterdata:
For teller = 0 To 7
tempdata = GetBit manchestin,teller
If tempdata = 0 Then
        ClearBit manchestout,(teller*2)
        SetBit manchestout,(teller*2+1)
    Else
        SetBit manchestout,(teller*2)           
        ClearBit manchestout,(teller*2+1)
    EndIf
Next teller
Return

Meting:         

OWrite ds1820, 1, [$CC, $44]               ' Start temperature conversion
   
While ORead ds1820, 4 = 0 : Wend   

OWrite ds1820, 1, [$CC, $BE]            ' Read the temperature
ORead ds1820, 2, [tempture.LowByte, tempture.HighByte, Dum,Dum,Dum,Dum, C_remain, C_per_c]

tempture = (((tempture >> 1) * 100) - 25) + (((C_per_c - C_remain) * 100) / C_per_c)

manchestin = tempture.HighByte
Call manchesterdata
manchestth = manchestout

manchestin = tempture.LowByte
Call manchesterdata
manchesttl = manchestout

checksum = zender + tempture - 1

manchestin = checksum
Call manchesterdata
manchestck = manchestout

For teller = 0 To 1

SerOut zendout, 49965,[startman,startman,startman,startman,startman,startman,startman,startman,dataman,manchestzd.HighByte,manchestzd.LowByte,manchesttl.HighByte,manchesttl.LowByte,manchestth.HighByte,manchestth.LowByte]
SerOut zendout, 49965,[dataman,dataman,dataman,dataman,dataman,dataman,manchestck.HighByte,manchestck.LowByte]

DelayMS 70
Next

INTCON.1 = 0 ' Clear interrupt flag
Resume ' Return to main program
Enable ' Enable interrupts after the handler

wireless temperatuur sensor

Hierbij een eenvoudige versie van de temperatuur sensor deze stuurt alleen de temperatuur door.
De sensor is ingebouwd in een een kastje van een oude sensor, ook de 433 mhz zender komt uit deze sensor.
De 4060 zorgt er voor dat de pic elke minuut ff wakker wordt.
De sensor is een onewire ds18b20 van maxim. In een volgende post zet ik de source.





zaterdag 23 juli 2011

Nog meer sensors.

De test uitgebreid met nog meer sensors, dit zijn de tmp75 in 12 bits mode, de n75-5.0 alleen 9 bits mode,
doet eigenlijk dus niet echt mee, 9 bits mode is aflezen op een halve graad. En de sht11.
Op het display als achtereenvolgend de ds18s20, ds2438, tmp75,n75-5.0, sht11, ds1624, adt7410 en als laatste de lm92, zeer rustig zijn de ds18s20 en de tmp75 en de ds1624 hier zie je de temperatuur heel rustig stijgen of dalen. Ook de sht11 is zeer rustig alleen omdat de resolutie hoog is  zie je de temperatuur relatief vaak veranderen.
 De ds2438 en de lm92 en de adt7410 zie je het meest heen en weer schommelen. De tmp75 en sht11 zitten met de temperatuur het dichtst bij de sensors van maxim-ic.



woensdag 20 juli 2011

temperatuur sensor test

Voor de aardigheid een kleine test van diverse temperatuur sensors.
Op het lcd  achtereen volgend de eerste 4 de ds18s20, waarvan de eerste twee uit een andere serie dan
de andere 2, daarnaast de ds2438 ,ds1624, adt7410 en als laatste de lm92, De maxim-ic's geven allemaal ongeveer hetzelfde aan, de adt7410 van analog devices zit daar weer boven en met een verschil een 1.5 graad geeft de lm92 van national semiconducters de hoogste temperatuur aan. De sensors staan wel continu aan de spanning en komen nooit in rust. Dus in hoeverre ze zichzelf opwarmen is hier geen rekening mee gehouden


zaterdag 16 juli 2011

Draadloze sensor uitgebreid.

De draadloze sensor is uitgebreid met een HH10D van Hope voor het meten van de vochtigheid.
De HH10D levert een toontje uit waarvan de frequentie varieert afhankelijk van de vochtigheid.
Met behulp van het commando COUNTER kunnen we de frequentie meten als we COUNTER gedurende 1 seconde de pulsen laten tellen. De HH10D heeft een EEPROM waarin de calibratie waarden staan met wat rekenwerk kunnen we dan de vochtigheid bereken met 1 cijfer achter de komma. Verder heb ik voor de lichtsterkte een eenvoudige LDR gebruikt. Super is dit niet maar het werkt.

vrijdag 15 juli 2011

Ontvanger draadloze temperatuur sensor

De eerste stappen voor de ontvanger zijn gemaakt.
In de video kunnen we zien dat we manchester data op het display krijgen.
Nu moeten we nog het signaal weer decoderen.

woensdag 13 juli 2011

Draadloze temperatuur sensor

Het volgende project is het maken van een draadloos weerstation, hier alvast een filmpje van de zender.
De zender bestaat uit een 16f88 en een ds1624 i2c temperatuur sensor. Ook nog een 4060 die elke minuut een interrupt genereert. In het filmpje iets vaker. De zender gaan we nog uitbreiden met een vochtigheidssensor en een lichtsterkte meting. Zodra ook de ontvanger klaar is zetten hier de schema's en source's  neer.

zondag 10 juli 2011

Barometer

Hier de eerste schakeling een barometer met de 16f876a pic microcontroller.

Het schema


De Werking.
We gebruiken een Motorola druksensor in mijn geval de MPXH6115A, deze levert een analoge spanning die afhankelijk is van de druk. Echter het bereik van de sensor is veel groter dan nodig. De sensor kan meten van 150 Hpa tot 1150 Hpa. En het bereik van de AD omzetter is maar 10 bits. We zouden dan een uitlezing hebben van ongeveer 1 Hpa. Om dit te veranderen maken we gebruik van twee referentiespanningen. De AD convertor van de pic zal dan tussen deze twee waarden sampelen. Deze waarden worden aangeleverd door een I2C 8 bits DA omzetter de MAX518. De Vref- word 3.164v en de Vref+ word 4.688v. Nu kunnen we al een veel nauwkeuriger uitlezing krijgen. Maar we willen nog nauwkeuriger dit bereiken we dmv oversampling. Van 10 bits gaan we naar max 16 bits. We sampelen voor 14 bits bijvoorbeeld 256 keer en dit totaal delen we dan door 16. We krijgen dan een 14 bits waarde. De software is nog niet optimaal een correctie is nog niet ingebouwd. Naast de HPA geven op het display het voltage en de AD waarde weer.

Source:

'****************************************************************
'*  Name    : Barometer.BAS                                     *
'*  Author  : VoXiT-Pro                                         *
'*  Notice  : Copyright (c) 2010                                *
'*          : All Rights Reserved                               *
'*  Date    : 19-11-2010                                        *
'*  Version : 1.0                                               *
'*  Notes   : barometer                                         * 
'*          :                                                   *
'****************************************************************


Device 16F876A
 
Xtal 20    

SCL_Pin = PORTC.3   ' i2c
SDA_Pin = PORTC.4      
  
LCD_DTPin PORTB.0    'lcd 
LCD_ENPin PORTB.4
LCD_RSPin PORTB.5
  
Adin_Res = 10     ' 10-bit ADC 
Adin_Tad = frc         '  
Adin_Stime = 50              '


TRISA  = %11111111          '  PORTA allemaal input
ADCON1 = %10001111          '  PORTa.0 en vref-,vref+ gebruiken

Symbol max518      = %01011110

Dim ADvalue      As Word      ' global - the final A/D value
Dim ADCount      As Word      ' sample count
Dim ADDivisor    As Word      ' averaging divisor
Dim ADmax        As Word      ' max Advalue
Dim ADAccum      As Dword     ' 32-bit sample accumulator
Dim Volts        As Float
Dim Prcalc       As Float
Dim Pressure     As Float

Cls

DelayMS 100

Print $FE,$40,$08,$08,$08,$0E,$09,$09,$09,$00         ' H
Print $FE,$48,$00,$0C,$12,$12,$1E,$12,$12,$00         ' a


BusOut max518,$00,[$A2]      ' max518 uitgang 0 op 3.164v vref-
BusOut max518,$01,[$F0]      ' max518 uitgang 1 op 4.688v vref+

main:

GoSub GetADC                   ' Haal A/D value op

Volts = (1.524/ADmax)*ADvalue  ' volts out from mpx4115  
Volts = Volts + 3.164
Prcalc = (Volts/5)+ 0.095      ' (Vout/5)+0.095)
Pressure = (Prcalc/0.009)*10   ' convert to pa by *1000

'Pressure = Pressure + 2.1

Print At 1,1, Dec1 Pressure ,0,"P",1," ",Dec Volts,"v"
Print At 2,1, Dec5 ADvalue

DelayMS 1000
GoTo main


GetADC:      ' voor 12 bits waarde 16 x sampelen dan delen door 4              
             ' voor 14 bits waarde 256 x sampelen dan delen door 16
             ' voor 16 bits waarde 4096 x sampelen dan delen door 64
ADCount = 256
ADDivisor = 16
ADAccum = 0 
ADmax = 16368

AdLoop:
  ADvalue= ADIn 0                      ' 10-bit sample
  ADAccum = ADAccum + ADvalue      
  ADCount = ADCount - 1            
  If ADCount > 0 Then AdLoop       

  ADvalue = ADAccum / ADDivisor   ; get the average value 14 bits
Return

End