尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于ESP32的四通道蓝牙与手动控制家居自动化系统设计与实现

基于ESP32的四通道蓝牙与手动控制家居自动化系统设计与实现 1. 项目缘起为什么需要一个四通道蓝牙手动控制的家居自动化系统几年前我还在用一堆独立的智能插座和遥控器来控制家里的灯光和风扇每次想调整都得打开好几个不同的App或者在一堆遥控器里翻找。这种体验非常割裂尤其是当你想同时控制多个设备或者临时需要一个手动开关作为备份时就显得特别笨拙。后来市面上出现了不少集成的智能家居中控功能强大但要么价格昂贵要么过于依赖云端和复杂的App配置一旦网络出问题或者手机不在身边整个系统就瘫痪了。这让我开始思考能不能自己动手做一个更简单、更可靠、成本也更低的本地化控制中心核心需求很明确第一它必须支持多路独立控制至少能同时管理四路不同的电器比如客厅主灯、氛围灯、风扇和加湿器第二它要有两种控制方式——既可以通过手机蓝牙App进行无线遥控也要有物理按钮或旋钮作为手动控制确保在网络或手机没电时系统依然可用第三它得足够稳定最好是本地直连不依赖云端响应速度快第四成本要可控方便爱好者复现。基于这些想法我决定用ESP32作为核心控制器搭配一个简单的四路继电器模块再设计一块集成手动控制按钮和状态指示灯的PCB板最后开发一个简洁的Android App。这就是“四通道蓝牙与手动控制家居自动化系统”项目的由来。它不是什么颠覆性的产品但确实解决了一个非常实际的痛点在智能与可靠之间找到一个平衡点让你既能享受手机遥控的便利也能在需要时“一键直达”。2. 核心硬件选型与设计逻辑为什么是ESP32继电器自定义PCB硬件是整个系统的骨架选型直接决定了系统的稳定性、成本和扩展性。经过几轮迭代我最终确定了以ESP32为核心外接四路继电器模块并自行设计一块集成控制面板的PCB的方案。下面详细拆解每个选择的背后逻辑。2.1 主控芯片ESP32的压倒性优势在众多微控制器中选择ESP32几乎是这个项目的必然选择。原因有以下几点首先双模无线通信能力是ESP32的杀手锏。这个项目需要蓝牙Bluetooth进行手机连接而ESP32原生支持蓝牙4.2BR/EDR和BLE这意味着我们可以用经典的SPPSerial Port Profile协议实现一个稳定的、类似串口的双向数据通道开发起来非常简单直接。虽然项目暂时用不到Wi-Fi但ESP32集成的Wi-Fi功能为未来系统升级如接入局域网或互联网预留了巨大的可能性这种“战未来”的冗余设计很有价值。其次强大的处理能力和丰富的外设。ESP32是双核处理器主频高达240MHz远超传统的Arduino UnoATmega328P16MHz。处理四路继电器的控制逻辑、解析蓝牙串口数据、扫描手动按钮状态以及驱动状态指示灯对ESP32来说游刃有余。它拥有多达34个可编程GPIO引脚可以轻松连接继电器、按钮、LED甚至未来扩展传感器如温湿度传感器从热词“esp32温湿度”也能看出这是常见应用。再者成熟的生态与低成本。围绕ESP32有Arduino Core、ESP-IDF等多种开发框架社区资源极其丰富。从热词“esp32教程”、“esp32开发”的搜索热度就能看出其普及程度。一块ESP32开发板的价格已经非常亲民为DIY项目控制成本提供了基础。注意ESP32型号众多对于本项目ESP32-WROOM-32或ESP32-S系列都是不错的选择。如果对蓝牙音频有想法热词中有“bluetooth audio toggle”需要注意ESP32的经典蓝牙音频功能需要额外的编码解码支持复杂度会陡增本项目暂不涉及。2.2 执行单元继电器模块的选型与驱动继电器是连接弱电控制端ESP32的3.3V GPIO和强电负载端220V家用电器的关键桥梁。选择四路继电器模块主要是出于安全、隔离和方便的考虑。为什么用继电器模块而不是直接使用MOS管对于控制交流220V的灯具、风扇等设备安全隔离是第一位的。继电器通过电磁线圈吸合机械触点来实现电路通断实现了控制电路低压直流与负载电路高压交流的电气隔离安全性远高于直接用MOS管等半导体器件。市面上常见的5V或12V驱动的四路继电器模块集成度高通常自带光耦隔离和驱动三极管ESP32的GPIO口可以直接通过一个简单的数字输出信号高/低电平来控制非常方便。关键参数考量线圈电压选择与ESP32逻辑电平兼容的5V继电器模块。ESP32的GPIO输出高电平约为3.3V虽然略低于5V但通常足以驱动模块内置的驱动电路使其可靠吸合。如果担心驱动能力可以在GPIO和继电器模块控制端之间加一个简单的电平转换电路或使用一个NPN三极管进行电流放大。触点容量这是继电器的核心指标指其触点能安全切断的负载大小。对于家庭照明和普通风扇选择触点容量为10A/250VAC的继电器完全足够。务必确保这个值大于你计划连接的电器的最大工作电流。模块接口选择带有输入信号光耦隔离的模块能进一步保护ESP32免受负载端干扰或浪涌冲击。2.3 交互界面自定义PCB的设计必要性这是本项目区别于简单面包板搭接的关键一步。为什么非要自己画PCB用开发板杜邦线连接按钮和LED不行吗短期演示可以但作为一个准备长期使用的“系统”可靠性、美观度和用户体验必须提升。杜邦线连接在震动或移动下容易松动导致控制失灵一堆飞线也显得非常杂乱不具备实用性。设计一块定制PCB可以将以下所有元件集成在一块板子上ESP32开发板插座方便插拔和更换。四路继电器模块接口通过排针或接线端子固定连接。四个手动控制按钮用于本地手动开关各通道。四个通道状态指示灯LED直观显示每个继电器当前的开关状态。电源管理电路将外部输入的电源如12V DC转换为ESP32所需的5V或3.3V并为继电器线圈供电。从热词“pcb设计”、“立创eda怎么用画pcb”、“嘉立创eda画pcb教程”可以看出现在利用国产的立创EDA等免费工具进行PCB设计再通过嘉立创等平台进行低成本打样对爱好者来说门槛已经大大降低。自己设计PCB不仅能获得一个坚固可靠的控制中心其过程本身也是极具价值的学习经历。3. 系统架构与电路设计详解明确了核心器件接下来需要规划它们如何协同工作并落实到具体的电路连接上。系统的整体架构可以理解为输入手动按钮/蓝牙指令 - 处理ESP32 - 输出继电器/状态LED。3.1 系统框图与信号流一个清晰的系统框图有助于理解各个部分的关系[Android App] --(蓝牙SPP)-- [ESP32 主控] ^ ^ | | (用户无线指令) (解析指令执行控制) | | [手动控制按钮] -- (GPIO输入) -- [ESP32 主控] -- (GPIO输出) -- [继电器模块] -- [家用电器] -- (GPIO输出) -- [状态指示灯LED]ESP32作为大脑持续监听两路输入一是来自四个手动按钮的GPIO数字输入通过内部上拉电阻检测低电平二是来自蓝牙串口的数据。无论哪一路输入触发了状态改变ESP32都会执行两个动作1. 控制对应GPIO输出高低电平以驱动继电器2. 更新对应通道的状态指示灯LED3. 通过蓝牙串口将最新的状态广播回App确保App界面状态与设备实际状态同步。3.2 核心电路设计要点在设计PCB原理图时有几个关键点需要特别注意1. GPIO引脚分配与功能定义 这是硬件与软件衔接的桥梁必须提前规划好。假设我们定义如下具体引脚可根据你的ESP32板型调整继电器控制输出GPIO12, GPIO13, GPIO14, GPIO15 分别控制 Relay1~Relay4。输出高电平时继电器吸合灯亮。手动按钮输入GPIO32, GPIO33, GPIO25, GPIO26 分别连接 Button1~Button4。配置为内部上拉输入INPUT_PULLUP按钮另一端接地。当按钮按下时引脚读到低电平LOW。状态指示灯输出GPIO21, GPIO22, GPIO23, GPIO19 分别驱动 LED1~LED4。通过一个限流电阻如220Ω接地ESP32输出高电平时LED点亮。蓝牙串口使用ESP32的硬件串口2UART2例如Serial2.begin(9600)并将RX/TX连接到蓝牙模块如果使用集成蓝牙的ESP32则无需外部连接。2. 按钮防抖与LED驱动 机械按钮在按下和弹起时会产生信号抖动可能导致一次按下被误判为多次。必须在软件中实现防抖逻辑后文详述。LED驱动简单但务必串联限流电阻阻值根据LED工作电压和电流计算通常3.3V系统用220Ω-1kΩ。3. 电源设计 这是稳定性的基石。继电器线圈吸合瞬间电流较大几十到上百毫安如果和ESP32共用同一路线性稳压电源可能导致电压瞬间被拉低引起ESP32复位。推荐的方案是使用双路输出或功率足够的开关电源。例如一个12V/2A的电源适配器作为总输入一路通过DC-DC降压模块如LM2596降至5V给继电器模块供电另一路通过AMS1117-3.3等LDO稳压芯片降至3.3V给ESP32和LED供电。确保地线GND良好共地。4. PCB布局布线注意事项来自热词“pcb布线规则和技巧”分区布局将电路按功能分区如电源区、MCU区、继电器驱动区、按钮接口区。避免强电继电器输出端子和弱电MCU数字信号部分交叉。电源路径电源走线要尽量粗短特别是继电器电源路径以减少压降和噪声。在电源入口和每个芯片的电源引脚附近放置足够容量的滤波电容如10uF电解电容并联0.1uF陶瓷电容。信号完整性数字信号线避免过长远离高频或大电流走线。按钮等输入信号线可以串联一个1kΩ左右的电阻起到一定的限流和抗干扰作用。接地采用单点接地或分区接地确保地平面完整减少噪声环路。4. 固件开发ESP32程序的核心逻辑与避坑指南硬件搭建好后灵魂在于软件。ESP32的固件需要稳定地处理蓝牙通信和手动输入并可靠地控制输出。这里使用Arduino框架进行开发因为它生态完善上手快速。4.1 开发环境搭建与基础工程首先需要在Arduino IDE中安装ESP32开发板支持。在“文件-首选项”的附加开发板管理器网址中添加https://espressif.github.io/arduino-esp32/package_esp32_index.json然后在“工具-开发板-开发板管理器”中搜索安装“esp32”。选择正确的开发板型号如ESP32 Dev Module。新建一个工程核心代码结构将包含以下部分引脚定义、蓝牙串口初始化、按钮状态检测、继电器控制函数、状态同步逻辑。一个常见的坑是引脚冲突务必查阅你所使用的ESP32板型的引脚功能图避免使用那些用于内部Flash、PSRAM等特殊功能的引脚。4.2 蓝牙串口通信协议设计为了实现App与ESP32的对话需要定义一个简单高效的通信协议。这里设计一个基于字符串的指令协议App发送控制指令“CHx1”或“CHx0”。其中x为通道号1-41代表开0代表关。例如“CH21”表示打开第二通道。ESP32上报状态“STA:x,y,z,w”。其中x,y,z,w分别代表1-4通道的当前状态1开/0关用逗号分隔。例如“STA:1,0,1,0”。在ESP32代码中使用SerialBT库用于经典蓝牙SPP进行通信。初始化后在loop()函数中不断检查SerialBT.available()读取数据并解析。#include BluetoothSerial.h BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin(ESP32_Relay_Controller); // 蓝牙设备名称 // ... 初始化GPIO ... } void loop() { // 解析蓝牙指令 if (SerialBT.available()) { String command SerialBT.readStringUntil(\n); // 假设以换行符结尾 command.trim(); if (command.startsWith(CH)) { int channel command.substring(2, 3).toInt(); // 提取通道号 int state command.substring(4).toInt(); // 提取状态 if(channel 1 channel 4 (state0 || state1)) { setRelay(channel, state); // 控制继电器 updateLED(channel, state); // 更新指示灯 reportStatus(); // 上报新状态给App } } } // ... 处理按钮扫描 ... }避坑提示蓝牙串口数据是流式的必须定义一个明确的消息边界。这里用换行符\n作为分隔符。在App端发送指令时务必在末尾加上\n。否则ESP32可能无法完整接收一条指令或者将多条指令粘连在一起导致解析失败。4.3 手动按钮检测与防抖处理手动按钮的检测逻辑相对独立但防抖是关键。简单的软件防抖算法是当检测到引脚电平变化如从高变低时不立即认为按钮按下而是等待一段时间如20-50毫秒再次检测如果仍然是低电平才确认是有效按下。const int buttonPins[] {32, 33, 25, 26}; int lastButtonStates[] {HIGH, HIGH, HIGH, HIGH}; // 假设内部上拉初始为高 unsigned long lastDebounceTime[] {0, 0, 0, 0}; const unsigned long debounceDelay 50; void checkButtons() { for (int i 0; i 4; i) { int reading digitalRead(buttonPins[i]); if (reading ! lastButtonStates[i]) { lastDebounceTime[i] millis(); } if ((millis() - lastDebounceTime[i]) debounceDelay) { // 防抖时间过后状态稳定 if (reading LOW lastButtonStates[i] HIGH) { // 检测到下降沿按钮被按下 int newRelayState !getRelayState(i1); // 取反当前继电器状态 setRelay(i1, newRelayState); updateLED(i1, newRelayState); reportStatus(); // 可以在这里加一个短延时防止按钮按住时连续触发 } } lastButtonStates[i] reading; } }在loop()中调用checkButtons()函数。这里实现的是“点动”功能即每按一次按钮对应通道状态翻转一次开-关关-开。你也可以根据需要改为“自锁”或“互锁”逻辑。4.4 状态同步与异常处理一个健壮的系统必须保证状态一致。无论是通过蓝牙控制还是手动按钮控制在改变继电器状态后都必须做三件事1. 物理上驱动继电器2. 更新本地状态指示灯3. 通过蓝牙向App发送最新的状态报告“STA:...”。这样App界面就能实时反映设备的真实状态避免出现App显示“开”而设备实际“关”的混乱。此外需要考虑蓝牙连接断开的情况。当蓝牙断开时ESP32应专注于响应手动按钮并可能进入低功耗模式如果设计。当蓝牙重新连接时App可以在连接成功后主动发送一个查询指令如“GETSTA”ESP32收到后立即上报当前所有通道状态完成同步。5. Android App开发用最简方式实现控制界面对于这个项目Android App不需要复杂的功能核心就是建立蓝牙连接、发送控制指令、接收并显示状态。使用Android Studio进行开发目标是一个界面直观、操作简单的应用。5.1 开发环境与权限配置安装Android Studio后新建一个Empty Activity项目。首先在AndroidManifest.xml中声明必要的权限uses-permission android:nameandroid.permission.BLUETOOTH / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / !-- 蓝牙扫描需要Android 6.0-- uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / !-- Android 12 需要 -- uses-permission android:nameandroid.permission.BLUETOOTH_SCAN / !-- Android 12 需要 --注意从Android 6.0API 23开始扫描蓝牙设备需要位置权限ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION因为蓝牙扫描可以用于推断位置。从Android 12API 31开始需要显式声明BLUETOOTH_CONNECT和BLUETOOTH_SCAN权限。务必在运行时动态申请这些危险权限。5.2 蓝牙连接管理与数据收发App的蓝牙核心功能包括发现设备、配对连接、发送数据、接收数据。我们可以使用Android原生的BluetoothAdapter和BluetoothSocket用于SPP来实现。1. 设备发现与列表展示 在Activity中获取BluetoothAdapter启动设备发现并通过广播接收器BroadcastReceiver监听BluetoothDevice.ACTION_FOUND来获取发现的设备将其添加到一个列表如ListView或RecyclerView中供用户选择。2. 建立SPP连接 用户点击列表中的设备我们ESP32的名字如“ESP32_Relay_Controller”后尝试建立连接。经典蓝牙SPP通信需要设备的UUID。对于串行通信通常使用标准的SPP UUID00001101-0000-1000-8000-00805F9B34FB。// Kotlin 示例代码片段 val device: BluetoothDevice ... // 从列表获取的设备 val uuid: UUID UUID.fromString(00001101-0000-1000-8000-00805F9B34FB) val socket: BluetoothSocket device.createRfcommSocketToServiceRecord(uuid) socket.connect() // 需要在后台线程执行连接成功后通过socket.inputStream和socket.outputStream进行数据读写。3. 发送控制指令 在控制界面为每个通道设置两个按钮开/关或一个切换按钮。点击时通过输出流发送对应的字符串指令如“CH11\n”。val outputStream: OutputStream socket.outputStream outputStream.write(CH11\n.toByteArray()) outputStream.flush()4. 接收状态更新 需要在一个独立的线程如Thread或Coroutine中持续监听输入流。当读到数据时按照约定的协议“STA:1,0,1,0\n”进行解析并更新UI界面上的状态显示例如改变按钮颜色或文本。val inputStream: InputStream socket.inputStream val reader BufferedReader(InputStreamReader(inputStream)) while (true) { val line reader.readLine() ?: break // 连接断开 if (line.startsWith(STA:)) { // 解析状态更新UI需切回主线程 runOnUiThread { updateUI(line) } } }实操心得蓝牙通信的所有耗时操作连接、发送、接收都必须在后台线程进行否则会阻塞主线程导致应用无响应ANR。在Android中可以使用AsyncTask、Thread、Handler或者更现代的Kotlin Coroutine协程来处理。同时要妥善管理连接的生命周期在Activity的onDestroy()中及时关闭Socket和释放资源。5.3 用户界面设计界面设计追求极简和清晰。一个典型的主界面可以包含顶部蓝牙连接状态显示和“扫描/连接”按钮。主体四个独立的控制卡片每个卡片包含通道名称如“客厅主灯”。当前状态显示如“已开启”或LED图标。两个大大的按钮“开启”和“关闭”或者一个“切换”按钮。也可以加入手动模式下的物理按钮状态同步显示可选。底部可以添加一个日志区域显示发送和接收的原始指令便于调试。使用LinearLayout或ConstraintLayout进行布局通过Button的setOnClickListener来绑定控制逻辑。状态更新通过改变TextView的文本或ImageView的图片资源来实现。6. 系统集成、调试与实测中的坑当硬件焊接完毕、固件烧录好、App也编译完成后就进入了最激动人心也最容易出问题的环节——联调。这个阶段会遇到各种各样预料之外的问题。6.1 上电前检查与静态测试在给整个系统接通220V强电之前务必进行彻底的静态测试目视检查检查PCB有无短路、虚焊、连锡特别是电源走线附近。检查继电器输出端子螺丝是否拧紧。万用表测试电源短路测试断开所有负载用万用表蜂鸣档测量电源输入正负极之间是否短路。电压测试仅接入低压直流电源如12V测量给ESP32的3.3V/5V输出是否正常、稳定。GPIO测试编写一个简单的测试固件让ESP32循环点亮各通道LED并用万用表测量对应GPIO引脚电压是否随程序变化。同时手动按下按钮测量对应GPIO输入引脚电压是否从高电平变为低电平。6.2 分步调试策略不要试图一次性让所有功能都工作。采用分步调试法先调核心控制不接蓝牙不接强电。只连接ESP32、按钮、LED和继电器模块继电器输出端空载。烧录一个简单的测试程序验证手动按钮能否正确控制LED和继电器可以听到继电器吸合/释放的“咔嗒”声。用手机或逻辑分析仪监测继电器控制引脚的电平变化。再调蓝牙通信在核心控制正常的基础上加入蓝牙功能。使用手机上的“串口蓝牙终端”App热词中提到的“Serial Bluetooth Terminal”是一款常用工具进行测试。先测试ESP32能否被手机发现并配对连接。连接后在串口终端App中发送“CH11\n”观察继电器和LED是否动作同时在手动按下按钮时观察终端App是否收到“STA:...”的状态上报。这一步可以完全脱离自定义App快速验证通信协议是否正确。最后接入负载在前两步都成功后断开所有电源将继电器的输出端子连接到家用电器建议先用一个台灯等小功率设备测试。确认接线牢固无误后再上电进行完整功能测试。6.3 常见问题与解决方案问题一蓝牙连接不稳定经常断开。可能原因ESP32与手机距离过远或有严重遮挡周围2.4GHz频段干扰严重如无线路由器、微波炉ESP32天线设计不佳或受屏蔽。排查拉近距离测试尝试更换手机或ESP32的摆放位置检查ESP32板载天线是否完好周围是否有金属物体包裹。解决优化天线位置在代码中增加蓝牙断线重连机制如果使用外部天线确保阻抗匹配。问题二手动按钮操作时蓝牙App状态不同步。可能原因按钮触发后ESP32没有执行reportStatus()函数向App发送状态更新App端接收数据的线程堵塞或解析出错。排查在ESP32代码中在按钮处理函数里加入串口打印Serial.println(“Button pressed, reporting status...”);通过USB线查看串口监视器确认上报指令是否发出。在App端开启调试日志查看是否收到数据以及数据内容是否正确。解决确保按钮处理逻辑中必然调用状态上报函数检查App端数据接收线程的健壮性处理可能的异常。问题三同时操作多个通道时系统反应迟钝或复位。可能原因电源功率不足。当多个继电器同时吸合时瞬间电流需求很大导致电源电压被拉低触发ESP32的欠压复位。排查用示波器监测ESP32的3.3V电源引脚在继电器动作时观察电压是否有大幅跌落。解决这是硬件设计问题。升级电源适配器功率如从1A升级到2A或3A在电源输入端并接一个大容量电解电容如470uF/25V作为储能缓冲优化PCB的电源走线加宽线宽。问题四App在Android新版本上无法发现蓝牙设备。可能原因从Android 12开始蓝牙权限模型变化需要动态申请BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限并且BLUETOOTH_SCAN权限要求声明android:usesPermissionFlagsneverForLocation如果应用不需要通过蓝牙获取位置信息。解决更新AndroidManifest.xml声明新权限。在代码中针对Android 12API 31及以上版本动态申请这些权限。确保权限申请逻辑正确。7. 项目优化与扩展思路一个基础版本的系统工作稳定后就可以考虑一些优化和功能扩展让它变得更智能、更实用。7.1 硬件优化增加反馈通道目前的系统是“单向控制”即只知道发出了指令不知道负载实际是否工作比如灯泡坏了。可以在继电器输出端并联一个电流检测模块如ACS712或电压检测电路将负载的实际工作电流/电压反馈给ESP32的ADC引脚实现真正的状态监控和故障报警。集成传感器利用ESP32富余的GPIO和ADC接入温湿度传感器如DHT22、光照传感器等。实现自动化逻辑例如“当环境光暗到一定程度且有人移动时自动打开灯”。改进电源管理设计一个完整的开关电源模块提供更高效、更稳定的多路电压输出并加入过流、过压保护电路。外壳设计使用3D打印或亚克力板为整个系统制作一个美观安全的外壳将强电部分完全隔离封装提升安全性和成品感。7.2 软件功能扩展定时与场景功能在ESP32端加入RTC实时时钟模块或使用NTP通过网络获取时间实现定时开关功能。在App端可以设置“场景”例如“离家模式”一键关闭所有通道“影院模式”只打开氛围灯等。OTA升级利用ESP32的Wi-Fi功能实现通过网络OTA更新固件无需再连接USB线极大方便后期功能迭代和维护。接入智能家居平台将ESP32连接到家庭Wi-Fi通过MQTT协议接入Home Assistant、OpenHAB等开源智能家居平台或直接支持米家、涂鸦等平台的SDK需要对应的硬件认证从而融入更广阔的智能家居生态。App体验优化增加设备重命名、通道图标自定义、控制日志查看、Widget小组件等功能提升用户体验。7.3 从项目到产品可靠性考量如果希望这个系统能7x24小时稳定运行还需要在软件层面加入更多守护机制看门狗启用ESP32的硬件看门狗esp_task_wdt_init防止程序跑飞。异常重启在代码中捕获严重的运行时错误并主动重启系统。状态持久化将继电器的最新状态保存到ESP32的Flash或EEPROM中这样系统意外断电重启后能自动恢复到断电前的状态而不是全部关闭。心跳包机制在App和ESP32之间定期发送心跳包用于检测连接是否存活并及时在UI上提示用户。这个四通道蓝牙手动控制家居自动化系统从构思到实现涉及了硬件选型、电路设计、PCB绘制、嵌入式编程和Android开发等多个环节。它可能不是功能最强大的但通过亲自动手你获得的是一个完全可控、高度定制、且深深理解其每一处细节的个性化解决方案。当你能用自己制作的App和控制器随心所欲地管理家里的灯光电器并且知道在断网时依然有物理按钮可以依赖时那种成就感和实用性是购买任何现成产品都无法替代的。
返回列表