当前位置: 首页 > news >正文

通用物联网开发板设计:基于ESP8266的硬件集成与开发实践

1. 项目概述为什么我们需要一块“通用”的物联网开发板在捣鼓了几年物联网项目之后我发现自己桌面上堆满了各种开发板ESP8266、ESP32、Arduino Uno、STM32 Nucleo……每个项目都要重新连线、配置电源、焊接传感器接口调试过程繁琐不说板子之间还经常“打架”占用了大量宝贵的桌面空间。更头疼的是当你想快速验证一个想法时光是搭建硬件基础就要花上半天。于是一个念头冒了出来能不能有一块板子它足够“通用”能覆盖我大部分的中小型物联网原型需求让我拿到手就能直接开干把精力集中在创意和代码上而不是重复的硬件搭建上这就是我设计这块“Universal IoT Dev Board”的初衷。它不是一个追求极致性能或最小尺寸的板子而是一个面向实际开发者的“瑞士军刀”。它的核心设计理念是“开箱即用”和“灵活扩展”。基于成熟且成本低廉的ESP8266核心我围绕它集成了项目中最常需要的功能模块一个稳定的开关电源SMPS、充足的数字和模拟IO、实时时钟RTC、以及可选的蓝牙和温湿度传感器接口。所有这些被集成在一块100mm x 60mm的PCB上大小适中既方便手持调试也易于装入项目外壳。这块板子的目标用户非常明确就是像我一样的物联网爱好者、创客、学生以及需要快速进行产品原型的工程师。如果你厌倦了每次都要从面包板开始如果你希望有一个可靠、功能全面的硬件平台来承载你的各种物联网奇思妙想那么这块板子可能就是为你准备的。它最大的价值在于将开发环境中那些琐碎、重复但又至关重要的基础工作标准化了让你能真正专注于“开发”本身。2. 核心硬件设计与选型解析2.1 主控芯片为何坚守ESP8266在ESP32大行其道的今天选择ESP8266作为核心似乎有些“复古”。但经过深思熟虑我认为对于一块定位为“通用”和“入门友好”的开发板ESP8266依然是最佳选择。首先是极低的成本和极高的市场普及度。这意味着任何拿到这块板子的人都能在网上找到海量的教程、库文件和社区支持学习曲线非常平缓。其次对于绝大多数物联网原型来说ESP8266的性能完全够用。它内置的Wi-Fi功能是物联网的“入场券”而它的处理能力和内存80MHz主频约80KB用户可用RAM足以运行复杂的网络逻辑、处理传感器数据并连接主流的云平台如阿里云物联网平台、腾讯云IoT Explorer、OneNET等。当然ESP8266的局限性我也很清楚比如只有一个可用的ADC引脚、缺乏蓝牙等。但这正是我设计这块“通用”板的意义所在——通过外围电路来弥补核心的不足。例如我通过模拟开关扩展出了6个ADC通道通过外置芯片实现了5路DAC输出。这样用户既能享受到ESP8266生态的便利又能获得远超其原生能力的功能接口。这是一种务实的“性价比”思维而不是盲目追求最新最强的芯片。2.2 电源系统从“凑合”到“可靠”的飞跃很多入门开发板使用简单的线性稳压器如AMS1117这在连接USB调试时问题不大但一旦接入外部电源驱动电机、继电器等负载发热和压降问题就非常明显。为了确保板子在各种工况下的稳定性我为这块板子设计了一套基于开关电源SMPS的供电方案。我选用了一颗经典的同步降压开关稳压器芯片例如MP2307或类似的型号。它的输入电压范围很宽典型4.5V到24V可以轻松适配常见的12V电源适配器、锂电池组或太阳能板。其输出被严格稳定在3.3V这是ESP8266和板上大部分外设的工作电压。开关电源的效率通常能达到85%以上这意味着即使输入12V输出1A电流芯片的发热也远低于线性稳压器大大提升了系统的可靠性和带载能力。注意在设计开关电源电路时电感、电容的选型和PCB布局布线至关重要。电感的饱和电流必须留有余量输入输出电容要尽可能靠近芯片引脚大电流路径要短而粗。一个糟糕的布局可能导致电源纹波巨大进而引起Wi-Fi连接不稳定或单片机重启。2.3 接口资源规划如何定义“通用”“通用”意味着接口既要全面又要合理。我规划了16个数字GPIO、6路ADC输入和5路DAC输出这基本覆盖了一个中小型物联网节点的所有典型需求。16个数字IO这些引脚全部通过排针引出并且大部分都具备复用功能如I2C、SPI、UART。其中我特意将ESP8266硬件I2C和SPI的引脚分组排列并预留了上拉电阻的位置方便直接连接OLED屏幕、传感器模块等。部分GPIO还设计了LED和按键作为基础输入输出调试之用。6路ADCESP8266本身只有一个ADC引脚TOUT为了扩展我使用了一颗模拟多路复用器芯片如CD74HC4067。这是一个16选1的模拟开关我用它来轮询多达6路模拟传感器如光照强度、土壤湿度、电位器。通过程序控制可以分时读取多路模拟量虽然不能同时采样但对于变化不快的环境监测场景完全足够。5路DACESP8266没有真正的DAC我使用了一颗PWM转模拟电压的专用芯片或者一种低成本方案利用RC低通滤波器将ESP8266硬件PWM输出的方波滤波成平滑的直流电压。这样就能实现真正的模拟电压输出用于控制LED灯亮度、电机转速或者生成简单的音频信号极大地扩展了板子的应用场景。2.4 可选功能模块蓝牙与温湿度传感器的意义板子上预留了HC-05蓝牙模块和DHT22温湿度传感器的接口焊盘。它们被设计为“可选”是因为并非每个项目都需要。HC-05蓝牙在Wi-Fi配置SmartConfig不顺利或者需要与手机APP进行短距离、低功耗、点对点通信时蓝牙是完美的补充。例如你可以做一个蓝牙遥控小车或者通过手机蓝牙为设备配置Wi-Fi密码这比在代码里硬编码密码要方便和安全得多。DHT22传感器温湿度是环境监测中最基础、最常用的参数。直接将其集成在板上意味着你拿到板子通电后几分钟内就能读到真实的温湿度数据并上传到云端实现一个完整的“Hello World”级物联网应用。这能带给初学者巨大的成就感快速进入开发状态。这种“核心板可选插件”的设计既控制了基础版本的成本又为有特定需求的用户提供了极大的便利。你不需要的话可以不焊接节省几块钱成本你需要的话直接插上或焊上就能用省去了外接模块的麻烦。3. 板载功能详解与实操要点3.1 实时时钟RTC的妙用不止于显示时间我为一款低功耗的实时时钟芯片如DS3231预留了位置。很多人觉得物联网设备联网后可以从网络获取时间NTPRTC是多余的。但在实际项目中RTC的价值巨大。首先低功耗定时唤醒。在电池供电的场景下ESP8266可以深度睡眠Deep Sleep此时只有RTC在耗电微安级别。RTC可以在设定的时间比如每半小时产生一个中断信号唤醒ESP8266进行数据采集和上传然后继续睡眠。这是实现设备长达数月续航的关键。其次保证事件记录的连续性。在网络不稳定或断开时设备依然可以依靠RTC的准确计时来为本地记录的数据打上时间戳。待网络恢复后这些带有时标的数据能有序地上传不会乱序。实操心得DS3231这类芯片精度很高但初始化时需要正确设置时间。我通常在setup()函数中先尝试从NTP服务器获取网络时间如果成功就用这个时间校准RTC如果失败则读取RTC的时间作为系统时间。这样保证了设备在任何情况下都有一个可靠的时间源。焊接时注意给RTC备份供电的纽扣电池座一定要安装否则断电后时间会丢失。3.2 模拟输入扩展ADC MUX的驱动逻辑使用模拟多路复用器扩展ADC需要在软件上实现通道切换。以CD74HC4067为例它有4个控制引脚S0-S3通过这4个引脚的高低电平组合选择16个通道中的一个连接到公共输出端COM而COM端则连接到ESP8266唯一的ADC引脚。// 定义控制引脚 #define S0 12 #define S1 13 #define S2 14 #define S3 15 void selectMuxChannel(byte channel) { // 将通道号0-15转换为4位二进制分别控制S0-S3 digitalWrite(S0, bitRead(channel, 0)); digitalWrite(S1, bitRead(channel, 1)); digitalWrite(S2, bitRead(channel, 2)); digitalWrite(S3, bitRead(channel, 3)); // 切换后需要短暂延时让信号稳定 delayMicroseconds(10); } void setup() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // ... 其他初始化 } void loop() { int sensorValue; for (byte ch 0; ch 6; ch) { // 读取我们使用的6个通道 selectMuxChannel(ch); delay(1); // 更长的稳定时间特别是高阻抗传感器时 sensorValue analogRead(A0); // ESP8266的ADC引脚 Serial.print(Channel ); Serial.print(ch); Serial.print(: ); Serial.println(sensorValue); } delay(1000); }注意事项模拟开关本身有导通电阻几十到上百欧姆并且不同通道间可能存在微小的偏移。对于精度要求不高的传感器如光敏电阻没问题但对于需要高精度测量的如PT100测温建议还是使用专门的ADC芯片。此外切换通道后必须等待足够时间delayMicroseconds或delay(1)让ADC输入端的电压稳定下来否则读数会不准。3.3 PWM转DAC输出的滤波与精度用PWM加低通滤波器实现DAC是一种经济实惠的方案。ESP8266的PWM频率可以设置得很高比如1kHz然后通过一个简单的RC滤波器电阻电容将方波滤成直流电压。输出电压值由PWM的占空比决定。计算示例假设我们使用3.3V系统PWM分辨率为10位0-1023。当占空比设置为512时理论输出平均电压为 3.3V * (512 / 1023) ≈ 1.65V。经过RC低通滤波器后纹波电压的大小取决于RC时间常数和PWM频率。时间常数 τ R * C 越大滤波效果越好输出电压越平滑但响应速度也越慢电压变化需要更长时间才能稳定到新值。对于大多数控制应用如调光响应速度慢一点不是问题。我通常选择R1kΩ C10μF这样τ10ms对于1kHz的PWM能有很好的滤波效果。你可以在滤波器后面再加一个电压跟随器运算放大器来提供驱动能力避免后级电路影响DAC输出电压。实操要点校准由于ESP8266的PWM输出电平、电阻电容精度的影响理论值和实际值可能有偏差。最好用万用表实际测量几个关键占空比如0 512 1023对应的输出电压在程序里做一个简单的线性查找表进行校准。分辨率与纹波权衡提高PWM频率可以减少纹波但某些库或硬件可能限制了最高有效分辨率。你需要测试找到一个平衡点。对于ESP82661kHz频率和10位分辨率是比较稳定的组合。4. 软件开发与环境搭建实战4.1 Arduino IDE配置与板型支持这块板子编程的核心是Arduino IDE因为它生态最好库最全。虽然板子物理上是自定义的但核心是ESP8266所以我们可以利用社区已经做好的基础支持。安装ESP8266开发板支持打开Arduino IDE进入“文件”-“首选项”在“附加开发板管理器网址”中输入http://arduino.esp8266.com/stable/package_esp8266com_index.json。然后进入“工具”-“开发板”-“开发板管理器”搜索“esp8266”安装“esp8266 by ESP8266 Community”。选择开发板安装后在“工具”-“开发板”中你会看到一系列ESP8266板型。由于我们的板子使用了标准的ESP-12F模块你可以选择“NodeMCU 1.0 (ESP-12E Module)”作为配置基准。两者的引脚定义和Flash大小基本一致。关键参数配置Flash Size: 选择“4MB (FS:3MB OTA:~1019KB)”。这是ESP-12F常见的配置为文件系统和OTA升级留出空间。Upload Speed: 设置为“115200”或“921600”以获得更快的上传速度。Port: 选择你的USB转串口芯片对应的端口。4.2 编写第一个测试程序点亮板载LED与读取DHT22让我们写一个简单的综合测试程序验证核心功能是否正常。这个程序会闪烁板载LED并读取集成或外接的DHT22数据。#include DHT.h // 需要安装DHT sensor library // 定义引脚 #define LED_PIN 2 // ESP8266模块上的内置LED低电平点亮 #define DHTPIN 4 // 假设DHT22数据线连接在GPIO4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); // 初始熄灭LED dht.begin(); Serial.println(\nUniversal IoT Dev Board Test Start...); } void loop() { // 1. 闪烁LED digitalWrite(LED_PIN, LOW); // 点亮 delay(200); digitalWrite(LED_PIN, HIGH); // 熄灭 delay(800); // 总共1秒周期亮0.2秒灭0.8秒 // 2. 读取温湿度每2秒读一次DHT22读取较慢 static unsigned long lastDHTRead 0; if (millis() - lastDHTRead 2000) { lastDHTRead millis(); float h dht.readHumidity(); float t dht.readTemperature(); // 读取摄氏温度 // 检查读数是否有效 if (isnan(h) || isnan(t)) { Serial.println(Failed to read from DHT sensor!); return; } Serial.print(Humidity: ); Serial.print(h); Serial.print( %\t); Serial.print(Temperature: ); Serial.print(t); Serial.println( *C); } }将这个程序上传到板子打开串口监视器你应该能看到LED有规律地闪烁并且每2秒打印一次温湿度数据如果连接了DHT22。这证明了你的开发环境、基础GPIO控制和传感器库都是正常的。4.3 连接Wi-Fi与MQTT协议上传数据物联网的核心是连接。这里我们演示如何连接本地Wi-Fi并通过MQTT协议将DHT22的数据发布到一台MQTT服务器例如本地搭建的Mosquitto或者免费的公共测试服务器。你需要安装PubSubClient库。在Arduino IDE的库管理中搜索并安装。#include ESP8266WiFi.h #include PubSubClient.h #include DHT.h // WiFi配置 const char* ssid Your_WiFi_SSID; const char* password Your_WiFi_Password; // MQTT配置 const char* mqtt_server broker.hivemq.com; // 使用公共测试服务器 const int mqtt_port 1883; const char* mqtt_topic_temp universal-iot/your-board-id/temperature; const char* mqtt_topic_humid universal-iot/your-board-id/humidity; WiFiClient espClient; PubSubClient client(espClient); DHT dht(DHTPIN, DHTTYPE); void setup_wifi() { delay(10); Serial.println(); Serial.print(Connecting to ); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(); Serial.println(WiFi connected); Serial.println(IP address: ); Serial.println(WiFi.localIP()); } void reconnect() { // 循环直到重新连接 while (!client.connected()) { Serial.print(Attempting MQTT connection...); String clientId UniversalIoT-; clientId String(random(0xffff), HEX); // 生成随机客户端ID 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() { Serial.begin(115200); dht.begin(); setup_wifi(); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // 维持MQTT连接处理传入消息 static unsigned long lastMsg 0; if (millis() - lastMsg 10000) { // 每10秒发布一次 lastMsg millis(); float h dht.readHumidity(); float t dht.readTemperature(); if (!isnan(h) !isnan(t)) { // 将浮点数转换为字符串 char tempString[8]; char humidString[8]; dtostrf(t, 6, 2, tempString); // 宽度6保留2位小数 dtostrf(h, 6, 2, humidString); // 发布消息 client.publish(mqtt_topic_temp, tempString); client.publish(mqtt_topic_humid, humidString); Serial.print(Published: temp); Serial.print(tempString); Serial.print(, humid); Serial.println(humidString); } } }这个程序实现了设备上云的核心逻辑。你可以使用MQTT客户端工具如MQTTX订阅对应的主题就能实时收到板子发送的温湿度数据了。5. 典型应用场景与项目构思5.1 智能家居环境监测节点这是最直接的应用。将板子放在客厅、卧室或阳台利用板载的DHT22监测温湿度还可以通过ADC扩展接口连接其他传感器比如MQ-135检测空气质量VOC、CO2等。声音传感器监测环境噪音水平。光照传感器感知光线强度用于自动窗帘或灯光调节。板子通过Wi-Fi将数据定时上报到家庭本地的服务器如运行Home Assistant的树莓派或云端。你可以设置报警规则当温度过高、湿度过大或空气质量差时通过手机APP收到通知甚至可以联动家里的空调、加湿器或空气净化器。项目要点这个场景下功耗不是首要考虑因素常供电重点是稳定性和数据的可视化。你可以用Node-RED或Grafana来搭建一个漂亮的仪表盘实时展示所有环境数据。5.2 低功耗远程农业传感器对于电池供电的户外农业监测如大棚、果园低功耗是关键。这时板载的RTC和ESP8266的深度睡眠功能就派上用场了。你可以连接土壤湿度传感器模拟量输出到ADC扩展口连接DS18B20温度传感器数字单总线到某个GPIO。程序逻辑如下RTC定时例如每30分钟唤醒ESP8266。ESP8266上电初始化传感器读取土壤湿度和温度数据。连接Wi-Fi如果信号好通过MQTT或HTTP将数据发送出去。断开连接进入深度睡眠模式并告诉RTC“30分钟后叫醒我”。整个系统除RTC和传感器外全部断电功耗可降至几十微安。一块大容量的锂电池可以让这样的设备工作好几个月。板子上丰富的IO口也允许你连接多个土壤探头监测不同区域的情况。5.3 工业现场信号采集与转发器在一些轻量级的工业或实验室场景这块板子可以作为廉价的分布式数据采集节点。它的5路DAC输出可以用来模拟0-3.3V的控制信号控制比例阀、调速器等。6路ADC输入可以连接各种变送器输出的标准模拟信号如4-20mA电流环需通过精密电阻转换为电压。例如你可以用它来监测一个小型水处理实验装置的多点温度和pH值并通过Wi-Fi将数据集中发送到上位机。由于ESP8266支持简单的Web服务器你甚至可以直接在浏览器里输入设备的IP地址查看一个简单的实时数据页面。注意事项工业环境干扰大需要做好信号的隔离和滤波。模拟信号输入部分可以考虑使用隔离运放模块电源部分最好使用隔离的DC-DC模块PCB布局上模拟和数字部分要分开地线处理要小心。6. 常见问题与硬件调试技巧实录6.1 上电无反应或无法烧录程序这是新手遇到最多的问题通常和电源与串口有关。检查电源首先确认供电是否正常。使用万用表测量3.3V稳压芯片的输出端是否有稳定的3.3V。如果使用USB转串口模块供电注意有些模块的5V输出带载能力很弱可能无法启动ESP8266。建议使用外部5V或12V电源通过板载SMPS供电。检查启动模式ESP8266烧录程序需要特定的引脚电平组合。通常需要将GPIO0拉低进入下载模式然后复位。我的板子上设计了一个“下载”按钮按下时会同时将GPIO0拉低并触发复位。请确保在点击Arduino IDE的上传按钮后再按下这个按钮。检查串口驱动与连接确认电脑已安装USB转串口芯片如CH340、CP2102的驱动。在设备管理器中查看端口号是否正确。尝试降低上传波特率如115200。6.2 Wi-Fi连接不稳定或经常断开电源纹波问题这是导致Wi-Fi异常的最常见硬件原因。用示波器观察3.3V电源线在ESP8266发射Wi-Fi信号时电流突变电压是否有大幅跌落或毛刺。重点检查开关电源的输入输出电容是否足够、是否紧贴芯片引脚。可以在3.3V电源上额外并联一个100-470uF的电解电容试试。天线问题ESP-12F模块板载了PCB天线。确保天线区域板子尾部那一块没有被金属物体覆盖或紧贴最好朝向空旷方向。如果信号环境极差可以考虑外接IPEX接口的胶棒天线。软件配置在代码中可以增加Wi-Fi断开重连的机制并适当增加重连等待时间。避免在loop()中频繁执行WiFi.begin()。6.3 ADC读数不准或不稳定参考电压ESP8266的ADC参考电压默认是电源电压VCC而VCC本身可能波动。这会导致ADC读数随电源变化。对于精度要求高的场合可以启用ESP8266的analogRead()函数中设置外部参考电压的选项如果固件支持或者使用一个稳定的基准电压源芯片如TL431为传感器单独供电并进行软件校准。模拟开关的影响如前所述模拟多路复用器有导通电阻且通道间有串扰。对于高阻抗信号源导通电阻会导致分压使读数偏小。可以在ADC输入端ESP8266的A0引脚加一个电压跟随器运放作为缓冲提供低输出阻抗。噪声滤波在ADC输入引脚到地之间加一个0.1uF的瓷片电容可以滤除高频噪声。软件上可以采用多次采样取平均值的算法来平滑读数。6.4 DAC输出带载能力差通过PWMRC滤波产生的DAC输出其驱动能力非常弱输出阻抗主要由滤波电阻R决定例如1kΩ。如果后级电路的输入阻抗不够高比如小于10kΩ就会明显拉低输出电压。解决方案在RC滤波器后面添加一个运算放大器构成的电压跟随器。电压跟随器的输入阻抗极高几乎不吸取电流输出阻抗极低可以驱动较大电流完美地解决了这个问题。一颗常见的单电源运放如LMV358就能胜任。这样你的DAC输出就变成了一个“真正”的、可用的模拟电压源了。经过这些设计和调试这块“Universal IoT Dev Board”从一个想法变成了我工作台上最得力的助手之一。它可能不是性能最强的但一定是“最顺手”的。它把那些繁琐的、重复的硬件调试工作都打包解决了让我能更快速地把想法变成现实。如果你也对这样一块板子感兴趣或者想基于这个思路做自己的版本我整理了一份更详细的物料清单BOM和原理图说明。
http://www.rkmt.cn/news/1382750.html

