文章目录

目录

前言

一、ESP32-CAM设备准备

二、设备接线

三、 Arduino获取视频IP地址以及端口

四、在Android studio上代码实现

总结



前言

最近打比赛创新点需要在app里设计添加监控模块,看了CSDN其他文章,借鉴了各位大佬的思路,最近成功解决,由于花费也少,所以在这里总结一下。

一、ESP32-CAM设备准备

ESP32-CAM开发板(30块左右),USB转TTL设备、ESP32-CAM烧录座(可以不买,后面发现被坑了几块钱)、杜邦线五根

本人于淘宝和pdd上购买,截图如下:

这里ESP32-CAM开发板到货后,注意摄像头插槽的使用,可以看下图,将开发板黑色小插槽上翻,刚好压住摄像头元件,正常情况下摄像头是不会脱落的。

二、设备接线

用杜邦线将ESP32-CAM的5V、GND、U0T、U0R分别连上USB转TTL设备的5V、GND、RXD、TXD,其中输入电源一定要至少5V 2A,否则视频会出现水纹。另外再用杜邦线将ESP32-CAM的GND与IO0短接,否则后期代码烧录会失败。

三、 Arduino获取视频IP地址以及端口

1.下载Arduino IDE 2.0.4 下载地址:https://www.arduino.cc/en/software

注意下载win10 and newer,64bits

2.设备连接

USB转TTL连上电脑,将开发板IO0与GND短接,打开电脑的设备管理器,端口中有CH340,则说明设备连接成功。

3.Arduino代码示例

打开Arduino的exe文件,File—Examples—ESP32—Camera—CameraWebServer,Tools工具栏的Board选择AI Thinker ESP32—CAM,Port选择COM3,在sketch中敲入示例代码:

