I thought I would take it step further and try to handle multiple codes. So much for that. I changed the while loop to a for loop since all codes are 3 digits.
Is it possible to convert the code to a BYTE and insert it into the message char array so that it is sent inline? So that it is all sent at once and not to prints to serial?
EDIT: I figured it out, now I can read codes and insert then into the message array as a int, therefore having multiples codes and they are inline when it speaks back.
Here is the fine code
/*
Testing Sketch for Robot
*/
//Soft serial library used to send serial commands on pin 2 instead of regular serial pin.
#include <NewSoftSerial.h>
//Define the Pin Numbers of the Voicebox shield for the sketch.
#define E0 5
#define E1 6
#define E2 7
#define E3 8
#define E4 9
#define E5 10
#define E6 11
#define E7 12
#define RDY 13
#define RES 3
#define SPK 4
//Pin 2 of the shield should be wired to the TTS256 chip.
#define txPin 2
//Create a SoftSerial Object to send strings to the TTS256 chip.
NewSoftSerial speakjet(0, txPin);
//Create a message buffer to hold the ascii message to be converted to sound
char message[128]="";
char message2[128]="";
void setup()
{
//Configure the pins for the SpeakJet module
pinMode(txPin, OUTPUT);
pinMode(SPK, INPUT);
//Set up a serial port to talk from Arduino to the SpeakJet module on pin 3.
speakjet.begin(9600);
//Set up a serial port to get the ascii message from the host
Serial.begin(9600);
//Configure the Ready pin as an input
pinMode(RDY, INPUT);
//Configure Reset line as an output
pinMode(RES, OUTPUT);
//Configure all of the Event pins as outputs from Arduino, and set them Low.
for(int i=E0; i<=E7; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
//All I/O pins are configured. Reset the SpeakJet module
digitalWrite(RES, LOW);
delay(100);
digitalWrite(RES, HIGH);
delay(1000);
char sounds[] = {200, 201, 202, 203, 220, 221, 222};
speakjet.println(sounds);
}
void loop()
{
//Get a message from the serial port
getMessage(message, message2);
//Send the message to the TTS256
speakjet.println(message);
Serial.println(message2);
print(message2);
print(" ");
//Wait 12ms before checking the ready line (specified in TTS256 datasheet)
delay(12);
//Wait for the Speakjet to become 'ready' before sending more text.
while(digitalRead(RDY)==0);
}
//Function: getMessage(char *)
//Description: Retrieves a string from the Serial port. Doesn't return the string until a carriage return character is detected.
//Inputs: None
//Outputs: char * message - The message received on the serial port.
//Returns: Nothing
//usage: getMessage(english_sentance);
void getMessage(char * message, char * message2)
{
char cmd[4]="";
char in_char=0; //Create a character to store the incoming byte from the serial port.
//Wait for a character to come into the serial port
while(Serial.available() <=0);
//Copy the incoming character to our variable.
in_char=Serial.read();
//Keep retreiving characters until the 'end of sentance(0x0D)' character is received.
while(in_char != 0x0D){
if (in_char == 0x5C)
{
for(int i = 0; i <= 2; i++){
while(Serial.available() <=0); //Now wait for the next character...
in_char = Serial.read();
cmd[i]=in_char;
}
int code = atoi(cmd);
Serial.println(code);
*message++=code;
while(Serial.available() <=0);
in_char = Serial.read();
}
else {
*message++=in_char; //Every time we receive a character we should add the character to the message string.
*message2++=in_char;
while(Serial.available() <=0); //Now wait for the next character...
in_char = Serial.read(); //and copy it to the variable again.
}
}
*message='\0'; //Strings must end with a Null terminator so we need to add this to our message.
*message2='\0';
return;
}
The 2nd message array is so I can display the text to the serial and lcd without the codes.