ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Arduino——ESP32-CAM深度睡眠+外部唤醒+拍摄照片+TCP通讯

2021-12-15 19:32:49  阅读:274  来源: 互联网

标签:Arduino ESP32 TCP fb NUM GPIO Serial include define


 

网上找了一个拍照片之后用UDP传输的程序改的,有些头文件应该没用

做这个的原因是需要一个有无线功能的摄像头用于校准机械臂抓取,淘宝上搜到了ESP32-CAM,但这个东西工作起来发热严重,于是写了深度睡眠和外部唤醒的功能

ESP32-CAM的供电和外部触发都用的机械臂上的复用端口,程序调好之后连三根线就能工作,就是拍出来的图片不太清晰,不知道能不能支持后续的校准

记录一下调试过程

  TCP服务端接收的数据转jpg会报“字符串末尾有无法识别字符”的错,百度了一下以为是沾包,于是就加了delay(100),现在想想可能是HEX字符串处理出了问题

  板子一直无法访问到TCP服务端,加了5000的延时就好了

  上传程序的时候报找不到板子的错,原因是串口助手或者串口监视器开着,关掉就好了

里面的Wifi信息和TCP服务端信息要根据实际情况修改

顺便记录一下调试一个用ESP8266无线通讯的AGV的过程

  代码应该不会贴了,控制板用的STM32,我也不太会,刚做嵌入式没几天,一直没空研究这个东西

  调试过程中发现TCP怎么都连不上,以为是硬件的问题,从头到尾换了一遍,最后用串口助手调试发现要连接TCP服务端地址跟我设置的不一样,后来发现Keil下程序之前需要编译一下,很低级的错误,只是我好久没做C的东西了,全忘了

  1 #include "esp_camera.h"
  2 #include <WiFi.h>
  3 #include "esp_timer.h"
  4 #include "img_converters.h"
  5 #include "Arduino.h"
  6 #include "fb_gfx.h"
  7 #include "soc/soc.h" //disable brownout problems
  8 #include "soc/rtc_cntl_reg.h"  //disable brownout problems
  9 
 10 const char *ssid = "********";
 11 const char *password = "********";
 12 
 13 const IPAddress serverIP(192,168,3,252); //欲访问的地址
 14 uint16_t serverPort = 8888;         //服务器端口号
 15 
 16 WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
 17 
 18 //定义单个数据包最大数据量
 19 #define maxcache 1024
 20 
 21 //定义相机类型
 22 #define CAMERA_MODEL_AI_THINKER
 23 #if defined(CAMERA_MODEL_AI_THINKER)
 24   #define PWDN_GPIO_NUM     32
 25   #define RESET_GPIO_NUM    -1
 26   #define XCLK_GPIO_NUM      0
 27   #define SIOD_GPIO_NUM     26
 28   #define SIOC_GPIO_NUM     27
 29   #define Y9_GPIO_NUM       35
 30   #define Y8_GPIO_NUM       34
 31   #define Y7_GPIO_NUM       39
 32   #define Y6_GPIO_NUM       36
 33   #define Y5_GPIO_NUM       21
 34   #define Y4_GPIO_NUM       19
 35   #define Y3_GPIO_NUM       18
 36   #define Y2_GPIO_NUM        5
 37   #define VSYNC_GPIO_NUM    25
 38   #define HREF_GPIO_NUM     23
 39   #define PCLK_GPIO_NUM     22
 40 #else
 41   #error "Camera model not selected"
 42 #endif
 43 
 44 void wifi_init(void)
 45 {
 46       WiFi.mode(WIFI_STA);
 47     WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
 48     WiFi.begin(ssid, password);
 49     while (WiFi.status() != WL_CONNECTED)
 50     {
 51         delay(500);
 52         Serial.print(".");
 53     }
 54     Serial.println("Connected");
 55     Serial.print("IP Address:");
 56     Serial.println(WiFi.localIP());
 57 }
 58 
 59 void tcpclient_init(void)
 60 {
 61     Serial.println("尝试访问服务器");
 62     int i = 0;
 63     while(i<5)
 64     {
 65         if (client.connect(serverIP, serverPort,5000)) //尝试访问目标地址
 66         {
 67           Serial.println("访问成功");
 68           client.print("Hello world!");                    //向服务器发送数据
 69           return;
 70         }
 71         else
 72         {
 73           Serial.println("访问失败");
 74           client.stop(); //关闭客户端
 75           delay(5000);
 76           i++;
 77         }
 78     }
 79 }
 80 
 81 void setup()
 82 {
 83     WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
 84   
 85     Serial.begin(115200);
 86     Serial.println();
 87     wifi_init();
 88     tcpclient_init();
 89 
 90     camera_config_t config;
 91     config.ledc_channel = LEDC_CHANNEL_0;
 92     config.ledc_timer = LEDC_TIMER_0;
 93     config.pin_d0 = Y2_GPIO_NUM;
 94     config.pin_d1 = Y3_GPIO_NUM;
 95     config.pin_d2 = Y4_GPIO_NUM;
 96     config.pin_d3 = Y5_GPIO_NUM;
 97     config.pin_d4 = Y6_GPIO_NUM;
 98     config.pin_d5 = Y7_GPIO_NUM;
 99     config.pin_d6 = Y8_GPIO_NUM;
100     config.pin_d7 = Y9_GPIO_NUM;
101     config.pin_xclk = XCLK_GPIO_NUM;
102     config.pin_pclk = PCLK_GPIO_NUM;
103     config.pin_vsync = VSYNC_GPIO_NUM;
104     config.pin_href = HREF_GPIO_NUM;
105     config.pin_sscb_sda = SIOD_GPIO_NUM;
106     config.pin_sscb_scl = SIOC_GPIO_NUM;
107     config.pin_pwdn = PWDN_GPIO_NUM;
108     config.pin_reset = RESET_GPIO_NUM;
109     config.xclk_freq_hz = 20000000;
110     config.pixel_format = PIXFORMAT_JPEG;
111     config.frame_size = FRAMESIZE_XGA;
112     config.jpeg_quality = 12;
113     config.fb_count = 1;
114     if(psramFound())
115     {
116       config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
117       config.jpeg_quality = 10;
118       config.fb_count = 2;
119     } 
120     else 
121     {
122       config.frame_size = FRAMESIZE_SVGA;
123       config.jpeg_quality = 12;
124       config.fb_count = 1;
125     }
126     
127     esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);//设置IO13端口高电平为睡眠唤醒
128     // Init Camera
129     esp_err_t err = esp_camera_init(&config);
130     if (err != ESP_OK) 
131     {
132       Serial.printf("Camera init failed with error 0x%x", err);
133       return;
134     }
135 
136 }
137 
138 void loop()
139 {
140     if(client.connected() || client.available())//如果已连接或有收到的未读取的数据
141     {
142       if(client.available()) //如果有数据可读取
143       {
144         String line = client.readStringUntil('\n'); //读取数据到换行符
145         Serial.print("读取到数据:");
146         Serial.println(line);
147         client.write(line.c_str()); //将收到的数据回发
148 
149         //收到take,拍一张照片并传送给TCP服务端
150         if(line == "take")
151         {
152           camera_fb_t * fb = esp_camera_fb_get();  
153           uint8_t * temp = fb->buf;
154           if(!fb) 
155           {
156             Serial.println("Camera capture failed");
157           }
158           else
159           {
160             // 将图片数据分段发送
161             int leng = fb->len;
162             int timess = leng/maxcache;
163             int extra = leng%maxcache;
164             for(int j = 0;j< timess;j++)
165             {
166               delay(100);
167               client.write(fb->buf, maxcache);
168               for(int i =0;i< maxcache;i++)
169               {
170                 fb->buf++;
171               }
172               //Serial.println("succes to send image for tcp");
173             }
174             client.write(fb->buf, extra);
175             fb->buf = temp; //将当时保存的指针重新返还
176             esp_camera_fb_return(fb);  //这一步在发送完毕后要执行,具体作用还未可知。
177           }
178         }
179 
180         //收到stop,进入深度睡眠
181         if(line == "stop")
182         {
183           Serial.println("关闭当前连接");
184           client.stop(); //关闭客户端
185           esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);
186           int i = 0;
187           while(i<10)
188           {
189             Serial.println("Going to sleep now"+i);
190             delay(100);
191             i++;
192           }
193           esp_deep_sleep_start();
194         }
195       }
196       
197     }
198     else
199     {
200         Serial.println("访问失败");
201         client.stop(); //关闭客户端
202     }
203     delay(5000);
204 }

 

标签:Arduino,ESP32,TCP,fb,NUM,GPIO,Serial,include,define
来源: https://www.cnblogs.com/junk-code-of-bo/p/15694681.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有