【雕爷学编程】Arduino智慧交通之基于背景差分的车辆检测与流量计数

在这里插入图片描述
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智慧交通是一种基于Arduino技术的智能交通系统,旨在提供交通管理和优化方案。下面将详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:
1、实时数据采集和处理功能:系统可以通过连接传感器和Arduino控制器,实时采集交通相关数据,如交通流量、车辆速度、道路状态等。通过数据处理和分析,可以生成实时的交通信息和统计数据。
2、智能交通控制和优化功能:系统可以根据采集到的数据,实现智能的交通控制和优化。通过控制信号灯、调整道路限速、优化车辆流量等方式,改善交通拥堵、提高交通效率。
3、交通事故预警和安全管理功能:系统可以通过数据分析和模式识别,实现交通事故的预警和安全管理。一旦检测到异常情况,如交通事故风险区域、超速行驶等,可以及时发出警报并采取相应的安全措施。
4、用户信息服务和智能导航功能:系统可以向用户提供实时的交通信息服务和智能导航功能。通过连接到移动设备或车载导航系统,为用户提供最佳的路线规划、交通拥堵提示等服务。

应用场景:
1、城市交通管理:系统可应用于城市交通管理,通过智能交通控制和优化,改善交通拥堵、提高交通效率。可以在城市主要道路、交叉口等关键位置部署传感器和控制装置,实现交通流量的实时监测和控制。
2、高速公路管理:系统可用于高速公路的交通管理。通过部署传感器和摄像头,实时监测车辆流量、限速情况等,并提供交通事故预警和安全管理服务,提高高速公路的安全性和通行效率。
3、智能车辆导航和驾驶辅助:系统可与车载导航系统集成,为驾驶员提供智能导航和交通信息服务。通过实时的交通信息和路况提示,帮助驾驶员选择最佳路线,避免交通拥堵和事故风险。

需要注意的事项:
1、数据隐私和安全:在采集和处理交通数据时,需要保护用户的隐私和数据安全。合理采用数据加密、访问控制等措施,确保交通数据不被泄露或滥用。
2、系统可靠性和稳定性:智慧交通系统需要具备高可靠性和稳定性,以确保交通信息的准确性和实时性。系统的硬件设备和软件应具备良好的稳定性和容错性,以应对突发状况和故障。
3、法律法规和道路安全:在使用智慧交通系统时,需要遵守相关的法律法规和道路安全规定。系统设计和使用应符合交通法规,保障交通安全和秩序。

总结而言,Arduino智慧交通具有实时数据采集和处理、智能交通控制和优化、交通事故预警和安全管理、用户信息服务和智能导航等主要特点。它适用于城市交通管理、高速公路管理和智能车辆导航等场景。在使用此技术时,需要注意数据隐私和安全、系统可靠性和稳定性,以及法律法规和道路安全等事项。

在这里插入图片描述
基于背景差分的车辆检测与流量计数是Arduino智慧交通领域中常用的一种方法,通过对视频图像进行背景建模和差分运算,实现对车辆的检测和流量计数。下面我将以专业的视角为您详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:
实时性:基于背景差分的车辆检测与流量计数可以实时地对视频图像进行处理和分析,能够提供即时的车辆检测和流量计数结果,适用于交通监控和管理等实时应用场景。
简洁高效:该方法基于背景差分原理,通过对当前图像与背景图像进行差分运算,提取出前景目标(车辆),从而实现车辆的检测和计数。算法相对简单高效,适合在嵌入式平台如Arduino上实现。
低成本:基于背景差分的车辆检测与流量计数相对于其他高级视觉算法,具有较低的成本,因为它只需要一个摄像头和较少的计算资源就可以实现车辆检测和计数。
高适应性:该方法对于不同道路场景和光照条件具有一定的适应性。通过对背景模型的更新和参数的调整,可以适应不同的环境变化,提高车辆检测和计数的准确性。

应用场景:
交通监控和管理:基于背景差分的车辆检测与流量计数广泛应用于交通监控和管理系统。通过对道路上车辆的实时检测和计数,可以提供交通流量数据,用于交通状况分析、拥堵预警、交通信号优化等。
停车场管理:该方法也适用于停车场管理系统。通过在停车场出入口处设置摄像头,可以实时检测车辆的进入和离开,实现停车场流量的计数和管理。
路口监控和安全:基于背景差分的车辆检测与流量计数可以用于路口的实时监控和安全管理。通过检测车辆的行驶方向和流量,可以提供路口交通流量数据、交通冲突检测等功能,有助于提高路口的安全性和交通效率。
市场调研和数据分析:车辆流量数据对市场调研和数据分析具有重要意义。基于背景差分的车辆检测与流量计数可以提供特定区域的车辆通行数据,为商业定位、市场分析和投资决策提供依据。

