B4R Code Snippet Measure Analog Sensor on Digital Pin

Discussion in 'B4R Code Snippets' started by AHilton, Apr 18, 2018.

  1. AHilton

    AHilton Active Member Licensed User

    Explanation is in the code. "Resistive Sensors" examples include Photocells (light sensor), Flex sensors, Thermistors (temperature reading).

    Code:
    ' This example can be used to read a resistive sensor (a sensor that acts like a resistor) on a digital pin by using a capacitor.

    ' The basic concept is this:  The capacitor fills but, because there is a resistor (for those sensors that acts like one),
    '    it fills rather slowly depending on the resistance of that sensor.  We count how long that takes.  The more resistance,
    '    the slower (more cycles) the capacitor fills until it reads "HIGH".  NOTE: You are NOT measuring voltage here. You are measuring
    '    how long it takes to half-fill a capacitor.  You'd need to either an analog pin or use an AnalogDigitalConverter (ADC) to do that.

    ' The (V) line connects to one of the sensor legs.
    ' One leg of the ceramic (C)apacitor (.001 to 1 microF depending on your reading range) goes to the other leg of the sensor.
    ' The (G)rnd line connects to the free leg of the capacitor.
    ' The (D)igital line connects to the combined legs of the sensor and capacitor and goes to your microcontroller.
    ' V
    ' SS
    '  CC
    '   G
    '  D
    ' See: https://learn.adafruit.com/assets/467 for a Fritzing of the circuit

    ' Good things:  Wide range of values depending on your choice of capacitor and any other resistors, etc. you put in-line.
    ' Bad things:  Charging a capacitor isn't linear.  It'll often start off charging very quickly and then slow as it gets 'full'.

    #Region Project Attributes
        
    #AutoFlushLogs: True
        
    #CheckArrayBounds: True
        
    #StackBufferSize: 300
    #End Region

    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'Public variables can be accessed from all modules.
        Public Serial1 As Serial
        
        
    Private ReadPin1 As Pin
        
    Private ReadGPIOPin1 As UInt = 0
        
        
    Private tmr1 As Timer
        
        
    Private CyclesMax As UInt = 1000
    End Sub

    Private Sub AppStart
        Serial1.Initialize(
    115200)
        
    Log("AppStart")
        
        ReadPin1.Initialize(ReadGPIOPin1, ReadPin1.MODE_OUTPUT)
        
        tmr1.Initialize(
    "tmr1_Tick"1000)                            ' Read values every 1 seconds
        
        tmr1.Enabled = 
    True
    End Sub

    Sub tmr1_Tick
        tmr1.Enabled = 
    False
        
    Private CyclesToRecharge As UInt
        CyclesToRecharge = RCTime(ReadPin1)
        
    If CyclesToRecharge = CyclesMax Then
            
    Log("Check your Connection. Too much Resistance")
        
    Else
            
    Log(CyclesToRecharge)
        
    End If
        tmr1.Enabled = 
    True
    End Sub

    Sub RCTime (RCPin As Pin) As UInt
        
    ' The code below, drains the capacitor and then counts how long it takes (not "Time" but cycles) for the capacitor
        '    to fill half way up (ie it reads "HIGH").
        
        
    Private Cycles As UInt = 0                ' Init the counter
        
        RCPin.Mode = RCPin.MODE_OUTPUT            
    ' Set pin to Output/Write
        RCPin.DigitalWrite(False)                ' Set pin to "LOW" (because GRND is connected to the capacitor end)
        
        Delay(
    1)                                ' Waiting for the capacitor to discharge

        RCPin.Mode = RCPin.MODE_INPUT            
    ' Set pin to Input/Read
        Do While RCPin.DigitalRead = False        ' Keep reading the pin until it reads "HIGH" (ie not False) which should be 1/2 of the input voltage
            Cycles = Cycles + 1
            
    If Cycles = CyclesMax Then
                
    ' Something is wrong. Resistance is too high. Probably a bad connection
                Return CyclesMax
            
    End If
        
    Loop
        
        
    Return Cycles
    End Sub
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice