Modo de ahorro de energía de Bluetooth para ArduinoBT

7

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 está constantemente consumiendo energía. Quiero poder apagar o poner el módulo Bluetooth en modo de suspensión durante períodos prolongados cuando no esté en uso.
Lo he intentado

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

En mi método de configuración, 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 el tiempo suficiente para que comience? ¿La versión WT11 iWRAP no admite el sueño profundo? ¿Lo estoy poniendo en el lugar equivocado en mi código? ¿Estoy haciendo otra cosa increíblemente atrevida que impide que funcione?

    
pregunta stevenvh

2 respuestas

5

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

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

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

pero también he intentado el comando SLEEP en la configuración y poner este código en el cargador de arranque ArduinoBT. Dejé el Arduino con el modo de suspensión activado durante varias horas y no hizo ninguna diferencia en el consumo, además, "CONFIGURAR CONFIGURACIÓN DE CONTROL 102d" no hace ningún cambio. Tal vez 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 una conexión pero puedo estar equivocado.

Lo siento, he tardado tanto en mis exámenes y días festivos.

Mi código finalmente 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);
  }

Lo que no funciona (¡YAY!)

Luego encontré un código aquí que tuvo una comunicación iWRAP exitosa , Lo modifiqué para incluir el iWRAP que quería, comencé con "INFO" y descubrí la versión de iWRAP (WRAP THOR AI 2.2.0 build 60) obtuve la hoja de datos correcta que encontró que Deepsleep era una característica del módulo y que podía probar. utilizando el comando "TEST DEEPSLEEP". ¡Utilicé ese comando y la tabla durmió! Creo que ... la corriente se situó en alrededor de 36 mA, que es más alta que el uso no conectado normal, pero la placa era incomunicable. La prueba obtuvo un OK, así que estoy seguro de que puedo hacer que el tablero duerma ahora. Desafortunadamente, emitir el comando "SLEEP" no parece hacer nada en la atmósfera, aunque no sé si mis comandos de configuración iniciales se están emitiendo todavía.

Anyhoo aquí es el código (apenas) modificado que estoy usando ahora. Básicamente ejecútalo y luego ingresa "&" en el monitor de serie y pasa al modo de comando y emite los comandos que ingresa en el código, ingrese "@" y le informa 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
}

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

    
respondido por el Jess
1

La hoja de especificaciones para el módulo BlueGiga proporciona una corriente de suministro promedio de 1.5 mA cuando el módulo es IDLE y Deep Sleep está ENCENDIDO. La página de ArduinoBT, aunque un poco más clara en los detalles, implica que ArduinoBT admite todos los modos de configuración de los que es capaz BlueGiga, y la hoja de especificaciones en el sitio de BlueGiga dice que es capaz del modo de Suspensión Profunda, por lo que está fuera Dudo que Arduino esté consumiendo 28.5 mA cuando está inactivo, así que a menos que tenga algo más en el circuito, es probable que esté en algún lugar del código. ¿Publicaría su código y esquema para una revisión adicional?

--- EDIT --- ---

Observé un poco más el documento 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 (vea la página 15). ¿Has intentado emitir tres personajes de escape? También dice en la página 15 que

  

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

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

También le preguntaré si ha revisado su configuración y el código de conexión. Por ejemplo, las comunicaciones en serie con el módulo BT deben estar a 115200 bps ( enlace ). No vi esa línea en tu código de configuración, pero podrías intentar agregar

Serial.begin(115200)

antes de la sentencia println en su método setup (). Dijiste que habías publicado todo el código, así que esta es probablemente la primera cosa que intentaría. Si no configura correctamente la velocidad en baudios, solo está enviando basura. ¡Manténganos informados!

    
respondido por el Lou

Lea otras preguntas en las etiquetas