el HC-06 Se cuelga

buenas les comento el problema que me ha surgido hoy, estoy “programando un sistema domotico integral”
lo que quiere decir que es capoaz de encender luces y controlar los aparatos por IR y todo con una central Tablet chuwi 8 con windows 10 32bit.
lo que me sucede es que luego del tercer comando aceptado por la central y enviado al arduino via bluetooth, ya no puede volver a completar la misma operacion, osea no logra abrir en mi caso el COM 6.
que es el puerto que utiliza mi central para enviar los datos al arduino, el programa no se cuelga ni nada, de hecho el HC-06 se mantiene normal parpadeando a la espera de cliente e instruccion, pero ni con el movil logro conectar depues de que sucede eso,
desconecto el HC-06 de la alimentacion lo conecto nuevamente y todo anda de maravillas por 3 comandos y luego lo mismo.
una pequeña ayuda me seria genial.
adjunto el caotico codigo que he desarrollado.

#include <SoftwareSerial.h>
#include <avr/wdt.h>
#include <IRremote.h>
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
IRsend irsend;

SoftwareSerial blue(0, 1);   //Crea conexion al bluetooth - PIN 0 a TX y PIN 1 a RX

char NOMBRE[21]  = "DOMO1"; // Nombre de 20 caracteres maximo
char BPS         = '4';     // 1=1200 , 2=2400, 3=4800, 4=9600, 5=19200, 6=38400, 7=57600, 8=115200
char PASS[5]    = "1234";   // PIN O CLAVE de 4 caracteres numericos
int estado = 0;
int retardo = 100;
int temp = 0;
int hum = 0;

void setup()
{
  wdt_disable();    // No te olvides
     wdt_enable(WDTO_4S);
  pinMode(A0, INPUT);
  pinMode(13, OUTPUT);
  pinMode(13, HIGH);
  pinMode(12, OUTPUT);
  pinMode(12, HIGH);
  pinMode(11, OUTPUT);
  pinMode(11, HIGH);
  pinMode(10, OUTPUT);
  pinMode(10, HIGH);
  pinMode(9, OUTPUT);
  pinMode(9, HIGH);
  pinMode(8, OUTPUT);
  pinMode(8, HIGH);
  pinMode(7, OUTPUT);
  pinMode(7, HIGH);
  pinMode(6, OUTPUT);
  pinMode(6, HIGH);
  pinMode(5, OUTPUT);
  pinMode(5, HIGH);
  pinMode(4, OUTPUT);
  pinMode(4, HIGH);
  pinMode(3, OUTPUT);
  pinMode(3, HIGH);

  blue.begin(9600); // inicialmente la comunicacion serial a 9600 Baudios (velocidad de fabrica)

  blue.print("AT");  // Inicializa comando AT


  blue.print("AT+NAME"); // Configura el nuevo nombre
  blue.print(NOMBRE);
  // espera 1 segundo

  blue.print("AT+BAUD");  // Configura la nueva velocidad
  blue.print(BPS);

  blue.print("AT+PIN");   // Configura el nuevo PIN
  blue.print(PASS);
dht.begin();

}

void loop()
{
  if (blue.available() > 0) {       // Si el puerto serie esta habilitadp
    estado = blue.read();      // Lee lo que llega por el puerto Serie
  }

  if (estado == 'a') {                 // on/off de los pin 13 al pin 6
    digitalWrite(13, HIGH);
     delay(1000);
    estado = 'b';
  }
  if (estado == 'b' ) {
    digitalWrite(13, LOW);
  }
  if (estado == 'c') {

    digitalWrite(12, LOW);
    delay(1000);
    estado = 'd';
  }
  
  if (estado == 'd' ) {
    digitalWrite(12, HIGH);
  }
  if (estado == 'e') {
    digitalWrite(11, LOW);
  }
  if (estado == 'f' ) {
    digitalWrite(11, HIGH);
  }
  if (estado == 'g' ) {
    digitalWrite(10, LOW);
  }
  if (estado == 'h' ) {
    digitalWrite(10, HIGH);
  }
  if (estado == 'i' ) {
    digitalWrite(9, LOW);
  }
  if (estado == 'j' ) {
    digitalWrite(9, HIGH);
  }
  if (estado == 'k' ) {
    digitalWrite(8, LOW);
  }
  if (estado == 'l' ) {
    digitalWrite(8, HIGH);
  }
  if (estado == 'm' ) {
    digitalWrite(7, LOW);
  }
  if (estado == 'n' ) {
    digitalWrite(7, HIGH);
  }
  if (estado == 'o' ) {
    digitalWrite(6, LOW);
  }
  if (estado == 'p' ) {
    digitalWrite(6, HIGH);
  }
  if (estado == 'r' ) {
    digitalWrite(5, LOW);
  }
  if (estado == 's' ) {
    digitalWrite(5, HIGH);
  }
  if (estado == 't' ) {
    digitalWrite(4, LOW);
  }
  if (estado == 'u' ) {
    digitalWrite(4, HIGH);
  }
  if(estado == 'v')
  {
    irsend.sendNEC(0x20DF10EF, 32); //envia una señal encender tv
    Serial.println("Enviado"); // imprime por serial que fue enviado
    delay(1000); //espera 1000 milisegundos
    irsend.sendNEC(0x10110EF, 32);
  estado = 0;
  }
  if(estado == 'w')
  {
    irsend.sendNEC(0x101906F, 32); //envia una señal canal mas
      estado = 0;
      }
  if(estado == 'x')
  {
    irsend.sendNEC(0x10150AF, 32); //envia una señal canal menos
    estado = 0;
    }
  if(estado == 'y')
  {
    irsend.sendNEC(0x101926D, 32); //envia una señal volumen mas
    delay(100);
    irsend.sendNEC(0x101926D, 32);
    delay(100);
    irsend.sendNEC(0x101926D, 32);
    estado = 0;
    }
       if(estado == 'z')
  {
    irsend.sendNEC(0x10112ED, 32); //envia una señal volumen menos
    delay(100);
    irsend.sendNEC(0x10112ED, 32);
    delay(100);
    irsend.sendNEC(0x10112ED, 32);
    estado = 0;
    }
      
  if (estado == 'q') {     // envia el valor leido del sensor de temperatura
    temp = dht.readTemperature();
    hum = dht.readHumidity();
    blue.print("Temperatura:");
    blue.print(temp);
    blue.println(" C");
    blue.print("Humedad:");
    blue.print(hum);
    blue.println(" %");
    delay (retardo);
    estado = 0;
  }
  delay(retardo);
  wdt_reset();
  
}

