Bluetooth-Energiesparmodus für ArduinoBT

7

Ich versuche, mein ArduinoBT ein bisschen energiefreundlicher zu machen. Ich habe es in einem Sensornetzwerk und es zieht ständig Strom. Ich möchte das Bluetooth-Modul für längere Zeit ausschalten oder in den Ruhezustand versetzen können, wenn es nicht verwendet wird.
ich habe es versucht

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

In meiner Setup-Methode sollte das Modul in den Tiefschlafmodus versetzt werden, aber es scheint nichts in Bezug auf den Stromverbrauch zu tun (verbraucht immer noch etwa 30 mA).
Warte ich nicht lange genug, bis es losgeht? Unterstützt die WT11 iWRAP-Version keinen Tiefschlaf? Platziere ich es an der falschen Stelle in meinem Code? Mache ich noch etwas unglaublich Dummes, das es daran hindert zu arbeiten?

stevenvh
quelle

Antworten:

5

Der Code, den ich gerade ausführe, ist einfach

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

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

Ich habe aber auch den Befehl SLEEP im Setup ausprobiert und diesen Code in den ArduinoBT-Bootloader eingefügt. Ich habe den Arduino mehrere Stunden lang mit aktiviertem Ruhezustand belassen und es machte keinen Unterschied für den Verbrauch. Auch "SET CONTROL CONFIG 102d" ändert nichts. Vielleicht gebe ich die Befehle im Datenmodus aus? Ich verstehe, dass der Datenmodus ist, wenn eine Bluetooth-Verbindung besteht, und der Befehl, wenn keine Verbindung besteht, aber ich könnte mich irren.

Tut mir leid, dass ich so lange gebraucht habe, um meine Prüfungen und Ferien zu haben.

Mein Code hat sich schließlich so entwickelt:

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);
  }

Was nicht funktioniert (YAY!)

Ich habe dann hier einen Code gefunden, der eine erfolgreiche iWRAP-Kommunikation hatte. Ich habe ihn so geändert, dass er den gewünschten iWRAP enthält. Ich habe mit "INFO" begonnen und herausgefunden, dass die Version von iWRAP (WRAP THOR AI 2.2.0 Build 60) das richtige Datenblatt erhalten hat Deepsleep war eine Funktion des Moduls und Sie konnten es mit dem Befehl "TEST DEEPSLEEP" testen. Ich habe diesen Befehl benutzt und das Board hat geschlafen! Ich denke ... der Strom lag bei ungefähr 36 mA, was höher ist als bei normaler, nicht verbundener Nutzung, aber das Board war nicht kommunizierbar. Der Test ergab ein OK, daher bin ich zuversichtlich, dass ich das Board jetzt schlafen lassen kann. Leider scheint die Ausgabe des Befehls "SLEEP" nichts zu bewirken, obwohl ich nicht weiß, ob meine anfänglichen Setup-Befehle noch ausgegeben werden.

Jedenfalls ist hier der (kaum) modifizierte Code, den ich jetzt verwende. Führen Sie es im Grunde aus, geben Sie "&" in den seriellen Monitor ein und es wechselt in den Befehlsmodus und gibt die Befehle aus, die Sie in den Code eingegeben haben. Geben Sie "@" ein und Sie erfahren die Antwort auf diese Befehle.

#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 epische Bearbeitung! Vielen Dank für Ihre Hilfe, es war von unschätzbarem Wert für meine Reise :)

Jess
quelle
1
Sie können Ihren Beitrag bearbeiten.
Kortuk
Ja, außer ich habe es anonym gemacht und ein Cookie ist fehlgeschlagen: /
Jess
Vielen Dank für die Veröffentlichung des Codes und des Links. Vor einer Stunde habe ich mein NB1-Board mit dem WT12A mit meinem Android koppeln lassen. Ich habe nach detaillierteren Beispielen für die iWRAP-Befehle gesucht und gerade Ihren Beitrag gefunden;) Sweet! Ich würde ein paar Mal auf den Aufwärtspfeil drücken, aber es sieht so aus, als wäre es einer für einen Kunden;)
jluciani
1

Das Datenblatt für das BlueGiga-Modul gibt einen durchschnittlichen Versorgungsstrom von 1,5 mA an, wenn das Modul im Leerlauf ist und Deep Sleep eingeschaltet ist. Die ArduinoBT-Seite enthält zwar nur wenige Details, impliziert jedoch, dass der ArduinoBT alle Konfigurationsmodi unterstützt, zu denen die BlueGiga in der Lage ist, und das Datenblatt auf der BlueGiga-Website gibt an, dass sie den Deep Sleep-Modus unterstützt. Ich bezweifle, dass der Arduino im Leerlauf 28,5 mA verbraucht. Wenn Sie also nichts anderes in der Schaltung haben, ist es wahrscheinlich irgendwo im Code. Würden Sie Ihren Code und Ihren Schaltplan zur weiteren Überprüfung veröffentlichen?

---BEARBEITEN---

Ich habe etwas weiter in das iWire-Dokument geschaut, das ich im Kommentar unten verlinkt habe. Ihr Verständnis scheint korrekt zu sein, aber es gibt eine Überschreibung, um den Befehlsmodus zu erzwingen: Geben Sie das Escape-Zeichen dreimal aus (siehe Seite 15). Haben Sie versucht, drei Escape-Zeichen auszugeben? Auf Seite 15 steht auch das

Wenn iWRAP in den Befehlsmodus wechselt, tritt ein READY-Ereignis auf (es sei denn, es wird mit dem Befehl „SET CONTROL ECHO“ maskiert.)

Hören Sie auf READY-Events? Auf Seite 23 scheint es beispielsweise so zu sein, dass READY über die serielle Schnittstelle ausgegeben wird und Sie leicht darauf warten können.

Ich werde Sie auch fragen, ob Sie Ihren Setup- und Verbindungscode überprüft haben. Beispielsweise muss die serielle Kommunikation mit dem BT-Modul mit 115200 Bit / s erfolgen ( http://www.arduino.cc/en/Guide/ArduinoBT ). Ich habe diese Zeile in Ihrem Setup-Code nicht gesehen, aber Sie könnten versuchen, sie hinzuzufügen

Serial.begin(115200)

vor der println-Anweisung in Ihrer setup () -Methode. Sie sagten, dass Sie den gesamten Code gepostet haben, daher ist dies wahrscheinlich das erste, was ich versuchen würde. Wenn Sie die Baudrate nicht richtig einstellen, senden Sie nur Müll. Halten uns auf dem Laufenden!

Lou
quelle
Ich habe endlich einen Link bekommen, für den kein Abonnement für die iWrap-Dokumentation erforderlich ist. Haben Sie den Befehl SLEEP ausprobiert? (s5.42, rfsolutions.co.uk/acatalog/WT11-iWRAP_UserGuide.pdf )
Lou