我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android app+ESP32-CAM实现远程监控app

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android app+ESP32-CAM实现远程监控app

文章目录

目录

前言

一、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地址以及端口

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

注意下载win10 and newer,64bits

设备连接

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

Arduino代码示例

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

#include #include #include "esp_camera.h"#include  #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     22 static 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 camera    esp_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 saturated    if (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 staticIP    WiFi.config(staticIP, gateway, subnet);  #endif  WiFi.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(){  //启动server  server.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 reuse    fb->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{    //分配最新的client    client = 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();}

编译烧录(按右向箭头)

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

测试结果

将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简单的开发使用,本人第一次发文章,还请多多包涵。

来源地址:https://blog.csdn.net/zlq721127/article/details/129954776

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android app+ESP32-CAM实现远程监控app

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android App实现监听软键盘按键的三种方式

前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入
2022-06-06

android退出app应用程序怎么实现

在Android中,可以通过以下方式退出应用程序:1. 使用System.exit(0)方法退出应用程序。这种方式不太推荐,因为它会直接终止应用程序的进程,可能会导致一些不可预知的问题。2. 使用finish()方法关闭当前Activity
2023-05-30

详解Android更改APP语言模式的实现过程

一、效果图二、描述更改Android项目中的语言,这个作用于只用于此APP,不会作用于整个系统 三、解决方案(一)布局文件2022-06-06

怎么使用Android快速实现一个财务APP程序

这篇文章主要介绍了怎么使用Android快速实现一个财务APP程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Android快速实现一个财务APP程序文章都会有所收获,下面我们一起来看看吧。一,系统的
2023-07-02

Android笔记设计范例之日记APP实现全流程

这篇文章主要介绍了Android笔记设计范例之日记APP实现全流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-28

Android自定义View之组合控件实现类似电商app顶部栏

本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图:分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,
2022-06-06

Android App中使用RatingBar实现星级打分功能的教程

RatingBar简单介绍 RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键(比如遥控器)来设置评分, Rating
2022-06-06

AspNet Core下如何利用app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

AspNet Core下如何利用app-metrics+Grafana + InfluxDB实现高大上的性能监控界面,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在日常系统
2023-06-19

Python实现用手机监控远程控制电脑的方法

一、前言很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。 今天我们就来用Python实现一个远程监控并控制电脑的小程序。 二、实现原理听起来远程控制电脑好像很高级的样
2022-06-02

Android编程实现监控各个程序流量的方法

本文实例讲述了Android编程实现监控各个程序流量的方法。分享给大家供大家参考,具体如下:public void getAppTrafficList(){ //获取所有的安装在手机上的应用软件的信息,并且获取这些软件里面的权限信息 Pac
2022-06-06

Android开发5:应用程序窗口小部件App Widgets的实现(附demo)

前言本次主要是实现一个Android应用,实现静态广播、动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应
2022-06-06

Python实现监控远程主机实时数据的示例详解

这篇文章主要为大家详细介绍了Python如何使用Socket库和相应的第三方库来监控远程主机的实时数据,比如CPU使用率、内存使用率、网络带宽等,感兴趣的可以了解一下
2023-05-14

Android编程实现监控apk安装,卸载,替换的方法

本文实例讲述了Android编程实现监控apk安装,卸载,替换的方法。分享给大家供大家参考,具体如下:public class GetBroadcast extends BroadcastReceiver {private static G
2022-06-06

阿里云物联网服务器端接收消息实现远程监控与控制

在现代工业生产中,物联网技术扮演着至关重要的角色。物联网系统通过无线设备将各种物理环境和设备的数据传输到云端,实现远程监控和控制。而作为物联网系统的重要组成部分,阿里云物联网服务器端接收消息是实现远程监控与控制的关键步骤之一。正文:在物联网系统中,设备和传感器通过无线网络将数据发送到云端,而阿里云物联网服务器端接
阿里云物联网服务器端接收消息实现远程监控与控制
2023-11-07

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录