Revisaste si por algún motivo llegues a la condición de watch dog? La has fijado a 4 seg.

Quiero comprender algo. La central (tablet) envia tres comandos al arduino a través de una señal bluetooth y al 4 comando la tablet pierde comunicación con el HC-06.

Aparte. Por cada que se inicia arduino o se reinicia ¿Es necesario re-configurar el bluetooth con los mismos parametros?

Asumiendo que WatchDog este molestando reseteando arduino ¿Tambien se resetea la fuente de corriente de arduino?

A mi se me resetea el arduino por mala programación pero el bluetooth sigue funcionando y ademas sigue apareado al celular.

osea no logra abrir en mi caso el COM 6.

Lo que quiero comprender es. ¿Cómo puede estar el error en el código o el WatchDog? Si la interrupción se da en la comunicación entre tablet y HC-06. Amenos que arduino este mandando siempre los comandos AT porque se reinicia con frecuencia lo cual no tiene lógica si arduino no guarda lo ultimo que hizo y debería después del reseteo seguir su loop como si nada. Para probar el HC-06 no lo conectes al serial de arduino y envía tres comandos (tres letras segun veo el programa) y si no recibe a la cuarta y aun sucede eso (Creo que el HC-06 esta mal). Buena suerte con el proyecto.

Yo no dije que el problema estuviera en el watchdog pero si sugerí que es posible que en el 3er comando se de alguna situación que haga que el watchdog se reinicie. Puedo estar equivocado y eso no provocar que el HC-06 se cuelgue. Solo es una sugerencia.

Tampoco digo que el perrito tenga la culpa pero como se expuso ese tema también lo abordo para tener un conjunto mas amplio para sacar las posibles soluciones.

La verdad es que no creo que sea culpa del perrito, pero ni se que pueda ocurrir, es muy similar a cuando el hc-06 tiene ya un cliente, a pesar de que esta parpadeando a la espera por conexión. La problemática se suscita cuando por ejemplo le envío el carácter c luego por ejemplo, el orden no cambia nada, que encienda la tv luego la cambie pero ya al cuarto "comando" ya se cuelga y no recibe nada, ni de la "tablet" ni de los celulares. Lo único que lo descuelga es quitar el vcc del modulo y volverlo a conectar y todo bien, esto sin resetear el arduino. Saludos y agradezco en demasía su ayuda

Les comento, luego de mucho darle vueltas, he realizado una aplicación para Android cuenta envía todos los comandos actuales, y para mi sorpresa el hc-06 no se cuelga nunca. Como puedo solucionar este dilema, necesito que mi central hable con el hc-06 y no lo cuelgue. Alguna idea? Saludos gente

Prueba con algo simple.

El HC-06 conectalo a arduino y el programa tiene que ser que te envié por el monitor serial todo o que le llega al HC-06.

#include <SoftwareSerial.h>// BLUETOOTH
SoftwareSerial BT1(8, 7); // RX | TX En arduino
int a;
void setup() {
  Serial.begin(9600);
  BT1.begin(9600);
}

void loop() {
  if(BT1.available()>0){
    a = BT1.read();
    Serial.print("Resive :");
    Serial.print(a);
    Serial.println();
  }
}

Ahora.
¿Para que guardo lo que lee BT1.read() en una variable tipo int?

Para que en el puerto serial te aparezca todo lo que le llegue desde la Central, ya que puede enviarte carácter nulo, salto de linea, retorno de carro o esos caracteres no irreprimibles que no se visualizan en el monitor serial,y así sepas en el momento justo que se cuelgue el HC-06 que fue lo que recibió para quedar loko.

Creo que eso servirá.
Suerte.

Gracias probaré y te cuento como me fue. muchas gracias por tu respuesta.