尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【训练营】立创EDA实战:从零打造物联网智能时钟(含PCB设计、ESP32编程与云端连接)

【训练营】立创EDA实战:从零打造物联网智能时钟(含PCB设计、ESP32编程与云端连接) 【训练营】立创EDA实战从零打造物联网智能时钟含PCB设计、ESP32编程与云端连接大家好我是老张一个在嵌入式行业摸爬滚打了十来年的工程师。最近很多刚入门的朋友问我想学物联网开发但感觉硬件、软件、云端都要懂不知道从哪里下手。今天我就用一个“物联网智能时钟”的项目带大家走一遍完整的开发流程。从画电路板、写代码到连上云端咱们一步步来保证你做完这个项目对物联网开发有个清晰的认识。这个项目咱们会用到立创EDA来设计电路板用ESP32做主控芯片再配上一些传感器和显示屏最后把数据上传到云端。听起来复杂但拆解开每一步都不难。我会把我在实际项目中踩过的坑、总结的技巧都分享出来让你少走弯路。1. 项目规划与核心硬件选型做项目第一步不是急着画图写代码而是先想清楚我们要做什么。这个“物联网智能时钟”核心功能有哪些呢我把它拆解了一下基本功能能显示时间、日期、星期。物联网功能能自动从网络同步时间保证时钟精准。环境感知能显示当前的温湿度。交互功能可以通过按键或手机来调整设置。想清楚了功能咱们就来选“演员”——也就是核心的硬件元器件。选型就像搭积木选对了后面开发就顺畅。1.1 主控芯片为什么是ESP32主控芯片是项目的大脑。对于物联网项目我首推ESP32。原因很简单双核处理器性能足够强跑个系统、处理网络协议绰绰有余。内置Wi-Fi和蓝牙这是它最大的优势省去了外接无线模块的麻烦和成本让设备轻松联网。丰富的外设有足够的GPIO通用输入输出引脚去连接屏幕、传感器还有ADC模数转换器、DAC数模转换器等。开发环境成熟支持Arduino框架和ESP-IDF乐鑫官方开发框架资料多社区活跃新手遇到问题很容易找到答案。市面上ESP32的模块很多比如ESP32-WROOM-32、ESP32-S系列。对于这个项目咱们选用最常见的ESP32-WROOM-32模块就足够了它集成了芯片、晶振和天线我们直接把它当做一个“黑盒子”焊在板子上就行非常方便。1.2 其他关键元器件显示屏为了显示信息我们选用一块0.96寸的OLED屏幕SSD1306驱动。这种屏幕是自发光的显示效果清晰而且只需要I2C两根线就能驱动节省引脚。温湿度传感器选用经典的DHT11或精度更高的DHT22。它们也是通过一根数据线通信使用简单。实时时钟RTC虽然ESP32联网后可以从网络获取时间但断网后也需要保持走时。我们可以加一个DS3231模块它自带高精度晶振和电池座断电后靠纽扣电池继续走时非常可靠。电源整个系统可以用USB Type-C接口供电配合一颗AMS1117-3.3稳压芯片将5V USB电压稳定到3.3V给ESP32和其他器件使用。按键与接口留出2-3个按键用于本地设置同时把ESP32的串口调试引脚TX/RX引出来方便下载程序和调试。2. 使用立创EDA进行PCB设计硬件选型定了接下来就是“盖房子”——设计电路板。这里咱们用国产的优秀工具立创EDA它免费、在线、对中文用户友好特别适合初学者。2.1 原理图设计把思路画成图纸原理图就像建筑的施工图纸它用符号表示元器件用线表示连接关系不关心元器件实际摆在哪里。创建工程与器件库在立创EDA中新建一个工程。然后使用它的“元件库”搜索我们需要的元器件比如“ESP32-WROOM-32”、“SSD1306”、“DHT11”等。通常都能找到官方或社区维护的符号和封装直接调用非常省事。放置与连接核心器件首先放置ESP32模块。找到它的原理图符号拖到画布上。重点连接电源部分从USB口进来的5V连接到AMS1117-3.3的输入端VinAMS1117的输出端Vout3.3V连接到ESP32的3V3引脚并为其他所有需要3.3V的器件供电。切记ESP32的供电电压必须是3.3V接5V会烧毁连接OLED屏幕找到SSD1306的符号。将它的VCC接3.3VGND接地SCL和SDA分别连接到ESP32的任意一组I2C引脚上例如GPIO22 (SCL)和GPIO21 (SDA)。连接DHT11传感器将其VCC接3.3VGND接地DATA引脚连接到ESP32的一个GPIO比如GPIO4并且在这个数据引脚到3.3V之间加一个4.7K-10K的上拉电阻这是保证数据通信稳定的关键。连接DS3231 RTC同样VCC和GND接好SCL和SDA可以和OLED屏幕共用ESP32的I2C引脚因为I2C总线支持多个设备。去耦电容这是一个容易忽略但至关重要的细节。在ESP32的电源引脚3V3附近一定要放置一个0.1uF104的陶瓷电容到地用于滤除电源噪声确保芯片稳定工作。最好在每个主要芯片的电源脚附近都放一个。提示画原理图时多用“网络标签”Net Label来代替长长的连线让图纸更清晰。比如把3.3V电源网络标为“3V3”地网络标为“GND”。2.2 PCB布局与布线把图纸变成实物原理图检查无误后点击“设计”-“转换到PCB”就进入了电路板实物设计阶段。板框与布局首先在“层”设置中切换到“边框层”画出你想要的电路板外形比如一个矩形。开始摆放元器件。核心原则先大后小先主后次。固定器件优先先把USB接口、按键这些需要固定在板边上的器件放好。核心器件居中将ESP32模块放在板子中央或略靠上的位置。围绕核心布局将OLED屏幕考虑朝向用户、传感器、RTC、电源芯片等围绕ESP32放置尽量让连接它们的走线最短。电源路径清晰AMS1117应靠近USB输入口其输出端到ESP32的路径要短而粗。布线实战与规则点击“布线”工具开始连线。对于这种低频数字电路我们主要关注几点电源线要粗主电源路径如5V、3.3V的线宽可以设置到20-30mil0.5-0.76mm电流承载能力更强。信号线适中普通的GPIO、I2C信号线10-15mil0.25-0.38mm即可。避免直角走线尽量使用45度角或圆弧走线可以减少信号反射。为晶振“保驾护航”ESP32模块内部有晶振我们布局时要注意其下方PCB层不要走高速信号线避免干扰。铺铜增加稳定性布线完成后在顶层和底层进行“铺铜”并连接到地网络GND。这能提供一个稳定的地平面减少干扰增强电磁兼容性。设计规则检查DRC与下单完成布线后一定要使用立创EDA的“设计规则检查”功能。它会检查线距、线宽、未连接网络等常见错误。根据提示修改所有错误。检查无误后就可以在立创EDA内直接“下单”了。它支持一键生成Gerber生产文件并发送到旗下的嘉立创PCB工厂打样对于小尺寸板子经常有免费打样活动成本极低。3. ESP32程序开发与驱动编写板子送去打样了这段时间咱们正好来写代码。这里我以大家最熟悉的Arduino框架为例来讲解因为它上手最快。3.1 开发环境搭建与基础工程安装Arduino IDE与ESP32支持去Arduino官网下载IDE并安装。打开IDE点击“文件”-“首选项”在“附加开发板管理器网址”中输入https://espressif.github.io/arduino-esp32/package_esp32_index.json然后点击“工具”-“开发板”-“开发板管理器”搜索“esp32”找到并安装“Espressif Systems”提供的包。新建工程与库管理新建一个Sketch项目。我们需要用到几个库来驱动硬件。点击“项目”-“加载库”-“管理库”然后搜索安装Adafruit SSD1306和Adafruit GFX用于驱动OLEDDHT sensor library用于驱动DHT11RTClib用于驱动DS3231WiFi和NTPClient用于Wi-Fi连接和网络对时是ESP32核心自带的无需额外安装。3.2 编写核心功能代码下面我给出一个最精简的代码框架并附上详细注释。// 1. 引入必要的头文件 #include Wire.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h #include DHT.h #include RTClib.h #include WiFi.h #include NTPClient.h #include WiFiUdp.h // 2. 引脚定义根据你的实际PCB连接修改 #define DHTPIN 4 // DHT11数据引脚接GPIO4 #define DHTTYPE DHT11 // 使用DHT11传感器 #define OLED_SDA 21 // OLED的SDA接GPIO21 #define OLED_SCL 22 // OLED的SCL接GPIO22 // 3. 创建对象实例 DHT dht(DHTPIN, DHTTYPE); RTC_DS3231 rtc; Adafruit_SSD1306 display(128, 64, Wire, -1); // 128x64分辨率OLED WiFiUDP ntpUDP; // 使用上海NTP服务器时区偏移设为8小时*3600秒 NTPClient timeClient(ntpUDP, ntp1.aliyun.com, 8*3600, 60000); // 4. 你的Wi-Fi凭证 const char* ssid 你的Wi-Fi名称; const char* password 你的Wi-Fi密码; void setup() { Serial.begin(115200); // 启动串口调试波特率115200 // 初始化I2C总线用于OLED和RTC Wire.begin(OLED_SDA, OLED_SCL); // 初始化OLED显示屏 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址0x3C Serial.println(F(SSD1306分配失败)); for(;;); // 卡死 } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(系统启动中...); display.display(); delay(1000); // 初始化DHT传感器 dht.begin(); // 初始化RTC if (!rtc.begin()) { Serial.println(找不到RTC模块); display.clearDisplay(); display.setCursor(0,0); display.println(RTC错误); display.display(); while (1); } // 如果RTC丢失电源则设置时间为编译时间仅首次或更换电池后 if (rtc.lostPower()) { Serial.println(RTC失去电力设置时间); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } // 连接Wi-Fi display.clearDisplay(); display.setCursor(0,0); display.print(连接WiFi: ); display.println(ssid); display.display(); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); display.print(.); display.display(); } Serial.println(WiFi连接成功); display.clearDisplay(); display.setCursor(0,0); display.println(WiFi连接成功); display.display(); delay(1000); // 初始化NTP客户端并从网络获取时间 timeClient.begin(); timeClient.update(); // 获取一次时间 // 将网络时间同步到RTC unsigned long epochTime timeClient.getEpochTime(); rtc.adjust(DateTime(epochTime)); Serial.println(已从NTP同步时间到RTC); display.clearDisplay(); } void loop() { // 从RTC读取时间更稳定不受网络影响 DateTime now rtc.now(); // 读取温湿度 float humidity dht.readHumidity(); float temperature dht.readTemperature(); // 在OLED上显示所有信息 display.clearDisplay(); display.setCursor(0,0); // 显示时间 display.print(now.hour()); display.print(:); if(now.minute() 10) display.print(0); // 分钟补零 display.print(now.minute()); display.print(:); if(now.second() 10) display.print(0); // 秒钟补零 display.println(now.second()); // 显示日期 display.print(now.year()); display.print(/); display.print(now.month()); display.print(/); display.println(now.day()); // 显示温湿度 display.print(Temp: ); display.print(temperature); display.println( C); display.print(Hum: ); display.print(humidity); display.println( %); display.display(); // 将缓存内容刷到屏幕上 // 每隔一段时间如10秒尝试同步一次网络时间 static unsigned long lastSync 0; if (millis() - lastSync 10000) { if (WiFi.status() WL_CONNECTED) { timeClient.update(); unsigned long epochTime timeClient.getEpochTime(); rtc.adjust(DateTime(epochTime)); Serial.println(RTC时间已同步); } lastSync millis(); } delay(1000); // 每秒刷新一次 }代码要点解析双时间源我们以RTCDS3231为主要时间源因为它稳定、精确、断电可运行。NTP网络时间仅用于定期校准RTC。这样即使断网时钟也能继续精准走时。显示逻辑所有数据先在内存display对象的缓存中绘制好最后调用一次display.display()统一刷新到屏幕避免闪烁。错误处理对OLED、RTC的初始化进行了检查如果失败会通过串口打印错误并停住方便调试。Wi-Fi连接连接过程有状态提示在OLED上用户体验更好。4. 物联网云端连接与数据上传本地功能实现了接下来让我们把它变成真正的“物联网”设备——将温湿度数据上传到云端并可以在手机端查看。这里我选用国内比较常用的Blinker平台因为它对Arduino和ESP32支持很好上手简单。4.1 云端平台配置与设备创建在手机应用市场下载“点灯Blinker”APP。注册账号并登录。在APP内点击“添加设备”选择“独立设备”-“网络接入”选择“阿里云”或其他提供的平台。系统会生成一个唯一的设备密钥Secret Key。复制保存好这个密钥它是你设备在云端的身份证。4.2 ESP32端接入代码首先在Arduino库管理中搜索并安装Blinker库。然后修改我们之前的代码添加Blinker支持// 在文件顶部添加Blinker头文件 #include Blinker.h // 定义你在APP端获取的设备密钥 char auth[] 你的Device Secret Key; // 定义Blinker组件用于在APP上显示数据 BlinkerNumber Number1(num-temp); // 温度组件键值为 num-temp BlinkerNumber Number2(num-hum); // 湿度组件键值为 num-hum void setup() { // ... 原有的setup代码初始化OLED、DHT、RTC等保持不变 ... // 初始化Blinker连接到Wi-Fi和云端 Blinker.begin(auth, ssid, password); // 使用你的Wi-Fi信息 // 将温湿度组件注册到Blinker Number1.attach(/*这里后面会关联数据*/); Number2.attach(/*这里后面会关联数据*/); } void loop() { // ... 原有的读取传感器、显示时间等代码保持不变 ... // 读取温湿度 float humidity dht.readHumidity(); float temperature dht.readTemperature(); // 将数据发送到Blinker云端 Number1.print(temperature); // 发送温度值关联到键值num-temp Number2.print(humidity); // 发送湿度值关联到键值num-hum // 必须调用Blinker.run()来处理云端通信 Blinker.run(); delay(2000); // 每2秒上传一次数据可根据需要调整 }4.3 手机APP界面配置在Blinker APP中进入你刚创建的设备。点击界面上的“编辑”按钮进入布局编辑模式。从组件库中拖拽两个“数据”组件到界面上。分别点击这两个数据组件在设置中将它们的“键名”修改为代码中定义的num-temp和num-hum。保存布局退出编辑模式。现在你的ESP32智能时钟上电并连接Wi-Fi后温湿度数据就会自动同步到Blinker APP上了。你可以在任何有网络的地方用手机查看时钟所在位置的环境情况。5. 焊接调试与项目总结PCB板子到手后就是焊接和调试了。焊接顺序建议先焊接电源部分USB口、AMS1117及其电容焊接完后用万用表测量一下确保3.3V输出正常再焊接其他芯片。最后焊接ESP32模块因为它引脚密需要细心。上电测试焊接完成后先别急着插USB。再次用万用表检查电源3V3和地GND之间是否短路。确认无误后再上电。程序下载通过USB给板子上电。在Arduino IDE中选择正确的开发板型号如“ESP32 Dev Module”和端口点击上传。如果遇到上传失败检查一下ESP32是否进入了下载模式通常需要按住某个按键再复位具体方法可以查一下你所用的ESP32模块的手册。串口监视器打开Arduino IDE的串口监视器波特率115200查看程序打印的日志这是最重要的调试手段。这个项目做下来你不仅学会了立创EDA画板、ESP32编程、传感器驱动还掌握了物联网设备上云的基本方法。过程中遇到的每一个问题比如电源不稳、I2C地址冲突、Wi-Fi连不上、数据上传失败都是宝贵的经验。嵌入式物联网开发就是这样软硬结合动手实践遇到问题解决问题能力就在这个过程中成长起来了。希望这个教程能帮你打开物联网开发的大门后面你可以尝试增加更多功能比如用蓝牙配网、增加光敏传感器自动调节屏幕亮度、或者将数据上传到自己的服务器等等。
返回列表