第一篇:最简单DIY基于ESP32CAM的物联网相机系统①(用网页实现拍照图传)
第二篇:最简单DIY基于ESP32CAM的物联网相机系统②(在JAVAWEB服务器实现图片查看器)
第三篇:最简单DIY基于ESP32CAM的物联网相机系统③(在JSP服务器图传相片给所有客户端欣赏)
第四篇:最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)
第五篇(上):最简单DIY基于ESP32CAM的物联网相机系统⑤(用1306OLED实现WIFI黑白屏照相机)
第五篇(下):最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)



前言

    daodanjishui物联网核心原创技术之最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)。
    该专栏的第四篇博文:最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传) 实现的是用ESP32CAM拍摄照片传输到电脑串口调试助手,在串口调试助手里面拷贝图片信息出来放到图片查看器可以看到拍摄的图片,其实这样很麻烦。
    在这篇博文,用C#上位机实现直接接收串口图传的十六进制字节数据,直接显示在上位机上。如果是做嵌入式图像处理的读者,我强烈推荐借鉴我这次的开源方案,这个C#代码跟C++不同的,适合新手或者老手修改达到二次开发,现在界面编程确实流行C#,因为根植于Windows系统,体积小,运行流畅,所以下载了我这个项目的源码的读者,现在可以做一个基于ESP32CAM监控摄像头监控之类的设计了,也可以学会图像传输和接收和编码等热门知识!
优酷视频演示地址:https://v.youku.com/v_show/id_XNTE2MTM4Njc4MA==.html

ESP32CAM的物联网相机系统⑤用C#上位机实现串口图传

请看看下面的效果图(为了相机稳定我加了电源控制模块输出稳定的5V电压):
在这里插入图片描述
下面的是调试图:
在这里插入图片描述
正常运行的效果图:

在这里插入图片描述


一、最简单DIY基于ESP32CAM的物联网相机系统⑤(用C#上位机实现串口图传)是什么?

    这个C#上位机确实不是我亲自写的,是一个免费开源的项目,当时在网上下载的,大家想免费的话自行去下载,附上另外一个开源的MFC客户端免费下载链接,(不是用C#写的,用C++写的,也可以实现串口图传,源码阅读有点困难的,如果想阅读简单的,可能要下载我最后附录的C#工程了):http://www.openedv.com/forum.php?mod=viewthread&tid=65762&highlight=%C9%E3%CF%F1%CD%B7%2B%C9%CF%CE%BB%BB%FA 该C#代码经过我整理,完美匹配我 最简单DIY基于ESP32CAM的物联网相机系统④ 项目涉及到的硬件,所以硬件配置和使用可以去参考最简单DIY基于ESP32CAM的物联网相机系统④的项目简介。并且在源码的关键地方加上了我的注释,但是这套原来源码是用来接收智能小车发送的图片的,后期也有可能用到我智能小车系列项目当中。现在我用来接收我ESP32CAM相机拍摄的图片,还是有一定的区别的, 因为这个项目的下位机代码用的就是最简单DIY基于ESP32CAM的物联网相机系统④的代码,我的代码都是一个系列的,上一个项目会与下个项目密切相关。


二、运行环境说明

1.PC软件环境

    运行这个C#工程需要用到VS2010软件,我当时用这个软件来开发OpenCV和C++和C#,后面也没有更新过这个软件,觉得麻烦。其实在网上稍微配置一下就可以实现在高版本的VS软件上使用了,不过我也懒得去弄了。MFC客户端工程免费下载链接:http://www.openedv.com/forum.php?mod=viewthread&tid=65762&highlight=%C9%E3%CF%F1%CD%B7%2B%C9%CF%CE%BB%BB%FA
在这里插入图片描述


2.单片机开发环境Arduino

官方摄像头源码路径是(只要读者正确安装了ESP32开发环境,这个源码可以在Arduino里面按照下面截图的方式打开的):
在这里插入图片描述

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

//
// WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
//            Ensure ESP32 Wrover Module or other board with PSRAM is selected
//            Partial images will be transmitted if image exceeds buffer size
//

// Select camera model
#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE	// Has PSRAM
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM

#include "camera_pins.h"

const char* ssid = "*********";
const char* password = "*********";

void startCameraServer();

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  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;
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

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

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

#if defined(CAMERA_MODEL_M5STACK_WIDE)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
#endif

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("' to connect");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}

官方串口通信的代码如下,路径我忘记了:


#include <HardwareSerial.h>
HardwareSerial MySerial(1);

void setup() {
    MySerial.begin(9600, SERIAL_8N1, 16, 17);//定义16和17管脚是串口2
    Serial.begin(115200);//串口1
    
}

void loop() {
    while (MySerial.available() > 0) {
        uint8_t byteFromSerial = MySerial.read();
        // Do something
        Serial.println(byteFromSerial);//输出十六机制的数字
        
    }
   
    //Write something like that
    MySerial.write("hello daodanjishui");
}

3.修改上面2的源码变成自己的源码

需要全部工程源码的请到最后链接去下载了。


三、运行与调试

(1)开机上电,将串口连接电脑,启动C#上位机,等待图片信息通过串口传给C#显示。用浏览器登录相机的主页,点击send拍摄一张图片,浏览器上显示红色字体就是图片的信息。
在这里插入图片描述
(2)再复制红色的信息粘贴到图片查看器看看是什么样子的图片。
在这里插入图片描述
(3)在对比下C#上位机显示的图片是不是一模一样的:
在这里插入图片描述
证明了图传成功了。
调试到此结束,根据结果可以满足博文提出的要求。


总结

总结:读者可以在这里学会了C#技术,可以在不刷新网页的前提下不断点击send按钮拍照,并且网页会显示一个变化的随机数nocathe=1620924773578 提示用户拍照成功,这个反馈不知道有多少个技术开发者想写都难写出来的,因为这个技术要熟悉JS技术才能使用得淋漓尽致了,还有就是可以学到嵌入式网页设计及嵌入式服务器的设计及嵌入式服务器如何接受get请求和用异步响应get请求。下一期,daodanjishui要秀出多种ESP32高速wifi图传上位机,实现相机拍照后上传到服务器,上位机包括JSP上位机、MFC上位机、JAVA Swing上位机等等,精彩值得期待,原创开源值得期待。

代码工程下载链接:https://www.cirmall.com/circuit/24549/
点我直接跳转

更多推荐