Skip to content

ESP32使用小机云开源项目可以快速使用小机云,目前支持arduino,python,idf。ESP32开源仓库,如果是使用WIFI远程控制,使用的是xsgee-esp32-iot-xxx的项目

以下以ESP32C3+arduino示例进行说明ESP32如何快速使用小机云。python和idf的使用过程类似。

建议SDK版本

  • Arduino
    • esp32 Board 3.3.10 by Espressif systems (重点:不建议低于该版本)
    • PubSubClient by Nick 2.8
    • ArduinoJson by Benoit Blanchon 7.4.3
    • Ardafruit GFX Library by Adafruit 1.12.6
    • Adafruit SSD1306 by Adafruit 2.5.17
  • ESP-IDF建议使用v5.5.2
  • Micropython
    • micropython固件版本1.28.0

可能冲突的地方

如果开源代码烧录到您的硬件上出现不运行,可以检查一下代码里的IO配置和您的硬件是否有冲突

shell
!! 在idf的代码中,uart用的是gpio18/19,有些硬件用于usb,可能会导致代码卡顿

界面与设备交互原理简述

  1. 在控制台自定义页面拖入一个布尔按钮组件,该组件默认的关键字是enabled
  2. 在应用点击这个按钮,应用会向设备发送json消息{"enabled":1},这里的1表示开
  3. 设备收到enable:1后把IO设为高,同时回复应用{"enabled":1},按钮把样式置为开 更多关于界面工作原理,请参考界面工作原理

开始使用ESP32

使用流程简述

  1. 准备项目信息(必须是WIFI类型项目,不是蓝牙或者物联项目)
  2. 在代码中填入项目信息
  3. 获取您ESP32的WIFI MAC地址。注意,ESP32有蓝牙MAC和WIFI MAC
  4. 在小机云控制台,选择您的WIFI项目,在设备列表中,使用您的MAC地址(不要冒号)创建设备
  5. 查看小程序/APP下发的数据
  6. 上传您的数据到小程序/APP

1. 准备项目信息

在电脑打开小机云控制台 xsgee.com。创建或选择您的WIFI项目。在更多中查看项目详情,如下图。要注意:是蓝牙项目,不是WIFI项目

项目卡片

我们需要准备三个信息,ProjectId,ProjectSecret,设备校验内容内容(KEY_CONTENT)

项目信息

2. 填入项目信息

您只需要根据您的项目类型,把上面拿到的项目信息填入到您的代码中

arduino配置项目信息

c
//ProjectId
#define X_PROJECT_ID "your_project_id"
//ProjectSecret
#define X_PROJECT_SECRET "your_project_secret"

python填入项目信息

python
PROJECT_CONFIG = {
"project_id": "your_project_id",
"project_secret": "your_project_secret",
}

idf填入项目信息

c++
#define CONFIG_PROJECT_ID "your_project_id"
#define CONFIG_PROJECT_SECRET "your_project_secret"

3. 获取您的WIFI MAC

您可以通过下面方式获取您的WIFI MAC

arduino打印WIFI mac地址

c++
char g_serialNo[13]; 
int mac_len = 6;
uint8_t mac[mac_len];
WiFi.macAddress(mac);
snprintf(g_serialNo, sizeof(g_serialNo), "%s", XUtils::hexToStr((char *)mac, mac_len).c_str());
Serial.printf("SerialNo: %s", g_serialNo);

python获取并打印WIFI mqc

python
def get_mac_address():
    """获取无冒号的MAC地址"""
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    mac_bytes = wlan.config('mac')
    
    mac_str = ""
    raw_mac_str = ""
    for b in mac_bytes:
        hex_str = "%02x" % b
        mac_str += hex_str
        raw_mac_str += hex_str + ":"
    
    mac_str = mac_str.upper()
    raw_mac_str = raw_mac_str[:-1].upper()
    
    return mac_str

idf打印蓝牙MAC地址

c
uint8_t mac_addr[6];

// 读取WIFI MAC 地址
esp_read_mac((uint8_t *)mac_addr, ESP_MAC_EFUSE_FACTORY);

// 打印 MAC 地址
printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
       mac_addr[0], mac_addr[1], mac_addr[2],
       mac_addr[3], mac_addr[4], mac_addr[5]);