#include <Arduino.h>
#include <WiFi.h>
#include "esp_camera.h"
#include <vector>#define maxcache 1024  //图像数据包的大小const char* ssid = "*****"; //输入wifi名称
const char* password = "   "; //输入电脑连上的wifi的密码const int LED = 4;//闪光灯
const int ZHESHI_LED = 33; //指示灯
bool cam_state = true;  //是否开启摄像头传输
const int port = 8080;
String  frame_begin = "FrameBegin"; //图像传输包头
String  frame_over = "FrameOverr";  //图像传输包尾
String  msg_begin = "Esp32Msg";  //消息传输头
//创建服务器端
WiFiServer server;
//创建客户端
WiFiClient client;//CAMERA_MODEL_AI_THINKER类型摄像头的引脚定义
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22static camera_config_t camera_config = {.pin_pwdn = PWDN_GPIO_NUM,.pin_reset = RESET_GPIO_NUM,.pin_xclk = XCLK_GPIO_NUM,.pin_sscb_sda = SIOD_GPIO_NUM,.pin_sscb_scl = SIOC_GPIO_NUM,.pin_d7 = Y9_GPIO_NUM,.pin_d6 = Y8_GPIO_NUM,.pin_d5 = Y7_GPIO_NUM,.pin_d4 = Y6_GPIO_NUM,.pin_d3 = Y5_GPIO_NUM,.pin_d2 = Y4_GPIO_NUM,.pin_d1 = Y3_GPIO_NUM,.pin_d0 = Y2_GPIO_NUM,.pin_vsync = VSYNC_GPIO_NUM,.pin_href = HREF_GPIO_NUM,.pin_pclk = PCLK_GPIO_NUM,.xclk_freq_hz = 20000000,.ledc_timer = LEDC_TIMER_0,.ledc_channel = LEDC_CHANNEL_0,.pixel_format = PIXFORMAT_JPEG,.frame_size = FRAMESIZE_VGA,.jpeg_quality = 31,   //图像质量   0-63  数字越小质量越高.fb_count = 1,
};
//初始化摄像头
esp_err_t camera_init() {//initialize the cameraesp_err_t err = esp_camera_init(&camera_config);if (err != ESP_OK) {Serial.println("Camera Init Failed!");return err;}sensor_t * s = esp_camera_sensor_get();//initial sensors are flipped vertically and colors are a bit saturatedif (s->id.PID == OV2640_PID) {//        s->set_vflip(s, 1);//flip it back//        s->set_brightness(s, 1);//up the blightness just a bit//        s->set_contrast(s, 1);}Serial.println("Camera Init OK!");return ESP_OK;
}bool wifi_init(const char* ssid,const char* password ){WiFi.mode(WIFI_STA);WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度#ifdef staticIPWiFi.config(staticIP, gateway, subnet);#endifWiFi.begin(ssid, password);uint8_t i = 0;Serial.println();while (WiFi.status() != WL_CONNECTED && i++ < 20) {delay(500);Serial.print(".");}if (i == 21) {Serial.println();Serial.print("Could not connect to"); Serial.println(ssid);digitalWrite(ZHESHI_LED,HIGH);  //网络连接失败 熄灭指示灯return false;}Serial.print("Connecting to wifi "); Serial.print(ssid);Serial.println(" success!"); digitalWrite(ZHESHI_LED,LOW);  //网络连接成功 点亮指示灯return true;
}void TCPServerInit(){//启动serverserver.begin(port);//关闭小包合并包功能,不会延时发送数据server.setNoDelay(true);Serial.print("Ready! TCP Server");Serial.print(WiFi.localIP());Serial.println(":8080 Running!");
}
void cssp(){camera_fb_t * fb = esp_camera_fb_get();uint8_t * temp = fb->buf; //这个是为了保存一个地址,在摄像头数据发送完毕后需要返回,否则会出现板子发送一段时间后自动重启,不断重复if (!fb){Serial.println("Camera Capture Failed");}else{ //先发送Frame Begin 表示开始发送图片 然后将图片数据分包发送 每次发送1430 余数最后发送 //完毕后发送结束标志 Frame Over 表示一张图片发送完毕 client.print(frame_begin); //一张图片的起始标志// 将图片数据分段发送int leng = fb->len;int timess = leng/maxcache;int extra = leng%maxcache;for(int j = 0;j< timess;j++){client.write(fb->buf, maxcache); for(int i =0;i< maxcache;i++){fb->buf++;}}client.write(fb->buf, extra);client.print(frame_over);      // 一张图片的结束标志//Serial.print("This Frame Length:");//Serial.print(fb->len);//Serial.println(".Succes To Send Image For TCP!");//return the frame buffer back to the driver for reusefb->buf = temp; //将当时保存的指针重新返还esp_camera_fb_return(fb);  //这一步在发送完毕后要执行,具体作用还未可知。        }//delay(20);//短暂延时 增加数据传输可靠性
}
void TCPServerMonitor(){
if (server.hasClient()) {if ( client && client.connected()) {WiFiClient serverClient = server.available();serverClient.stop();Serial.println("Connection rejected!");}else{//分配最新的clientclient = server.available();client.println(msg_begin +  "Client is Connect!");Serial.println("Client is Connect!");}
}//检测client发过来的数据
if (client && client.connected()) {if (client.available()) {String line = client.readStringUntil('\n'); //读取数据到换行符if (line == "CamOFF"){cam_state = false;client.println(msg_begin +  "Camera OFF!");}if (line == "CamON"){cam_state = true;client.println(msg_begin +  "Camera ON!");}if (line == "LedOFF"){digitalWrite(LED, LOW);client.println(msg_begin +  "Led OFF!");}if (line == "LedON"){digitalWrite(LED, HIGH);client.println(msg_begin +  "Led ON!");}Serial.println(line);}
}// 视频传输
if(cam_state)
{if (client && client.connected()) {cssp();}
}
}void setup() {Serial.begin(115200);pinMode(ZHESHI_LED, OUTPUT);digitalWrite(ZHESHI_LED, HIGH);pinMode(LED, OUTPUT);digitalWrite(LED, LOW);wifi_init(ssid,password);camera_init();TCPServerInit();
}void loop() {TCPServerMonitor();
}

4.编译烧录(按右向箭头)

下载代码时注意将GND与IO0一直相连,出现Leaving... 和 Hard resetting via RTS pin...,即下载成功。

5.测试结果

将GND与IO0断开,打开右上角的Serial Monitor,选择115200baud波段,按一下ESP32—CAM开发板上的RST复位键,显示IP地址和相应端口,如下图,TCP Server后面就是IP地址,将其记住。

四、在Android studio上代码实现

编写Android studio代码,将每一帧视频的图片导入监控页面上,输入在arduino中成功连接的IP地址和端口号。连接以后结果如下,即可将摄像头采集到的视频导入到你想做的app上了。

代码链接:https://github.com/caixukun-jinitaimei/ESP32CAM-android-app

总结

以上就是今天要讲的内容,本文介绍了ESP32—CAM结合android app简单的开发使用,本人第一次发文章,还请多多包涵。

Android app+ESP32-CAM实现远程监控app相关推荐

  1. 基于android的温室大棚监控管理信息系统研究,基于Android与GSM的温室大棚远程监控系统.pdf...

    基于Android与GSM的温室大棚远程监控系统.pdf 江苏农业科学 2015 年第43卷第4期 - 397 - 韩 剑,莫德清.基于Android 与GSM的温室大棚远程监控系统[J].江苏农业科 ...

  2. 【app性能测试】Python脚本监控app指标

    1. adb shell top top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最"敏感"的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序. ...

  3. 基于手机APP的PLC远程监控系统

    基于手机APP的PLC远程监控系统 一.手机APP远程监控PLC的意义: 随着网络技术和智能手机快速发展,远程通过手机APP对设备系统的控制单元PLC的运行进行远程预警监控的技术已经非常成熟.基于手机 ...

  4. 在工业污水处理中实现施耐德PLC的远程监控和上下载

    随着中国经济的快速发展和人均GDP的不断增长,人们在享受丰富的物质生活的同时也面临这环境污染的问题.全国各地大大小小的环境污染事件时有发生,在一定程度上暴露出污水治理的难题. 我国污水处理厂存在站点数 ...

  5. 基于手机app的树莓派远程监控(非常全)

    基于手机app的树莓派远程监控(非常全) 一.准备器件:树莓派系统板,树莓派自带摄像头 二. 树莓派系统环境:Raspberry Debian 9 手机app运行环境:android studio 三 ...

  6. Android 监控APP是否在后台运行

    最近被BUG缠身,,好久没有更新东西了,,现在给大家带来的一种简单方便实用的知识.最近总结了一个比较简单的可以监控APP是否在后台运行的方法.上代码. @Override public void on ...

  7. 如何用手机APP实现PLC远程监控

    一.应用需求 随着工业生产.制造环节的不断深化,工业设备的结构越来越复杂,借助PLC实现的自动化控制技术被广泛应用于工业设备.农业.市政等多种应用长江.在互联网+制造的大背景下,一种实现软硬件对接的手 ...

  8. wincc实现手机APP远程监控

    wincc是西门子公司开发的上位机视窗监控编程软件,用户可以利用软件提供的控件.脚本.方法等进行开发,将控制系统动做成动画画形式的人机界面,从而实现对控制系统的监控.现在智能手机已经可以实现电脑的很多 ...

  9. Android 安装第三方远程协助APP无法控制屏幕

    现象: 远程屏幕录制正常,但使用鼠标点击屏幕无响应,无法对设备进行控制. 查看异常log 01-24 14:35:46.978954 2956 2956 I SunloginClient: [ipc] ...

最新文章

  1. 『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)
  2. 利用世界杯,读懂 Python 装饰器
  3. 【CHARINDEX】先按STATIC_VALUE排序 在按R_RECORD_CREATE_DATE排序
  4. 武科大计算机专业分数线,武汉科技大学计算机类(中外合作办学)专业2016年在湖北理科高考录取最低分数线...
  5. 工业交换机在工业通信领域的应用分析
  6. mysqldump 忽略视图_Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)...
  7. C/C++混淆点-运算符短路
  8. python爬取js动态网页_Python 从零开始爬虫(八)——动态爬取解决方案 之 selenium
  9. 运用vs code常见错误_CBA:浙江广厦控股 VS 广东东莞大益 热门篮球竞猜分析
  10. 余承东生日朋友圈深夜连发五个“感恩”:这是一个难忘的日子
  11. c语言编程作业 一哥是何人,PLC编程语言之争:谁才是quot;一哥quot;-简易百科
  12. php基于纯真IP数据库实现IP地址信息查询
  13. 银联标准之MAC算法实现(POS终端加密)
  14. python生成华氏度-摄氏度转换表
  15. 更加精确的TCP Westwood拥塞控制算法
  16. python字符串常见方法
  17. ipad协议全新非常稳定
  18. mp4转换m3u8格式php,【过程】第一次将m3u8文件转换为MP4文件经验分享
  19. 飞凌Linux版LS1028A嵌入式开发板测评分享
  20. 2345浏览器怎么换主页 2345浏览器换主页教程

热门文章

  1. 英文半角及全角的区别如何转换
  2. office 删除密钥的方式
  3. gsea结果分析图怎么看_GSEA结果解读
  4. 难走的路,都是上坡路
  5. foxmail中无法设置qq邮箱
  6. DOM/伪DOM自定义事件
  7. Linux驱动 | DHT11驱动
  8. ESP8266和DHT11通讯
  9. normalization对比
  10. JAVA链表习题---回文结构(详细图解)