El indicador LED múltiple de Arduino Uno R3 + Android puede encenderse pero no se apaga

0

Soy nuevo aquí y tengo una pregunta ... Espero que me puedas ayudar, cualquier respuesta es más que bienvenida ... así que estoy usando una aplicación de Android con interruptores para encender y apagar 5 LED. . Logré encender cuatro de ellos, pero ninguno de ellos no se apagará cuando vuelva a presionar el interruptor en mi aplicación ... creo que algo está mal con mi dibujo de arduino ... ps en mi aplicación, en el comando enviar, también puedo enviar comandos desde seekbar pero no lo estoy utilizando. Quiero decir que no lo puse en la aplicación.

This is Arduino code. 
#include <adk.h>
USB Usb;
ADK adk(&Usb, "test", // Manufacturer Name
              "test", // Model Name
              "Example sketch for the USB Host Shield", 
              "1.0", // Version
               "http://www.tkjelectronics.dk/uploads/ArduinoBlinkLED.apk", 
               "0000000012345678"); // Serial Number (optional)
const int LED1 =  9;
const int LED2 =  4;
const int LED3 =  7;
const int LED4 =  8;
const int LED5 =  3;
uint32_t timer;
boolean connected;
void setup() {

   Serial.begin(115200);
   while (!Serial); 
   if (Usb.Init() == -1) {
      Serial.print("\r\nOSCOKIRQ failed to assert");
      while (1); // halt
   }
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
Serial.print("\r\nArduino Blink LED Started");
}

void loop() {
Usb.Task();

if (adk.isReady()) {
  if (!connected) {
    connected = true;
    Serial.print(F("\r\nConnected to accessory"));
}


uint8_t msg[3]={0x0};
uint16_t len = sizeof(msg);
uint8_t rcode = adk.RcvData(&len, msg);
if( rcode ) {
 USBTRACE2("Data rcv. :", rcode );}
if (len > 0) {    
   USBTRACE("\r\nData Packet.");
   // assumes only one command per packet  
   if (msg[1] == 0x2)
       digitalWrite(LED1, msg[0]==0x1 ? HIGH : LOW);
   else if (msg[1] == 0x3)
   digitalWrite(LED2, msg[0]==0x1 ? HIGH : LOW);
   else if (msg[1] == 0x4)
   digitalWrite(LED3, msg[0]==0x1 ? HIGH : LOW);
   else if (msg[1] == 0x5)
   digitalWrite(LED4, msg[0]==0x1 ? HIGH : LOW);
    else if (msg[1] == 0x6)
   digitalWrite(LED5, msg[0]==0x1 ? HIGH : LOW);
}

msg[0] = 0x1;   


if (millis() - timer >= 1000) { // Send data every 1s
  timer = millis();
  rcode = adk.SndData(sizeof(timer), (uint8_t*)&timer);
  if (rcode && rcode != hrNAK) {
    Serial.print(F("\r\nData send: "));
    Serial.print(rcode, HEX);
  } else if (rcode != hrNAK) {
    Serial.print(F("\r\nTimer: "));
    Serial.print(timer);
  }
}
} else {
    if (connected) {
    connected = false;
    Serial.print(F("\r\nDisconnected from accessory"));
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED5, LOW);
    }
 }
}

y la actividad principal de mi aplicación para Android

private final byte digitalPort = 0x1;
private final byte outputHighLow = 0x0;
private final byte outputPWM = 0x1;
private final byte low = 0x0;
private final byte high = 0x1;

private Switch switch1,switch2,switch3,switch4,switch5;

private CompoundButton.OnCheckedChangeListener highLowChangeListener = new HighLowChangeListener();

  ....... some code for usb accessory


protected void showControls() {
    setContentView(R.layout.main);

    switch1 = (Switch) findViewById(R.id.switch1);
    switch1.setTag((byte) 0x2);
    switch1.setOnCheckedChangeListener(highLowChangeListener);
    switch2 = (Switch) findViewById(R.id.switch2);
    switch2.setTag((byte) 0x3);
    switch2.setOnCheckedChangeListener(highLowChangeListener);
    switch3 = (Switch) findViewById(R.id.switch3);
    switch3.setTag((byte) 0x4);
    switch3.setOnCheckedChangeListener(highLowChangeListener);
    switch4 = (Switch) findViewById(R.id.switch4);
    switch4.setTag((byte) 0x5);
    switch4.setOnCheckedChangeListener(highLowChangeListener);
    switch5 = (Switch) findViewById(R.id.switch5);
    switch5.setTag((byte) 0x6);
    switch5.setOnCheckedChangeListener(highLowChangeListener);
}


private class HighLowChangeListener implements CompoundButton.OnCheckedChangeListener {

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
                                 boolean isChecked) {
        byte portByte = (Byte) buttonView.getTag();
        if (isChecked) {
            sendCommand(digitalPort, portByte, outputHighLow, high);
            Log.i(TAG, "message send: digital pin " + portByte + " HIGH");
        } else {
            sendCommand(digitalPort, portByte, outputHighLow, low);
            Log.i(TAG, "message send: digital pin " + portByte + " LOW");
        }
    }
}


public void sendCommand(byte portType, byte portNumber, byte mode, byte value) {
    byte[] buffer = new byte[4];
    if (value > 255)
        value = (byte)255;
    buffer[0] = portType;
    buffer[1] = portNumber;
    buffer[2] = mode;
    buffer[3] = value;
    Log.i(TAG, "byte: " + buffer[0]);
    Log.i(TAG, "byte: " + buffer[1]);
    Log.i(TAG, "byte: " + buffer[2]);
    Log.i(TAG, "byte: " + buffer[3]);
    if (mOutputStream != null && buffer[1] != -1) {
        try {
            mOutputStream.write(buffer);
            mOutputStream.flush();
        } catch (IOException e) {
            Log.e(TAG, "write failed", e);
        }
    }
}


}
    
pregunta Jakša Tomović

1 respuesta

3

No he rastreado todo tu código, pero un error inmediato que veo es este:

uint8_t msg[3]={0x0};
...
digitalWrite(LED4, msg[3]==0x1 ? HIGH : LOW);

Usted asigna una matriz de 3 bytes (segmentos 0..2) y luego hace referencia al segmento 3, que es el cuarto byte de una matriz de 3 bytes.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas