小默叔叔

  • 2024-11-05
  • 发表了主题帖: 【2024 DigiKey创意大赛】基于Raspberry Pi 5的智能颜色识别

    # **基于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_())         ```          ## 四、作品源码 ## 五、作品功能演示视频 [localvideo]82bde498af037349746e6a3746232660[/localvideo] 视频嵌入 ## 六、项目总结 本项目成功实现了一个完整的颜色识别与远程显示系统,展示了物联网技术在实际应用中的潜力。通过ESP32和树莓派的协同工作,实现了从数据采集到远程显示的完整流程,为类似应用提供了可靠的参考方案。 应用价值 - 可用于工业自动化的颜色检测 - 适用于智能家居的环境感知 - 教育领域的STEM教学演示 - 物联网应用开发的参考案例

  • 2024-10-02
  • 回复了主题帖: 【2024 DigiKey创意大赛】 物料开箱

    phonone 发表于 2024-9-24 17:32 树莓派是用来玩的? 试着跑个模型,或者接入模型

  • 回复了主题帖: 【2024 DigiKey创意大赛】 物料开箱

    wangerxian 发表于 2024-9-23 09:09 ESP32和树莓派准备用什么方式进行通信? 用串口吧,最简单了;走网络也可以

  • 回复了主题帖: 【2024 DigiKey创意大赛】 物料开箱

    lansebuluo 发表于 2024-9-23 08:31 4GB 树莓派,这个是否还要加散热片,防止过热 不用啊,Pi 5上面自带散热片

  • 2024-09-22
  • 发表了主题帖: 【2024 DigiKey创意大赛】 物料开箱

    本帖最后由 小默叔叔 于 2024-9-22 16:03 编辑 这次申请了三块开发板套件,分别是“ESP32-C6-DEVKITC-1-N8”、“TCS3200 RGB COLOR SENSOR BOARD”和“Raspberry Pi5”。 计划是ESP32控制RGB,然后树莓派5与这个通讯,还可以用上位机控制,上图,coding  

  • 2024-03-29
  • 回复了主题帖: 测评入围名单: 米尔-瑞米派Remi Pi(兼容树莓派扩展模块)

    个人信息无误,确认可以完成评测计划

  • 2024-03-13
  • 回复了主题帖: 颁奖礼:平头哥玄铁杯第三届获奖名单揭晓,纪念一起对AI进行小小探索的你们

    确认无误,请兑换成等值E金币,谢谢

最近访客

< 1/5 >

统计信息

已有90人来访过

  • 芯积分:239
  • 好友:--
  • 主题:23
  • 回复:18

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言