【雕爷学编程】Arduino智能家居之ESP32-CAM远程监控和图像存储


Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:

开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。


Arduino在智能家居领域的应用主要特点如下:
1、灵活可扩展:Arduino作为一个开源平台,具有丰富的周边生态系统,包括各种传感器、执行器和通信模块。这些组件可以轻松地与Arduino主板连接,使得智能家居系统的功能能够根据需求进行扩展和定制。
2、低成本:Arduino硬件价格相对较低,适合个人和小规模项目。它的低成本特性使得智能家居技术对更多人群变得可行和负担得起。
3、易于使用和编程:Arduino采用简单易学的编程语言和开发环境,使得非专业人士也能够快速上手。通过编写简单的代码,结合传感器和执行器的使用,可以实现智能家居系统的各种功能。
4、高度可定制化:Arduino的开源特性使得用户可以自由地访问和修改其硬件和软件。这意味着用户可以根据自己的需求和创意,自定义和定制智能家居系统的功能和外观。

Arduino在智能家居领域有广泛的应用场景,包括但不限于以下几个方面:
1、温度和湿度控制:通过连接温度传感器和湿度传感器,Arduino可以实时监测室内环境的温度和湿度,并通过控制空调、加热器或加湿器等执行器,实现室内温湿度的自动调节。
2、照明控制:Arduino可以与光照传感器结合使用,根据环境光照强度自动调节室内照明。此外,通过使用无线通信模块,可以实现远程控制灯光开关和调光。
3、安防监控:通过连接门磁传感器、人体红外传感器和摄像头等设备,Arduino可以实现家庭安防监控系统。当检测到异常情况时,可以触发警报或发送通知。
4、智能窗帘和门窗控制:通过连接电机和红外传感器,Arduino可以实现智能窗帘的自动控制,根据光照和时间等条件进行开关。此外,通过连接门窗传感器,可以实现门窗的状态监测和自动开关。
5、能源管理:Arduino可以与电能监测模块和智能插座等设备结合使用,实时监测家庭能源的使用情况,并通过自动控制电器设备的开关,实现能源的有效管理和节约。

在使用Arduino构建智能家居系统时,需要注意以下事项:
1、安全性:智能家居系统涉及到家庭安全和隐私,需要注意确保系统的安全性。合理设置访问权限、加密通信以及保护个人隐私的措施是必要的。
2、电源供应:智能家居系统中的设备和传感器需要稳定的电源供应。合理规划和选择适当的电源方案,确保系统的稳定运行。
3、可靠性:智能家居系统应具备良好的可靠性,避免系统故障或误操作带来的不便。对于关键功能,可以考虑冗余设计或备份措施。
4、通信技术:选择适合的通信技术对于智能家居系统至关重要。根据具体需求和场景,可以选择无线通信技术,如Wi-Fi、蓝牙、Zigbee或Z-Wave等,或有线通信技术,如以太网或RS485等。确保通信稳定性和覆盖范围的同时,还需要考虑设备之间的互操作性和兼容性。
5、用户体验:智能家居系统的用户体验是重要的考虑因素。设计用户友好的界面和操作方式,提供简单直观的控制和反馈机制,以及考虑用户习惯和需求,能够提升系统的整体用户体验。

总之,Arduino作为一个灵活可扩展、低成本、易于使用和定制的开源平台,在智能家居领域有着广泛的应用。在构建Arduino智能家居系统时,需要注意安全性、电源供应、可靠性、通信技术和用户体验等方面的问题。


当涉及到Arduino智能家居的ESP32-CAM远程监控和图像存储时,以下是一些详细说明,以专业的视角:

主要特点:

视频监控功能:ESP32-CAM模块集成了摄像头,可以实现实时视频监控。通过连接到Arduino智能家居系统,可以从远程位置观看家庭或特定区域的实时视频流。

