I have a program working over Arduino Uno using bluetooth HC-06. The information comes in fine and the program works. It's just me playing around and testing with an RGB LED. The UNO code is here
#define MAX_ANALOGWRITE 255
int current_r = 0;
int current_g = 0;
int current_b = 0;
int current_i = 0;
void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
Serial.flush();
}
void loop()
{
int Red = -1;
int Green = 0;
int Blue = 0;
int Cycles = 0;
int Speed = 0;
int Start = 0;
int End = 0;
int Revert = 0;
// wait for incoming data
if (Serial.available() < 1) return; // if serial empty, return to loop().
// parse incoming command start flag
Red = Serial.parseInt();
if (Red == -1) return; // if no command start flag, return to loop().
Green = Serial.parseInt();
Blue = Serial.parseInt();
Cycles = Serial.parseInt();
Speed = Serial.parseInt();
Start = Serial.parseInt();
End = Serial.parseInt();
Revert = Serial.parseInt();
changeColor(Red, Green, Blue, Cycles, Speed, Start, End, Revert);
}
/**************
changeColor
**************/
void changeColor(int Red, int Green, int Blue, int Cycles, int Speed, int Start, int End, int Revert)
{
// set color
if(Cycles == 0){
setColor( Red, Green, Blue, End );
saveColor( Red, Green, Blue, End );
}
// pulse
else{
for (int j = 1; j <= Cycles; j++){
for (int i = 0; i <= 10; i++){
setColor( Red, Green, Blue, Start + ( ( End - Start ) * i / 10 ) );
delay(Speed / 20);
}
if( j != Cycles || Revert ){
for (int i = 10; i >= 0; i--){
setColor( Red, Green, Blue, Start + ( ( End - Start ) * i / 10 ) );
delay(Speed / 20);
}
}
else{
saveColor( Red, Green, Blue, End );
}
}
//
if(Revert == 1){
setColor( current_r, current_g, current_b, current_i );
}
}
}
/**************
setColor
**************/
void setColor(int Red, int Green, int Blue, int Intensity)
{
analogWrite(9, getRGB( Red, Intensity) );
analogWrite(10, getRGB( Green, Intensity) );
analogWrite(11, getRGB( Blue, Intensity) );
}
/**************
saveColor
**************/
void saveColor(int Red, int Green, int Blue, int Intensity)
{
current_r = Red;
current_g = Green;
current_b = Blue;
current_i = Intensity;
}
/**************
getRGB
**************/
int getRGB(int rgb, int intensity)
{
return MAX_ANALOGWRITE - ( (rgb * intensity) / 100 );
}
Now, I needed to have the hardware smaller, so I started using an Arduino Micro. I noticed the separation of USB and Serial; so, had to use Serial1 for the bluetooth.
Now, the Micro code:
#define MAX_ANALOGWRITE 255
int has_command = 0;
int current_r = 0;
int current_g = 0;
int current_b = 0;
int current_i = 0;
int x = 0;
void setup() {
pinMode(0, INPUT);
pinMode(1, OUTPUT);
Serial.begin(9600);
while (!Serial) ;
Serial1.begin(9600);
Serial.println("ArduDroid 0.12 Alpha by TechBitar (2013)");
Serial1.println("ArduDroid 0.12 Alpha by TechBitar (2013)");
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
changeColor(255, 0, 0, 3, 500, 0, 100, 1);
Serial.flush();
}
void loop()
{
int Red = -1;
int Green = 0;
int Blue = 0;
int Cycles = 0;
int Speed = 0;
int Start = 0;
int End = 0;
int Revert = 0;
char something[] = "hfkjhfdskjfZZ";
if( x == 0 ){
delay(3000);
Serial.write(something);
x = 1;
}
// wait for incoming data
if (Serial1.available() < 1) return; // if Serial empty, return to loop().
Serial.println(Serial1.readString());
// parse incoming command start flag
Red = Serial1.parseInt();
if (Red == -1) return; // if no command start flag, return to loop().
Green = Serial1.parseInt();
Blue = Serial1.parseInt();
Cycles = Serial1.parseInt();
Speed = Serial1.parseInt();
Start = Serial1.parseInt();
End = Serial1.parseInt();
Revert = Serial1.parseInt();
changeColor(Red, Green, Blue, Cycles, Speed, Start, End, Revert);
}
/**************
changeColor
**************/
void changeColor(int Red, int Green, int Blue, int Cycles, int Speed, int Start, int End, int Revert)
{
// set color
if(Cycles == 0){
setColor( Red, Green, Blue, End );
saveColor( Red, Green, Blue, End );
}
// pulse
else{
for (int j = 1; j <= Cycles; j++){
for (int i = 0; i <= 10; i++){
setColor( Red, Green, Blue, Start + ( ( End - Start ) * i / 10 ) );
delay(Speed / 20);
}
if( j != Cycles || Revert ){
for (int i = 10; i >= 0; i--){
setColor( Red, Green, Blue, Start + ( ( End - Start ) * i / 10 ) );
delay(Speed / 20);
}
}
else{
saveColor( Red, Green, Blue, End );
}
}
//
if(Revert == 1){
setColor( current_r, current_g, current_b, current_i );
}
}
}
/**************
setColor
**************/
void setColor(int Red, int Green, int Blue, int Intensity)
{
analogWrite(9, getRGB( Red, Intensity) );
analogWrite(10, getRGB( Green, Intensity) );
analogWrite(11, getRGB( Blue, Intensity) );
}
/**************
saveColor
**************/
void saveColor(int Red, int Green, int Blue, int Intensity)
{
current_r = Red;
current_g = Green;
current_b = Blue;
current_i = Intensity;
}
/**************
getRGB
**************/
int getRGB(int rgb, int intensity)
{
return MAX_ANALOGWRITE - ( (rgb * intensity) / 100 );
}
A sample of the code being sent in would be:
"255,0,0,3,500,0,100,1"
which would flash red 3 times, 0.5 seconds cycle, and return to previous state.
Works fine in the Uno; but in the Micro when I do a print I get something like @@@@@@
So; any ideas?