w5500 php,[W5500]搭建属于你的家庭网络实时监控

2023-10-29

图9 OV2640 SVGA模式下图像输出时序图

系统上电后,MCU配置OV2640的工作方式,在OV2640准备好图像后,VSYNC会被拉高一段时间,MCU通过PCLK上升沿中断按字节接收图像数据。接下来我们将对OV2640的初始化配置程序和图像数据缓存程序进行介绍。

2.OV2640程序介绍

初始化配置程序:

iic_init();/*初始化MCU I2C_2,与OV2640 SCCB接口通信*/

ov2640_jpeg_config(JPEG_640x480); /*设置输出图像格式*/

/* 设置COMS参数 */

ov2640_brightness_config(0×40); /*设置亮度模式:亮度+2*/

ov2640_auto_exposure(3); /*设置自动曝光等级 0-4*/

ov2640_contrast_config(0×28,0x0c); /*设置对比度:对比度+2*/

ov2640_black_white_config(0×00); /*设置黑白彩色模式:正常模式*/

ov2640_color_saturation(0×68,0×68); /*设置色饱和度:饱和度+2*/

ov2640_light_mode_config(OFFICE); /*设置场景模式:办公室*/

o2640_capture_gpio_init();/*初始化并行传输IO管脚*/

注:以上代码在main.c文件中

图像数据缓存程序:

u8 temp;

EXTI_ClearITPendingBit(EXTI_Line0);/*清除PC0(PCLK)中断*/

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)==0)/*HREF管脚为低*/

return;

temp =(u8)((GPIOC->IDR)>>8&0x00ff);/*读取一个字节图像数据*/

switch(jpg_flag)

{

case0:

if(temp==0xff)/*图像数据以0xff 0xd8开头*/

{

JPEGBuffer[4]=0xff;

jpg_flag=1;

}

break;

case1:

if(temp==0xd8)

{

JPEGBuffer[5]=0xd8;

jpg_flag=2;

JPEGCnt=6;

}

elseif(temp!=0xff)

jpg_flag=0;

break;

case2:

JPEGBuffer[JPEGCnt++]= temp;/*存储数据*/

if(temp==0xff)

jpg_flag=3;

break;

case3:

JPEGBuffer[JPEGCnt++]= temp;/*图像数据以0xff 0xd9结尾*/

if(temp==0xd9)

{

jpg_flag=4;

counter++;

}

elseif(temp!=0xff)

jpg_flag=2;

break;

case4:

break;

}

注:以上代码在websocket.c文件中

在中断函数中通过以上缓存数据即可正确读取每一帧图像的数据了。其中JPEGBuffer为一个全局的图像缓存区,WebSocket数据发送函数中检测到缓存区数据准备完毕后,就可以将图像发送给浏览器了。

在Canvas上绘制图片

Canvas API中有趣的一面就是对图片的支持,我们可以借助drawImage函数,通过多种方法操作图片,drawImage有三种格式:

n  drawImage(image, dx, dy):将image URL指定的图片显示在dx,dy位置

n  drawImage(image, dx, dy, dw, dh):根据提供的显示宽度(dw)和显示高度(dh)缩放显示图片

n  drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh):根据X,Y坐标和宽高(sx,sy,sw,sh)剪裁出图片的一部分显示出来。

下面开看看我们的网页程序里是如何实现绘制图片的吧。

1.首先建立一张画布

2.定义画布的边距、宽高等信息

.img{margin:0 auto;display:block;margin-bottom:10px; width:640px;height:480px;cursor:pointer;}

3.为了在JavaScript中对canvas进行绘制,首先需要通过目标canvas的id获取绘制环境。代码需要通过id获取canvas元素,然后使用此元素的getContext方法获取其二维绘制环境的引用。

var canvas =document.getElementById(‘cam’);

var context =canvas.getContext(’2d’);

4.WebSocket接收到数据,并绘制图像

