小默叔叔 发表于 2024-11-5 11:28

【2024 DigiKey创意大赛】基于Raspberry Pi 5的智能颜色识别

## 一、简介



介绍
ESP32通过TSC3200识别红色、绿色和蓝色,并通过MQTT将数据传输给树莓派,树莓派此时是一个MQTT服务器,接收到MQTT数据后,通过QT界面,在树莓派上显示识别到的颜色;同时ESP32上也有个RGB灯,RGB灯的颜色与识别的颜色相同

这次申请了三块开发板套件,分别是“ESP32-C6-DEVKITC-1-N8”、“TCS3200 RGB COLOR SENSOR BOARD”和“Raspberry Pi5”。





树莓派5 主要介绍

- 2.4GHz 四核 64 位 Arm Cortex-A76 CPU,512KB 二级缓存和 2MB 共享三级缓存
- VideoCore VII GPU @800MHz,支持 OpenGL ES 3.1 和 Vulkan 1.2
- 双 4Kp60 HDMI 显示输出
- 4Kp60 HEVC 解码器
- LPDDR4X-4267 SDRAM (2GB/4GB/8GB 内存可选)
- 2.4GHz/5GHz 双频 802.11ac Wi-Fi
- 蓝牙 5.0 / 低功耗蓝牙 (BLE)
- 高速 Micro SD 卡接口,支持 SDR104 模式
- 2 × USB 3.0 端口,支持 5Gbps 同步运行
- 千兆以太网,支持 PoE+ (需要单独的 PoE+ HAT,即将推出)
- 2 × 4-lane MIPI DSI/CSI 接口
- 用于高速外设的 PCIe 2.0 x1 接口 (需要单独的 M.2 HAT 或其他适配器)
- 通过 USB-C 提供 5V/5A 直流电源,支持 PD
- Raspberry Pi 40PIN GPIO 接口
- 实时时钟 (RTC),由外置电池供电 (需单独购买)
- 板载电源按钮,可以在不断开电源的情况下关机/开机

## 二、系统框图

计划是ESP32通过TCS3200识别不同的颜色,然后控制RGB显示当前识别的颜色,然后通过mqtt发送给树莓派,树莓派这边作为MQTT服务器,接收和显示当前ESP32识别到的颜色。



## 三、各部分功能说明

各部分实现的功能说明及讲解,以图文结合的方式展示

1. ESP32 & TSC3200
    1. 识别颜色
      
      ```c
      
      void setup() {
            pinMode(S0, OUTPUT);      
            pinMode(S1, OUTPUT);      
            pinMode(S2, OUTPUT);      
            pinMode(S3, OUTPUT);      
            pinMode(sensorOut, INPUT);
      
            digitalWrite(S0,HIGH);
            digitalWrite(S1,LOW);
      }
      
      int getRed() {
            digitalWrite(S2,LOW);
            digitalWrite(S3,LOW);
            Frequency = pulseIn(sensorOut, LOW); /*Get the Red Color Frequency*/
            return Frequency;
      }
      
      int getGreen() {
            digitalWrite(S2,HIGH);
            digitalWrite(S3,HIGH);
            Frequency = pulseIn(sensorOut, LOW); /*Get the Green Color Frequency*/
            return Frequency;
      }
      
      int getBlue() {
            digitalWrite(S2,LOW);
            digitalWrite(S3,HIGH);
            Frequency = pulseIn(sensorOut, LOW); /*Get the Blue Color Frequency*/
            return Frequency;
      }
      
      ```
      
    2. 与MQTT通讯
      
      ```c
      // 新增MQTT重连函数
      void reconnect() {
            while (!client.connected()) {
                Serial.print("Attempting MQTT connection...");
                String clientId = "ESP32ColorSensor-";
                clientId += String(random(0xffff), HEX);
      
                if (client.connect(clientId.c_str())) {
                  Serial.println("connected");
                } else {
                  Serial.print("failed, rc=");
                  Serial.print(client.state());
                  Serial.println(" try again in 5 seconds");
                  delay(5000);
                }
            }
      }
      
      void setup() {
            // 新增WiFi和MQTT初始化
            setup_wifi();
            client.setServer(mqtt_server, mqtt_port);
      
      }
      ```
      
