文章目录

  • 前言
  • 硬件选择
  • 代码获取
  • 代码解析
  • 总结

前言

之前看了官方玩过一个智能猫眼摄像头,我很有兴趣,但是那个 IDF 平台属实难整,我光安装都整了一天,网不好下载的包可能有问题。然后命令行操作也比较麻烦,我就想到了无敌的 arduino ,ESP32-CAM 这个板子本来就是 arduino 支持的,移植上去问题不大。SDDC 连接器的移植,按之前我移植 SDDC 的经验,官方代码的代码规范和可移植性都很不错,移植的难度不大。那就开干!


硬件选择

这我用的是和爱智官方一样的,安信可的ESP32 - CAM 摄像头,这里推荐这种分成两块板子的这种,还有一种把串口集成到一块板子上的,发热太严重,烧录程序的时候需要手动按 IO0 然后按 RST 按键。


然后在 arduino 上选择对应的开发板:

代码获取

从爱智官方的示例文章:ESP32 SDDC 设备开发 中可以获取到SDDC 连接器的示例代码,和 SDDC 连接器的库,然后 arduino 的设备代码可以直接用 arduino 提供的示例代码来改。

当然,你们看到篇文章的时候,就不用管这么多啦︿( ̄︶ ̄)︿

看过我之前文章的朋友肯定都知道,我早就帮大伙打包好了~
只需要去 – 我们的微信公众号 我最讨厌添加各种微信公众号才能获取资源了,所以还是老样子, 直接去灵感桌面的秘密宝库 获取代码,或者直接 clone:

https://gitee.com/inspiration-desktop/DEV-lib-arduino.git

这次用到的是下图红圈的三个文件夹:

cjson:我移植的 cjson 库,就是标准的 cjson 库,放到 arduino 安装目录下的 libraries 文件夹里,百度一下 cjson 的函数使用就行了。

LIBESP32_CAM:是我移植自官方的SDDC 连接器库,也是放入 libraries 文件夹里就行。里面是 SDDC 协议的处理函数,我们不用管。因为这个库包含了 SDDC 协议相关内容,我们就不再用原来的 libsddc 库了

sddc_demo 文件夹里面就是我们各种传感器的 demo 代码了:

红圈的 ESP32_Camera文件夹里面就是我们代码,点进去就能看见 ESP32_Camera.ino 文件,双击文件会自动启动 arduino-IDE 打开代码。在工具 -> 端口 选择对应的 COM 口然后点击上传就可以把代码烧录到板子里:

具体 arduino 使用教程可以看我之前的文章 arduino开发指导 和 手把手带你 arduino 开发:基于ESP32S 的第一个应用-红外测温枪(带引脚图)

代码解析

这个代码因为是移植爱智和 arduino 官方的代码,相关解析已经很多了,我就重点讲一下我修改的部分。
我主要修改了 esp_on_message() 和 esp_send_image(),esp_connector_task()函数。
代码如下:

