[ Arduino ] 使用 PyBluez對 Arduino發送訊息
第一次學寫 Arduino,先試個水溫使用 Pybluez對 Arduino發送訊息。
Arduino的部分
安裝 PyBluez
安裝前請先參閱各平台的 Requirement。
Windows或 Linux應該是可以直接安裝
不過 GitHub上都沒有提出這類 issues,有可能我是個案 :P
為了顯示 device的名稱還需到 bluetooth資料夾中,找到 macos.py。
懶得修改的話可以直些使用我小改後的代碼。
尋找 Bluetooth設備
接著就試著發送看看吧。
新數據若沒有比之前長,未被覆蓋的部分就會被保留。
所以使用 ljust(16)指令把空缺補滿到 16格,覆蓋剩餘的部分。
有時候安裝會少安裝 LightAquaBlue.framework這部分,導致無法 import bluetooth。
重試幾次不行就 clone下來安裝吧。
#include <liquidcrystal.h> #include <softwareserial.h> LiquidCrystal lcd(12,11,5,4,3,2); SoftwareSerial BT(9, 10); void setup() { lcd.begin(16,2); BT.begin(9600); BT.setTimeout(10); lcd.print("Hello, world!"); } void loop() { if (BT.available()) // if text arrived in from BT serial... { String cod=(BT.readString()); lcd.setCursor(0,0); // choose first line of LCD lcd.print(cod); } }
安裝 PyBluez
安裝前請先參閱各平台的 Requirement。
Windows或 Linux應該是可以直接安裝
$ pip install pybluez我使用的是 MacOS,但 Python的 Bluetooth packages中似乎對 MacOS沒有很好的支援,甚至無法直接使用 pip安裝。
不過 GitHub上都沒有提出這類 issues,有可能我是個案 :P
$ pip install git+https://github.com/pybluez/pybluez.git安裝後會在 packages中找到 lightblue資料夾,當中會有一個檔案 _bluetoothsockets.py。
class _BluetoothSocket(object): ... def send(self, data, flags=0): # if not isinstance(data, str): # raise TypeError("data must be string, was %s" % type(data)) if self.__commstate in (SHUT_WR, SHUT_RDWR): raise _socket.error(errno.EPIPE, os.strerror(errno.EPIPE)) self.__checkconnected() ...直接把 5, 6行註解掉(非實際行數),修改後才能正常傳輸數據。
為了顯示 device的名稱還需到 bluetooth資料夾中,找到 macos.py。
def discover_devices(duration=8, flush_cache=True, lookup_names=False, lookup_class=False, device_id=-1): ... # Use lightblue to discover devices on OSX. # devices = lightblue.finddevices(getnames=lookup_names, length=duration) devices = lightblue.finddevices(getnames=False, length=duration) ret = list() for device in devices: ...直接把 6行 lookup_names修改為 False(非實際行數),如 7行。修改後就能正常使用 lookup_names。
懶得修改的話可以直些使用我小改後的代碼。
$ pip install git+https://hardliver@bitbucket.org/hardliver/pybluez.git
尋找 Bluetooth設備
>>> import bluetooth >>> >>> bluetooth.discover_devices(lookup_names=True) [(b'12:34:56:78:90:XX', 'HC-05')] >>>
接著就試著發送看看吧。
import bluetooth mac = '12:34:56:78:90:XX' port = 1 sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((mac,port)) sock.send('Good Luck!'.ljust(16).encode()) # MacOS需使用 bytes type # sock.send('Good Luck!'.ljust(16)) # Windows和 Linux應該可以直接發送 sock.close()我使用的液晶顯示器是 16x2,Arduino收到數據後,顯示器並不會把螢幕清空再放上剛收到的數據,而是直接覆蓋。
新數據若沒有比之前長,未被覆蓋的部分就會被保留。
所以使用 ljust(16)指令把空缺補滿到 16格,覆蓋剩餘的部分。
有時候安裝會少安裝 LightAquaBlue.framework這部分,導致無法 import bluetooth。
重試幾次不行就 clone下來安裝吧。
留言
張貼留言