Storing value from Keypad
JohnCook
Posts: 3
in BASIC Stamp
Hello all,
I am trying to use the keypad membrane to change a temperature ('Setpoint') which would be a 3 digit number. I am unsure how to do this, it would be a matter of displaying what ever the user inputs on the keypad onto the LCD and once they press the new temperature in, to use the value as the new temperature ('Setpoint'). All help is welcomed!
Here is what I have so far
I am trying to use the keypad membrane to change a temperature ('Setpoint') which would be a 3 digit number. I am unsure how to do this, it would be a matter of displaying what ever the user inputs on the keypad onto the LCD and once they press the new temperature in, to use the value as the new temperature ('Setpoint'). All help is welcomed!
Here is what I have so far
' {$STAMP BS2} ' {$PBASIC 2.5} ' -----[ Title ]----------------------------------------------------------- ' Process Control - IncubatorOnOff.bs2 ' -----[ Declarations ]---------------------------------------------------- ADC_ByteValue VAR Byte ' Analog to Digital Converter data V_Offset VAR Word ' Temperature/voltage for ADC offset V_Span VAR Word ' Temperature/voltage for ADC Span TempF VAR Word ' Calculated temperature in hundredths SetPoint VAR Word ' Heater control setpoint ADC_CS PIN 13 ' ADC Chip Select pin ADC_Clk PIN 14 ' ADC Clock pin ADC_Dout PIN 15 ' ADC Data output ADC_VRef PIN 10 ' Filtered PWM for ADC Vref ADC_Vminus PIN 11 ' Filtered PWM for ADC Vminus Heater PIN 8 ' Incubator heater Fan PIN 12 ' Incubator cooling fan row VAR Nib ' Variable space for row counting column VAR Nib ' Variable space for column counting keypad VAR Word ' Variable space to store keypad output keypadOld VAR Word ' Variable space to store old keypad output temp VAR Nib ' Variable space for polling column states ' -----[ Initialization ]-------------------------------------------------- LOW Heater ' Ensure heater off LOW Fan ' Ensure fan off PAUSE 1000 ' Allow connection to stabilize with StampPlot SEROUT 9, 84,[22, 17] 'GOSUB ReadSP_Span ' Read StampPlot for ADC SetPoint = 10100 V_Offset = 70 V_Span = 50 ' -----[ Main Routine ]---------------------------------------------------- DO ' GOSUB ReadSP_Controls GOSUB DriveFan GOSUB DisplayLCD GOSUB UserInput GOSUB SetADC GOSUB ReadADC GOSUB CalcTemp GOSUB Drive_Heater PAUSE 500 LOOP ' -----[ Subroutines ]----------------------------------------------------- ReadSP_Span: ' On connection, get ADC range DEBUG CR,"!READ (txtTMin)",CR ' Request/store offset DEBUGIN DEC V_Offset PAUSE 50 DEBUG "!READ [(txtTMax),-,(txtTMin)]",CR ' Request/store Span (Max-Min) DEBUGIN DEC V_Span PAUSE 50 RETURN ReadSP_Controls: DEBUG "!READ [(txtSetPoint),*,100]",CR ' Obtain setpoint in hundredths DEBUGIN DEC SetPoint PAUSE 50 DEBUG "!READ (swFan)",CR ' Request/control Fan state DEBUGIN Fan PAUSE 50 RETURN SetADC: PWM ADC_Vminus, V_Offset * 255/500,100 ' Set Voltage for ADC Vminus PWM ADC_Vref, V_Span * 255/500,100 ' Set voltage for ADC Vref RETURN ReadADC: ' Read ADC 0831 LOW ADC_CS ' Enable chip SHIFTIN ADC_Dout, ADC_Clk, MSBPOST,[ADC_ByteValue\9] ' Clock in ADC data HIGH ADC_CS ' Disable ADC RETURN CalcTemp: ' Transfer function for temperature in hundreths TempF = (V_Span * 100)/255 * ADC_ByteValue + (V_Offset * 100) RETURN Drive_Heater: IF TempF > SetPoint THEN ' Determine heater state LOW Heater ' Above setpoint - Heat off ELSE HIGH Heater ' Below setpoint - Heat on ENDIF RETURN DriveFan: IF TempF > (SetPoint + 300) THEN HIGH Fan ELSE LOW Fan ENDIF RETURN DisplayLCD: SEROUT 9, 84, [128,"Set Point:", 138, DEC5 SetPoint, 148,"Temp:",154, DEC5 TempF] RETURN ' -----[ Subroutine - ReadKeypad ]------------------------------------------------- ' Read keypad button states ReadKeypad: keypad = 0 OUTL = %00000000 ' Initialize IO DIRL = %00000000 FOR row = 0 TO 3 DIRB = %1111 ' Set columns (P7-P4) as outputs OUTB = %0000 ' Pull columns low (act as pull down) OUTA = 1 << Row ' Set rows high one by one DIRA = 1 << Row temp = 0 ' Reset temp variable to 0 FOR column = 0 TO 3 INPUT (column + 4) ' Set columns as inputs one by one temp = temp | (INB & (1 << column)) ' Poll column state and store in temp NEXT keypad = keypad << 4 | (Temp REV 4) ' Store keypad value NEXT RETURN UserInput: GOSUB ReadKeypad IF Keypad.BIT12 THEN ' If "A" is pressed GOSUB ChangeTemp ENDIF RETURN ChangeTemp: SEROUT 9,84,[148,"Input Temp"] RETURN
Comments
Now I would know how to interpret the value that ReadKeyPad returns in keypad
Then I would write a subroutine
I would call my new routine instead of the debugin statement where you get a new set temperature.