图像存储和传输:ESP32-CAM可以将捕获的图像进行存储,并通过网络传输到远程服务器或云存储服务。这使得用户可以随时查看和检索存储的图像,以便进行监控、安全性分析或其他用途。

移动便捷性:ESP32-CAM模块具有小巧的尺寸和便携性,可以方便地安装在需要监控的区域。这使得它非常适合无线远程监控应用,例如家庭安全、宠物监控或婴儿监护。

远程访问和控制:ESP32-CAM模块可以通过网络连接到Arduino智能家居系统,并通过手机应用程序或网页界面进行远程访问和控制。用户可以随时查看实时视频、访问存储的图像或进行其他相关设置。

应用场景:

家庭安全监控:ESP32-CAM模块可以用于家庭安全监控系统。用户可以安装摄像头在家中关键区域,如入口门、楼梯或后院,以实时监控并记录任何潜在的安全问题。

宠物监控:ESP32-CAM模块可用于宠物监控应用。用户可以将摄像头放置在宠物常去的区域,以远程观察宠物的行为、活动和安全情况。

婴儿监护:ESP32-CAM模块可用于婴儿监护系统。用户可以将摄像头安装在婴儿房间,以远程监控婴儿的睡眠状态、安全情况以及提供实时的视频监控。

需要注意的事项:

网络连接和带宽:确保ESP32-CAM模块与稳定的网络连接,以便实现远程监控和图像传输。同时,需要考虑网络带宽的要求,以确保视频流的稳定传输和存储图像的顺利上传。

隐私保护和数据安全:在进行远程监控和图像存储时,需要考虑隐私保护和数据安全。采取适当的措施,如数据加密、访问控制和安全传输协议,以保护用户的隐私和数据安全。

动力和存储容量:ESP32-CAM模块需要稳定的电源供应,以确保连续的监控和图像存储。此外,还需要考虑存储容量的要求,选择合适的存储设备或云存储服务来存储图像数据。

法律和合规性:在使用ESP32-CAM进行远程监控和图像存储时,需要遵守当地的法律和规定。了解并遵守相关的隐私法律和监控规定,确保合法、合规的使用。

综上所述,Arduino智能家居的ESP32-CAM远程监控和图像存储具有视频监控功能、图像存储和传输、移动便捷性以及远程访问和控制的特点。它适用于家庭安全监控、宠物监控和婴儿监护等应用场景。在使用ESP32-CAM模块时,需要注意网络连接和带宽、隐私保护和数据安全、动力和存储容量以及法律和合规性等事项,以确保系统的性能、安全性和合法性。


案例1:远程监控并实时显示图像

#include "esp_camera.h"
#include <WiFi.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

// WiFi网络参数
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// 图片上传服务器地址
const char* serverUrl = "http://your_server_url/upload.php";

camera_config_t config;

void startCameraServer();

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // 关闭BROWN OUT DETECTOR

  Serial.begin(115200);

  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // 设置摄像头配置
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5;
  config.pin_d1 = 18;
  config.pin_d2 = 19;
  config.pin_d3 = 21;
  config.pin_d4 = 36;
  config.pin_d5 = 39;
  config.pin_d6 = 34;
  config.pin_d7 = 35;
  config.pin_xclk = 0;
  config.pin_pclk = 22;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // 启动摄像头服务器
  startCameraServer();
}

void loop() {
  delay(10000);  // 每隔10秒拍摄一张照片并上传到服务器
  capturePhoto();
}

void startCameraServer(){
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5;
  config.pin_d1 = 18;
  config.pin_d2 = 19;
  config.pin_d3 = 21;
  config.pin_d4 = 36;
  config.pin_d5 = 39;
  config.pin_d6 = 34;
  config.pin_d7 = 35;
  config.pin_xclk = 0;
  config.pin_pclk = 22;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }
  // 初始化相机
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
}

