拍摄上传云端相册
本帖最后由 龘龘_ 于 2022-4-5 19:05 编辑
前言
本文通过使用ESP32-CAM模块、迪文4.3寸COF屏与巴法云服务器,实现了拍摄照片显示于迪文屏中,同时将拍摄的jpeg图片保存至巴法云服务器。
正文
步骤一:
新建DGUSSII上位机工程,如下图,点击显示控件,放置图标叠加控件,设置图标叠加控件的宽和高(最好与需要拍摄的图片大小一致),设置变量地址为7FFE(图片大小小于64kb)。
参考《T5L DGUS II应用开发指南》,变量地址为0x7FFE,图片将存储在0x8000,如果图片从0x8000存储至0xFFFF,则可存储小于64kB的图片。注意一点,图标叠加控件最大占用120kB。变量地址最低从0x1000开始。详细发送图片协议自行查阅指南。
步骤二:
通过icl生成工具将0背景图片.jpg生成为23背景图片.icl文件,按照如下图配置CFG文件并保存,在此的波特率使用3225600,因为什么,因为传的快,但也有可能太快导致图片传输失败,第一次用的话使用默认的115200就可以,波特率后续需要快再调(应用指南里也有提到“DGUSII 屏会有应答的“5A A5 03 82 4F 4B ”可以收到应答之后立即下发下一条,实际上,T5L 采用 20ms 刷新机制,在使用≤115200 波特率情况下,不停地发送数据也不会导致串口处理不过来的现象”)。
将DWIN文件夹内的文件烧录进入SD卡,如下图
步骤三:
登录巴法云服务器,获取私钥与端口并在图云创建主题numberpic。
步骤四:
编写ESP32-CAM代码。需要提前安装HTTPClient库。
- #include
- #include
- #include
- #include "esp_camera.h"
- #include "esp_http_client.h"
- const char* uid = "填写私钥"; //用户私钥,巴法云控制台获取
- const char* topic = "numberpic"; //主题名字,可在控制台新建
- const char* post_url = "http://images.bemfa.com/upload/v1/upimages.php"; // 默认巴法云上传地址
- static String httpResponseString;//接收服务器返回信息
- // 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
- String comdata = "";//缓存清零
- HTTPClient http_client;
- char data_json[40000];
- String url1;
- void WiFi_Connect()
- {
- WiFi.begin("WIFI账号", "WIFI密码");
- while (WiFi.status() != WL_CONNECTED)
- { //这里是阻塞程序,直到连接成功
- delay(300);
- Serial.print(".");
- }
- }
- void setup()
- {
- Serial.begin(3225600); // open the serial port at 115200 bps;
- delay(100);
- Serial.print("Connecting.. ");
- WiFi_Connect();
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- 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;
- //init with high specs to pre-allocate larger buffers
- if (psramFound()) {
- config.frame_size = FRAMESIZE_CIF;
- config.jpeg_quality = 10;
- config.fb_count = 2;
- } else {
- config.frame_size = FRAMESIZE_SVGA;
- config.jpeg_quality = 12;
- config.fb_count = 1;
- }
- // 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;
- }else
- {
- Serial.println("Camera init successed.");
- }
- //delay(5000);
- }
- /********http请求处理函数*********/
- esp_err_t _http_event_handler(esp_http_client_event_t *evt)
- {
- if (evt->event_id == HTTP_EVENT_ON_DATA)
- {
- httpResponseString.concat((char *)evt->data);
- }
- return ESP_OK;
- }
- /********推送图片*********/
- static esp_err_t take_send_photo()
- {
- Serial.println("Taking picture...");
- camera_fb_t * fb = NULL;
- esp_err_t res = ESP_OK;
- fb = esp_camera_fb_get();
- if (!fb) {
- Serial.println("Camera capture failed");
- return ESP_FAIL;
- }
- //char dest[50000];
- //memcpy(dest, (char *)fb->buf, fb->len);
- //Serial.printf("dest = %sn", dest);
- //Serial.print(fb->len);
- //Serial.println("");
- size_t jpg_size=fb->len;
- Serial.println(jpg_size);
- int packnum=0;
- packnum=jpg_size/240;
- char jpg_head_char[4]={90,165,243,130};
- if(jpg_size%240!=0)
- {
- packnum=packnum+1;
- }
- int jpg_add_num=0x8000;
- int j=0;
- int i=0;
- int jpg_trans=0;
- //delay(7000);
- while(j
- {
- Serial.write(jpg_head_char[0]);
- Serial.write(jpg_head_char[1]);
- Serial.write(jpg_head_char[2]);
- Serial.write(jpg_head_char[3]);
- if(j!=0)
- {
- jpg_add_num=jpg_add_num+120;//0x8000+0*0x78
- }
- //Serial.printf("j:%drn",j);
- //Serial.printf("jpg_add_num:%drn",jpg_add_num);
- Serial.write(jpg_add_num>>8);
- Serial.write(jpg_add_num);
- i=j*240;//0,240
- //Serial.printf("i:%drn",i);
- jpg_trans=((j+1)*240)-1;//((0+1)*240)-1=239
- //Serial.printf("jpg_trans:%drn",jpg_trans);
- while(i<=jpg_trans)//发送[0]-[239]
- {
- Serial.write(fb->buf[i]);
- if(fb->buf[i-1]==0xFF&&fb->buf[i]==0xD9)
- {
- break;
- }
- i++;
- }
- j++;
- //delay(1);//10
- }
- if(jpg_size%240!=0)
- {
- int k=0;
- while(k<240)
- {
- Serial.write(0);
- k++;
- }
- }
- //delay(5);
- //delay(5000);
- //char jpg_show[10]={90,165,7,130,127,254,90,165,128,0};
- Serial.write(90);
- Serial.write(165);
- Serial.write(7);
- Serial.write(130);
- Serial.write(127);
- Serial.write(254);
- Serial.write(90);
- Serial.write(165);
- Serial.write(128);
- Serial.write(0);
- //delay(50);
- //delay(25000);
- /*
- //int i=0;
- while(i
- {
- Serial.write(fb->buf[i]);
- i++;
- }*/
- //Serial.print(fb->buf[0]);
- Serial.println("");
- httpResponseString = "";
- esp_http_client_handle_t http_client;
- esp_http_client_config_t config_client = {0};
- config_client.url = post_url;
- config_client.event_handler = _http_event_handler;
- config_client.method = HTTP_METHOD_POST;
- http_client = esp_http_client_init(&config_client);
- esp_http_client_set_post_field(http_client, (const char *)fb->buf, fb->len);//设置http发送的内容和长度
- esp_http_client_set_header(http_client, "Content-Type", "image/jpg"); //设置http头部字段
- esp_http_client_set_header(http_client, "Authorization", uid); //设置http头部字段
- esp_http_client_set_header(http_client, "Authtopic", topic); //设置http头部字段
- esp_err_t err = esp_http_client_perform(http_client);//发送http请求
- if (err == ESP_OK) {
- //json数据解析
- StaticJsonDocument<200> doc;
- DeserializationError error = deserializeJson(doc, httpResponseString);
- if (error) {
- Serial.print(F("deserializeJson() failed: "));
- Serial.println(error.c_str());
- }
- String url = doc["url"];
- url1=url;
- Serial.println(url);//打印获取的URL
- }
- esp_http_client_cleanup(http_client);
-
- esp_camera_fb_return(fb);
- }
- void loop()
- {
- Serial.println("start");
- take_send_photo();
- delay(5000);
- }
复制代码
必须修改代码中的私钥、wifi账号、wifi密码和波特率,修改拍摄图片大小与上位机图标叠加控件宽高一致。 ESP32-CAM参考文档
编译程序,并按照下图将esp32cam与u***转ttl模块相连,插口电脑u***口,烧录代码。
步骤五:
将ESP32-CAM与迪文屏调试板的5V与5V相连,GND与GND相连,U0R与
URX相连,U0T与UTX相连。然后给迪文调试板的u***口供电即可实现视频效果。
拍摄速度展示
|