凡是真能一个人在一个学期内做完的 IoT 项目,骨架都长得一模一样:一个传感器进来,ESP32 做判断,Wi-Fi 把数值送出去到 Blynk 仪表板,再由一路继电器动手。下面十个点子就是这同一副骨架,只是换了传感器 — 所以真正的难度来自它装在哪里,而不是元件有几个。
这篇写给需要自己挑一个毕业专题、并且要独立做完的大学、理工学院和文凭课程学生。每个点子都指向本站已经写好的完整教程,所以你一旦选定,就能直接跳到接线那一步。
简短答案:一个人做最稳的是房间温湿度监测器、用手机控制低压 DC 灯或风扇,还有自动浇花系统 — 三个都装在有插座的室内。最常做不完的是人脸识别考勤、市电用电量监测器,还有要靠电池撑上好几个月的野外节点。
这些 IoT 项目共用的是什么骨架?

ESP32 是把 Wi-Fi 电台做进同一颗芯片封装里的微控制器,这也是这份点子清单能这么短的唯一原因。下面每一个项目,都是同样的四个模块。
第一个模块,传感器,把一个物理量变成开发板读得懂的东西:由 ADC 数字化的电压(土壤探头、TDS)、用定时器量出来的脉冲宽度(HC-SR04),或者串行协议上的数据帧(DHT11、DS18B20、GPS)。第二个模块是判断 — 几乎永远只是拿读数跟一个阈值比一下。
让它成为“IoT”的,是第三个模块。ESP32 向外开一条到 Blynk 服务器的 TCP 连接,把数值写进虚拟引脚;你手机上的 App 订阅同一台服务器。因为两边都是主动向中间那台服务器拨出去的,你不需要知道开发板的 IP 地址,也不需要在路由器上开任何端口 — 这就是这类项目在家门外也能用、而且不必额外做网络配置的原因。第四个模块,继电器,把这个判断带回物理世界。
FYP 核心套件 — 买一次,十个点子通用
内置 Wi-Fi 的 ESP32 开发板、Type-C 数据线、830 孔面包板、公母两种杜邦线、第一个传感器,还有一路继电器输出。这就是你还没选定点子之前,就能先备齐的完整骨架。
可选加购
按下面表格里你选中的那个点子,只挑一两样就够。30 针的 ESP32 开发板插上面包板后几乎占满整个宽度,两侧各只剩下大约一列还能用的孔,所以清单最后那块扩展板,是某个点子需要接很多线时的出路。
十个适合 FYP 和毕业专题的 IoT 项目点子
下面那一列难度,是按项目要装在什么地方算出来的,不是按它有几个元件。
| IoT 项目点子 | 核心传感器 | 难度 | 加购件 | 完整教程 |
|---|---|---|---|---|
| 房间或实验室的温湿度监测器 | DHT11 | 简单 | 无 — 核心套件已含 | DHT11 + OLED 温湿度监测器 |
| 用手机控制低压 DC 灯或风扇(例如 12 V) | —(只有输出) | 简单 | 无 — 核心套件已含 | 用 Blynk 控制继电器 |
| 自动浇花系统 | 土壤湿度传感器 | 简单 | CAPSOIL、5VWPUMP | 自动浇花系统 |
| 带手机推送的入侵警报器 | PIR | 简单 | HCSR501 | ESP32 网页服务器 + 继电器 — 输出那部分 |
| 室内空气质量与烟霾监测器 | 粉尘传感器 | 中等 | 按那篇教程里的清单 | 空气质量监测器 |
| 水箱水位监测器 | 防水超声波 | 中等 | 防水探头 — 按那篇教程里的清单 | 水塔水位监控器 |
| 养殖或鱼缸水温监测器 | DS18B20 防水探头 | 中等 | DS18B20 + 4.7 kΩ 电阻 | 防水温度探头 |
| 池塘或自来水的 TDS 水质计 | TDS 探头 | 中等 | 按那篇教程里的清单 | TDS 水质检测仪 |
| 远程监控摄像头 | 摄像头模块 | 中等 | S3CAM56 | ESP32-S3 CAM 视频流 |
| 车辆或资产定位追踪器 | GPS NEO-6M | 偏难(野外供电) | GPS6MAN | NEO-6M GPS 模块 |
关于水箱那一行要多说一句:可选清单里的 HC-SR04 是干燥空气用的传感器 — 它那两颗换能器是裸露的,水箱里的潮湿空气会把它们吃掉。把它留给桌面上的测距,或者垃圾桶里的垃圾高度;水箱水位,我们的教程用的是整颗封装起来的防水超声波探头。
每个点子的成本都是同一个模式:核心套件买一次,然后从可选清单里加一两样。上面两份清单都实时显示当前价格,所以任何一行的成本预算,就是核心套件加上那一行点名的零件。
如果是中学的专题 — 中学 1 到 3 年级、RBT 课业 — 更合适的清单在RBT 电子专题点子那篇里。
所有点子共用的同一份骨架代码
下面这份 sketch 是表格里第一个点子的完整骨架:读 DHT11、把两个数值送上仪表板,超过阈值就触发通知。要换成别的点子,改掉那两行读取和它的库就行 — 其余照旧。
// 每个 IoT FYP 项目的基本骨架:读传感器 -> 做判断 -> 发给 Blynk。
#define BLYNK_TEMPLATE_ID "TMPL6xxxxxxxx" // 从 Blynk.Console 复制过来
#define BLYNK_TEMPLATE_NAME "Projek FYP"
#define BLYNK_AUTH_TOKEN "TokenAndaDiSini"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
const char* SSID_WIFI = "NamaWiFiAnda";
const char* PASS_WIFI = "KataLaluanWiFi";
#define PIN_DHT 4 // ESP32 DevKit 上的 GPIO4
#define JENIS_DHT DHT11
DHT dht(PIN_DHT, JENIS_DHT);
BlynkTimer pemasa;
const float HAD_SUHU = 32.0; // 触发阈值,单位摄氏度
bool amaranAktif = false;
void hantarBacaan() {
float suhu = dht.readTemperature();
float lembap = dht.readHumidity();
// DHT11 偶尔不回应;跳过这一轮,别把垃圾数据发出去。
if (isnan(suhu) || isnan(lembap)) {
Serial.println("Bacaan DHT gagal - langkau pusingan ini");
return;
}
Blynk.virtualWrite(V0, suhu);
Blynk.virtualWrite(V1, lembap);
// 1 C 的迟滞,免得读数在阈值上下抖动时
// 一口气发出几十条通知。
if (suhu >= HAD_SUHU && !amaranAktif) {
Blynk.logEvent("suhu_tinggi", String("Suhu ") + suhu + " C");
amaranAktif = true;
} else if (suhu < HAD_SUHU - 1.0) {
amaranAktif = false;
}
}
void setup() {
Serial.begin(115200);
dht.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, SSID_WIFI, PASS_WIFI);
pemasa.setInterval(120000L, hantarBacaan); // 每 2 分钟 2 个数值 - 配额算法见下文
}
void loop() {
Blynk.run();
pemasa.run();
}
这份代码之外有两件事,漏了就会安静地失败。在 Blynk.Console 里,要建一个 template、V0 和 V1 两条 datastream,还有一个代号为 suhu_tinggi 的 event;这个名字要是不存在,Blynk.virtualWrite 和 Blynk.logEvent 不会返回任何错误 — 你的仪表板就只是一直空着。在 Arduino IDE 那边,DHT sensor library 依赖 Adafruit Unified Sensor,少了它编译就停在 Adafruit_Sensor.h: No such file or directory 这条错误上。
代码里那四个决定,正好对应四个最常毁掉 FYP 项目的错误。第一,用 BlynkTimer 而不是 delay():Blynk.run() 必须被不断调用,它才来得及回应服务器的 ping。Blynk 库每 40 秒发一次 ping,并且在连续 40 秒没有任何东西进来、再加上三次 6 秒超时之后断开连接,也就是大约 58 秒(BlynkConfig.h)。所以 loop() 里长的 delay() 会把连接拖断,设备明明还活着,手机上却显示“offline”;而短的 delay() 又会让仪表板按钮的反应变慢。BlynkTimer 两边都避开了。
第二,isnan 这道检查。DHT11 是用脉冲长度来表示每个比特的,ESP32 必须自己去量那些脉冲的时间。当 Wi-Fi 的工作在一帧中间插进来,这个计时就被带偏,库于是返回 NaN。跳过那一轮,比把垃圾数值推进你的曲线图里要好。
第三,一度的迟滞。真实读数会在阈值附近小幅抖动,所以如果“开警报”和“关警报”之间没有留出距离,一个正好停在 32 °C 的温度就会反复发通知。
第四,间隔是两分钟而不是两秒。DHT 库每 2 秒才允许一次新的读取;更早的调用返回的是同一个旧值,而不是错误(DHT.cpp)。对要长期跑着的项目来说还有更要紧的一点:Blynk 免费方案每月计 100,000 条设备消息(Blynk 方案列表)。每两秒两个数值,一天就大约 86,400 条消息,一个月的额度差不多一天就烧光,你的曲线图会在学期中途停止更新;每两分钟两个数值,一个月大约 43,000 条。在桌面上调试的时候可以临时把间隔调小,项目要放着长跑之前再调回来。
这段短片拍的是读数第一次出现在手机上的那一刻 — 恰恰是文字最难描述的部分。
真正吃掉几个星期的,到底是什么?

