Hi all
I am using the following code to control via OSC some DMX controllers. I also use the Ethernet shield and it works until I use the following code.
So in the code I want to send a number that defines the Mode (manual, automatic/mood color, all close, all open). It is possible to choose mode 0 (all close), then mode 1 (manual color from my Processing interface), however when I go to mode 2, everything gets messed up. I can't choose any other mode, and everything sort of stuck!!!! It seems like the RGB[3] array does not reset to 0 and keeps counting on. How can I stop it?
Am I doing something wrong? I believe the problem is somewhere in the loop() function.
Please have a look (I have sort of included just the basic stuff). Cheers!
(Using Arduino 0.22 IDE, Z_OSC library, and DMXSimple)
#include <SPI.h>
#include <Ethernet.h> // version IDE 0022
#include <Z_OSC.h>
#include <DmxSimple.h>
#define RED_CH_1 1
#define GRN_CH_1 2
#define BLU_CH_1 3
#define ALPHA_CH_1 4
#define RED_CH_2 5
#define GRN_CH_2 6
#define BLU_CH_2 7
#define ALPHA_CH_2 8
#define RED_CH_3 9
#define GRN_CH_3 10
#define BLU_CH_3 11
#define ALPHA_CH_3 12
float RGB[3];
int DMX_dir = 2;
int LED2 = 8;
int LED3 = 7;
int mode, finalRed1, finalGreen1, finalBlue1, red1, green1, blue1, red2, green2, blue2,
red3, green3, blue3, redMood1, greenMood1, blueMood1, redMood2, greenMood2, blueMood2,
redMood3, greenMood3, blueMood3, alpha1, alpha2, alpha3 = 0;
byte myMac[] = {
0x90, 0xA2, 0xDA, 0x00, 0x54, 0x94 };
byte myIp[] = {
141,163,187,151 };
int serverPort = 10000;
Z_OSCServer server;
Z_OSCMessage *rcvMes;
void setup(){
Serial.begin(19200);
Ethernet.begin(myMac ,myIp);
server.sockOpen(serverPort);
pinMode(DMX_dir, OUTPUT);
pinMode(LED2, OUTPUT);
digitalWrite(DMX_dir, LOW); // Set direction pin of trasnsceiver to Tx.
DmxSimple.usePin(2);
for (int i=0; i<3;i++){
RGB[i] = 0;
}
}
void loop(){
if(server.available()){
rcvMes=server.getMessage();
logMessage();
}
switch (mode){
case 0:
RGB[0] = 0;
RGB[1] = 0;
RGB[2] = 0;
finalRed1 = 0;
finalGreen1 = 0;
finalBlue1 = 0;
break;
case 1:
RGB[0] = 0;
RGB[1] = 0;
RGB[2] = 0;
finalRed1 = red1;
finalGreen1 = green1;
finalBlue1 = blue1;
break;
case 2:
for (float x=0;x<PI;x=x+0.00001){
RGB[0] = 255*abs(sin(x*(180/PI))); // calculate the brightness for the red led
RGB[1] = 255*abs(sin((x+PI/3)*(180/PI))); // calculate the brightness for the green led
RGB[2] = 255*abs(sin((x+(2*PI)/3)*(180/PI)));// calculate the brightness for the blue led
// for(int i=0;i<3;i++){
// if(RGB[i]<1){
// delay(100);
// }
// if(RGB[i]<5){
// delay(50);
// }
// if(RGB[i]<10){
// delay(10);
// }
// if(RGB[i]<100){
// delay(5);
// }
}
finalRed1 = int (RGB[0]);
finalGreen1 = int (RGB[1]);
finalBlue1 = int (RGB[2]);
//delay(1);
break;
}
digitalWrite(LED2, HIGH);
DmxSimple.write(RED_CH_1, finalRed1);
DmxSimple.write(GRN_CH_1, finalGreen1);
DmxSimple.write(BLU_CH_1, finalBlue1);
delay(5);
}
void logMessage(){
uint16_t i;
byte *ip = rcvMes->getIpAddress();
long int intValue;
float floatValue;
int rcvRed1, rcvGreen1, rcvBlue1, rcvAlpha1;
char *stringValue;
int rcvMode;
for(i=0 ; i<rcvMes->getArgsNum(); i++){
switch( rcvMes->getTypeTag(i) ){
case 'i':
intValue = rcvMes->getInteger32(i);
String modemsg = "/mode/";
String red1msg = "/red1/";
String green1msg = "/green1/";
String blue1msg = "/blue1/";
if (modemsg==rcvMes->getZ_OSCAddress()){
rcvMode = rcvMes->getInteger32(0);
Serial.print("Mode: ");
Serial.println(rcvMode);
mode = rcvMode;
}
if (red1msg==rcvMes->getZ_OSCAddress()){
rcvRed1 = rcvMes->getInteger32(0);
Serial.print("red1: ");
Serial.println(rcvRed1);
red1 = rcvRed1;
}
if (green1msg==rcvMes->getZ_OSCAddress()){
rcvGreen1 = rcvMes->getInteger32(0);
Serial.print("green1: ");
Serial.println(rcvGreen1);
green1 = rcvGreen1;
}
if (blue1msg==rcvMes->getZ_OSCAddress()){
rcvBlue1 = rcvMes->getInteger32(0);
Serial.print("blue1: ");
Serial.println(rcvBlue1);
blue1 = rcvBlue1;
}