websocket.onmessage= function (evt)/*收到服务器消息,使用evt.data提取*/

{

var image = new Image();

image.οnlοad= function ()

{

context.clearRect(0,0,canvas.width,canvas.height);/*清除画布矩形区域*/

context.drawImage(image,0,0,canvas.width,canvas.height);/*绘制宽度640px,高度480px的图像*/

}

image.src=URL.createObjectURL(evt.data);/*生成本图像数据的URL信息*/

}

可见我们使用了第二种drawImage格式,指定缩放大小使其与画布大小刚好匹配,而我们从OV2640获取的图像恰好与画布大小相同。

注:以上代码在webpage.c文件中

WebSocket数据传输程序

在上一期的《搭建属于你的在线实时采集系统》中,我们详细介绍了WebSocket的使用和API函数,并分析了握手流程。在本篇文章中将不再赘述,这里将对数据较大的传输程序进行介绍。

if(handshaked)/*握手成功*/

{

uint32jpgLen=0;

uint32 send_len=0;

uint8firstByte=0×82;//FIN=1, opcode=0×02: binary

uint8secondByte=126;//no mask, extend length=2 bytes

uint8 extend[2]={0×00};//extend header

while(jpg_flag!=4);/*图像缓存完毕*/

jpgLen=JPEGCnt;

extend[0]=(jpgLen-4)/256;/*提取payload高8位*/

extend[1]=(jpgLen-4)%256;/*提取payload低8位*/

/*打包websocket数据包*/

JPEGBuffer[0]=firstByte;

JPEGBuffer[1]=secondByte;

JPEGBuffer[2]=extend[0];

JPEGBuffer[3]=extend[1];

while(jpgLen)

{

if(jpgLen>WS_PACKET_LEN)/*长度大于W5500发送缓存区大小(4K默认)*/

{

send(s,(uint8*)(JPEGBuffer+send_len), WS_PACKET_LEN);

send_len+= WS_PACKET_LEN;

jpgLen-= WS_PACKET_LEN;

}

else/*将数据包剩余的字节全部发送出去*/

{

send(s,(uint8*)(JPEGBuffer+send_len),jpgLen);

send_len+=jpgLen;

jpgLen-=jpgLen;

}

}

if(jpg_flag==4)/*发送完毕后,重置图像采集标志位*/

jpg_flag=0;

printf(“.%d”,send_len);/*调试口打印本次数据包长度*/

}

上一篇中,由于数据包长度较小只有7个字节,所以没有使用到扩展长度字节,由于OV2640采集到的图像经过压缩后,一帧图像的数据远大于125个字节,所以就需要用到扩展字节来表征数据长度,经过实测,本系统中OV2640在JPEG_480*640模式下,一帧图像大概12Kbytes左右,所以使用两个扩展字节(16位,最大可表示65535个字节)就可以了。根据上一篇数据包帧格式定义,当数据包第二个字节secondByte的后7位为126时表示使用2字节长度扩展,为127时表示使用8字节长度扩展。这里我们没有使用掩码,所以secondByte的第一位为0,在扩展字节后就是数据包的payload(图像数据)。在发送时,由于W5500每个socket有自己的收发缓存区,在设备初始化时可配置,默认设置4K,所以一帧大小为12K的图像是无法一次发送出去的,程序的后半部分就是将数据包切割分几次发送。W5500也再次展示它硬件协议栈易于使用,快速传输的优越性能。使远程监控轻松实现。

总结

于此,摄像头 + 单片机 + HTML5的组合完成了家庭网络监控的作品。其实很多创意和想法都是源于各种功能组合,非常乐意与你分享我们的程序,希望你能发挥自己的想象力,组合出更多新奇的web功能,体会DIY的价值与乐趣。

程序下载地址:http://wizwiki.net/forum/viewtopic.php?f=91&t=733

699ba7046c51816a17b33a7caa85f179.png

9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

