
在windows上搭建vs code platform arduino nodemcu开发环境?
ChatGPT 说: 在 Windows 上搭建 VS Code + PlatformIO 开发环境,用于开发基于 NodeMCU(ESP8266)的 Arduino 项目,可以按照以下步骤进行配置。这个方案比 Arduino IDE 更现代,功能更强大,适合长期开发。
一、准备工作
1. 安装 VS Code
前往官网下载安装:https://code.visualstudio.com/
2. 安装 Python(PlatformIO 依赖)
推荐使用 Python 3.8 以上版本:https://www.python.org/downloads/
安装时 勾选“Add Python to PATH”
3. 安装 Git(可选但推荐)
安装地址:https://git-scm.com/
二、安装 PlatformIO 插件(在 VS Code 中)
启动 VS Code
打开扩展(Extensions)面板(左侧方块图标)
搜索并安装:PlatformIO IDE
安装后 VS Code 会自动安装 PlatformIO Core(依赖 Python)
三、新建项目(NodeMCU / ESP8266)
打开左下角的“PlatformIO 图标”(小蚂蚁 🐜)
选择 Project Tasks > Home > Open,进入 PlatformIO 主界面
点击“New Project”创建新项目:
Project Name:随便写一个
Board:选择 NodeMCU 1.0 (ESP-12E Module)
Framework:选择 Arduino
Location:建议放在英文路径下
点击“Finish”,PlatformIO 会自动生成项目结构并安装依赖
四、编写代码
进入 src 文件夹,编辑 main.cpp 示例代码:
#include <Arduino.h>
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello, NodeMCU!");
delay(1000);
}
保存文件
五、编译和上传
通过 USB 将 NodeMCU 连接电脑
点击 VS Code 左侧 PlatformIO 的 “PlatformIO: Upload”(或按快捷键 Ctrl+Alt+U)
默认会自动识别端口并上传
六、串口监视器(查看打印信息)
点击 “PlatformIO: Monitor”(或快捷键 Ctrl+Alt+M)
或者使用菜单命令 PlatformIO > Monitor
七、可选配置(platformio.ini)
修改 platformio.ini 来添加功能,例如指定串口速度:
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
✅ ## 常见问题解决
问题 解决方案 无法识别端口 尝试更换 USB 线、换个端口、或安装 CH340 驱动 上传失败 按住 NodeMCU 的 Flash 键再上传 中文路径报错 确保项目路径不要包含中文或空格 如果你想进一步了解如何写一个 ESP8266 WiFi 相关的例程(如联网、建站、MQTT 等),我也可以提供示例代码 😊
需要我帮你生成一个最小例子项目结构吗?
您说: dht11 传感器接nodemcu 如何实现控制,读取传感器输出?
ChatGPT 说: DHT11 是非常常见的温湿度传感器,适合初学者。你可以非常容易地将它与 NodeMCU(ESP8266)结合使用,并通过代码读取温度与湿度数据。
✅ 一、DHT11 与 NodeMCU 接线图(数字信号,不用分压) DHT11 引脚 功能 NodeMCU 连接引脚 1(VCC) 电源输入 3.3V 或 VIN(推荐使用 3.3V) 2(DATA) 数字信号输出 D4(GPIO2)或你指定的任意 GPIO 3(NC) 未连接 不用管 4(GND) 地线 GND 🔧 如果使用裸模块(无板载电阻),记得在 VCC 和 DATA 之间串一个 10kΩ 上拉电阻!
🧪 二、读取 DHT11 代码(Arduino 代码,适用于 VS Code + PlatformIO) 安装库(仅第一次) 在 platformio.ini 添加:
lib_deps =
adafruit/DHT sensor library@^1.4.4
主代码(src/main.cpp)
#include <Arduino.h>
#include "DHT.h"
#define DHTPIN D4 // DHT 数据引脚连接到 NodeMCU 的 D4 (GPIO2)
#define DHTTYPE DHT11 // 传感器类型为 DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature(); // 摄氏度
float f = dht.readTemperature(true); // 华氏度(可选)
// 检查读取失败
if (isnan(h) || isnan(t)) {
Serial.println("读取失败,检查接线!");
return;
}
Serial.print("温度: ");
Serial.print(t);
Serial.print(" °C, 湿度: ");
Serial.print(h);
Serial.println(" %");
delay(2000); // 每 2 秒读取一次
}
📌 小提示 DHT11 的精度不高,温湿度误差在 ±2~5%,适合基础教学或简单项目。
如果需要更精确,可考虑 DHT22 或 SHT系列。
读取频率不能太快,DHT11 最快建议每 2 秒读取一次。
📈 扩展方向(可选) 你可以将 DHT11 和其它模块结合做更多事情,比如:
显示温湿度(OLED / LCD 显示屏)
上传数据到网页 / 云端(Blynk、ThingSpeak、MQTT)
温湿度控制风扇 / 加湿器 / 灯(结合继电器控制)
制方案。
您说: .pio\libdeps\nodemcuv2\DHT sensor library\DHT_U.h:36:10: fatal error: Adafruit_Sensor.h: No such file or directory
ChatGPT 说: 这个错误提示说明你缺少了 Adafruit_Sensor 库,它是 DHT sensor library 的一个依赖库。虽然有时候 PlatformIO 会自动安装依赖,但有时候它并不会主动拉取这个库。
✅ 解决方案(为 platformio.ini 添加依赖) 打开你的 platformio.ini 文件,确保里面包含以下内容:
ini 复制 编辑 lib_deps = adafruit/DHT sensor library@^1.4.4 adafruit/Adafruit Unified Sensor@^1.1.6 然后 保存文件,PlatformIO 会自动安装这两个库。
🔁 重新编译步骤 修改好 platformio.ini
点击 VS Code 左下角的 ✔️ Build 按钮 或运行 pio run
如果你还没有 lib_deps 项目,可以完整这样写:
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
lib_deps =
adafruit/DHT sensor library@^1.4.4
adafruit/Adafruit Unified Sensor@^1.1.6
📌 补充说明
Adafruit_Sensor.h 是 Adafruit Unified Sensor 库的一部分
它为许多传感器(DHT、加速度计、陀螺仪等)提供了统一接口
试试上面的方法应该就能解决这个错误了。如果你之后还遇到类似的 No such file or directory 错误,也可以用 PlatformIO 的 Library Manager 手动搜索安装。
如果你愿意,我可以帮你生成一份完整可运行的 DHT11 测试项目(含配置)。需要吗?
可以的!你可以通过 修改 PlatformIO 的 platformio.ini 文件 来设置更快的上传速率(upload speed),让烧录速度提升很多 🚀
platformio.ini里面增加一个配置:
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
**upload_speed = 921600**
lib_deps =
adafruit/DHT sensor library@^1.4.4
adafruit/Adafruit Unified Sensor@^1.1.6
完美的下一步!👏 你现在已经能读到温湿度数据了,我们来把这些数据通过 NodeMCU 搭建一个 小型 Web 页面,实现在局域网访问 DHT11 温湿度数据,就像一个迷你 IoT 服务器 🌐🌡️
✅ 实现目标 NodeMCU(ESP8266)运行一个 HTTP Web Server
网页显示当前温湿度
网页自动刷新或点击刷新按钮实时获取新数据
可在手机 / 电脑浏览器访问(只要在同一 Wi-Fi)
🧰 所需库 我们先用 ESP8266WebServer(官方同步库),比较简单稳定:
lib_deps =
adafruit/DHT sensor library
adafruit/Adafruit Unified Sensor
ESP8266WiFi
ESP8266WebServer
🔌 接线保持不变
DHT11 → NodeMCU
VCC → 3.3V
GND → GND
DATA → D4(GPIO2)
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
// === 配置区域 ===
const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
#define DHTPIN D4 // DHT 数据引脚
#define DHTTYPE DHT11 // 使用 DHT11
DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80);
// 返回 HTML 页面
String getPage(float temp, float humi) {
String html = "<!DOCTYPE html><html><head><meta charset='utf-8'><title>DHT11</title>";
html += "<meta http-equiv='refresh' content='5'>";
html += "<style>body{font-family:sans-serif;background:#222;color:#0f0;text-align:center;}</style></head><body>";
html += "<h1>🌡️ NodeMCU 温湿度监测</h1>";
html += "<p>温度: <strong>" + String(temp) + "°C</strong></p>";
html += "<p>湿度: <strong>" + String(humi) + "%</strong></p>";
html += "<p><small>每5秒自动刷新</small></p>";
html += "</body></html>";
return html;
}
void handleRoot() {
float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) {
server.send(200, "text/plain", "DHT11 读取失败!");
return;
}
server.send(200, "text/html", getPage(temp, humi));
}
void setup() {
Serial.begin(115200);
delay(1000);
dht.begin();
WiFi.begin(ssid, password);
Serial.print("正在连接WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n连接成功,IP地址: " + WiFi.localIP().toString());
server.on("/", handleRoot);
server.begin();
Serial.println("Web服务启动成功");
}
void loop() {
server.handleClient();
}
🚀 上传运行后
打开串口监视器(115200)
看到 连接成功,IP地址: xxx.xxx.xxx.xxx
用浏览器打开这个 IP 地址(同一 Wi-Fi)
效果图:
🌡️ NodeMCU 温湿度监测
温度: 23.5°C
湿度: 42%
(每 5 秒刷新)
📌 拓展功能建议(可加可不加)
✅ 显示当前时间(可用 NTP 获取网络时间)
✅ 增加 /json 路由返回 { "temp": 23.5, "humidity": 42 }
✅ 加上图表(Chart.js)
✅ 使用 ESPAsyncWebServer 提升性能(稍复杂)
要不要我帮你升级成 Ajax 实时刷新的网页,或者用 ESPAsyncWebServer 提高性能? 你也可以告诉我你想把它集成在哪个系统里,比如家庭监控、实验室、小风扇联动控制等等~
提到的几个扩展功能不错,请一一添加
ChatGPT 说: 太棒了!那我们一步一步来,把你的小型网页升级成一个功能丰富、炫酷、实用的 物联网温湿度监控系统 😎。下面是我们将要集成的几个扩展功能:
🚀 总体功能升级路线 功能点 描述 ✅ JSON API 提供 /json 路由,返回温湿度 JSON 数据 ✅ AJAX 实时刷新 网页使用 JavaScript 每 5 秒自动获取 JSON 更新内容 ✅ Chart.js 图表 显示温湿度变化曲线 ✅ 当前时间显示 获取 NTP 网络时间并在网页上显示 ✅ 美化页面 用 CSS 增强视觉体验,适配移动设备
最终我的例子 效果图