需要注意的事项:
背景建模与更新:背景差分算法依赖于准确的背景建模。在实际应用中,需要考虑场景中的动态变化,如树木摇晃、光照变化等,合理更新背景模型,以保持准确的车辆检测。
参数调整与优化:背景差分算法中的参数设置对车辆检测和计数的准确性具有重要影响。需要根据实际场景进行参数的调整和优化,以提高算法的性能。
遮挡与误检测:背景差分算法容易产生遮挡和误检测问题。遮挡指的是车辆被其他物体部分或完全遮挡,导致检测不准确。误检测指的是将非车辆的前景目标误判为车辆。在实际应用中,需要采取一些措施来减少遮挡和误检测的影响,如使用多个摄像头进行多视角监测、结合其他传感器数据进行验证等。
硬件要求:基于背景差分的车辆检测与流量计数通常需要使用摄像头来获取视频图像,并需要一定的计算资源进行图像处理和分析。在选择硬件平台时,需要考虑摄像头的分辨率和帧率要求,以及计算资源的性能和存储容量。
隐私保护:车辆检测与流量计数涉及对车辆行驶轨迹和数量的获取,需要注意隐私保护。在设计和实施系统时,应采取相应的措施来确保数据的安全性和隐私性。

总之,基于背景差分的车辆检测与流量计数是一种简单高效、成本较低且具有实时性的方法,适用于交通监控、停车场管理、路口安全和市场调研等领域。在应用过程中需要关注背景建模与更新、参数调整与优化、遮挡与误检测、硬件要求和隐私保护等问题,以提高算法的准确性和可靠性。

在这里插入图片描述
当涉及到基于背景差分的车辆检测与流量计数的智慧交通系统,以下是几个实际运用程序参考代码案例:

案例一:背景建模与车辆检测

#include <Arduino.h>
#include <ESP32-CAM.h>
#include <opencv2/opencv.hpp>

const int PIR_PIN = 13;
const int LED_PIN = 4;

cv::Mat background;
cv::Mat frame;
cv::Mat foregroundMask;
cv::Ptr<cv::BackgroundSubtractorMOG2> pMOG2;
cv::Rect vehicleBoundingBox;
bool vehicleDetected = false;

void IRAM_ATTR handleInterrupt() {
  vehicleDetected = true;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(PIR_PIN), handleInterrupt, RISING);

  pMOG2 = cv::createBackgroundSubtractorMOG2();
  pMOG2->setDetectShadows(false);
}

void loop() {
  if (vehicleDetected) {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Vehicle detected!");

    // Capture frame from camera
    // (Assuming you have configured the ESP32-CAM module to capture frames)

    // Convert captured frame to grayscale
    cvtColor(frame, frame, cv::COLOR_BGR2GRAY);

    // Apply background subtraction
    pMOG2->apply(frame, foregroundMask);

    // Find contours of moving objects
    std::vector<std::vector<cv::Point>> contours;
    findContours(foregroundMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // Filter contours based on area and aspect ratio to detect vehicles
    for (const auto& contour : contours) {
      cv::Rect boundingBox = cv::boundingRect(contour);
      double area = cv::contourArea(contour);
      double aspectRatio = static_cast<double>(boundingBox.width) / boundingBox.height;

      if (area > 1000 && aspectRatio > 0.8 && aspectRatio < 2.5) {
        vehicleBoundingBox = boundingBox;
        break;
      }
    }

    // Print vehicle bounding box coordinates
    Serial.print("Vehicle bounding box (x, y, width, height): ");
    Serial.print(vehicleBoundingBox.x);
    Serial.print(", ");
    Serial.print(vehicleBoundingBox.y);
    Serial.print(", ");
    Serial.print(vehicleBoundingBox.width);
    Serial.print(", ");
    Serial.println(vehicleBoundingBox.height);

    vehicleDetected = false;
    delay(2000);
    digitalWrite(LED_PIN, LOW);
  }
}

要点解读:
使用ESP32-CAM模块进行摄像头图像捕捉。
使用一个PIR(被动红外)传感器来检测车辆的到来。
使用OpenCV库进行背景建模和前景提取。
通过计算轮廓的面积和长宽比来筛选出车辆。
在循环中,当检测到车辆时,点亮LED指示灯并打印车辆的边界框坐标。

案例二:车辆流量计数

#include <Arduino.h>
#include <ESP32-CAM.h>
#include <opencv2/opencv.hpp>

const int PIR_PIN = 13;
const int LED_PIN = 4;

cv::Mat background;
cv::Mat frame;
cv::Mat foregroundMask;
cv::Ptr<cv::BackgroundSubtractorMOG2> pMOG2;
cv::Rect vehicleBoundingBox;
int vehicleCount = 0;
bool vehicleDetected = false;

void IRAM_ATTR handleInterrupt() {
  vehicleDetected = true;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(PIR_PIN), handleInterrupt, RISING);

  pMOG2 = cv::createBackgroundSubtractorMOG2();
  pMOG2->setDetectShadows(false);
}