w5500 php,[W5500]搭建属于你的家庭网络实时监控 的相关文章

  • React 查找表格数据例子

    假设我们已经有了一个返回 JSON 的 API category Sporting Goods price 49 99 stocked true name Football category Sporting Goods price 9 9
  • 简单修改,让CI支持memcache

    CI默认只支持memcaced 今天在网上搜索了下 一些解决方案都是错的 经过ci源代码分析 给出一个正确的解决方案 1 复制driver目录下的memcachd php为memcache php 并且将memcached替换为memcac
  • Altium designer第二屏幕导致的问题

    由于之前笔记本电脑通过VGA线连接第二屏幕使用 但是在一些情况下第二屏幕不在 但是打开Altium designer相关窗口后还默认在第二屏幕 导致软件无法操作 解决方法 1 当Altium Designer 的某一窗口跑到另外一个显示屏上
  • 停用词(stop words)+TF-IDF实现

    一 什么是停用词 在汉语中 有一类没有实际意义的词语 比如组词 的 连词 以及 副词 甚至 语气词 吧 被称为停用词 一个句子去掉这些停用词 并不影响理解 所以 进行自然语言处理时 一般将停用词过滤掉 一般词表文件中每一行存储一个停用词 行
  • Linux版的CASTEP功能更强大,castep在linux下的安装步骤.docx

    castep在linux下的安装步骤 卸载 一 MS卸载 1 首先进入home msi Accelrys Materials Studio40 etc Gateway然后执行 msgateway control 18888 stop 即停掉
  • 服务器无法登录之迷——login界面无限循环

    本周遇到了一个很奇葩的问题 客户的一台服务器无论如何都无法登录到机器系统里面去 可以肯定的是输入的登录密码是完全正确的 但是输入密码后 总在login登录界面无限循环 今天抽空总结下这个问题的前因后果 登录异常现象 1 ssh登录成功后 会
  • vue项目页面进行数据更新的三种方法

    1 场景 在处理列表时 常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求 2 遇到的问题 用vue router重新路由到当前页面 页面是不进行刷新的 3 采用window reload 或者router go 0 刷新时 整个
  • mysql 误删binlog_mysql binlog日志 误删数据 用于恢复数据

    1 binlog 日志打开方法 在my cnf这个文件中加一行 Windows为my ini vi etc my cnf mysqld log bin mysqlbin log 添加这一行就ok了 号后面的名字自己定义吧 然后我们可以对数据
  • Linux线程

    目录 线程概念 原生线程库pthread 线程的优点 线程的缺点 线程异常 线程用途 Linux进程VS线程 Linux线程控制 创建线程 获取线程ID 线程ID及进程地址空间布局 线程等待 线程终止 线程取消 分离线程 线程概念 什么是线
  • VM虚拟机下添加一个硬盘

    VM虚拟机下添加一个硬盘 一 新建虚拟硬盘 打开VMware 选择菜单 VM gt settings gt Add gt 下一步 gt 选择 Harddisk 点 下一步 gt 选 creat a new virtual disk 点 下一
  • 三大抽样分布:卡方分布,t分布和F分布的简单理解

    有很多统计推断是基于正态分布的假设 以标准正态分布变量为基石而构造的三个著名统计量在实际中有广泛的应用 这是因为这三个统计量不仅有明确背景 而且其抽样分布的密度函数有显式表达式 它们被称为统计中的 三大抽样分布 这三大抽样分布即为著名的卡方
  • C、C++写二进制数据到mysql的Blob字段/插入images

    引子 由于调试需要 需直接往数据库里写入二进制数据 本来这些数据是由上层软件来写的 用的是C 为了熟悉C语言的数据库操作 还是决定用C来写这段调试代码 概况 表名 Task 涉及的字段及属性 NumDest int 11 用于存储目标数目
  • 希沃展台如何使用_技术培训

    信息技术应用培训 第五代希沃白板学科应用讲解 一支粉笔勾画五湖四海 一杆教鞭指点千秋万代 这是对教师这个职业的描绘 而随着社会的进步 教育教学改革的不断深入 一支粉笔一块黑板的时代已经离我们远去 现代化的教学设施正随着改革的浪潮涌入到教学当
  • shell判断一个文件夹是否为空,文件是否存在

    文件夹是否为空 dir path xxx if d 1 then 判断文件夹是否为空 if ls A 1 then echo 文件夹为空 else echo 文件夹不为空 fi else echo 文件夹不存在 fi d 判断文件夹是否存在
  • JavaScript题库

    1 下面语句得到值为true的有 A C A 1 1 B 1 1 C 2 gt 19 D 2 19 2 下面哪些方法可以实现将字符串 123 变成数值型 A B C D A Number B parseInt C parseFloat D
  • python:Anaconda安装mlxtend库

    步骤 进入Anaconda Powershell Prompt Acaconda 管理者模式 gt 键入 pip install mlxtend gt over 就这么简单 为嘛要写出来呢 因为我在安装的时候忘记联网啦 QAQ 一直失败 所
  • vue3 + threejs 实现仿iView官网大波浪特效

    一 效果图 先上最终效果图 具体效果可参考iview官方界面iView 一套高质量的UI组件库 大波浪效果 使用的是three js的官方例子 需要先安装three js支持 具体可以看官方实例 three js examples thre
  • linux查询mysql内存使用率_Linux查看CPU和内存使用情况方法总结

    在做Linux系统优化的时候 物理内存是其中最重要的一方面 自然的 Linux也提供了非常多的方法来监控宝贵的内存资源的使用情况 下面的清单详细的列出了Linux系统下通过视图工具或命令行来查看内存使用情况的各种方法 1 proc memi
  • 【ICCV2023】Robustifying Token Attention for Vision Transformers

    Robustifying Token Attention for Vision Transformers 论文 https arxiv org abs 2303 11126 代码 暂未开源 解读 ICCV 2023 Token过度聚焦暴露注