相关文章:

  • 集成Taotoken为OpenClaw工作流提供持久化模型支持
  • DeepSeek到底强在哪?拆解HuggingFace Open LLM Leaderboard最新排名背后的5层测试逻辑:从基础token匹配到因果链推理深度验证
  • 2023B卷,食堂供餐
  • 通过curl命令快速测试Taotoken多模型接口连通性
  • QML 架构之美:拒绝“意大利面条式”代码,从掌握信号(Signal)通信开始
  • 长鑫、长江存储有望破万亿市值,人民币基金迎来超级回报时刻
  • 别再踩坑了!Unity AR项目发布安卓时,这几个Player Settings设置必须改(以Vuforia为例)
  • 全面讲解 OpenClaw 本地部署相关知识点
  • Unity DllNotFoundException 根因解析与跨平台插件加载四关卡
  • obfs4协议原理与企业级抗DPI混淆部署实战
  • 量子计算编译器:自动化资源分配与优化实践
  • Apache路径规范化与访问控制时序漏洞深度解析
  • 百考通AI降重/降AIGC:彻底解决各环节的创作难题
  • 微信小程序抓包原理与Proxifier+Burp实战配置
  • 【收藏级】2026 年 AI 大模型保姆级学习路线,小白 / 程序员从零入门到落地精通
  • 卷到今天,Agent的含金量还在提升丨AIGC2026圆桌论坛
  • 2026年4月靠谱的马氏体不锈钢板生产厂家推荐,不锈铁板材/430不锈钢板材/不锈铁中厚板,马氏体不锈钢板生产厂家哪家好 - 品牌推荐师
  • 对比按量计费与Token Plan套餐在长期项目中的成本差异
  • API渗透测试:从契约理解到业务逻辑攻防实战
  • 技术人的“数字排毒”:周末不看屏幕的尝试与结果
  • 从‘争抢频道’到‘预约时段’:TDMA如何让LINK16数据链在复杂战场环境下‘井然有序’地通信
  • 为OpenClaw智能体工作流配置Taotoken作为多模型供应商的详细步骤
  • 孩子皮肤敏感,用什么品牌的家纺不刺激?水星家纺领衔:儿童敏感肌科学选购之道 - 品牌评测官
  • 可解释机器学习破解星系演化之谜:随机森林与EBM揭示重子保留关键
  • 用Arduino和micro:bit点燃孩子科技好奇心:微控制器启蒙教学全指南
  • 炉石传说脚本:3步实现智能自动对战的完整指南
  • 终极指南:如何5分钟开启ZTE光猫工厂模式,释放完整管理权限
  • Frida Hook签名校验实战:Android逆向绕过全链路指南
  • UE5材质实战:用材质参数集和Actor蓝图,5分钟搞定可拖拽的球形遮罩
  • Godot做2D像素风Steam游戏,真的比Cocos香吗?聊聊我的踩坑与选型心得