从时间上看,传感器并不是贵的那一部分。在桌面上读 DHT11 或者土壤探头是一个下午的活,因为库早就写好了,接线也就三条。真正吃掉几个星期的,是电路之外的四件事。
| 因素 | 为什么它吃时间 | 怎么把它缩小 |
|---|---|---|
| 安装环境 | 每往桌面外走一步 — 进花盆、进水箱、上柱子 — 都会多出防水、固定和够得着的问题 | 挑一个你五分钟之内能走到的位置 |
| 防水和外壳 | 外壳、电缆固定头和密封是机械活,不是电子活 | 电子件全放进盒子里,只把探头留在外面 |
| 野外供电 | 没有插座就意味着电池、充电和电流预算 — 这本身就是一个完整的子项目 | 能用 USB 供电就一直用 USB |
| 自己写的用户界面 | 自己做手机 App 或者自己架服务器,是第二个项目,带着它自己的一堆 bug | 直接用 Blynk 现成的仪表板 |
这就是上面点子表格里最后两行难度标得更高的原因。摄像头和 GPS 接起来并不比 DHT11 难;它们难,是因为这两样通常最后都装在房间外面。
有两个细节会在第一天就让学生意外:ESP32-S3 摄像头板出厂时排针是没焊的,但第一条视频流只需要一条 USB-C 线,所以你可以什么都不焊就先跑起来;还有 GPS 模块在建筑物里面是不会完成第一次定位的 — 把它拿到空旷的地方,给它几分钟,再判断它是不是坏了。
另一个吞掉整周的常见源头,是开发板根本不肯接收代码。原因都在ESP32 无法识别、上传失败那篇里;而 Wi-Fi 一开就自己重启的开发板,通常是供电轨的问题 — 看ESP32 供电方案那篇。
看起来简单、其实该避开的点子

