Modo de ahorro de energía Bluetooth para ArduinoBT

Estoy tratando de hacer que mi ArduinoBT sea un poco más amigable con la energía, lo tengo funcionando en una red de sensores y consume energía constantemente. Quiero poder apagar o poner el módulo Bluetooth en modo de suspensión durante el tiempo que no esté en uso.
He intentado

Serial.println("SET CONTROL CONFIG 103d");

En mi método de configuración, que debería poner el módulo en modo de suspensión profunda, pero no parece hacer nada en términos de consumo de energía (todavía consume alrededor de 30 mA).
¿No estoy esperando lo suficiente para que haga efecto? ¿La versión WT11 iWRAP no admite el modo de suspensión profunda? ¿Lo estoy poniendo en el lugar equivocado en mi código? ¿Estoy haciendo otra cosa increíblemente tonta que impide que funcione?

Respuestas (2)

El código que estoy ejecutando en este momento es solo

setup()
{
    Serial.println("SET CONTROL CONFIG 103d");
}

loop()
{
    Serial.println("SLEEP");
}

pero también probé el comando SLEEP en la configuración y puse este código en el cargador de arranque ArduinoBT. Dejé el Arduino con la suspensión habilitada funcionando durante varias horas y no hizo ninguna diferencia en el consumo, además, "SET CONTROL CONFIG 102d" no hace ningún cambio. ¿Quizás estoy emitiendo los comandos en modo de datos? Entiendo que el modo de datos es cuando hay una conexión Bluetooth y el comando es cuando no hay conexión, pero podría estar equivocado.

Siento haber tardado tanto en tener mis exámenes y vacaciones.

Mi código eventualmente evolucionó para ser algo como esto:

int input = 0;    
int resetPin = 7;
int ledPin = 13;

void setup()
{
  pinMode(resetPin, OUTPUT);
  Serial.begin(115200);
  Serial.println("SET CONTROL ESCAPE 43 00 0");
  Serial.println("SET CONTROL CONFIG 103D");
  digitalWrite(ledPin, HIGH);
}

void loop()
{
  if (!input)
  {
    delay(2000);
    Serial.print("+++");
    delay(2000);
    Serial.println("TEST DEEPSLEEP");
    delay(10000);
    Serial.print("+++");
    delay(2000);
    input = 1;
    digitalWrite(ledPin, LOW);
  }

Que no funciona (¡YAY!)

Luego encontré un código aquí que tenía una comunicación iWRAP exitosa, lo modifiqué para incluir el iWRAP que quería, comencé con "INFO" y descubrí que la versión de iWRAP (WRAP THOR AI 2.2.0 build 60) obtuvo la hoja de datos correcta y encontré que el sueño profundo era una característica del módulo y podía probarlo usando el comando "PRUEBA DE SUEÑO PROFUNDO". ¡Usé ese comando y el tablero se durmió! Creo que... la corriente se situó en alrededor de 36 mA, que es más alta que el uso normal sin conexión, pero la placa no se podía comunicar. La prueba arrojó un OK, así que confío en que ahora puedo hacer que la placa duerma. Desafortunadamente, emitir el comando "SLEEP" no parece hacer nada en el cajero automático, aunque no sé si mis comandos de configuración inicial ya se están emitiendo.

Anyhoo aquí es el código (apenas) modificado que estoy usando ahora. Básicamente ejecútelo, luego ingrese "&" en el monitor serial y va al modo de comando y emite los comandos que puso en el código, ingrese "@" y le dice la respuesta a esos comandos.

#include <EEPROM.h>

int ledPin = 13;    	    // LED connected to digital pin 13
int resetPin = 7;   		// BT module uses pin 7 for reset
char inByte = 0;    	    // incoming serial byte
int  infoSize = 0 ;
void setup()    		  // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);  // sets the digital pin as output
  pinMode(resetPin, OUTPUT);  
  Serial.begin(115200);   // start serial at 115200 kbs

  Serial.println("SET CONTROL ESCAPE 43 00 0");
  Serial.println("SET CONTROL CONFIG 103D");
}

