【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]