人脸识别考勤系统。ESP32 摄像头模块可以推视频流,但人脸识别做的是把一小串特征向量跟存好的样本作比较。光线、角度或者距离一变,同一个人两张照片之间的距离,就会比两个不同的人之间的距离变得还大 — 实验室里的演示能过,真正的课室不行。如果你还是要做,那就把它做成一个带人工确认的记录与通知工具,而不是做成一把锁。
市电用电量监测器。测量住家的用电量意味着要在市电线路上动手,那是高压作业,在马来西亚必须由持证电工(registered wireman)来做。这篇指南只谈低压 DC。如果能源确实是你的主题,那就用 DC 功率计模块去测某个负载的直流那一侧 — 太阳能板、电池组 — 把市电留在范围之外。
要靠电池撑好几个月的纯电池节点。ESP32 芯片在深度睡眠时确实能降到 10 µA 上下(Espressif 数据手册),但 DevKit 开发板不只是一颗芯片。板上那颗 AMS1117 稳压器典型静态电流是 5 mA(它的数据手册),芯片睡着了它照样在耗,而 USB 串口芯片也一样一直带电。所以整块板的功耗地板是几个 mA,不是微安级:2000 mAh 的电池除以 5 mA 是 400 小时,也就是大概 17 天 — 而且这还只算了稳压器,把同一块板上的 USB 串口芯片算进去,真实数字只会更短。不是几个月。如果你的项目必须独立自持,那就从一开始就把太阳能和间歇工作规划进去(太阳能与 18650、锂电池种类)。
自己写一个手机 App。仪表板和推送通知,Blynk 已经免费给你了。自己写 App 会多出构建工具链、Android 权限、文件分发,还有手机与开发板之间一套新的协议 — 全都在你本该展示的那个系统之外。
我们常见到的错误
把继电器模块或者水泵直接接到 3.3 V 引脚上。5 V 继电器模块的 DC+ 应该取自开发板的 VIN 或 5V 引脚并共地,而 IN 引脚可以由 3.3 V 的 GPIO 直接驱动,因为它里面的光耦只需要足够点亮内部 LED 的电流。迷你水泵要吃 0.1–0.2 A,远远超过单个 GPIO 引脚扛得住的量,所以它必须走继电器的负载端子来通断,绝对不能直接接到引脚上。这篇指南只谈低压 DC 负载;完整接线和 H/L 触发跳线的位置,在继电器模块指南里。
Wi-Fi 开着的时候还用 ADC2 引脚读模拟传感器。ESP32 上的 ADC2 是跟 Wi-Fi 电台共用的(Espressif 文档),所以 Wi-Fi 一连上,GPIO25、26、27、12、13、14 这些 ADC2 引脚上的读取就可能失败或者返回零。这一条正好打在土壤探头和 TDS 水质计这两个点子上:电路是对的,曲线却是平的。把每一个模拟传感器都放到 ADC1 引脚上 — GPIO32、33、34、35、VP 和 VN。
给 ESP32 选了 5 V 传感器,却没有把电压降下来。HC-SR04 用 5 V 供电,它的 ECHO 引脚输出接近 5 V,而 ESP32 的 GPIO 引脚是 3.3 V,并不耐 5 V。两颗电阻做成分压(例如 1 kΩ 和 2 kΩ)就能把 5 V 降到大约 3.3 V。如果你暂时想省掉这道工序,那就先把这个传感器接在本来就是 5 V 的 Arduino Uno 上 — 比如自动垃圾桶那个项目。对比一下 HC-SR501:这块 PIR 模块要的是 5 V 供电(用 USB 供电时取开发板的 VIN 引脚),但它的输出本来就是 3.3 V 电平,所以可以不经分压直接进 GPIO。
接 DS18B20 却不加上拉电阻。1-Wire 总线是开漏电路:设备只能把线拉低,不能把它推高。数据线和 3.3 V 之间少了那颗 4.7 kΩ 电阻,这条线就永远回不到高电平,开发板读到的会是空值或者 −127 °C。这颗电阻不会随探头一起附送,所以要在安装那天之前先备好。
以为随便哪条 USB 线都行。很多 Type-C 线只走电源线。开发板会亮,PWR 灯是亮的,但因为没有数据通路,COM 口就是不出现。请用数据线,不是充电线。
学期中途换点子。因为这十个点子共用同一副骨架,第六周换传感器通常不会浪费掉你的代码 — 但它会浪费掉安装那部分的工作,而那部分贵得多。先定下装在哪里,再定用什么传感器。
我们供应元件和一步一步的搭建教程;项目从头到尾,还是你自己的项目。
常见问题
什么是 IoT 项目?
IoT 项目就是一个电路,它测量物理世界里的某样东西,再把读数通过网络送出去,让人可以在别的地方看到它或者控制它。在学生项目里,这意味着一个传感器、一块带 Wi-Fi 的开发板(例如 ESP32),加上手机上的一个仪表板。
哪个 IoT 项目点子最适合 FYP 新手?
房间温湿度监测器,因为它只用到核心清单里的东西,而且装在桌面上。IoT 项目的难度来自安装环境,不是来自传感器,所以室内的项目永远做得更快。
做一个 FYP 的 IoT 项目要多少钱?
成本的形状是核心加加购:所有点子共用同一套核心,然后按你选的点子再加一两样。上面两份零件清单都显示当前价格,所以你可以自己把那一行加起来。
IoT 项目该用 ESP32 还是 Arduino Uno?
ESP32,因为 Wi-Fi 电台就在同一颗芯片封装里 — 不需要额外的网络模块。Arduino Uno 要先接一块独立的网络板,才能把任何东西送出去。完整对比在ESP32、ESP8266 与 Arduino Uno 的差别那篇;ESP32 有哪些型号、该挑哪一块,则在ESP32 型号怎么选那篇。
一个人能在一个学期里做完一个 IoT 项目吗?
能,前提是安装的位置容易走到。传感器到仪表板这副骨架本身是几天的活;吃掉学期剩下时间的,是外壳、防水、供电,还有在真实位置上一遍又一遍的测试。
最后更新:2026 年 8 月。有问题?WhatsApp 联系我们。



