Ask Some Questions and Get Some Answers

Run the Final Program!

Now for the following Magic BS2 Board code, I used Parallax and electronics themed responses (for the fun of it). Feel free to change the responses to anything you desire!

Running the MagicBS2Board.bs2 code below magically turns your BASIC Stamp 2 into an amazing fortune-telling machine. Impress all your friends and family with your microcontroller’s ability to predict the future!

Keep in mind when using the Magic BS2 Board that if you’d like to ask it a second question, you’ll need to press the reset button on your board.

' -----[ Title ]--------------------------------------------------------------
' MagicBS2Board.bs2
' Ask a question & get a response from the wise Magic BS2 Board!

' {$STAMP BS2}
' {$PBASIC 2.5}

' -----[ I/O Definitions ]----------------------------------------------------
LCDpin            PIN    13                     ' Serial LCD pin

' -----[ Variables ]----------------------------------------------------------
old0              VAR    Bit                    ' Variable space for previous
old1              VAR    Bit                    ' tilt states

counter           VAR    Nib                    ' Counter variable

generateMessage   VAR    Word                   ' Variable space for randomizing
displayMessage    VAR    generateMessage.NIB0   ' and displaying answers

' -----[ Initialization ]-----------------------------------------------------
SEROUT LCDpin, 84, [22, 12]                     ' Initialize the LCD
PAUSE 500                                       ' Wait for battery connection

SEROUT LCDpin, 84, [128, "ASK A QUESTION &",    ' Prompt user response
                    148, "SHAKE FOR ANSWER"]

DO
  old0 = IN0: old1 = IN1                        ' Loop until board is
  RANDOM generateMessage                        ' shaken & randomize answer
LOOP UNTIL (old0 <> IN0 OR old1 <> IN1)

SEROUT LCDpin, 84, [12]                         ' Clear the LCD

' -----[ Main Routine ]-------------------------------------------------------
DO
  old0 = IN0: old1 = IN1                        ' Save tilt states to variables
  PAUSE 100                                     ' Pause for human speeds

  IF old0 <> IN0 OR old1 <> IN1 THEN            ' Compare to current state &
    RANDOM generateMessage                      ' if different, board is shaking
    counter = 0                                 ' Reset counter to 0
  ELSE                                          ' If they repeat, track with
    counter = counter + 1                       ' counter variable
    IF counter > 10 THEN                        ' If it's been the same for 10
      GOSUB Display_Answer                      ' cycles, display the answer
    ENDIF
  ENDIF
LOOP                                            ' Loop until shaking stops

' -----[ Subroutine - Display_Answer ]----------------------------------------
' Displays answers based on value in displayMessage & ends the program

Display_Answer:
  SELECT displayMessage
    CASE 0
      SEROUT LCDpin, 84, [128, " PBASICALLY YES"]
    CASE 1
      SEROUT LCDpin, 84, [128, "  THE BOE-BOTS",
                          148, "    SAY YES"]
    CASE 2
      SEROUT LCDpin, 84, [128, " RESPONSE FRIED",
                          148, "   ASK LATER"]
    CASE 3
      SEROUT LCDpin, 84, [128, "  DEBUGGING...",
                          148, "   TRY AGAIN"]
    CASE 4
      SEROUT LCDpin, 84, [128, " THE SCRIBBLERS",
                          148, "     SAY NO    "]
    CASE 5
      SEROUT LCDpin, 84, [128, " PROPELLERY NOT"]
    CASE 6
      SEROUT LCDpin, 84, [128, " REPLY STATIC-Y",
                          148, "    ASK AGAIN"]
    CASE 7
      SEROUT LCDpin, 84, [128, "  CURRENTLY NO"]
    CASE 8
      SEROUT LCDpin, 84, [128, " AMMETERS POINT",
                          148, "     TO YES"]
    CASE 9
      SEROUT LCDpin, 84, [128, "AS THE STINGRAYS",
                          148, "  SEE IT - YES"]
    CASE 10
      SEROUT LCDpin, 84, [128, " VOLTAGE SPIKE",
                          148, " CAN'T SAY NOW"]
    CASE 11
      SEROUT LCDpin, 84, [128, "  AS I SPIN IT",
                          148, "     ...YES"]
    CASE 12
      SEROUT LCDpin, 84, [128, " YOU WILL MEET",
                          148, " NO RESISTANCE"]
    CASE 13
      SEROUT LCDpin, 84, [128, "DON'T CNT ON IT"]
    CASE 14
      SEROUT LCDpin, 84, [128, "THE POLARITY IS",
                          148, "   POSITIVE"]
    CASE ELSE
      SEROUT LCDpin, 84, [128, " IN-VARIABLE-Y",
                          148, "     YES"]
    ENDSELECT
END                                             ' End the program

 

Your Turn

As mentioned above, if you want to ask the Magic BS2 Board a second question, you have to press the reset button on the board. This is sort of inconvenient when wanting to ask many questions in a row. Is there a way that you can modify the program so that the reset button doesn't have to be pushed? (Hint: Yes, there is!)

Here are some important things to ponder if attempting to improve the code:

  • How will you determine if the board is shaking because the user is asking another question or if the 4-Directional Tilt Sensor is just responding to small movements as the answer is being read?
  • Could you specify how long to wait before the board resumes taking tilt measurements?
  • Would it be possible to put a piece of code in the subroutine to track movement before returning to the main program?

If you get stuck, go back and run MagicBS2Board_Test.bs2 and monitor how the board responds in different situations. The key to solving these kinds of problems is to pick up on any patterns that emerge which can easily be replicated in code.

Give it a try!