【问题标题】:Python GUI tkinter arduino serial dataPython GUI tkinter arduino 串行数据
【发布时间】:2020-12-06 01:35:45
【问题描述】:

好的,我试图通过串口将我的数据从 arduino 分离到 python GUI tkinter

示例:我有一个湿度和温度传感器,还有一个灯。我希望 Python GUI 读取串行通信并将数据存储在单独的字符串中(温度、湿度、光)

Python 代码

import tkinter as tk
import serial #Serial imported for Serial communication
import time #Required to use delay functions
 
# Create the master object
root = tk.Tk()

ArduinoSerial = serial.Serial('com5',9600) #Create Serial port object called arduinoSerialData
time.sleep(2)

humidity = tk.Label(root, text=ArduinoSerial.readline())
humidity.grid(row=0, column=0)

templabel = tk.Label(root, text="Temperature :" )
tempEntry = tk.Label(root, text=ArduinoSerial.readline() )

templabel.grid(row=1, column=0)
tempEntry.grid(row=1, column=2)

root.mainloop()

Arduino 代码

#include <DHT.h>
#include <Wire.h>
#include <SPI.h>

int relayPin = 5; 
int relayPinW = 6;
int sOn = 3;
char serialData;

DHT my_sensor (3, DHT22);

float temperature, humidity;

void setup(){
  Serial.begin(9600);
  my_sensor.begin();
   pinMode (relayPin, OUTPUT);
   pinMode (relayPinW, OUTPUT);
  
}

void loop() {
  
  //digitalWrite(relayPin, HIGH);
  //Serial.print("Nano - Relay Open \n");
  //delay(8000);

  //if(sOn > 0){
  //digitalWrite(relayPin, LOW);
  //Serial.print("Nano - Relay CLOSED \n");
  //delay(8000);
  //}
  
  digitalWrite(relayPinW, HIGH);
  Serial.print("Nano - Water Pump is now active \n");
  delay(8000);
  
  digitalWrite(relayPinW, LOW);
  Serial.print("Nano - Water Pump OFF \n");
  delay(8000);
  
 if(humidity > 1)
  {
     digitalWrite(6, HIGH);
     Serial.print("Humidifer Is Now ** ON ** PIN5 \n");
  } else { 
    Serial.print("ERROR with Digital Write PIN");
  }
  if(Serial.available() > 0)
  serialData = Serial.read();
  Serial.print(serialData);
 
  humidity = my_sensor.readHumidity();
  temperature = my_sensor.readTemperature();

  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print("C / Humidity: ");
  Serial.print(humidity);
  Serial.println("%");
    
  
}

这可行,但我希望将数据分成自己的变量,我必须解码或编码吗?我很迷茫...谢谢!

【问题讨论】:

    标签: python tkinter arduino pyserial


    【解决方案1】:

    嗨,嗨
    你只需要格式化类型
    意味着在你的 python 代码中
    它在哪里\

    humidity = tk.Label(root, text=ArduinoSerial.readline())
    humidity.grid(row=0, column=0)
    
    templabel = tk.Label(root, text="Temperature :" )
    tempEntry = tk.Label(root, text=ArduinoSerial.readline() )
    

    只有你unicode函数 表示您的代码应如下所示:- \

    humidity = tk.Label(root, text=unicode(ArduinoSerial.readline()))
    humidity.grid(row=0, column=0)
    
    templabel = tk.Label(root, text="Temperature :" )
    tempEntry = tk.Label(root, text=unicode(ArduinoSerial.readline()) )
    

    它将解决您的问题。 但这有一个缺点,因为您要串行打印太多东西
    所以,
    你需要优化你的 Arduino 代码

    最后一个小提示:- 您可以使用println() 函数代替print("....\n")

    【讨论】:

      【解决方案2】:

      首先,您需要在线程中进行串行读取,这样它就不会阻塞主应用程序。其次,双方必须在数据格式上妥协。

      以下是根据您的代码修改的示例:

      import tkinter as tk
      import serial #Serial imported for Serial communication
      import threading
      
      # Create the master object
      root = tk.Tk()
      
      ArduinoSerial = serial.Serial('com5', 9600) #Create Serial port object called arduinoSerialData
      
      def arduino_handler():
          while True:
              data = ArduinoSerial.readline().strip()
              if data.startswith("Temperature:"):
                  temperature.set(data.split(":")[1])
              elif data.startswith("Humidity:"):
                  humidity.set(data.split(":")[1])
      
      tk.Label(root, text="Humidity:").grid(row=0, column=0, sticky='w')
      humidity = tk.StringVar()
      tk.Label(root, textvariable=humidity).grid(row=0, column=1, sticky='w')
      
      tk.Label(root, text="Temperature:" ).grid(row=1, column=0, sticky='w')
      temperature = tk.StringVar()
      tk.Label(root, textvariable=temperature).grid(row=1, column=1, sticky='w')
      
      threading.Thread(target=arduino_handler, daemon=True).start()
      root.mainloop()
      

      然后更新Arduino程序以输出所需的格式:

      void loop() {
          digitalWrite(relayPinW, HIGH);
          Serial.println("Nano - Water Pump is now active");
          delay(8000);
      
          digitalWrite(relayPinW, LOW);
          Serial.println("Nano - Water Pump OFF");
          delay(8000);
      
          if(humidity > 1)
          {
              digitalWrite(6, HIGH);
              Serial.println("Humidifer Is Now ** ON ** PIN5");
          } else {
              Serial.println("ERROR with Digital Write PIN");
          }
          if (Serial.available() > 0) {
              serialData = Serial.read();
              Serial.print(serialData);
      
              humidity = my_sensor.readHumidity();
              temperature = my_sensor.readTemperature();
      
              Serial.print("Temperature:");
              Serial.println(temperature);
              Serial.print("Humidity:");
              Serial.print(humidity);
              Serial.println("%");
          }
      }
      

      【讨论】:

      • 线程 Thread-7 中的异常:回溯(最后一次调用):文件“C:\Users\ii\AppData\Local\Programs\Python\Python39\lib\threading.py”,行950,在 _bootstrap_inner self.run() 文件“C:\Users\ii\AppData\Local\Programs\Python\Python39\lib\threading.py”,第 888 行,在运行 self._target(*self._args, * *self._kwargs) 文件“c:\Users\ii\python\GUI\test2.py”,第 13 行,在 arduino_handler if data.startswith("Temperature:"): TypeError: startswith first arg must be bytes or a tuple字节数,而不是 str
      • 它给了我这个错误..不确定线程​​会做什么来帮助这个。从我所理解的到连载中的许多内容。我同意。我在想我可以将它们简化为确切的值
      • 例如温度:22.0 湿度:33.0 水泵 1/ON 灯 1/ON 并且在序列中它看起来像这样 22.0 x 33.0 x 1 x 1
      • 然后我正在考虑拆分“x”并将它们存储为浮点数......但我不确定如何做到这一点
      • 对于例外情况,请尝试将data = ArduinoSerial.readline().strip() 行更改为data = ArduinoSerial.readline().decode().strip()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多