一、项目概述
厌倦了传统鱼缸的繁琐管理? 想要随时随地了解鱼儿的生活状态? 本项目将带你使用 ESP32 开发板、MQTT 通信协议和微信小程序,打造一个功能完善的智能鱼缸系统。 实时监测水温、远程控制灯光、定时定量喂食...... 一切尽在掌握!
二、系统架构
本系统采用典型的物联网架构,主要分为硬件层、软件层和云平台三个部分:
2.1 硬件层
- ESP32 开发板: 系统的控制核心,负责采集传感器数据、控制外设以及与云端进行通信。
 - 传感器: 水温传感器(DS18B20)、光照传感器(BH1750)等,实时监测鱼缸环境参数。
 - 执行器: LED 灯带(WS2812B)、水泵、喂食器等,用于调节鱼缸环境和实现自动化功能。
 
2.2 软件层
- ESP32 程序: 负责读取传感器数据、控制外设、连接 WiFi 和 MQTT Broker,并将数据发布到云端。
 - 微信小程序: 提供用户界面,用于显示鱼缸状态、发送控制指令以及设置定时任务等。
 
2.3 云平台
- MQTT Broker: 负责接收来自 ESP32 的数据,并转发至订阅该主题的客户端,例如微信小程序。
 
2.4 系统架构图

三、实例代码介绍
3.1 ESP32 代码 (部分)
            
            
              cpp
              
              
            
          
          #include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// 引脚定义
#define ONE_WIRE_BUS 2  // DS18B20 数据引脚
// WiFi 和 MQTT Broker 信息
const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
const char* mqtt_server = "your_mqtt_broker_ip";
const int mqtt_port = 1883;
// 创建 OneWire 和 Dallas Temperature 对象
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 创建 WiFi 和 MQTT 客户端
WiFiClient espClient;
PubSubClient client(espClient);
// ... 其他变量和函数定义 ...
void setup() {
  Serial.begin(115200);
  // 初始化传感器
  sensors.begin();
  // 连接 WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  // 连接 MQTT Broker
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  while (!client.connected()) {
    Serial.println("Connecting to MQTT Broker...");
    if (client.connect("ESP32Client")) {
      Serial.println("connected");
      // 订阅控制指令主题
      client.subscribe("fishTank/control");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
void loop() {
  // MQTT 连接保持
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  // 读取水温数据
  sensors.requestTemperatures();
  float temperatureC = sensors.getTempCByIndex(0);
  // 发布数据到 MQTT 主题
  char tempString[8];
  dtostrf(temperatureC, 6, 2, tempString);
  client.publish("fishTank/temperature", tempString);
  // ... 其他传感器数据读取和发布 ...
  // ... 其他控制逻辑 ...
  delay(1000); 
}
// MQTT 回调函数,处理接收到的控制指令
void callback(char* topic, byte* payload, unsigned int length) {
  // ... 解析控制指令并控制相应的外设 ...
}
// 重新连接 MQTT Broker
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP32Client")) {
      Serial.println("connected");
      // 重新订阅主题
      client.subscribe("fishTank/control");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
        3.2 微信小程序代码 (部分)
            
            
              javascript
              
              
            
          
          // pages/index/index.js
Page({
  data: {
    temperature: '--', // 水温
    lightIntensity: '--', // 光照强度
    // ... 其他数据 ...
  },
  // 页面加载时连接 MQTT Broker
  onLoad: function () {
    // 初始化 MQTT 客户端
    this.client = mqtt.connect('wss://your_mqtt_broker_ip:8083/mqtt', {
      username: 'your_mqtt_username',
      password: 'your_mqtt_password',
    });
    // 订阅数据主题
    this.client.on('connect', () => {
      this.client.subscribe('fishTank/temperature', (err) => {
        if (!err) {
          console.log('Subscribed to fishTank/temperature');
        }
      });
      // ... 订阅其他数据主题 ...
    });
    // 处理接收到的数据
    this.client.on('message', (topic, message) => {
      switch (topic) {
        case 'fishTank/temperature':
          this.setData({ temperature: message.toString() });
          break;
        // ... 处理其他数据 ...
      }
    });
  },
  // 页面卸载时断开 MQTT 连接
  onUnload: function () {
    this.client.end();
  },
  // 控制灯光开关
  toggleLight: function () {
    // 发送控制指令
    this.client.publish('fishTank/control', 'toggleLight');
  },
  // ... 其他控制函数 ...
});
        3.3MQTT服务端代码(python)
本示例使用 库创建一个简单的 MQTT Broker,并监听来自 ESP32 和微信小程序的消息。
            
            
              python
              
              
            
          
          import asyncio
from hbmqtt.broker import Broker
# MQTT Broker 配置
config = {
    'listeners': {
        'default': {
            'type': 'tcp',
            'bind': '0.0.0.0:1883'  # 监听所有接口的 1883 端口
        },
        'ws-mqtt': {
            'bind': '0.0.0.0:8083',
            'type': 'ws',
            'websocket_path': '/mqtt'
        }
    },
    'sys_interval': 10,
    'auth': {
        'allow-anonymous': True,  # 允许匿名访问,实际项目中建议关闭
    }
}
# 启动 Broker
async def startBroker():
    broker = Broker(config)
    await broker.start()
if __name__ == '__main__':
    formatter = "[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s"
    logging.basicConfig(level=logging.INFO, format=formatter)
    asyncio.get_event_loop().run_until_complete(startBroker())
    asyncio.get_event_loop().run_forever()
        四、总结和知识点归纳(附部分知识点链接)
通过以上代码示例,我们可以清晰地了解到智能鱼缸系统各个部分是如何协同工作的。 当然,实际项目中还需要根据具体需求进行更复杂的逻辑处理和功能扩展。
- ESP32 开发板 :
- 简介: ESP32 Wi-Fi & 蓝牙 SoC | 乐鑫科技
 - 购买链接: ESP32 Wi-Fi & 蓝牙 SoC | 乐鑫科技 (官方商城或其他电商平台)
 
 - DS18B20 温度传感器 :
- 简介: DS18B20数据手册和产品信息 | Analog Devices
 - 购买链接: (各大电子元器件商城)
 
 
- Arduino IDE:
 - 微信开发者工具 :
 - MQTT 代理 :
- EMQX : EMQX:用于物联网、车联网和工业物联网的企业级 MQTT 平台 (开源、功能强大)
 - Mosquitto : Eclipse Mosquitto (轻量级、易于部署)
 - 云服务: 阿里云、腾讯云等云服务商提供的 MQTT 服务
 
 
最后的最后,不懂可以私信我哦!!!