最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)

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



前言

    daodanjishui物联网核心原创技术之最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)。
    该专栏的第三篇博文:最简单DIY基于ESP32CAM的物联网相机系统③(在JSP服务器图传相片给所有客户端欣赏)介绍如何在客户端浏览器或客户端post请求发送软件上传图片base64编码信息给服务器,其他客户端如何通过浏览器查询到服务器里面上传的图片。说白了就是,实现一人传图多人共享图片的效果,缺点是上传图片是通过人工模拟http请求进行传图的,图片也是经过编码好的,并且不是通过ESP32CAM直接输出的图片,而是经过一定手段保存到硬盘的图片,并没有真正用到ESP32CAM这个硬件。所以这次我要使用ESP32CAM以最简单的方式在CAM的串口输出CAM自带的高清130万像素的OV2640摄像头拍摄的图片,电脑通过串口调试助手接收图片信息,串口接收到图片信息有两种:第一种是十六进制字节数据,另一种是十六进制字符串数据。
    串口在嵌入式开发中扮演着重要的角色,无论是串口调试,还是串口蓝牙,还是串口WIFI等等以串口为通信协议的模块都需要用到串口,所以使用硬件ESP32CAM之前就需要激活和使用串口作为入门第一堂课。

优酷视频介绍本次博文达到的高度:https://v.youku.com/v_show/id_XNTE1NDQ0NDA0NA==.html

用串口调试助手实现ESP32CAM串口图传


一、最简单DIY基于ESP32CAM的物联网相机系统④(用调试串口助手实现串口图传)是什么?

    现在对串口助手接收到两种图片信息做一下说明:我接触图像处理有4年历史了,人生又有多少个4年呢?一个人在自己熟悉的领域坚守阵地数年,修炼出来的功力不是三天两头掉包调库能比拟的。我最早接触的是OpenCV Mat矩阵对象存储图片信息,然后到Mjpeg_streamer开源项目用结构体指针存储图片信息,最后到单片机数组存储图片信息。从语言和语法的角度上我是开了倒车,但是从资源利用的角度来讲我是开顺风车,也见证了我从一个初学者到一个买卖者的蜕变。因为现在图传的方法很多样了,有串口图传、wifi图传、mqtt图传、邮件图传、二进制图传、http图传、EDP图传、json图传、URL图传、websocket图传、序列化图传、JS中的Blob图片对象图传等等,其实我每一个图传方式都可以写一个方案出来作为例子展示,但是归根结题,无论是高级语言还是低级语言,传输文件其实本质就是传输二进制数据,掌握这个根本的方式,就能解决所有图传问题,所以这期的博文,我将会揭开图传的面纱,意义深远。我将分享一个开源的ESP32CAM图传测试软件可以在网页操作ESP32CAM去分别执行用串口实现:十六进制图传和十六进制字符串图传。并且在电脑串口调试助手演示传输的效果。
    首先这个开源的图传测试软件当然是我独家首发的了,是ESP32CAM单片机图传测试和开发的最好的工具之一。这个软件是硬件和软件交互的纽带,与常规的图传测试软件不同,这个软件能直接控制ESP32CAM硬件采集图像信息,后期还会升级用文件系统保存js库实现文件操作,用js库实现本地图像处理。


二、实现需求

1.先打开官方例程研究串口技术

    在Arduino IDE有很多例子供开发者学习的。
(1)第一个相关的例子就是串口通信的例子了:
源码路径:(忘记在哪里了,代码保存在我硬盘上)


#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");
}

下载烧录代码之后,串口1会输出串口2读入的字符的ascll码,是以十六进制的数字输出的。并且初始化完成一次之后,会输出一次“hello daodanjishui”,为了正常使用串口2,读者还需要多准备一个USB转TTL模块接到开发板的定义16和17管脚是串口2的管脚上去。


2.再打开官方ESP32CAM照相机程序

源码路径是(只要读者正确安装了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);
}

3.修改上面1和2的官方源码变成自己的源码

(1)编写采图转串口的核心代码:

 char data[10];
                 msg = "";
                for (int i = 0; i < fb->len; i++)
                {
                    sprintf(data, "%02X", *((fb->buf + i)));
                    msg += data;                     
                }
                    if (msg.length()>0){                                    
                         Serial.print(msg);//直接打印十六进制的字符串,客户端不能直接解码
                    }    

(2)结合串口代码和采图代码完成最终的设计
需要完整代码的读者请到最后面的链接下载工程源码。这里省去几千字的代码······


三、运行与调试

(1)烧录代码开机,查看串口调试助手信息:
在这里插入图片描述
(2)用笔记本电脑的浏览器上输入打印出来的ESP32CAM的IP地址,这样就能访问到存在单片机里面的嵌入式主页,注意了ESP32和笔记本电脑必须要在同一个局域网才行.看到主页就成功了:
在这里插入图片描述
(3)上图传输的第一个参数是string,点击send之后就会触发ESP32CAM在串口1输出FFD8······FFD9的压缩图片格式jpg的图片数据,注意了这些数据是字符串形式的,另外可以看到点击send之后网页会多了一行红色的字符,说白了这就是CAM采集回来的图片信息,买家可以复制到图片查看工具就可以看到图片。nocathe=1620964951876是随机数证明每一次的数据都是不一样的,这是我用js语法写的一个随机数。
在这里插入图片描述
(4)串口打印的图片字符串信息如上图所示,如果你用其他MFC或者C#来写这个界面,又要安装开发环境又要安装驱动之类的很麻烦,我这个软件只需要有浏览器就可以,有编辑器就可以编写网页代码,非常人性化。买家可以学会我这个简洁的网页制作。然后修改网页上的提交表单的第一个参数换成hex,点击send意味着单片机将会在串口输出十六进制的数据,直接在串口助手接收会显示一堆乱码,如下图所示:
在这里插入图片描述
(5)当我们串口助手打上“16进制显示”的选项之后就看到间隔开来的十六进制的信息了,如下图所示:
在这里插入图片描述
最后我们就可以看出来输出的十六进制是有效的图片数据,因为有0xFF,0xD8,······,0xFF,0XD9,这些jpg专有格式的 数据,不过这个时候不能用这个图片查看器去查看图片了,要用其他专用的图片查看器去看图了,这个十六进制图片查看器后期我会独家发明出一个java 版本的图片查看器,到时候开一个专题来详细讲这个十六进制图传技术,到时候用的是TCP/IP实现高速字节流传输,效果当然不是这个项目简介达到的。读者现在可以在这个项目中先学会如何在CAM的串口输出十六进制的图片数据了。

调试到此结束,根据结果可以满足博文提出的要求。


总结

总结:根据我设计的嵌入式网页提交表单实现单片机输出图片的十六进制或者十六进制字符串到电脑串口调试助手,开发者可以利用我这个便捷的工具采集图片数据去开发更多的应用,我以项目292行源码的截图结束这次分享,绝对原创精简注释并开源,代码逻辑功能运行流畅,出错少,运行速度快,如下所示:
在这里插入图片描述
下一篇将会实现ESP32CAM黑白照相机,在单片机添加显示屏显示实时拍摄的照片。精彩值得期待,更多DIY在daodanjishui ESP32CAM专题可以找到你所想到的方案。支持daodanjishui核心原创ESP32CAM方案等于支持国产芯片ESP32,支持国产从我做起。

代码工程下载链接:https://gf.bilibili.com/item/detail/1107788114
点我直接跳转
提交post请求的软件名字叫:TestHttpPost.exe读者自己去下载吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

daodanjishui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值