Chế độ tiết kiệm năng lượng Bluetooth cho ArduinoBT


7

Tôi đang cố gắng để ArduinoBT của mình thân thiện hơn với sức mạnh một chút, tôi có nó chạy trong mạng cảm biến và nó liên tục rút điện. Tôi muốn có thể tắt hoặc đặt mô-đun Bluetooth để ngủ trong thời gian dài khi không sử dụng.
Tôi đã thử

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

Trong phương pháp thiết lập của tôi, điều này sẽ đưa mô-đun vào chế độ ngủ sâu nhưng dường như nó không làm gì cả về mức tiêu thụ điện năng (vẫn rút ra khoảng 30mA).
Tôi không đợi đủ lâu để nó đá vào à? Phiên bản WT11 iWRAP không hỗ trợ giấc ngủ sâu? Tôi có đặt nó ở vị trí sai trong mã của tôi không? Có phải tôi đang làm một cái gì đó cực kỳ chóng mặt đang ngăn nó hoạt động không ??

Câu trả lời:


5

Mã tôi đang chạy hiện tại chỉ là

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

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

nhưng tôi cũng đã thử lệnh SLEEP trong thiết lập và đưa mã này vào bộ tải khởi động ArduinoBT. Tôi rời khỏi Arduino với chế độ ngủ được kích hoạt trong vài giờ và nó không có gì khác biệt so với mức tiêu thụ, cũng như "SET CONTROL CONFIG 102d" không tạo ra bất kỳ thay đổi nào. Có lẽ tôi đang ban hành các lệnh trong chế độ dữ liệu? Tôi hiểu rằng chế độ dữ liệu là khi có kết nối Bluetooth và lệnh là khi không có kết nối nhưng tôi có thể bị nhầm.

Xin lỗi tôi đã mất quá lâu để có kỳ thi và ngày lễ của tôi.

Mã của tôi cuối cùng đã phát triển thành một cái gì đó như thế này:

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

Mà không hoạt động (YAY!)

Sau đó tôi đã tìm thấy một số mã ở đây đã giao tiếp iWRAP thành công, tôi đã sửa đổi nó để bao gồm iWRAP tôi muốn, bắt đầu với "INFO" và tìm ra phiên bản iWRAP (WRAP THOR AI 2.2.0 build 60) có được biểu dữ liệu chính xác được tìm thấy ngủ sâu là tính năng của mô-đun và bạn có thể kiểm tra nó bằng lệnh "TEST DEEPSLEEP". Tôi đã sử dụng lệnh đó và bảng đã ngủ! Tôi nghĩ rằng ... hiện tại ngồi ở khoảng 36mA, cao hơn so với sử dụng không kết nối bình thường nhưng bảng không thể truyền thông. Bài kiểm tra đã trả lại OK vì vậy tôi tự tin rằng tôi có thể làm cho bảng ngủ ngay bây giờ. Thật không may, việc ban hành lệnh "SLEEP" dường như không làm gì cả, mặc dù tôi không biết liệu các lệnh thiết lập ban đầu của mình đã được ban hành chưa.

Anyhoo ở đây là mã sửa đổi (hầu như) tôi đang sử dụng. Về cơ bản chạy nó sau đó nhập "&" vào màn hình nối tiếp và nó chuyển sang chế độ lệnh và đưa ra các lệnh bạn đặt trong mã, nhập "@" và nó cho bạn biết phản ứng với các lệnh đó.

#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 sử thi chỉnh sửa! Cảm ơn rất nhiều vì sự giúp đỡ của bạn, nó là vô giá đối với hành trình của tôi :)


1
Bạn có thể chỉnh sửa bài viết của bạn.
Kortuk

vâng, ngoại trừ tôi đã làm điều đó một cách ẩn danh và đã thất bại với cookie: /
Jess

Cảm ơn đã đăng mã và liên kết. Chỉ một giờ trước, tôi đã nhận được bảng NB1 để ghép nối với Android của mình bằng WT12A. Tôi đã tìm kiếm một số ví dụ chi tiết hơn về các lệnh iWRAP và vừa tìm thấy bài đăng của bạn;) Sweet! Tôi sẽ nhấn mũi tên lên một vài lần nhưng có vẻ như nó là một cho khách hàng;)
jluciani

1

Bảng thông số kỹ thuật cho mô-đun BlueGiga cung cấp dòng cung cấp trung bình 1,5 mA khi mô-đun là IDLE và Deep Sleep được BẬT. Trang ArduinoBT, mặc dù có một chút chi tiết, ngụ ý rằng ArduinoBT không hỗ trợ bất kỳ chế độ cấu hình nào mà BlueGiga có khả năng, và thông số kỹ thuật trên trang BlueGiga cho biết nó có khả năng ở chế độ Ngủ sâu, vì vậy điều đó không còn nữa. Tôi nghi ngờ Arduino đang tiêu thụ 28,5 mA khi không hoạt động, vì vậy trừ khi bạn có thứ gì khác trong mạch, nó có thể nằm ở đâu đó trong mã. Bạn sẽ gửi mã và sơ đồ của bạn để xem xét thêm?

---BIÊN TẬP---

Tôi đã nhìn xa hơn một chút vào tài liệu iWire mà tôi đã liên kết trong bình luận bên dưới. Sự hiểu biết của bạn có vẻ đúng, nhưng có một ghi đè để buộc chế độ lệnh: Phát hành ký tự thoát ba lần (Xem Trang 15). Bạn đã thử phát hành ba nhân vật thoát? Nó cũng nói trên trang 15 rằng

Khi iWRAP chuyển sang chế độ lệnh, sự kiện SYN SÀNG xảy ra (Trừ khi bị che đi bằng lệnh CÀI ĐẶT ĐIỀU KHIỂN ECHO.)

Bạn đang lắng nghe các sự kiện SYN SÀNG? Ví dụ, trên trang 23, có vẻ như SYN SÀNG được phát hành qua cổng nối tiếp và bạn có thể dễ dàng lắng nghe nó.

Tôi cũng sẽ hỏi nếu bạn đã xem lại mã thiết lập và mã kết nối của mình. Ví dụ: giao tiếp nối tiếp với mô-đun BT cần ở mức 115200 bps ( http://www.arduino.cc/en/Guide/ArduinoBT ). Tôi không thấy dòng đó trong mã thiết lập của bạn, nhưng bạn có thể thử thêm

Serial.begin(115200)

trước câu lệnh println trong phương thức setup () của bạn. Bạn nói rằng bạn đã đăng tất cả các mã, vì vậy đây có lẽ là điều đầu tiên tôi thử. Nếu bạn không đặt tốc độ truyền chính xác, bạn chỉ đang gửi rác. Giữ cho chúng tôi được đăng!


Cuối cùng tôi đã nhận được một liên kết không yêu cầu đăng ký tài liệu iWrap. Bạn đã thử lệnh SLEEP chưa? (s5.42, rfsolutions.co.uk/acatalog/WT11-iWRAP_UserGuide.pdf )
Lou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.