// // Arduono DRC (Drogon Remote Control) test // arduTest = DrcOpen ("/dev/ttyUSB0") // // Setup the screen, etc. // PROC setup PROC updateButtons(FALSE, FALSE) lastB1 = FALSE lastB2 = FALSE lastPc = -1 ledBargraph = TRUE CYCLE // Dump all analog channels FOR i = 0 TO 5 CYCLE x = AnalogRead (arduTest, i) v = x * 5 / 1023 HVTAB (0, 5 + i) NUMFORMAT (2, 0) PRINT i; ": "; NUMFORMAT (4, 0) PRINT x; " - "; NUMFORMAT (4, 2) PRINT v; REPEAT // // Button 3 - Toggle between LED bargraph and LED brightness // b3pushed = AnalogRead (arduTest, 2) < 511 if b3pushed then proc changeMode // // Analog input from the potentiometer on pin 5 // a = AnalogRead (arduTest, 5) pc = INT (a / 1023 * 100) IF pc <> lastPc THEN if ledBargraph THEN PROC LEDbarGraph(pc) else PROC LEDbrightness(pc) endif PROC GRbarGraph(pc) HVTAB (5, THEIGHT - 3) if ledBargraph THEN PRINT "LEDs: Bargraph" else PRINT "LEDs: Brightness" endif HVTAB (TWIDTH - 10, THEIGHT - 3) NUMFORMAT (3, 0) PRINT pc; "%" lastPC = pc ENDIF // // Buttons // b1pushed = NOT DigitalRead (arduTest, 12) b2pushed = AnalogRead (arduTest, 1) < 511 IF (b1pushed <> lastB1) OR (b2pushed <> lastB2) THEN PROC updateButtons(b1pushed, b2pushed) lastB1 = b1pushed lastB2 = b2pushed ENDIF // // Temperature from the LM35 // volts = 5 * AnalogRead (arduTest, 0) / 1023 temp = volts * 100 HVTAB (0, 15) NUMFORMAT (4, 2) PRINT "Volts: "; volts NUMFORMAT (4, 1) PRINT "Temperature: "; temp; "C"; // WAIT (0) // Update screen REPEAT END // // PROC changeMode: // Flip between bargraph and brightness on the LED bargraph // def proc changeMode wait (0.05) while AnalogRead (arduTest, 2) < 511 cycle // Wait for button to be released wait (0.05) repeat if ledBargraph THEN PROC LEDbarGraph (0) // Turn off all LEDs ledBargraph = FALSE PinMode (arduTest, 3, 2) // 2 = PWM PinMode (arduTest, 5, 2) PinMode (arduTest, 9, 2) PinMode (arduTest, 10, 2) PinMode (arduTest, 11, 2) ELSE ledBargraph = TRUE PinMode (arduTest, 3, 1) PinMode (arduTest, 5, 1) PinMode (arduTest, 9, 1) PinMode (arduTest, 10, 1) PinMode (arduTest, 11, 1) ENDIF endproc // // PROC LEDbarGraph // Take the reading from the potentiometer (as a percentage) // and update the LED bargraph // DEF PROC LEDbarGraph(percent) PROC ledCheck(6, 15, percent, 2) PROC ledCheck(16, 25, percent, 3) PROC ledCheck(26, 35, percent, 4) PROC ledCheck(36, 45, percent, 5) PROC ledCheck(46, 55, percent, 6) PROC ledCheck(56, 65, percent, 7) PROC ledCheck(66, 75, percent, 8) PROC ledCheck(76, 85, percent, 9) PROC ledCheck(86, 95, percent, 10) PROC ledCheck(96, 100, percent, 11) ENDPROC // Another strategy // LOCAL i, last // last = INT (percent / 10) // i = 0 // WHILE i < last CYCLE // DigitalWrite (arduTest, i + 2, 1) // i = i + 1 // REPEAT // FOR i = last TO 10 CYCLE // DigitalWrite (arduTest, i + 2, 0) // REPEAT // ENDPROC // // PROC ledCheck: // Check if the signal is in the range given and on/off the LED // DEF PROC ledCheck(mn, mx, v, led) // if (v >= mn) and (v <= mx) THEN IF (v >= mn) THEN DigitalWrite (arduTest, led, 1) ELSE DigitalWrite (arduTest, led, 0) ENDIF ENDPROC // // PROC LEDbrightness // Use PWM to set the brightness of the LEDs based on the potentiometer setting // def proc LEDbrightness(percent) local bright bright = percent / 100 * 255 pwmWrite (arduTest, 9, bright) pwmWrite (arduTest, 10, 255 - bright) pwmWrite (arduTest, 11, bright) pwmWrite (arduTest, 5, bright) pwmWrite (arduTest, 3, 255 - bright) ENDPROC // // PROC GRbarGraph // Take the reading from the potentiometer (as a percentage) // and update the on-screen bargraph // DEF PROC GRbarGraph(percent) LOCAL width COLOUR = Blue RECT (1, 1, GWIDTH - 2, 38, 1) COLOUR = Maroon width = INT (percent / 100 * (GWIDTH - 2)) RECT (1, 1, width, 38, 1) ENDPROC // DEF PROC updateButtons(b1, b2) COLOUR = White CIRCLE (GWIDTH / 4, GHEIGHT / 2, 50, 1) CIRCLE (GWIDTH / 4 * 3, GHEIGHT / 2, 50, 1) IF b1 THEN COLOUR = Black CIRCLE (GWIDTH / 4 * 3, GHEIGHT / 2, 40, 1) ENDIF // IF b2 THEN COLOUR = Blue CIRCLE (GWIDTH / 4, GHEIGHT / 2, 40, 1) ENDIF ENDPROC // // PROC setup: // Setup the test-bed Arduino platform // Pins 2-11 are LED bargraph output, // 12 is a switch input // Analog 0 is an LM35 temperature sensor // Analog 1 is a switch // Analog 5 is a potentiometer // DEF PROC setup LOCAL i FOR i = 2 TO 11 CYCLE PinMode (arduTest, i, 1) // Outputs REPEAT PinMode (arduTest, 12, 0) // Input DigitalWrite (arduTest, 12, 1) // Enable internal pull-up // // Graphics HGR COLOUR = Yellow RECT (0, 0, GWIDTH, 40, 0) FOR i = 0 TO GWIDTH - 1 STEP GWIDTH / 10 CYCLE LINE (i, 40, i, 50) REPEAT LINE (GWIDTH - 1, 40, GWIDTH - 1, 50) FOR i = GWIDTH / 20 TO GWIDTH - 1 STEP GWIDTH / 10 CYCLE LINE (i, 40, i, 45) REPEAT // // Text // BCOLOUR = Black TCOLOUR = White PRINT PRINT "RTB <-> Arduino DRC Test Program" PRINT "================================" ENDPROC