void loop() {
  if (vehicleDetected) {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Vehicle detected!");

    // Capture frame from camera
    // (Assuming you have configured the ESP32-CAM module to capture frames)

    // Convert captured frame to grayscale
    cvtColor(frame, frame, cv::COLOR_BGR2GRAY);

    // Apply background subtraction
    pMOG2->apply(frame, foregroundMask);

    // Find contours of moving objects
   std::vector<std::vector<cv::Point>> contours;
    findContours(foregroundMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // Filter contours based on area and aspect ratio to detect vehicles
    for (const auto& contour : contours) {
      cv::Rect boundingBox = cv::boundingRect(contour);
      double area = cv::contourArea(contour);
      double aspectRatio = static_cast<double>(boundingBox.width) / boundingBox.height;

      if (area > 1000 && aspectRatio > 0.8 && aspectRatio < 2.5) {
        vehicleBoundingBox = boundingBox;
        vehicleCount++;
        break;
      }
    }

    // Print vehicle count
    Serial.print("Vehicle count: ");
    Serial.println(vehicleCount);

    vehicleDetected = false;
    delay(2000);
    digitalWrite(LED_PIN, LOW);
  }
}

要点解读:
使用ESP32-CAM模块进行摄像头图像捕捉。
使用一个PIR(被动红外)传感器来检测车辆的到来。
使用OpenCV库进行背景建模和前景提取。
通过计算轮廓的面积和长宽比来筛选出车辆,并进行计数。
在循环中,当检测到车辆时,点亮LED指示灯并打印车辆的数量。

案例三:车辆流量统计

#include <Arduino.h>
#include <ESP32-CAM.h>
#include <opencv2/opencv.hpp>

const int PIR_PIN = 13;
const int LED_PIN = 4;

cv::Mat background;
cv::Mat frame;
cv::Mat foregroundMask;
cv::Ptr<cv::BackgroundSubtractorMOG2> pMOG2;
std::vector<cv::Rect> vehicleBoundingBoxes;
int totalVehicleCount = 0;
int inVehicleCount = 0;
int outVehicleCount = 0;
bool vehicleDetected = false;

void IRAM_ATTR handleInterrupt() {
  vehicleDetected = true;
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(PIR_PIN), handleInterrupt, RISING);

  pMOG2 = cv::createBackgroundSubtractorMOG2();
  pMOG2->setDetectShadows(false);
}

