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

 

网上找了一个拍照片之后用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 }

 

上一篇:一分钟上云 - 物联网智能设备云端一体快速开发新体验


下一篇:php的$_GET和$POST