Как в PyQt5 зажечь светодиод Arduino используя QSerialPort?

Нужен специалист Ардуинщик! Код main.py открывает порт связи с Arduino. Скетч Arduino позволяет управлять через монитор порта включением и отключением светодиодов RGB. Как правильно записать функцию led_Red() в python, чтобы управлять светодиодом Red с помощью python? Мне не принципиально то, как будет написан код в скетче, главное, чтоб управление стало возможно

main.py

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.uic import loadUi
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
from PyQt5.QtCore import QIODevice


class New(QMainWindow):
    def __init__(self):
        super(New, self).__init__()

        loadUi("Arduino_GUI.ui", self)
        self.setWindowTitle('New')

        self.openB.clicked.connect(self.onOpen)
        self.closeB.clicked.connect(self.onClose)
        self.ledR.stateChanged.connect(self.led_Red)
        self.ledG.stateChanged.connect(self.led_Green)
        self.ledB.stateChanged.connect(self.led_Blue)

        self.serial = QSerialPort()
        self.serial.setBaudRate(9600)
        portList = []
        ports = QSerialPortInfo().availablePorts()
        for port in ports:
            portList.append(port.portName())
        print(portList)
        self.comL.addItems(portList)

    def onOpen(self):
        print('on')
        self.serial.setPortName(self.comL.currentText())
        self.serial.open(QIODevice.ReadWrite)

    def onClose(self):
        print('close')
        self.serial.close()

    def led_Red(self,  data):
        if data == '1':
            self.serial.write(1)
        elif data == '0':
            self.serial.write(0)

    def led_Green(self,  data):
        pass

    def led_Blue(self,  data):
        pass

    def closeEvent(self, e):
        super().closeEvent(e)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = New()
    window.show()
    sys.exit(app.exec_())

Arduino_GUI.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>208</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QGroupBox" name="groupBox">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>331</width>
      <height>61</height>
     </rect>
    </property>
    <property name="title">
     <string>Открытие / закрытие порта</string>
    </property>
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
      <widget class="QComboBox" name="comL"/>
     </item>
     <item row="0" column="1">
      <widget class="QPushButton" name="openB">
       <property name="text">
        <string>OPEN</string>
       </property>
      </widget>
     </item>
     <item row="0" column="2">
      <widget class="QPushButton" name="closeB">
       <property name="text">
        <string>CLOSE</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <widget class="QCheckBox" name="ledR">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_R</string>
    </property>
   </widget>
   <widget class="QCheckBox" name="ledG">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_G</string>
    </property>
   </widget>
   <widget class="QCheckBox" name="ledB">
    <property name="geometry">
     <rect>
      <x>240</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_B</string>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Скетч Arduino

int cnt = 0;

void setup() {
 Serial.begin(9600);
 Serial.setTimeout(5);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(11, OUTPUT);
}

void loop() 
{
    if (Serial.available() > 0) {
    byte data = Serial.read();
    if(data == '0')digitalWrite(5, LOW);
    if(data == '1')digitalWrite(5, HIGH);
    if(data == '0')digitalWrite(6, LOW);
    if(data == '2')digitalWrite(6, HIGH);
    if(data == '0')digitalWrite(11, LOW);
    if(data == '3')digitalWrite(11, HIGH);
    Serial.write(data);
  }
}

Ответы (1 шт):

Автор решения: Владимир

Библиотеки для Serial порта ардуины на сайте alexgyver.ru или на канале "Записки Ардуинщика"

main.py

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.uic import loadUi
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
from PyQt5.QtCore import QIODevice