void loop() {
  if (vehicleDetected) {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Vehicle detected!");

    // Capture frame from camera
    // (Assuming you have configured the ESP32-CAM module to capture frames)

    // Convert captured frame to grayscale
    cvtColor(frame, frame, cv::COLOR_BGR2GRAY);

    // Apply background subtraction
    pMOG2->apply(frame, foregroundMask);

    // Find contours of moving objects
    std::vector<std::vector<cv::Point>> contours;
    findContours(foregroundMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

    // Filter contours based on area and aspect ratio to detect vehicles
    for (const auto& contour : contours) {
      cv::Rect boundingBox = cv::boundingRect(contour);
      double area = cv::contourArea(contour);
      double aspectRatio = static_cast<double>(boundingBox.width) / boundingBox.height;

      if (area > 1000 && aspectRatio > 0.8 && aspectRatio < 2.5) {
        vehicleBoundingBoxes.push_back(boundingBox);
      }
    }

    // Count vehicles entering and exiting
    for (const auto& boundingBox : vehicleBoundingBoxes) {
      // Determine if the vehicle is entering or exiting based on its position
      if (boundingBox.x < frame.cols / 2) {
        inVehicleCount++;
      } else {
        outVehicleCount++;
      }
    }

    // Print total vehicle count, in-vehicle count, and out-vehicle count
    totalVehicleCount = inVehicleCount + outVehicleCount;
    Serial.print("Total vehicle count: ");
    Serial.println(totalVehicleCount);
    Serial.print("In-vehicle count: ");
    Serial.println(inVehicleCount);
    Serial.print("Out-vehicle count: ");
    Serial.println(outVehicleCount);

    vehicleDetected = false;
    delay(2000);
    digitalWrite(LED_PIN, LOW);
  }
}

要点解读:
使用ESP32-CAM模块进行摄像头图像捕捉。
使用一个PIR(被动红外)传感器来检测车辆的到来。
使用OpenCV库进行背景建模和前景提取。
通过计算轮廓的面积和长宽比来筛选出车辆,并将车辆的边界框存储在一个向量中。
根据车辆边界框的位置,统计进入和离开的车辆数量。
在循环中,当检测到车辆时,点亮LED指示灯并打印总车辆数量、进入车辆数量和离开车辆数量。
这些案例代码基于Arduino和ESP32-CAM模块,使用OpenCV库进行图像处理和分析。代码中的关键步骤包括图像采集、背景建模、前景提取、轮廓检测、车辆筛选和计数等。这些案例提供了基于背景差分的车辆检测和流量计数的基本框架,可以根据实际需求进行进一步的优化和扩展。

在这里插入图片描述
以下是几个基于背景差分的车辆检测与流量计数的实际运用程序参考代码案例:

案例四:背景差分车辆检测

#include <opencv2/opencv.hpp>

const int cameraPin = 0;
const int thresholdValue = 30;
const int minContourArea = 1000;

cv::BackgroundSubtractorMOG2 backgroundSubtractor;
cv::VideoCapture capture;
cv::Mat frame, foregroundMask, blurredMask, thresholdMask;
std::vector<std::vector<cv::Point>> contours;

int vehicleCount = 0;

void setup()
{
  capture.open(cameraPin);
  if (!capture.isOpened())
  {
    Serial.println("Error opening camera");
    while (1);
  }
}

void loop()
{
  capture >> frame;

  // Apply background subtraction
  backgroundSubtractor(frame, foregroundMask);

  // Apply image processing
  cv::GaussianBlur(foregroundMask, blurredMask, cv::Size(21, 21), 0);
  cv::threshold(blurredMask, thresholdMask, thresholdValue, 255, cv::THRESH_BINARY);

  // Find contours
  cv::findContours(thresholdMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

  // Count vehicles
  int previousCount = vehicleCount;
  vehicleCount = 0;
  for (size_t i = 0; i < contours.size(); i++)
  {
    if (cv::contourArea(contours[i]) > minContourArea)
    {
      vehicleCount++;
    }
  }

  // Print vehicle count
  if (vehicleCount > previousCount)
  {
    Serial.println("Vehicle detected");
  }
}

要点解读:
该程序使用Arduino和OpenCV库实现了基于背景差分的车辆检测功能。
使用BackgroundSubtractorMOG2类进行背景差分,将当前帧与背景进行比较,提取前景。
对前景图像进行高斯模糊和二值化处理,得到二值化的前景掩码。
使用findContours函数找到前景掩码中的轮廓。
根据设置的最小轮廓面积阈值,判断是否为车辆,并进行车辆计数。
如果当前帧检测到新的车辆,则通过串口打印"Vehicle detected"。

案例五:车辆流量计数

#include <opencv2/opencv.hpp>

const int cameraPin = 0;
const int thresholdValue = 30;
const int minContourArea = 1000;
const int countingLineY = 300;

cv::BackgroundSubtractorMOG2 backgroundSubtractor;
cv::VideoCapture capture;
cv::Mat frame, foregroundMask, blurredMask, thresholdMask;
std::vector<std::vector<cv::Point>> contours;

int vehicleCount = 0;

void setup()
{
  capture.open(cameraPin);
  if (!capture.isOpened())
  {
    Serial.println("Error opening camera");
    while (1);
  }
}

void loop()
{
  capture >> frame;

  // Apply background subtraction
  backgroundSubtractor(frame, foregroundMask);

  // Apply image processing
  cv::GaussianBlur(foregroundMask, blurredMask, cv::Size(21, 21), 0);
  cv::threshold(blurredMask, thresholdMask, thresholdValue, 255, cv::THRESH_BINARY);

  // Find contours
  cv::findContours(thresholdMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

  // Count vehicles
  for (size_t i = 0; i < contours.size(); i++)
  {
    if (cv::contourArea(contours[i]) > minContourArea)
    {
      cv::Rect boundingRect = cv::boundingRect(contours[i]);
      int centerY = boundingRect.y + boundingRect.height / 2;
      if (centerY > countingLineY)
      {
        vehicleCount++;
      }
    }
  }

  // Print vehicle count
  Serial.print("Vehicle count: ");
  Serial.println(vehicleCount);
}

要点解读:
该程序使用Arduino和OpenCV库实现了基于背景差分的车辆流量计数功能。
使用BackgroundSubtractorMOG2类进行背景差分,将当前帧与背景进行比较,提取前景。
对前景图像进行高斯模糊和二值化处理,得到二值化的前景掩码。
使用findContours函数找到前景掩码中的轮廓。
根据设置的最小轮廓面积阈值,判断是否为车辆,并通过判断轮廓的中心Y坐标与设定的计数线Y坐标进行判断,确定车辆是否通过计数线。
根据通过计数线的车辆数量进行流量计数。
通过串口打印车辆数量。

案例六:实时显示车辆检测结果

#include <opencv2/opencv.hpp>

const int cameraPin = 0;
const int thresholdValue = 30;
const int minContourArea = 1000;

cv::BackgroundSubtractorMOG2 backgroundSubtractor;
cv::VideoCapture capture;
cv::Mat frame, foregroundMask, blurredMask, thresholdMask;
std::vector<std::vector<cv::Point>> contours;

int vehicleCount = 0;

void setup()
{
  capture.open(cameraPin);
  if (!capture.isOpened())
  {
    Serial.println("Error opening camera");
    while (1);
  }

  // Set up video output
  cv::namedWindow("Vehicle Detection");
}

void loop()
{
  capture >> frame;

  // Apply background subtraction
  backgroundSubtractor(frame, foregroundMask);

  // Apply image processing
  cv::GaussianBlur(foregroundMask, blurredMask, cv::Size(21, 21), 0);
  cv::threshold(blurredMask, thresholdMask, thresholdValue, 255, cv::THRESH_BINARY);

  // Find contours
  cv::findContours(thresholdMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

  // Count vehicles
  vehicleCount = 0;
  for (size_t i = 0; i < contours.size(); i++)
  {
    if (cv::contourArea(contours[i]) > minContourArea)
    {
      vehicleCount++;
      cv::drawContours(frame, contours, i, cv::Scalar(0, 255, 0), 2);
    }
  }

  // Print vehicle count
  cv::putText(frame, "Vehicle count: " + std::to_string(vehicleCount), cv::Point(10, 30),
              cv::FONT_HERSHEY_SIMPLEX, 0.8, cv::Scalar(0, 0, 255), 2);

  // Display frame
  cv::imshow("Vehicle Detection", frame);
  cv::waitKey(1);
}

要点解读:
该程序使用Arduino和OpenCV库实现了基于背景差分的车辆检测,并在图像上实时显示检测结果。
使用BackgroundSubtractorMOG2类进行背景差分,将当前帧与背景进行比较,提取前景。
对前景图像进行高斯模糊和二值化处理,得到二值化的前景掩码。
使用findContours函数找到前景掩码中的轮廓,并通过绘制轮廓在图像上显示检测到的车辆。
根据设置的最小轮廓面积阈值,判断是否为车辆,并进行车辆计数。
在图像上绘制车辆数量,并通过串口打印车辆数量。
显示处理后的图像窗口,并实时更新显示。
以上是基于背景差分的车辆检测与流量计数的几个实际运用程序参考代码案例,通过这些代码可以实现车辆检测、流量计数以及实时显示检测结果的功能。你可以根据自己的需求和硬件平台进行相应的修改和优化。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雕爷学编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷学编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷学编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值