随机推荐

  • Topaz Video Enhance AI中文版

    教程 1 下载解压 双击运行 VideoEnhanceAI windows x64 installer exe 进入安装向导 2 勾选我接受许可协议 3 选择安装目录 也可以选择默认安装 4 安装完成 先不要运行软件 退出向导 5 将文件夹
  • android利用SAX解析xml(以解析谷歌天气预报xml预报为例)

    package com mars android import java io BufferedInputStream import java io InputStream import java net URL import java n
  • ElastAlert2告警不分词查询

    原查询条件 需求是带 服务商回传提单异常 的日志捞出来告警 当我按以下查询条件告警时会发现匹配不到我想要的日志 原因 query string查询默认就是模糊查询 并且是分词查询 例如 123 会拆分查询是否带否带1 带2 带3的日志 条件
  • Java 基本类型和包装类型侧重学习笔记(基础)

    包装类可以是null 而基本类型不可以
  • Ubuntu安装NVIDIA独立显卡驱动出现X service error问题解决方法

    目录 问题症状 解决方法 参考网址 问题症状 最近在Ubuntu下安装NVIDIA独立显卡驱动的过程中出现X service error问题 如下图所示 解决方法 0 到NVIDIA 官网上下载驱动文件 run 格式 Official Ge
  • python HHT实现方法

    引言 随着信号处理领域的不断发展 自适应信号处理和非线性信号分析成为了研究的热点 在这两个领域中 Hilbert Huang变换 HHT 作为一种强大的工具 被广泛应用于信号的时频分析和模态分解 本文将介绍如何使用Python实现HHT 并
  • 解决 微软应用商店无法联网 0x80072EFD问题

    近期使用微软应用商店发现不能正常的连接网络 小娜也是 经过检查是使用了代理自动配置脚本 PAC 的原因 按win键 输入网络代理设置 打开代理设置界面 设置 使用安装程序脚本 为关
  • SpringBean的生命周期

    Spring Bean Lifecycle 1 过程 1 调用无参构造 2 执行 set 方法设置属性 也可以是 Bean 注解方法内容 3 调用 BeanNameAware 的 setBeanName 方法 可以获得 Bean 的名字 4
  • 0N在计算机里面起什么作用,计算器0n/c是什么键

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 计算器0n c是开机键以及清屏键 此键一方面有着开机的功能 另一方面也有着清除屏幕内容的功能 计算器是现代人发明的可以进行数字运算的电子机器 现代的电子计算器能进行数学运算
  • 在微软任职近 20 年,Windows、Surface 负责人官宣将离职!

    整理 屠敏 出品 CSDN ID CSDNnews 9 月 19 日 据外媒 The Verge 报道 负责领导 Windows 开发和 Surface 产品线的微软首席产品官 CPO Panos Panay 即将离职 这一消息来得很突然
  • XML基本规则(XML语法规则)

    XML基本规则 XML语法规则 1 XML 文档必须包含在一个单一元素中 2 XML 元素不能重叠 必须正确的嵌套 3 不能省去任何结束标记 或者说标记必须成对 4 XML 元素是区分大小写的 也就是大小写敏感 5 XML 文档中的属性有两
  • 源码安装zabbix

    源码安装zabbix 1 zabbix简介 2 zabbix的主要功能 3 监控指标 4 zabbix配置文件 5 服务器端配置文件 6 客户端配置文件 7 部署zabbix 8 先安装apache 8 1 安装开发工具包 8 2 下载ap
  • python使用plt.savefig保存时图片保存不完整,四周留白太多

    问题 今天在给论文添加曲线图 使用matplotlib的savefig函数中遇到图片保存不完整 且留白太多的问题 插入到论文中很难看 左边是在pycharm里的截图 右边是通过savefig保存的图片 代码如下 保存图片 plt savef
  • 怎样在PB中实现文件的拷贝与删除 (转)

    怎样在PB中实现文件的拷贝与删除 转 more 怎样在PB中实现 文件的拷贝与删除 可借助外部 函数 可用 api函数实现 1 文件拷贝 函数声明 FUNCTION boolean CopyFileA ref string cfrom re
  • 安装及使用ceres遇到过的问题

    首先ceres安装及使用需要两个依赖库glog与gflags 这两个库安装时需要注意要么只用apt install要么只用源码编译安装 如果两个都装了用apt purge或者在 usr local lib及 usr local includ
  • 设置Unity的帧率

    问题描述 Xsens接收数据的频率是30Hz 为了接收到正确 完整的数据 要将Unity的帧率换成30帧 第一种方法 点击Editor gt Project Setting gt Quality 将VSync Count那选择Every S
  • 测试框架pytest教程(4)运行测试

    运行测试文件 pytest q test example py 会运行该文件内test 开头的测试方法 该 q quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中 但如果写在类中 类名需要是Test开头 非Test开
  • C/C++中使用Base64编码解码(使用boost库)

    Base64是一种用64个字符来表示任意二进制数据的方法 用记事本打开exe jpg pdf这些文件时 我们都会看到一大堆乱码 因为二进制文件包含很多无法显示和打印的字符 所以 如果要让记事本这样的文本处理软件能处理二进制数据 就需要一个二
  • c++判断硬盘是否连接、修改指定盘符、读取配置文件、获取exe路径

    系统 win7 64 编译器 vs2010 mfc对话框程序 工程名 fixde 语言 c 涉及函数 GetPrivateProfileString 读取配置文件内容 类型为string GetDriveType 获取某驱动器状态 GetV
  • w5500 php,[W5500]搭建属于你的家庭网络实时监控

    图9 OV2640 SVGA模式下图像输出时序图 系统上电后 MCU配置OV2640的工作方式 在OV2640准备好图像后 VSYNC会被拉高一段时间 MCU通过PCLK上升沿中断按字节接收图像数据 接下来我们将对OV2640的初始化配置程