void loop()
{
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {    
    inByte = getbyte();  // get incoming byte
    if (inByte == '&' ) { // look for a &
      Serial.print("Got an &  ");
    infoSize = getInfo();
      Serial.println("Done");
    }
    else if (inByte == '@' ) { // look for a 0
    digitalWrite(ledPin, LOW); // set led LOW
        Serial.print("Get string:  ");  
    for(int i=0;i<infoSize;i++)
        {
      Serial.print(EEPROM.read(i));
        }
    Serial.println();
    Serial.print("Cleared string  size: ");
    Serial.println(infoSize);
    }     
  }
}

int getInfo()
{
  int j=0;
  digitalWrite(ledPin, HIGH); // set led HIGH
  delay(2000);  
  Serial.print("+++");
  delay(2000);


  Serial.println("SLEEP");  //THIS IS WHERE YOU ENTER THE COMMANDS
                            //"INFO" and "TEST DEEPSLEEP" are both successful
                            //"SLEEP" isn't successful yet


  for (int i=0; i <= 10; i++){
    delay(1000);
    while (Serial.available() > 0 && j <512) {    
    inByte = getbyte();  // get incoming byte    
    EEPROM.write(j, inByte);
    j++;
    }
    delay(1000);
  }  
  delay(2000);
  Serial.print("+++");
  delay(2000);
  digitalWrite(ledPin, LOW); // set led low
  return j;
}

char getbyte()
{
  while (Serial.available() == 0) { //look for aviable data
    // do nothing, wait for incoming data
  }
  return Serial.read(); //return data if aviable
}

¡Vaya edición épica! Muchas gracias por su ayuda, ha sido invaluable para mi viaje :)

Puedes editar tu publicación.
sí, excepto que lo hice de forma anónima y falló una cookie:/
Gracias por publicar el código y el enlace. Hace solo una hora conseguí que mi placa NB1 se emparejara con mi Android usando el WT12A. Estaba buscando algunos ejemplos más detallados de los comandos iWRAP y acabo de encontrar tu publicación;) ¡Genial! Presionaría la flecha hacia arriba un par de veces, pero parece que es uno para un cliente;)

La hoja de especificaciones del módulo BlueGiga proporciona una corriente de suministro promedio de 1,5 mA cuando el módulo está INACTIVO y Deep Sleep está ENCENDIDO. La página de ArduinoBT, aunque un poco ligera en detalles, implica que ArduinoBT admite cualquier modo de configuración del que sea capaz BlueGiga, y la hoja de especificaciones en el sitio de BlueGiga dice que es compatible con el modo de suspensión profunda, así que eso está fuera. Dudo que Arduino esté consumiendo 28,5 mA cuando está inactivo, por lo que, a menos que tenga algo más en el circuito, probablemente esté en algún lugar del código. ¿Podría publicar su código y esquema para una revisión adicional?

---EDITAR---

Miré un poco más en el documento de iWire que vinculé en el comentario a continuación. Su comprensión parece correcta, pero hay una anulación para forzar el modo de comando: emita el carácter de escape tres veces (consulte la página 15). ¿Has intentado emitir tres caracteres de escape? También dice en la página 15 que

Cuando iWRAP ingresa al modo de comando, ocurre el evento READY (a menos que esté enmascarado con el comando "SET CONTROL ECHO").

¿Está escuchando eventos READY? En la página 23, por ejemplo, parece que READY se emite a través del puerto serie y podría escucharlo fácilmente.

También le preguntaré si ha revisado su configuración y código de conexión. Por ejemplo, las comunicaciones en serie con el módulo BT deben ser de 115200 bps ( http://www.arduino.cc/en/Guide/ArduinoBT ). No vi esa línea en su código de configuración, pero podría intentar agregar

Serial.begin(115200)

antes de la instrucción println en su método setup(). Dijiste que publicaste todo el código, así que esto es probablemente lo primero que intentaría. Si no establece la velocidad en baudios correctamente, solo está enviando basura. ¡Que nos mantengais!

Finalmente obtuve un enlace que no requería suscripción a la documentación de iWrap. ¿Has probado el comando SLEEP? (s5.42, rfsolutions.co.uk/acatalog/WT11-iWRAP_UserGuide.pdf )