4. 创建设备

在您刚才选择的WIFI 项目中,进入项目-->设备列表-->创建设备。输入上面得到的MAC地址(注意是无冒号),选择任意分组,点击创建即可

TIP

到此已经配置完成,配置好WIFI设备会自动连接小机云,连接成功设备可以和应用进行通讯

小程序

小机云物联小程序

5. 收发数据

arduino收发数据

c++
//xsgee-esp32-iot-arduino.ino
class MyMQTTCallback : public MQTTCallback{
  // 收到MQTT消息的回调函数
  void onMessage(char* topic, byte* payload, unsigned int len) override{
    // 先构造字符串,payload不是以null结尾的
    String msg = "";
    for (unsigned int i = 0; i < len; i++) {
      msg += (char)payload[i];
    }
    XLOGI("MQTT received: %s", msg.c_str());
  
    StaticJsonDocument<128> jsonDoc;
    DeserializationError jsonError = deserializeJson(jsonDoc, msg);
    if (jsonError) {
      XLOGE("MQTT Parse JSON error: %s", msg.c_str());
      return;
    }

    pageDataDriver.handler(jsonDoc);
  }
};

//PageDataDriver.cpp
//处理应用发下来的消息,设置硬件状态
void PageDataDriver::handler(JsonDocument jsonDoc) {

  if (jsonDoc.containsKey("out1")) {
    int v = jsonDoc["out1"];
    XLOGD("set switch value:%d", v);
    if (v) {
      // 硬件LED控制开
      digitalWrite(LED_PIN, HIGH);
      m_ledState = 1;
    } else {
      // 硬件LED控制关
      digitalWrite(LED_PIN, LOW);
      m_ledState = 0;
    }
  } else if (jsonDoc.containsKey("pwm2")) {
    int v = jsonDoc["pwm2"];
    XLOGD("set pwm2 value:%d", v);
    analogWrite(PWM_PIN, v);
    m_pwm = v;
  }

  uploadData();
}

//上传消息到小机云,应用也会收到上传的消息
void PageDataDriver::uploadData() {
  getTemperature();
  getButtonState();

  StaticJsonDocument<128> jsonDoc;
  jsonDoc["out1"] = m_ledState;
  jsonDoc["pwm2"] = m_pwm;
  jsonDoc["t1"] = m_temperature;
  jsonDoc["in1"] = m_buttonState;

  if (sendFnc != nullptr) {
    sendFnc(jsonDoc.as<String>().c_str(), jsonDoc.as<String>().length());
  }
}

python收发数据

python
# main.py
driver = PageDataDriver()
# ==================== MQTT 回调函数 ====================
def mqtt_subscribe_callback(topic, msg):
    """MQTT 订阅消息回调"""
    print("Received:")
    print("   Topic: " + topic.decode('utf-8'))
    print("   Content: " + msg.decode('utf-8'))
    driver.handler(msg.decode('utf-8'))

# PageDataDriver.py
# 处理应用发下来的消息,设置硬件状态
def handler(self, jsonStr):
    try:
        # 解析JSON
        jsonDoc = json.loads(jsonStr)
        
        if "out1" in jsonDoc:
            v = int(jsonDoc["out1"])
            print(f"switch value:{v}")
            if v:
                self.led.value(1)
                self.m_ledState = 1
            else:
                self.led.value(0)
                self.m_ledState = 0
        elif "pwm1" in jsonDoc:
            v = int(jsonDoc["pwm1"])
            print(f"set pwm1 value:{v}") 
            self.pwm.duty(v * 1023 // 100)
            self.m_pwm = v
        
        self.uploadData()
        
    except Exception as e:
        print(f"handler error: {e}")

# 上传消息到小机云,应用也会收到上传的消息
def uploadData(self):
    self.getTemperature()
    self.getButtonState()
    
    jsonDoc = {
        "out1": self.m_ledState,
        "pwm1": self.m_pwm,
        "t1": self.m_temperature,
        "in1": self.m_buttonState,
        "color": self.generateColor()
    }
    
    if self.sendFnc is not None:
        jsonStr = json.dumps(jsonDoc)
        self.sendFnc(jsonStr, len(jsonStr))