这段代码实现了连接到WiFi网络、设置摄像头配置以及启动摄像头服务器。在loop函数中,每隔10秒拍摄一张照片并上传到服务器。你需要根据自己的需求,实现capturePhoto函数来拍摄照片并上传到指定的服务器地址。

案例2:图像存储到SD卡

#include "esp_camera.h"
#include "SD_MMC.h"

void setup() {
  Serial.begin(115200);
  
  // 初始化摄像头
  camera_config_t config;
  // ... (省略摄像头配置部分)

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  // 初始化SD卡
  if(!SD_MMC.begin()){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }
  
  // 创建文件
  File file = SD_MMC.open("/test.jpg", FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }

  // 拍摄照片并保存到SD卡
  camera_fb_t * fb = esp_camera_fb_get();
  if(!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  file.write(fb->buf, fb->len);
  file.close();
  esp_camera_fb_return(fb);
}

void loop() {
  // empty
}

这段代码初始化了摄像头和SD卡,并将拍摄的照片保存到SD卡上的指定文件中。你可以根据需要修改文件名和路径。

案例3:远程触发拍摄并存储

#include <WiFi.h>
#include "esp_camera.h"

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* serverUrl = "http://your_server_url/capture_image.php";

camera_config_t config;

void setup() {
  Serial.begin(115200);
  delay(10);

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Camera configuration
  config.ledc_channel = LEDC_CHANNEL_0;
  // ... (camera config details)
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
}

void loop() {
  if (digitalRead(BUTTON_PIN) == HIGH) {
    captureAndUpload();
    delay(1000);
  }
}

void captureAndUpload() {
  camera_fb_t * fb = NULL;
  // Take and save a photo
  fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    return;
  }
  File file = SD_MMC.open("/test.jpg", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file in SD card for writing");
    return;
  }
  file.write(fb->buf, fb->len);  // Write the image data to the file
  file.close();
  esp_camera_fb_return(fb);

  // Upload the photo to server
  WiFiClient client;
  if (!client.connect(server, 80)) {
    Serial.println("Connection to server failed");
    return;
  }
  String postData = "--boundary\r\n";
  postData += "Content-Disposition: form-data; name=\"image\"; filename=\"test.jpg\"\r\n";
  postData += "Content-Type: image/jpeg\r\n\r\n";
  postData += "<JPEG image data>\r\n";
  postData += "--boundary--\r\n";
  String postHeader = "POST /upload_image.php HTTP/1.1\r\n";
  postHeader += "Host: your_server_url\r\n";
  postHeader += "Content-Length: ";
  postHeader += postData.length();
  postHeader += "\r\n";
  postHeader += "Content-Type: multipart/form-data; boundary=--boundary\r\n\r\n";
  client.println(postHeader + postData);
  delay(10);
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  client.stop();
}

这段代码实现了通过按钮触发拍摄并上传照片到服务器。在loop函数中,检测按钮状态,如果按钮被按下,则执行captureAndUpload函数来拍摄照片并上传到服务器。你需要根据自己的需求修改服务器地址和其他相关参数。

以上是三个针对ESP32-CAM远程监控和图像存储的实际运用程序参考代码案例,它们可以帮助你开始构建一个功能完善的远程监控和图像存储系统。


案例4:ESP32-CAM实时视频流传输到Web服务器
以下是一个示例程序,使用ESP32-CAM模块和Web服务器实现实时视频流传输。

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESPAsyncWebServer.h>

// 替换为您的网络凭据
const char* ssid = "your-ssid";
const char* password = "your-password";

// 创建AsyncWebServer对象
AsyncWebServer server(80);