2. 树莓派
    1. 开启MQTT服务器
      
      sudo apt-get install python3-paho-mqtt
      
      sudo apt-get install mosquitto mosquitto-clients
      
      sudo vim /etc/mosquitto/mosquitto.conf
      
      sudo systemctl restart mosquitto
      

      

    2. QT显示识别到的颜色
      
      ```c
      import sys
      from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget
      from PyQt5.QtCore import Qt
      from PyQt5.QtGui import QFont
      import paho.mqtt.client as mqtt
      
      class ColorDisplay(QMainWindow):
            def __init__(self):
                super().__init__()
                print("初始化程序...")
                self.initUI()
                self.initMQTT()
                print("初始化完成")
      
            def initUI(self):
                self.setWindowTitle('Color Detection Display')
                self.setGeometry(100, 100, 400, 200)
               
                central_widget = QWidget()
                self.setCentralWidget(central_widget)
                layout = QVBoxLayout(central_widget)
               
                self.color_label = QLabel('等待颜色数据...')
                self.color_label.setFont(QFont('Arial', 24))
                self.color_label.setStyleSheet('padding: 20px;')
                self.color_label.setAlignment(Qt.AlignCenter)
                layout.addWidget(self.color_label)
               
                self.status_label = QLabel('MQTT 状态: 未连接')
                self.status_label.setFont(QFont('Arial', 12))
                self.status_label.setStyleSheet('padding: 10px;')
                layout.addWidget(self.status_label)
      
            def initMQTT(self):
                print("初始化MQTT客户端...")
                self.mqtt_client = mqtt.Client()
                self.mqtt_client.on_connect = self.on_connect
                self.mqtt_client.on_message = self.on_message
                self.mqtt_client.on_disconnect = self.on_disconnect
      
                try:
                  print("连接到MQTT服务器...")
                  self.mqtt_client.connect("localhost", 1883, 60)
                  self.mqtt_client.loop_start()
                except Exception as e:
                  print(f"MQTT连接错误: {str(e)}")
                  self.status_label.setText(f'MQTT 连接错误: {str(e)}')
                  self.status_label.setStyleSheet('color: red; padding: 10px;')
      
            def on_connect(self, client, userdata, flags, rc):
                if rc == 0:
                  self.status_label.setText('MQTT 状态: 已连接')
                  self.status_label.setStyleSheet('color: green; padding: 10px;')
                  client.subscribe("color/detection")
                  print("已成功连接到MQTT服务器并订阅主题")
                else:
                  self.status_label.setText(f'MQTT 连接失败,错误码: {rc}')
                  self.status_label.setStyleSheet('color: red; padding: 10px;')
                  print(f"MQTT连接失败,错误码: {rc}")
      
            def on_disconnect(self, client, userdata, rc):
                self.status_label.setText('MQTT 状态: 已断开连接')
                self.status_label.setStyleSheet('color: red; padding: 10px;')
                print("MQTT连接已断开")
      
            def on_message(self, client, userdata, msg):
                try:
                  color = msg.payload.decode()
                  display_message = f'检测到颜色: {color}'
                  print(f"收到颜色信息: {color}")
                  
                  self.color_label.setText(display_message)
                  
                  style = 'padding: 20px; border-radius: 10px; margin: 10px;'
                  if color == 'red':
                        # 纯正的红色背景
                        self.color_label.setStyleSheet(f'background-color: #FF0000; color: white; {style}')
                  elif color == 'green':
                        # 纯正的绿色背景
                        self.color_label.setStyleSheet(f'background-color: #00FF00; color: black; {style}')
                  elif color == 'blue':
                        # 纯正的蓝色背景
                        self.color_label.setStyleSheet(f'background-color: #0000FF; color: white; {style}')
                  else:
                        self.color_label.setStyleSheet(f'background-color: #f0f0f0; color: black; {style}')
                except Exception as e:
                  print(f"处理消息时出错: {str(e)}")
      
            def closeEvent(self, event):
                print("正在关闭程序...")
                if hasattr(self, 'mqtt_client'):
                  self.mqtt_client.loop_stop()
                  self.mqtt_client.disconnect()
                event.accept()
                print("程序已关闭")
      
      if __name__ == '__main__':
            print("\n=== 程序启动 ===")
            app = QApplication(sys.argv)
            ex = ColorDisplay()
            ex.show()
            print("=== GUI已启动,等待消息 ===\n")
            sys.exit(app.exec_())
      ```
      

## 四、作品源码


## 五、作品功能演示视频
82bde498af037349746e6a3746232660<br/>
视频嵌入





## 六、项目总结

本项目成功实现了一个完整的颜色识别与远程显示系统,展示了物联网技术在实际应用中的潜力。通过ESP32和树莓派的协同工作,实现了从数据采集到远程显示的完整流程,为类似应用提供了可靠的参考方案。

应用价值

- 可用于工业自动化的颜色检测
- 适用于智能家居的环境感知
- 教育领域的STEM教学演示
- 物联网应用开发的参考案例


页: [1]
查看完整版本: 【2024 DigiKey创意大赛】基于Raspberry Pi 5的智能颜色识别