/** Send image to connector*/
static void esp_send_image(sddc_connector_t *conn)
{void *data;size_t size;size_t totol_len = 0;size_t len;int ret;data = fb->buf;size = fb->len;while (totol_len < size) {//len = min((size - totol_len), (1460 - 16));len = min((size - totol_len), 1420);ret = sddc_connector_put(conn, data, len, (totol_len + len) == size);if (ret < 0) {sddc_printf("Failed to put!\n");break;}totol_len += len;data += len;}sddc_printf("Total put %d byte\n", totol_len);esp_camera_fb_return(fb);
}

esp_send_image() 函数这主要是删掉了原有的调用拍照的函数,因为拍照的逻辑放在了 esp_on_message 函数中,而且 esp_camera_fb_get() 会返回一个 fd 作为全局变量使用,就不需要在这重新拍一张照片了。

/** sddc connector task*/
static void esp_connector_task(void *arg)
{sddc_connector_t *conn;BaseType_t ret;while (1) {ret = xQueueReceive(conn_mqueue_handle, &conn, portMAX_DELAY);if (ret == pdTRUE) {esp_send_image(conn);sddc_connector_destroy(conn);cam_flag = 0;}}vTaskDelete(NULL);
}/** Lock timer callback function*/
static void esp_lock_timer_callback(TimerHandle_t handle)
{sddc_printf("Close the door!\n");
}

esp_connector_task 函数加入了一个全局变量 cam_flag 避免由于拍照太快导致发送不及时。

/** Handle MESSAGE*/
static sddc_bool_t esp_on_message(sddc_t *sddc, const uint8_t *uid, const char *message, size_t len)
{cJSON *root = cJSON_Parse(message);cJSON *value;cJSON *cam;char *str;int ret;sddc_return_value_if_fail(root, SDDC_TRUE);str = cJSON_Print(root);sddc_goto_error_if_fail(str);sddc_printf("esp_on_message: %s\n", str);cJSON_free(str);cam = cJSON_GetObjectItem(root, "cam");if (cJSON_IsString(cam)) {if (strcmp(cam->valuestring, "image") == 0 && (cam_flag == 0)) {char *str;size_t size;cam_flag = 1;// 拍照fb = esp_camera_fb_get();sddc_goto_error_if_fail(fb);// 获得图像数据大小size = fb->len;// 连接器cJSON *connector = cJSON_GetObjectItem(root, "connector");sddc_goto_error_if_fail(cJSON_IsObject(connector));cJSON *port = cJSON_GetObjectItem(connector, "port");sddc_goto_error_if_fail(cJSON_IsNumber(port));cJSON *token = cJSON_GetObjectItem(connector, "token");sddc_goto_error_if_fail(!token || cJSON_IsString(token));sddc_connector_t *conn = sddc_connector_create(sddc, uid, port->valuedouble, token ? token->valuestring : NULL, SDDC_FALSE);if (conn == NULL) {cam_flag = 0;printf("error !\n");}else {             printf("连接创建成功!\n");}sddc_goto_error_if_fail(conn);// 创建 cJSON 对象value = cJSON_CreateObject();sddc_goto_error_if_fail(value);// size 为图像数据大小cJSON_AddNumberToObject(value, "size", size);sddc_printf("Send picture to EdgerOS, file size %d\n", size);// cJSON 对象转换成字符串str = cJSON_Print(value);sddc_goto_error_if_fail(str);// 发送图片大小消息sddc_broadcast_message(sddc, str, strlen(str), 1, SDDC_FALSE, NULL);cJSON_free(str);if(conn_mqueue_handle == NULL){Serial.println("conn_mqueue_handle ERROR");}if(&conn == NULL){Serial.println("&conn ERROR");}ret = xQueueSend(conn_mqueue_handle, &conn, 0);      if (ret != pdTRUE) {sddc_connector_destroy(conn);sddc_goto_error_if_fail(ret == pdTRUE);}} else if (strcmp(cam->valuestring, "shoot") == 0) {cJSON *root = NULL;char *str;size_t size;// 摄像头捕捉一帧图像fb = esp_camera_fb_get();sddc_goto_error_if_fail(fb);// 获得图像数据大小size = fb->len;      // 创建 cJSON 对象root = cJSON_CreateObject();sddc_goto_error_if_fail(root);// cmd 为 recvcJSON_AddStringToObject(root, "cam", "image");// size 为图像数据大小cJSON_AddNumberToObject(root, "size", size);sddc_printf("Send picture to EdgerOS, file size %d\n", size);// cJSON 对象转换成字符串str = cJSON_Print(root);sddc_goto_error_if_fail(str);// 发送消息sddc_broadcast_message(sddc, str, strlen(str), 1, SDDC_FALSE, NULL);cJSON_free(str);}} else {sddc_printf("Command no specify!\n");}error:cJSON_Delete(root);esp_camera_fb_return(fb);return SDDC_TRUE;
}

主要改动是因为这一份官方代码的锁和摄像头是一体的,而且官方的 IDF 平台使用的 camera_run(),camera_get_data_size() 和 camera_get_fb() 这几个函数在 arduino 上没有,我改成了esp_camera_fb_get() ,还添加了一个在连接器之前先发送一个 size 用来校验图片完整性。

其他的设备初始化和配置啥的我都用的 arduino 示例代码的配置


总结

我智能猫眼的应用代码被我搞丢了,得去找官方看看那边有没有保留,所以暂时没法展示。

arduino 天下第一(暴论) -- 智能猫眼与 SDDC 连接器移植到 arduino 上相关推荐

  1. 启明云端方案分享| ESP32-S2 摄像头 WIFI方案应用于智能猫眼

    提示:启明云端从2013年起就作为Espressif(乐鑫科技)大中华区合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程.同时也用心推出了基于乐鑫的相关应用方案!希望你 ...

  2. arduino读取水位传感器的数据显示在基于i2c的1602a上_构建Arduino的LoRa远程智能空气质量监测系统...

    背景知识视频教程 Arduino分步指南:完整指南 - 国外课栈​viadean.com Arduino微控制器:学习Arduino制作项目 - 国外课栈​viadean.com 通过构建实际应用程序 ...

  3. 基于Arduino的多功能智能交通信号灯的设计与实现 ---------对盲人语音播报,红灯结束时铃声提醒,信号灯倒计时和闯红灯语音劝阻

    ** 基于Arduino的多功能智能交通信号灯的设计与实现 ---------对盲人语音播报,红灯结束时铃声提醒,信号灯倒计时和闯红灯语音劝阻 ** 魏树鸿, 1.系统设计思路 a.: 满足基本信号灯 ...

  4. 基于arduino和openmv的智能小车设计制作流程

    arduino与openmv的智能物流小车 一.购买模块组件准备阶段 1.ArduinoMAGE2560+扩展板 使用这个当做主控板,加上扩展板已经满足了所有需求,主要是也很便宜,唯一不足的是就是扩展 ...

  5. 没有没有联网鸿蒙的智能猫眼,智能猫眼的功能

    智能家居 回答数:1915 2021-04-06 15:34:44 赞 0 智能猫眼的功能1:隐藏力强 在今天的高科技发展中,谁也没想到,是以前从门后看到一个人的小东西,实际上现在可以一天整整升到24 ...

  6. LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)

    目录 1.项目概述 2.项目架构 3.传感器选型 3.1.气体传感器 3.2.温度传感器 3.3.热释电红外传感器 3.4.继电器 4.硬件环境 5.Arduino功能设计 ​6.LabVIEW功能设 ...

  7. 【物联网毕设】基于arduino与树莓派的智能鱼缸【一】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 零.智能鱼缸框架与项目整体思路 一.Arduino与传感器部分 1.温度传感器部分 2.水位传感器部分 3.溶解氧传感 ...

  8. 启明智显分享|WIFI蓝牙智能猫眼门铃应用方案

    随着生活与科技水平的提高,国民对智能产品的依赖程度愈加强烈.据中国智能家居行业研究报告统计,智能家庭安防需求量增长已超过90%.一方面,相较于日韩智能门铃门锁高达80%.60%的渗透率,国内智能门铃门 ...

  9. 电子猫眼视频服务器地址修改,一种智能猫眼及智能猫眼与云端管理系统的使用方法专利_专利查询 - 天眼查...

    1.一种云端管理系统与智能猫眼配合使用方法,其特征在于,包括以下步骤: 1) .用户在移动终端向云端管理系统中输入个人信息: 2) .云端管理系统将用户的个人信息发送至匹配房间的智能猫眼: 3. )智 ...

