Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
Arduino JSON 的全面详细科学解释
-
Arduino 概述
Arduino 是一个开源的电子原型平台,基于易用的硬件和软件。它由硬件(各种型号的 Arduino 板)和软件(Arduino IDE)组成,主要用于快速开发交互式项目。 -
JSON 概述
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,但独立于语言,广泛用于 Web 应用和 IoT 设备之间的数据交换。 -
Arduino JSON 的定义
Arduino JSON 是指在 Arduino 平台上使用 JSON 格式进行数据交换和处理。通过 Arduino JSON 库,开发者可以轻松地在 Arduino 项目中解析和生成 JSON 数据。Arduino JSON是一个用于处理JSON数据的Arduino库,适用于嵌入式C++项目。它支持JSON的序列化和反序列化,能够在有限的内存环境中高效地解析和生成JSON数据。 -
关键特点:
简单的API:Arduino JSON提供了直观的语法,使开发者能够轻松地处理对象和数组。
序列化和反序列化:支持将JSON数据转换为字符串(序列化)和将字符串转换为JSON数据(反序列化)。
输入过滤:可以过滤大型输入,只保留与应用程序相关的字段,从而节省内存。
流式处理:支持从输入流(如串行端口、以太网连接等)中解析JSON数据。
缩进输出:可以生成紧凑的JSON文档或美化的JSON文档。
闪存字符串:可以直接使用存储在程序内存中的字符串(PROGMEM)。
字符串去重:去重JSON文档中的字符串,减少内存消耗。
隐式或显式转换:支持两种编码风格,可以选择隐式或显式转换。 -
主要功能
数据解析: 从 JSON 字符串中提取数据。
数据生成: 将数据转换为 JSON 格式的字符串。
数据交换: 通过 JSON 格式与外部服务进行数据交换。 -
技术实现
库支持: 使用 Arduino JSON 库(如 ArduinoJson)来解析和生成 JSON 数据。
数据格式: JSON 数据格式包括对象(用花括号 {} 表示)和数组(用方括号 [] 表示),键值对用冒号 : 分隔。
数据处理: 在 Arduino 上处理 JSON 数据,执行相应操作。 -
应用场景
物联网(IoT): 与云平台进行数据交换。
Web 服务: 与 Web API 进行数据交互。
传感器数据: 处理和传输传感器数据。
配置文件: 存储和读取配置信息。 -
开发工具
Arduino IDE: 编写和上传代码到 Arduino 板。
ArduinoJson 库: 提供 JSON 解析和生成的库。
网络模块: 如 ESP8266、ESP32,用于连接互联网。 -
优势与挑战
优势:
轻量级: JSON 格式简洁,易于解析和生成。
跨平台: 独立于语言,适用于多种开发环境。
灵活性: 支持复杂的数据结构。
挑战:
内存限制: Arduino 内存有限,处理大 JSON 数据需优化。
性能限制: 解析和生成 JSON 数据可能占用较多资源。
数据安全: 需要确保数据完整性和安全性。 -
未来发展方向
优化性能: 提高 JSON 解析和生成的效率。
扩展功能: 支持更多的 JSON 特性(如 JSON Schema)。
增强安全性: 提供数据加密和验证机制。
一、主要特点
(一)数据传输的标准化与规范性
统一的数据格式:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有简洁、清晰的结构。在通过POST请求接收JSON数据时,遵循统一的JSON格式规范,使得数据的组织和表示方式标准化。这有助于不同设备、系统之间的数据交互和理解,降低了数据处理的复杂性。例如,一个包含传感器数据的JSON对象可以统一表示为 {“temperature”: 25.5, “humidity”: 60},其中键值对的形式清晰地表明了数据的含义。
易于解析和处理:由于JSON格式的规范性,Arduino在接收到JSON数据后,可以使用专门的JSON解析库(如ArduinoJson)轻松地将JSON字符串解析为程序中的数据结构(如对象、数组等)。这使得开发者能够方便地访问和操作数据,无需手动解析复杂的字符串格式,提高了开发效率。
(二)支持复杂数据结构的传输
嵌套结构和数组:JSON允许数据以嵌套的结构和数组形式存在,这使得它可以有效地表示复杂的数据关系。例如,在一个智能家居系统中,接收到的JSON数据可能包含多个房间的信息,每个房间又有多个设备的信息,这种嵌套结构可以通过JSON轻松表示,如:
{
"rooms": [
{
"name": "客厅",
"devices": [
{
"name": "灯",
"status": "开启"
},
{
"name": "电视",
"status": "关闭"
}
]
},
{
"name": "卧室",
"devices": [
{
"name": "空调",
"status": "制冷"
}
]
}
]
}
丰富的数据类型支持:JSON支持多种数据类型,包括字符串、数字、布尔值、数组和对象等。这使得在传输不同类型的数据时更加灵活,能够满足各种应用场景的需求。例如,传感器数据可以是数字类型,设备状态可以用布尔值表示,设备名称则使用字符串描述。
(三)与网络通信的紧密结合
基于HTTP协议的传输:POST请求是HTTP协议中的一种常用方法,用于向服务器提交数据。通过POST请求接收JSON数据,意味着可以利用现有的网络通信基础设施和协议栈,实现Arduino设备与其他服务器或设备之间的数据交互。这种紧密结合使得数据的传输更加可靠和高效,并且可以方便地集成到各种网络应用中。
可扩展性和兼容性:由于HTTP协议的广泛应用和标准化,基于POST请求接收JSON数据的方式具有良好的可扩展性和兼容性。它可以与各种服务器端技术(如Node.js、Python Flask等)以及不同的客户端设备(如手机、电脑等)进行无缝对接,为构建复杂的物联网应用提供了坚实的基础。
二、应用场景
(一)物联网设备数据上传
传感器数据监测:在物联网应用中,大量的传感器需要将采集到的数据上传到服务器进行分析和处理。通过POST请求发送包含JSON格式数据的请求,可以将传感器数据(如温度、湿度、光照强度等)以及其他相关信息(如设备ID、时间戳等)一并发送给服务器。服务器接收到数据后,可以进行实时监测、数据分析和存储等操作。例如,在一个智能农业系统中,分布在农田中的各种传感器可以通过Arduino设备将采集到的数据以JSON格式通过POST请求发送到服务器,服务器根据这些数据进行农作物生长环境的监测和管理。
设备状态报告:物联网设备需要定期向服务器报告自身的状态信息,以便用户或管理系统了解设备的运行情况。使用POST请求发送JSON数据可以方便地将设备的状态信息(如工作状态、故障信息等)发送给服务器。例如,在一个智能家居系统中,智能插座、智能灯泡等设备可以通过Arduino定期发送包含自身状态信息的JSON数据到服务器,用户可以通过手机应用查看设备的状态。
(二)远程控制与配置
设备参数设置:用户可以通过服务器向Arduino设备发送包含配置参数的JSON数据,实现对设备的远程控制和配置。例如,在一个智能灌溉系统中,用户可以通过手机应用或网页界面设置灌溉时间、水量等参数,这些参数以JSON格式通过POST请求发送到Arduino控制器,控制器根据接收到的参数调整灌溉系统的运行。
固件升级与维护:在进行Arduino设备的固件升级或维护时,也可以利用POST请求接收JSON数据来获取升级包的相关信息或执行特定的维护任务。例如,服务器可以向设备发送包含固件版本号、下载地址等信息的JSON数据,设备接收到后进行固件升级操作。
(三)与第三方服务集成
数据共享与分析:Arduino设备可以通过POST请求将数据发送到第三方数据分析平台或云服务提供商,利用其强大的数据处理和分析能力挖掘数据的价值。例如,将环境监测数据发送到专业的数据分析平台,进行数据可视化和趋势预测,为用户提供更有价值的信息。
接入智能家居生态系统:在智能家居领域,不同的设备和系统需要相互协作和互联互通。通过POST请求接收JSON数据,Arduino设备可以接入各种智能家居生态系统,与其他设备进行数据交互和协同工作。例如,与智能音箱、智能门锁等设备进行联动,实现更加智能化的家居控制。
三、需要注意的事项
(一)服务器端配置与接口设计
正确的URL和端口号:在Arduino代码中,需要确保正确设置服务器的URL和端口号,以便能够准确地发送POST请求。如果URL或端口号错误,请求将无法到达服务器,导致数据传输失败。
接口兼容性:服务器端的接口需要能够正确处理接收到的POST请求和JSON数据。这包括对请求头的解析、JSON数据的验证和处理等。在设计服务器端接口时,要考虑不同客户端设备发送的数据格式和规范,确保接口的兼容性和稳定性。
(二)JSON数据的构建与发送
数据格式的正确性:在Arduino中构建JSON数据时,必须严格遵循JSON的语法规则。例如,键值对中的键必须是字符串,并且要用双引号括起来;对象的属性之间要用逗号分隔;数组中的元素也要用逗号分隔等。任何语法错误都可能导致服务器无法正确解析数据。
数据大小的限制:要注意JSON数据的大小,避免发送过大的数据包。一些服务器或网络环境可能对请求的数据大小有限制,如果数据过大,可能会导致请求失败或被截断。在构建JSON数据时,应尽量精简数据内容,只包含必要的信息。
(三)网络连接与稳定性
稳定的网络连接:POST请求依赖于网络连接,因此需要确保Arduino设备具有稳定的网络连接。在使用Wi-Fi连接时,要考虑信号强度、网络拥塞等因素,避免因网络问题导致请求失败。可以采取一些措施来提高网络连接的稳定性,如增加重试机制、优化网络配置等。
处理网络异常情况:在实际应用中,可能会出现网络中断、超时等异常情况。在Arduino代码中,需要对网络异常进行处理,例如在请求失败时进行重试,或者提示用户检查网络连接。同时,要考虑在网络恢复后重新发送未成功发送的请求。
(四)安全性考虑
数据加密:如果传输的数据涉及到用户的隐私或敏感信息,需要对数据进行加密处理。可以使用SSL/TLS等加密协议对通信进行加密,确保数据在传输过程中的安全性。
身份验证与授权:为了防止非法访问和恶意攻击,服务器端需要对请求进行身份验证和授权。Arduino设备在发送POST请求时,可能需要提供有效的身份凭证(如API密钥、用户名和密码等),服务器端对凭证进行验证后才会处理请求。
1、接收并解析POST请求中的JSON数据
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
ESP8266WebServer server(80);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
server.on("/post", HTTP_POST, handlePost);
server.begin();
}
void handlePost() {
if (server.hasArg("plain") == false) {
Serial.println("No data received");
server.send(400, "text/plain", "No data received");
return;
}
String body = server.arg("plain");
StaticJsonDocument<256> doc;
DeserializationError error = deserializeJson(doc, body);
if (error) {
Serial.print("JSON parsing failed: ");
Serial.println(error.c_str());
server.send(400, "text/plain", "JSON parsing failed");
return;
}
const char* name = doc["name"];
int age = doc["age"];
Serial.print("Name: ");
Serial.println(name);
Serial.print("Age: ");
Serial.println(age);
server.send(200, "text/plain", "Data received");
}
void loop() {
server.handleClient();
}
要点解读:
使用ESP8266连接到WiFi网络,并启动一个Web服务器来接收POST请求。
在handlePost函数中,通过server.arg(“plain”)获取POST请求的原始数据。
使用ArduinoJson库解析JSON数据,提取name和age字段,并通过串口输出。
如果解析失败,返回400错误;如果成功,返回200状态码并确认数据已接收。
2、接收JSON数据并控制设备
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
ESP8266WebServer server(80);
const int ledPin = 2; // 使用GPIO2作为LED引脚
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
server.on("/control", HTTP_POST, handleControl);
server.begin();
}
void handleControl() {
if (server.hasArg("plain") == false) {
Serial.println("No data received");
server.send(400, "text/plain", "No data received");
return;
}
String body = server.arg("plain");
StaticJsonDocument<128> doc;
DeserializationError error = deserializeJson(doc, body);
if (error) {
Serial.print("JSON parsing failed: ");
Serial.println(error.c_str());
server.send(400, "text/plain", "JSON parsing failed");
return;
}
bool ledState = doc["led"];
digitalWrite(ledPin, ledState ? HIGH : LOW);
Serial.print("LED State: ");
Serial.println(ledState ? "ON" : "OFF");
server.send(200, "text/plain", "Control received");
}
void loop() {
server.handleClient();
}
要点解读:
接收POST请求中的JSON数据,解析并控制设备(如LED)的状态。
在handleControl函数中,解析JSON数据中的led字段,根据其值控制LED的开关。
通过串口输出LED的状态,并返回200状态码确认控制指令已接收。
3、接收JSON数据并存储
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
ESP8266WebServer server(80);
StaticJsonDocument<512> storedData;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
server.on("/store", HTTP_POST, handleStore);
server.begin();
}
void handleStore() {
if (server.hasArg("plain") == false) {
Serial.println("No data received");
server.send(400, "text/plain", "No data received");
return;
}
String body = server.arg("plain");
DeserializationError error = deserializeJson(storedData, body);
if (error) {
Serial.print("JSON parsing failed: ");
Serial.println(error.c_str());
server.send(400, "text/plain", "JSON parsing failed");
return;
}
Serial.println("Data stored:");
for (JsonPair kv : storedData) {
Serial.print(kv.key());
Serial.print(": ");
Serial.println(kv.value().as<String>());
}
server.send(200, "text/plain", "Data stored");
}
void loop() {
server.handleClient();
}
要点解读:
接收POST请求中的JSON数据,并将其存储在全局变量storedData中。
在handleStore函数中,解析JSON数据并将其存储在StaticJsonDocument中。
通过串口输出存储的数据,并返回200状态码确认数据已存储。
4、使用 ESP8266 接收 POST 请求的 JSON 数据
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
// WiFi 信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 创建服务器对象,监听 80 端口
WiFiServer server(80);
void setup() {
Serial.begin(115200);
// 连接到 WiFi 网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// 启动服务器
server.begin();
Serial.println("Server started");
}
void loop() {
// 检查是否有客户端连接
WiFiClient client = server.available();
if (client) {
Serial.println("New client connected");
String currentLine = "";
String jsonPayload = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
// 空行表示头部结束,接下来可能是 POST 数据
if (jsonPayload.length() > 0) {
// 解析 JSON 数据
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, jsonPayload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
} else {
// 打印解析后的 JSON 数据
serializeJsonPretty(doc, Serial);
}
}
// 发送响应给客户端
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<html><body>Received JSON data successfully</body></html>");
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
if (currentLine.startsWith("Content-Length:")) {
// 提取 Content-Length 的值
int contentLength = currentLine.substring(16).toInt();
jsonPayload.reserve(contentLength);
}
if (jsonPayload.length() > 0) {
jsonPayload += c;
}
if (currentLine.endsWith("\r\n\r\n")) {
// 开始接收 POST 数据
jsonPayload = "";
}
}
}
}
// 关闭客户端连接
client.stop();
Serial.println("Client disconnected");
}
}
要点解读
库的引入:
ESP8266WiFi.h:用于 ESP8266 模块的 WiFi 连接和网络通信。
ArduinoJson.h:用于处理 JSON 数据的解析和生成。
WiFi 连接和服务器启动:
在 setup 函数中,连接到指定的 WiFi 网络,并启动一个 HTTP 服务器监听 80 端口。
客户端连接处理:
在 loop 函数中,检查是否有客户端连接。如果有,开始接收客户端发送的数据。
JSON 数据解析:
当接收到空行表示头部结束后,提取 Content-Length 的值,然后接收 POST 数据。
使用 deserializeJson 函数解析接收到的 JSON 数据,并处理解析结果。
响应客户端:
发送 HTTP 200 响应给客户端,表示数据接收成功。
5、使用以太网盾接收 POST 请求的 JSON 数据
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoJson.h>
// 以太网 MAC 地址和 IP 地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);
// 创建服务器对象,监听 80 端口
EthernetServer server(80);
void setup() {
Serial.begin(9600);
// 启动以太网连接
Ethernet.begin(mac, ip);
// 启动服务器
server.begin();
Serial.println("Server started");
}
void loop() {
// 检查是否有客户端连接
EthernetClient client = server.available();
if (client) {
Serial.println("New client connected");
String currentLine = "";
String jsonPayload = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
// 空行表示头部结束,接下来可能是 POST 数据
if (jsonPayload.length() > 0) {
// 解析 JSON 数据
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, jsonPayload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
} else {
// 打印解析后的 JSON 数据
serializeJsonPretty(doc, Serial);
}
}
// 发送响应给客户端
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<html><body>Received JSON data successfully</body></html>");
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
if (currentLine.startsWith("Content-Length:")) {
// 提取 Content-Length 的值
int contentLength = currentLine.substring(16).toInt();
jsonPayload.reserve(contentLength);
}
if (jsonPayload.length() > 0) {
jsonPayload += c;
}
if (currentLine.endsWith("\r\n\r\n")) {
// 开始接收 POST 数据
jsonPayload = "";
}
}
}
}
// 关闭客户端连接
client.stop();
Serial.println("Client disconnected");
}
}
要点解读
库的引入:
SPI.h:用于与以太网盾进行 SPI 通信。
Ethernet.h:用于以太网连接和网络通信。
ArduinoJson.h:用于处理 JSON 数据。
以太网连接和服务器启动:
在 setup 函数中,设置以太网的 MAC 地址和 IP 地址,启动以太网连接并开启 HTTP 服务器。
客户端连接和数据处理:
与案例一类似,在 loop 函数中检查客户端连接,接收客户端发送的数据,解析 JSON 数据并处理。
响应客户端:
发送 HTTP 200 响应给客户端,表示数据接收成功。
6、使用 MKR1000 接收 POST 请求的 JSON 数据
#include <WiFi101.h>
#include <ArduinoJson.h>
// WiFi 信息
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
// 创建服务器对象,监听 80 端口
WiFiServer server(80);
void setup() {
Serial.begin(115200);
// 初始化 WiFi 模块
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while (true);
}
// 连接到 WiFi 网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// 启动服务器
server.begin();
Serial.println("Server started");
}
void loop() {
// 检查是否有客户端连接
WiFiClient client = server.available();
if (client) {
Serial.println("New client connected");
String currentLine = "";
String jsonPayload = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
// 空行表示头部结束,接下来可能是 POST 数据
if (jsonPayload.length() > 0) {
// 解析 JSON 数据
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, jsonPayload);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
} else {
// 打印解析后的 JSON 数据
serializeJsonPretty(doc, Serial);
}
}
// 发送响应给客户端
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.println("<html><body>Received JSON data successfully</body></html>");
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
if (currentLine.startsWith("Content-Length:")) {
// 提取 Content-Length 的值
int contentLength = currentLine.substring(16).toInt();
jsonPayload.reserve(contentLength);
}
if (jsonPayload.length() > 0) {
jsonPayload += c;
}
if (currentLine.endsWith("\r\n\r\n")) {
// 开始接收 POST 数据
jsonPayload = "";
}
}
}
}
// 关闭客户端连接
client.stop();
Serial.println("Client disconnected");
}
}
要点解读
库的引入:
WiFi101.h:用于 MKR1000 开发板的 WiFi 连接和网络通信。
ArduinoJson.h:用于处理 JSON 数据。
WiFi 连接和服务器启动:
在 setup 函数中,检查 WiFi 模块是否存在,然后连接到指定的 WiFi 网络,并启动 HTTP 服务器。
客户端连接和数据处理:
与前两个案例类似,在 loop 函数中处理客户端连接,接收并解析 POST 请求中的 JSON 数据。
响应客户端:
发送 HTTP 200 响应给客户端,表示数据接收成功。
这几个案例展示了不同 Arduino 平台下如何接收 POST 请求中的 JSON 数据,核心步骤包括网络连接、服务器启动、客户端数据接收、JSON 数据解析和响应客户端。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。