void setup() {
  // 初始化串口通信
  Serial.begin(115200);

  // 连接到Wi-Fi网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  // 初始化相机模块
  camera_config_t config;
  config.led_pin = -1;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.pin_xclk = 0;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_d7 = 35;
  config.pin_d6 = 34;
  config.pin_d5 = 39;
  config.pin_d4 = 36;
  config.pin_d3 = 21;
  config.pin_d2 = 19;
  config.pin_d1 = 18;
  config.pin_d0 = 5;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_pclk = 22;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;

  // 启动相机
  esp_err_t res = esp_camera_init(&config);
  if (res != ESP_OK) {
    Serial.printf("Camera initialization failed with error 0x%x", res);
    return;
  }

  // 设置路由处理程序
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    // 获取图像数据
    camera_fb_t *fb = esp_camera_fb_get();
    if (!fb) {
      request->send(500, "text/plain", "Camera capture failed");
      return;
    }

    // 发送图像数据
    request->send_P(200, "image/jpeg", (const uint8_t *)fb->buf, fb->len);

    // 释放图像缓冲区
    esp_camera_fb_return(fb);
  });

  // 启动Web服务器
  server.begin();
  Serial.println("Web server started");
}

void loop() {
  // 空循环
}

要点解读:
使用esp_camera.h库和esp_camera_init()函数初始化ESP32-CAM相机模块。
使用WiFi库连接到Wi-Fi网络。
在setup()函数中,配置相机模块的引脚和参数。
创建AsyncWebServer对象,并将路由处理程序设置为处理根路径的HTTP GET请求。
在路由处理程序中,调用esp_camera_fb_get()函数获取相机图像的帧缓冲区,然后将图像数据作为HTTP响应发送给客户端。
在loop()函数中,空循环以保持Web服务器运行。

案例5:ESP32-CAM将图像上传到云存储服务
以下是一个示例程序,使用ESP32-CAM模块将图像上传到云存储服务(例如Google Cloud Storage)。

#include "esp_camera.h"
#include <WiFi.h>
#include <HTTPClient.h>

// 替换为您的网络凭据
const char* ssid = "your-ssid";
const char* password = "your-password";

// 替换为您的云存储服务的终结点和凭据
const char* endpoint = "your-cloud-storage-endpoint";
const char* bucketName = "your-bucket-name";
const char* accessKey = "your-access-key";
const char* secretKey = "your-secret-key";

void setup() {
  // 初始化串口通信
  Serial.begin(115200);

  // 连接到Wi-Fi网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  // 初始化相机模块
  camera_config_t config;
  // 配置相机模块的引脚和参数
  // ...

  // 启动相机
  esp_err_t res = esp_camera_init(&config);
  if (res != ESP_OK) {
    Serial.printf("Camera initialization failed with error 0x%x", res);
    return;
  }
}

void loop() {
  // 获取图像数据
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    return;
  }

  // 创建HTTP客户端
  HTTPClient http;
  // 设置HTTP请求的URL
  String url = String(endpoint) + "/" + String(bucketName) + "/image.jpg";
  http.begin(url);

  // 设置HTTP请求头
  http.addHeader("Content-Type", "image/jpeg");
  http.addHeader("x-amz-acl", "public-read");
  http.addHeader("x-amz-content-sha256", "UNSIGNED-PAYLOAD");

  // 设置HTTP请求的凭据
  String authorizationHeader = "AWS " + String(accessKey) + ":" + String(secretKey);
  http.addHeader("Authorization", authorizationHeader);

  // 发送图像数据
  int httpCode = http.PUT(fb->buf, fb->len);
  if (httpCode == HTTP_CODE_OK) {
    Serial.println("Image uploaded successfully");
  } else {
    Serial.printf("Image upload failed with HTTP code %d", httpCode);
  }

  // 释放图像缓冲区
  esp_camera_fb_return(fb);

  // 关闭HTTP客户端
  http.end();

  // 延迟一段时间
  delay(5000);
}

要点解读:
使用esp_camera.h库和esp_camera_init()函数初始化ESP32-CAM相机模块。
使用WiFi库连接到Wi-Fi网络。
在setup()函数中,配置相机模块的引脚和参数。
在loop()函数中,使用esp_camera_fb_get()函数获取相机图像的帧缓冲区。
创建HTTPClient对象,并设置HTTP请求的URL、请求头和凭据。
使用http.PUT()方法将图像数据上传到云存储服务。
根据HTTP响应的状态码判断图像上传是否成功。
释放图像缓冲区,关闭HTTP客户端,并延迟一段时间后重复上传操作。