最新文章

  1. PAT(甲级)2018年冬季考试 7-2 Decode Registration Card of PAT
  2. python正则表达式\s \S \w \W区别
  3. Java获取当前的系统时间
  4. 区块链项目-Lisk
  5. 《人月神话》(P11)为舍弃而计划
  6. python爬虫第一课 开发环境配置
  7. 圣诞快乐 | 盘点2017最受欢迎的原创文章
  8. latex中\left[\right]在多行公式中的问题
  9. python从入门到精通-python从入门到精通视频(大全60集)
  10. 第01期:ubuntu下淘宝网Tengine服务器的搭建
  11. 实习踩坑之路:Date、LocalDate和LocalDateTime的区别
  12. 汤家凤:九月前强化复习结束不了怎么办?
  13. 软件测试自动化面试题(含答案)
  14. cloudera-repos 地址
  15. android 手机 apk安装失败对应码
  16. 给打算找技术工作的毕业生几点建议
  17. 阅读笔记 |《哲学·科学·常识》陈嘉映
  18. 插入排序原理及实现思路
  19. 庄子“知”问题的深入探讨(转载)
  20. java打印空心六边形_带文字的空心六边形。

热门文章

  1. Java后端处理video快进快退播放以及断点续传的原理和代码
  2. 向质量要增长,内容社区告别“大水漫灌”时代
  3. 程序员如何正确的自我提升?
  4. Shiro的Java原生反序列化漏洞
  5. 【龙芯1c库】封装CAN接口和使用示例
  6. 数据库复习笔记-第1章绪论
  7. 电脑怎么录制屏幕?分享电脑录制屏幕的3个方法
  8. 全新的Lync 2013为我们带来了什么?
  9. 根据ParentId生成树状结构这po事
  10. 关于model层建VO和PO,实体类(VO,DO,DTO)的划分