#python #user-interface #arduino #pyqt #bluetooth-lowenergy
#python #пользовательский интерфейс #arduino #pyqt #bluetooth -низкое энергопотребление
Вопрос:
Я пытаюсь создать графический интерфейс на Python, который позволит мне отправлять сообщение на модуль Bluetooth Arduino (nrf8001), когда я нажимаю кнопку внутри графического интерфейса. В настоящее время я написал скрипт для графического интерфейса пользователя и скрипт для подключения к модулю Bluetooth.
Проблема: всякий раз, когда я подключаюсь к модулю Bluetooth, нажимая кнопку GUI, которую я сделал, графический интерфейс, похоже, зависает / зависает, пока продолжается сценарий для подключения Bluetooth. Я читал, что это может быть связано с запуском двух основных циклов событий.
Я действительно новичок в python, и мне было интересно, есть ли хорошее решение для этого.
Файл Bluetooth
import Adafruit_BluefruitLE
from Adafruit_BluefruitLE.services import UART
""" Get the BLE provider for the current platform. DO NOT REMOVE."""
ble = Adafruit_BluefruitLE.get_provider()
message = "empty"
def change_message(msg_string):
global message
message = msg_string
def run_Time(uart):
global message
connection_status = True
uart.write("Ready")
while (connection_status == True):
if message != "empty":
if (message == "exit"):
connection_status= False
else:
uart.write(message)
message = "empty"
def main():
# Clear any cached data
ble.clear_cached_data()
# Get the first available BLE network adapter and make sure it's powered on.
adapter = ble.get_default_adapter()
adapter.power_on()
print('Using adapter: {0}'.format(adapter.name))
# Disconnect any currently connected UART devices.
print('Disconnecting any connected UART devices...')
UART.disconnect_devices()
# Scan for UART devices.
print('Searching for UART device...')
try:
adapter.start_scan()
# Search for the first UART device found (timeout_sec to change parameter)
device = UART.find_device()
if device is None:
raise RuntimeError('Failed to find UART device!')
finally:
# Make sure scanning is stopped before exiting.
adapter.stop_scan()
print('Connecting to device...')
device.connect()
try:
print('Discovering services...')
UART.discover(device)
# create an instance of the service
uart = UART(device)
run_Time(uart)
finally:
device.disconnect()
# Initialize the BLE system. MUST be called before other BLE calls!
def start_ble_connection():
ble.initialize()
ble.run_mainloop_with(main)
Графический интерфейс
import sys
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtGui import *
import terminal_input
# ----- GENERAL VARIABLES -------
# Windows Size
w_xSize = 200
w_ySize = 300
# Create a generic btn size
x_size = 130
y_size = 32
# Create generic x,y, variables to append to btn locations
# such that you can shift the entire btn locations as a whole
x_frame1 = (w_xSize-x_size)/2 #center
y_frame1 = 10
# ------ DEFINING WINDOW PROPERTIES -------
# create our window
app = QApplication(sys.argv)
# Base class to all our widget is QWidget
w = QWidget()
# Set window title
w.setWindowTitle('Primitive GUI')
# Set window size.
w.resize(w_xSize,w_ySize )
# ------ DEFINING BUTTON PROPERTIES -------
# Button 1
btn = QPushButton("Channel 0", w)
btn.move(0 x_frame1, 0 y_frame1)
btn.resize(x_size,y_size) #(x,y)
# Button 2
btn2 = QPushButton("Channel 1", w)
btn2.move(0 x_frame1, 30 y_frame1)
btn2.resize(x_size,y_size)
# ------ DEFINING TEXTBOX PROPERTIES -------
textbox = QLineEdit(w)
textbox.move(x_frame1, w_ySize-50)
textbox.resize(x_size,y_size)
# ------ CREATE SLOTS FOR BUTTONS ------
@pyqtSlot()
def on_click():
print("btn1 was clicked")
terminal_input.start_ble_connection()
@pyqtSlot()
def on_click_btn2():
textbox.setText("Button 2")
terminal_input.change_message("button 2")
# ------ CONNECT SIGNALS TO THE SLOTS ------
# Each button can have its own function that it calls
# Button 1
btn.clicked.connect(on_click)
#btn.pressed.connect(on_press)
#btn.released.connect(on_release)
# Button 2
btn2.clicked.connect(on_click_btn2)
# ------ SHOW THE WINDOW ------
# Show the window and run the app
w.show()
app.exec_()