Prezado, sou novo nesse assunto de arduino, mas vi seu código pois eu precisa de algo parecido e consegui resolver o problema. Se você colocar um delay (uns 500 ms) logo após o comando OSC você perceberá que ele está funcionando mas o seu comando html sempre manda um nível zero ou 1 para a porta a cada loop, por isso mesmo você ativando pelo OSC o que predomina é o html. Eu fiz um flag indicando que já foi pressionado e para não pressionar mais e deu certo. Não esqueça de limpar o flag no comando osc também.
Abraço,
Josemar
Obs.: Segue o código funcionando no arduino uno:
#include <SPI.h>
#include <Ethernet.h>
#include <ArdOSC.h>
// ethernet configuration
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEA, 0xFF };
byte ip[] = { 192, 168, 1, 99 }; // ip do arduino na rede--------------------------------
EthernetServer server(80);
//OSC configuration
byte destIP[] = {192,168,1,255}; // ip do controlador osc---------------------
int serverPort = 8000;
int destPort = 9000;
OSCServer oserver;
OSCClient oclient;
//pins defines
byte LED1 = 6;
byte LED2 = 7;
byte BOT1 = 8;
byte BOT2 = 9;
int old1 = 0;
int old2 = 0;
// Variaveis
boolean botstate1 = 0;
boolean botstate2 = 0;
char c = 0;
char command[6] = "\0";
void setup(){
Ethernet.begin(mac, ip);
server.begin();
oserver.begin(serverPort);
oserver.addCallback("/ard/rele01", &func1);
oserver.addCallback("/ard/rele02", &func2);
//setup dos pinos
pinMode(LED1, OUTPUT);
pinMode(BOT1, INPUT);
digitalWrite(BOT1,HIGH);
pinMode(LED2, OUTPUT);
pinMode(BOT2, INPUT);
digitalWrite(BOT2,HIGH);
}
void loop(){
if(oserver.aviableCheck()>0){}
if(digitalRead(BOT1)==LOW){
botstate1 = !botstate1;
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele01");
txMes.addArgFloat(botstate1);
oclient.send(&txMes);
digitalWrite(LED1,botstate1);
delay(200);
}
if(digitalRead(BOT2)==LOW){
botstate2 = !botstate2;
digitalWrite(LED2,botstate2);
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele01");
txMes.addArgFloat(botstate2);
oclient.send(&txMes);
delay(200);
}
EthernetClient client = server.available();
// detect if current is the first line
boolean current_line_is_first = true;
if (client) {
// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if we've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (c == '\n' && current_line_is_blank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
// auto reload webpage every 5 second
//client.println("<META HTTP-EQUIV=REFRESH CONTENT=5 URL=>");
// webpage title
client.println("<center><p><h1>Arduino + Ethernet Shield Application v1.0</h1></p><center><hr><br />");
// read analog pin 1 for the value of photocell
// button led1 functions
client.println("<center><p><h2>Led 1</h1></p><center><br />");
client.println("<form method=get name=form>");
client.println("<button name=b value=1 type=submit style=height:80px;width:150px>LED On</button>");
client.println("<button name=b value=2 type=submit style=height:80px;width:150px>LED Off</button>");
client.println("</form><hr><br />");
// button led2 functions
client.println("<center><p><h2>Led 2</h1></p><center><br />");
client.println("<form method=get name=form>");
client.println("<button name=b value=3 type=submit style=height:80px;width:150px>LED On</button>");
client.println("<button name=b value=4 type=submit style=height:80px;width:150px>LED Off</button>");
client.println("</form><br />");
// button todas as leds functions
client.println("<center><p><h2>Todas leds</h1></p><center><br />");
client.println("<form method=get name=form>");
client.println("<button name=b value=5 type=submit style=height:80px;width:150px>LED On</button>");
client.println("<button name=b value=6 type=submit style=height:80px;width:150px>LED Off</button>");
client.println("</form><br />");
// webpage footer
break;
}
if (c == '\n') {
// we're starting a new line
current_line_is_first = false;
current_line_is_blank = true;
}
else if (c != '\r') {
// we've gotten a character on the current line
current_line_is_blank = false;
}
// get the first http request
if (current_line_is_first && c == '=') {
for (int i = 0; i < 1; i++) {
c = client.read();
command = c;
}
// LED1 web control
if (!strcmp(command , "1") && old1 == 0) {
botstate1 = 1;
old1 = 1;
digitalWrite(LED1,botstate1);
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele01");
txMes.addArgFloat(botstate1);
oclient.send(&txMes);
digitalWrite(LED1,botstate1);
delay(200);
}
else if (!strcmp(command, "2") && old1 == 1 ) {
botstate1 = 0;
old1 = 0;
digitalWrite(LED1,botstate1);
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele01");
txMes.addArgFloat(botstate1);
oclient.send(&txMes);
digitalWrite(LED1,botstate1);
delay(200);
}
// LED2 web control
if (!strcmp(command , "3") && old2 == 0) {
botstate2 = 1;
old2 =1 ;
digitalWrite(LED2,botstate2);
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele02");
txMes.addArgFloat(botstate2);
oclient.send(&txMes);
delay(200);
}
else if (!strcmp(command, "4") && old2 == 1 ) {
botstate2 = 0;
old2 = 0;
digitalWrite(LED2,botstate2);
OSCMessage txMes;
txMes.setAddress(destIP,destPort);
txMes.beginMessage("/ard/rele02");
txMes.addArgFloat(botstate2);
oclient.send(&txMes);
digitalWrite(LED2,botstate2);
delay(200);
}
// todas LED web control
if (!strcmp(command , "5")) {
botstate1 = 1;
botstate2 = 1; //aqui eu desativei, mas basta seguir a mesma lógiga
// digitalWrite(LED1,botstate1);
// digitalWrite(LED2,botstate2);
}
else if (!strcmp(command, "6") ) {
botstate1 = 0;
botstate2 = 0; //aqui eu desativei, mas basta seguir a mesma lógiga
//digitalWrite(LED1,botstate1);
//digitalWrite(LED2,botstate2);
}
}
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}
// digitalWrite(LED1,botstate1);
// digitalWrite(LED2,botstate2);
}
void func1(OSCMessage *_mes){
int value = (int)_mes->getArgFloat(0);
if (value == 1){
digitalWrite(LED1, HIGH);
delay(500);
}
else
digitalWrite(LED1, LOW);
OSCMessage txMes1; //cria uma nova menssagem OSC
txMes1.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes1.beginMessage("/ard/rele01"); //define comando OSC
txMes1.addArgInt32(value); //define no estado do led 2 que será enviado no argumento OSC para ANDROID
oclient.send(&txMes1); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
//valor=value; //armazena o valor em variável global
}
void func2(OSCMessage *_mes){
int value = (int)_mes->getArgFloat(0);
if (value == 1){
digitalWrite(LED2, HIGH);
delay(500);
old2 = 1;
}
else{
digitalWrite(LED2, LOW);
old2 = 0;
}
delay(500);
OSCMessage txMes1; //cria uma nova menssagem OSC
txMes1.setAddress(_mes->getIpAddress(),destPort); //define o endereço e porta do destino da mensagem OSC
txMes1.beginMessage("/ard/rele02"); //define comando OSC
txMes1.addArgInt32(value); //define no estado do led 2 que será enviado no argumento OSC para ANDROID
oclient.send(&txMes1); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
// valor=value; //armazena o valor em variável global
}