src/main.cpp代码
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
#define DHTPIN D2
#define DHTTYPE DHT11
const char* ssid = "XXXXXXX";
const char* password = "YYYYYYY";
DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8 * 3600, 60000); // +8小时,更新频率1分钟
float currentTemp = 0.0;
float currentHumi = 0.0;
unsigned long lastReadTime = 0;
const unsigned long interval = 3000;
String getFormattedTime() {
timeClient.update();
time_t rawTime = timeClient.getEpochTime();
struct tm* timeInfo = localtime(&rawTime);
char buffer[64];
sprintf(buffer, "%04d年%02d月%02d日 %02d时%02d分%02d秒(北京时间)",
timeInfo->tm_year + 1900,
timeInfo->tm_mon + 1,
timeInfo->tm_mday,
timeInfo->tm_hour,
timeInfo->tm_min,
timeInfo->tm_sec);
return String(buffer);
}
void handleRoot() {
String page = R"=====(
<!DOCTYPE html><html><head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<title>NodeMCU DHT11</title>
<style>
body { font-family:sans-serif; background:#111; color:#0f0; text-align:center; padding:20px; }
h1 { color: #0ff; }
.chart-container {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 20px;
flex-wrap: wrap; /* Allow charts to wrap to next line if space is not enough */
}
canvas { background:#222; max-width: 320px; max-height: 240px; width: 100%; height: 100%; }
</style>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head><body>
<h1>🌡️ NodeMCU 实时温湿度监控</h1>
<p id="time">时间加载中...</p>
<p>温度: <span id="temp">--</span> °C</p>
<p>湿度: <span id="humi">--</span> %</p>
<div class="chart-container">
<canvas id="tempChart"></canvas>
<canvas id="humiChart"></canvas>
</div>
<script>
const tempData = [], humiData = [], labels = [];
const tempCtx = document.getElementById('tempChart').getContext('2d');
const humiCtx = document.getElementById('humiChart').getContext('2d');
const tempChart = new Chart(tempCtx, {
type: 'line',
data: {
labels: labels,
datasets: [{
label: '温度 °C', borderColor: '#f00', data: tempData,
fill: false, tension: 0.1
}]
},
options: { scales: { y: { beginAtZero: true } } }
});
const humiChart = new Chart(humiCtx, {
type: 'line',
data: {
labels: labels,
datasets: [{
label: '湿度 %', borderColor: '#00f', data: humiData,
fill: false, tension: 0.1
}]
},
options: { scales: { y: { beginAtZero: true } } }
});
// 📌 每3秒获取一次温湿度数据
async function fetchData() {
const res = await fetch('/json');
const json = await res.json();
const time = json.time;
const temp = json.temp;
const humi = json.humi;
document.getElementById('temp').innerText = temp;
document.getElementById('humi').innerText = humi;
if (labels.length > 10) {
labels.shift(); tempData.shift(); humiData.shift();
}
labels.push(new Date().toLocaleTimeString());
tempData.push(temp); humiData.push(humi);
tempChart.update();
humiChart.update();
}
// 🕓 每秒更新时间显示(本地时间,中文格式)
function updateClock() {
const now = new Date();
const timeStr = `当前时间:${now.getFullYear()}年${now.getMonth() + 1}月${now.getDate()}日 ` +
`${now.getHours()}时${now.getMinutes()}分${now.getSeconds()}秒`;
document.getElementById('time').innerText = timeStr;
}
// 定时器控制
setInterval(fetchData, 3000); // 3秒获取温湿度
setInterval(updateClock, 1000); // 1秒更新时间
// 初始调用
fetchData();
updateClock();
</script>
</body></html>
)=====";
server.send(200, "text/html", page);
}
void handleJson() {
static float tempCache = 0.0, humiCache = 0.0;
unsigned long now = millis();
if (now - lastReadTime > interval) {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)) {
tempCache = t;
humiCache = h;
lastReadTime = now;
}
}
DynamicJsonDocument doc(256);
doc["temp"] = tempCache;
doc["humi"] = humiCache;
doc["time"] = getFormattedTime();
String output;
serializeJson(doc, output);
server.send(200, "application/json", output);
}
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
Serial.print("连接WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n已连接,IP地址: " + WiFi.localIP().toString());
timeClient.begin();
server.on("/", handleRoot);
server.on("/json", handleJson);
server.begin();
Serial.println("Web服务已启动");
}
void loop() {
server.handleClient();
}
platformio.ini
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
lib_deps =
ESPAsyncTCP
ESP Async WebServer
DHT sensor library
Adafruit Unified Sensor
NTPClient
ArduinoJson
Time
upload_speed = 921600
小结:
- 我基本上没有认真去看具体的代码,这是不是就是所谓的vibe coding
- prompt尽量清晰,简短,一次不要加太多功能
- 从基础的功能逐渐扩展
基本解决思路

再更high-level概念:


评论