案例6:ESP32-CAM通过电子邮件发送图像
以下是一个示例程序,使用ESP32-CAM模块通过电子邮件发送图像。

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <SMTPClient.h>

// 替换为您的网络凭据
const char* ssid = "your-ssid";
const char* password = "your-password";

// 替换为您的SMTP服务器和电子邮件凭据
const char* smtpServer = "your-smtp-server";
int smtpPort = 465;
const char* smtpUsername = "your-smtp-username";
const char* smtpPassword = "your-smtp-password";
const char* fromEmail = "your-from-email";
const char* toEmail = "your-to-email";

void setup() {
  // 初始化串口通信
  Serial.begin(115200);

  // 连接到Wi-Fi网络
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  // 初始化相机模块
  camera_config_t config;
  
  // 配置相机模块的引脚和参数
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = 5;
  config.pin_d1 = 18;
  config.pin_d2 = 19;
  config.pin_d3 = 21;
  config.pin_d4 = 36;
  config.pin_d5 = 39;
  config.pin_d6 = 34;
  config.pin_d7 = 35;
  config.pin_xclk = 0;
  config.pin_pclk = 22;
  config.pin_vsync = 25;
  config.pin_href = 23;
  config.pin_sscb_sda = 26;
  config.pin_sscb_scl = 27;
  config.pin_pwdn = 32;
  config.pin_reset = -1;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size = FRAMESIZE_SVGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;

  // 启动相机
  esp_err_t res = esp_camera_init(&config);
  if (res != ESP_OK) {
    Serial.printf("Camera initialization failed with error 0x%x", res);
    return;
  }
}

void loop() {
  // 获取图像数据
  camera_fb_t *fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Camera capture failed");
    return;
  }

  // 创建安全的WiFi客户端
  WiFiClientSecure client;
  if (!client.connect(smtpServer, smtpPort)) {
    Serial.println("Failed to connect to SMTP server");
    esp_camera_fb_return(fb);
    return;
  }

  // 初始化SMTP客户端
  SMTPClient smtp(client, smtpServer, smtpPort, smtpUsername, smtpPassword);
  if (!smtp.send(fromEmail, toEmail, "ESP32-CAM Image", "", (const uint8_t *)fb->buf, fb->len)) {
    Serial.println("Failed to send email");
  } else {
    Serial.println("Email sent successfully");
  }

  // 释放图像缓冲区
  esp_camera_fb_return(fb);

  // 延迟一段时间
  delay(5000);
}

要点解读:
使用esp_camera.h库和esp_camera_init()函数初始化ESP32-CAM相机模块。
使用WiFi库连接到Wi-Fi网络。
在setup()函数中,配置相机模块的引脚和参数。
在loop()函数中,使用esp_camera_fb_get()函数获取相机图像的帧缓冲区。
创建安全的WiFi客户端并连接到SMTP服务器。
使用SMTPClient库初始化SMTP客户端,并使用smtp.send()方法将图像作为附件发送到指定的电子邮件地址。
根据发送结果打印相应的消息。
释放图像缓冲区,延迟一段时间后重复发送操作。
请注意,这些示例代码只是用于参考和演示目的,并且可能需要根据您的具体需求进行适当的修改和调整。

请注意,以上案例只是为了拓展思路,可能存在错误、不适用或者不能通过编译的情况。不同的硬件平台、使用场景和Arduino版本可能会导致不同的使用方法。在实际编程中,您需要根据您自己的硬件配置、使用场景和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

版权声明:本文为博主作者:驴友花雕原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_41659040/article/details/134380931

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年5月6日
下一篇 2024年5月6日

相关推荐