NodeMCU ESP32 Wi-Fi + Bluetooth Development Board CH340/CP2012 - For IOT Project - ESP-32 (CH340)
Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-C CABLE (1.0M)
MB102 Breadboard 170 400 830 Holes Breadboard Donut Board Arduino Prototype Multi Color - BREADBOARD (830 HOLES)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CM
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM
DHT 11 DHT 22 Temperature and Humidity Sensor DHT22 High Sensitivity Sensor DHT11 For Aduino IOT - DHT11 SENSOR
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)
Capacitive Soil Moisture Sensor V1.2 Corrosion Resistant with Cable For Arduino IOT Application
Mini Water Pump Submersible DC 3V-5V - 5V WATER PUMP
Ultrasonic Sensor HC-SR04 Ultrasonic Range Detection Distance Finder Obstacle avoidance For Arduino Application
Temperature Sensor DS18B20 Temperature Measurement Probe WaterProof 18B20
PIR Motion Sensor HC-SR501 MN-SR501 MINI Human Sensor Human Detector Motion Detector Arduino HCSR501 MNSR501 - HC-SR501 PIR MOTION SENSOR
GPS Module GY NEO 6M/8M with Ceramic Antenna Time and Location Tracking - For Arduino IOT Project - GY-NEO-6M GPS MODULE
ESP32-S3 WROOM CAM DEVELOPMENT BOARD OV5640 CAMERA MODULE WIFI BLUETOOTH DUAL USB-C IOT AI
ESP32 Expansion Board 30P Expansion Board ESP32 Shield GPIO Expansion Development Kit