/*
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