class New(QMainWindow):
    def __init__(self):
        super(New, self).__init__()

        loadUi("Arduino_GUI.ui", self)
        self.setWindowTitle('New')

        self.openB.clicked.connect(self.onOpen)
        self.closeB.clicked.connect(self.onClose)
        self.ledR.stateChanged.connect(self.led_Red)
        self.ledG.stateChanged.connect(self.led_Green)
        self.ledB.stateChanged.connect(self.led_Blue)
        self.led13on.clicked.connect(self.led13_on)
        self.led13off.clicked.connect(self.led13_off)

        self.serial = QSerialPort()
        self.serial.setBaudRate(115200)
        portList = []
        ports = QSerialPortInfo().availablePorts()
        for port in ports:
            portList.append(port.portName())
        print(portList)
        self.comL.addItems(portList)

    def onOpen(self):
        print('on')
        self.serial.setPortName(self.comL.currentText())
        self.serial.open(QIODevice.ReadWrite)

    def serialSend(self, data): # список int
        txs = ""
        for val in data:
            txs += str(val)
            txs += ','
        txs = txs[:-1]
        txs += ';'
        self.serial.write(txs.encode())

    def onClose(self):
        print('close')
        self.serial.close()

    def led13_on(self):
        val = 1
        self.serialSend([0, val])

    def led13_off(self):
        val = 0
        self.serialSend([0, val])

    def led_Red(self, val):
        self.serialSend([1, val])

    def led_Green(self, val):
        self.serialSend([2, val])

    def led_Blue(self,  val):
        self.serialSend([3, val])

    def closeEvent(self, e):
        super().closeEvent(e)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = New()
    window.show()
    sys.exit(app.exec_())

Arduino_GUI.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>208</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QGroupBox" name="groupBox">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>331</width>
      <height>61</height>
     </rect>
    </property>
    <property name="title">
     <string>Открытие / закрытие порта</string>
    </property>
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
      <widget class="QComboBox" name="comL"/>
     </item>
     <item row="0" column="1">
      <widget class="QPushButton" name="openB">
       <property name="text">
        <string>OPEN</string>
       </property>
      </widget>
     </item>
     <item row="0" column="2">
      <widget class="QPushButton" name="closeB">
       <property name="text">
        <string>CLOSE</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <widget class="QCheckBox" name="ledR">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_R</string>
    </property>
   </widget>
   <widget class="QCheckBox" name="ledG">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_G</string>
    </property>
   </widget>
   <widget class="QCheckBox" name="ledB">
    <property name="geometry">
     <rect>
      <x>240</x>
      <y>120</y>
      <width>81</width>
      <height>20</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>LED_B</string>
    </property>
   </widget>
   <widget class="QPushButton" name="led13on">
    <property name="geometry">
     <rect>
      <x>410</x>
      <y>120</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>PIN13_on</string>
    </property>
   </widget>
   <widget class="QPushButton" name="led13off">
    <property name="geometry">
     <rect>
      <x>530</x>
      <y>120</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>10</pointsize>
     </font>
    </property>
    <property name="text">
     <string>PIN13_off</string>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Скетч

#define LED_R 5
#define LED_G 6
#define LED_B 11

#include "Parser.h"
#include "AsyncStream.h"  // асинхронное чтение сериал
AsyncStream<50> serial(&Serial, ';');   // указываем обработчик и стоп символ


void setup() {
  Serial.begin(115200);

  pinMode(13, 1);
  pinMode(LED_R, 1);
  pinMode(LED_G, 1);
  pinMode(LED_B, 1);
}

// с пк на ардуино, терминтаор ;
// 0,лед 13
// 1,r
// 2,g
// 3,b

void loop() {
  parsing();
}  

// функция парсинга, опрашивать в лупе
void parsing() {
  if (serial.available()) {
    Parser data(serial.buf, ',');  // отдаём парсеру
    int ints[10];           // массив для численных данных
    data.parseInts(ints);   // парсим в него

    switch (ints[0]) {
      case 0: digitalWrite(13, ints[1]);
        break;
      case 1:
        digitalWrite(LED_R, ints[1]);
        break;
      case 2:
        digitalWrite(LED_G, ints[1]);
        break;
      case 3:
        digitalWrite(LED_B, ints[1]);
        break;
    }
  }
}
→ Ссылка