This code reads three sensors and sends them out serially when prompted by another computer. It works with this Processing example. Arduino/Wiring, PicBasic Pro, and BX-24 versions are shown.
/* analog Call-and-Response by Tom Igoe Waits for serial input. If the incoming value is a valid byte (i.e. 0 - 255), the program then reads two analog inputs and one digital input. It divides the anaog inputs by 4 to convert the ranges to 0 = 255, and sends all three sensor values out serially. Arduino hardware connections: A0: potentiometer on analog in 1 A1: potentiometer on analog in 2 D2: switch on digital in 2 Created 26 Sept. 2005 Updated 30 May 2006 */ int firstSensor = 0; // first analog sensor int secondSensor = 0; // second analog sensor int thirdSensor = 0; // digital sensor int inByte = 0; // incoming serial byte void setup() { // start serial port at 9600 bps: Serial.begin(9600); } void loop() { // if we get a valid byte, read analog ins: if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255: firstSensor = analogRead(0)/4; // delay 10ms to let the ADC recover: delay(10); // read second analog input, divide by 4 to make the range 0-255: secondSensor = analogRead(1)/4; // read switch, multiply by 255 // so that you're sending 0 or 255: thirdSensor = 255 * digitalRead(2); // send sensor values: Serial.print(firstSensor, BYTE); Serial.print(secondSensor, BYTE); Serial.print(thirdSensor, BYTE); } }
Here’s the PicBasic Pro version:
' call and response serial example for picBasic Pro. ' By Tom Igoe, 2003 ' This example waits for a byte on the incoming serial connection, ' and checks to see that the byte equals 65. ' It then sends the values of three sensors on pins RA0 - RA2. ' this example uses two arrays to hold the ADC values, ' and the byte values that they're converted to for sending. ' serial RX is on pin RC7 ' serial TX is on pin RC6 ' Define ADCIN parameters DEFINE ADC_BITS 10 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (3=rc) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS ' constant to set the baud rate: inv9600 con 16468 ' define variables: adcVar var word(3) byteVar var byte(3) channel var byte inByte var byte TRISA = %11111111 ' Set PORTA to all input ADCON1 = %10000010 ' Set PORTA analog and right justify result main: ' read sensors, convert to bytes: for channel = 0 to 2 adcin channel, adcVar(channel) byteVar(channel) = adcVar(channel) / 4 next ' read serial data in: serin2 portc.7, inv9600, [inByte] ' if you got the message from director, send out data: if inByte = 65 then serout2 portc.6, inv9600, [byteVar(0), byteVar(1), byteVar(2)] endif goto main
And here’s the BX-24 version:
' call and response serial example for BX-24. ' by Tom Igoe, 2000 ' This example waits for a byte on the incoming serial connection, ' and checks to see that the byte equals 65. ' It then sends the values of three sensors on pins 13, 14, and 15. ' serial RX is on pin 12 ' serial TX is on pin 11 dim adc1Var as byte dim adc2Var as byte dim adc3Var as byte dim inByte as byte dim gotaByte as boolean dim inputBuffer(1 To 13) As Byte dim outputBuffer(1 To 10) As Byte sub main () ' set up serial port: call defineCom3(12,11,bx1000_1000) call openQueue(inputBuffer, 13) call openQueue(outputBuffer, 10) call openCom(3,9600,inputBuffer, outputBuffer) do ' read sensors: adc1Var = cByte(getADC(13)4) adc2Var = cByte(getADC(14)4) adc3Var = cByte(getADC(15)4) ' read serial data in: if statusQueue(inputBuffer) = true then call getQueue(inputBuffer, inByte, 1) ' if you got the message from director, send out data: if inByte = 65 then call putQueue(OutputBuffer, adc1Var, 1) call putQueue(OutputBuffer, adc2Var, 1) call putQueue(OutputBuffer, adc3Var, 1) end if end if loop end sub