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,可能会导致代码卡顿界面与设备交互原理简述
- 在控制台自定义页面拖入一个布尔按钮组件,该组件默认的关键字是
enabled - 在应用点击这个按钮,应用会向设备发送json消息
{"enabled":1},这里的1表示开 - 设备收到enable:1后把IO设为高,同时回复应用
{"enabled":1},按钮把样式置为开 更多关于界面工作原理,请参考界面工作原理
开始使用ESP32
使用流程简述
- 准备项目信息(必须是WIFI类型项目,不是蓝牙或者物联项目)
- 在代码中填入项目信息
- 获取您ESP32的WIFI MAC地址。注意,ESP32有蓝牙MAC和WIFI MAC
- 在小机云控制台,选择您的WIFI项目,在设备列表中,使用您的MAC地址(不要冒号)创建设备
- 查看小程序/APP下发的数据
- 上传您的数据到小程序/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_stridf打印蓝牙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))
小机云