我是靠谱客的博主 超帅帆布鞋,最近开发中收集的这篇文章主要介绍STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)EDP协议OV7670摄像头模块ESP8266_WIFI模块项目,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

EDP协议

EDP协议文档说明:https://leoeinstein.lanzous.com/ifX1Ckfkaaf

服务器登录

登录流程:

(1)客户端发送连接请求(CONN_REQ)
(2)服务器验证请求的合法性
(3)服务器发送一个回执(CONN_RESP)给客户端

Onenet 上的EDP、HTTP、MQTT服务器地址和端口号如下:

E D P: 183.230.40.39 PORT: 876
HTTP: 183.230.40.33 PORT: 80
MQTT: 183.230.40.39 PORT: 6002

在这里插入图片描述
其中请求包含三部分:消息头、选项和消息体。

1、消息头

包括消息的类型和剩余消息长度。

2、选项

包括协议名称、协议版本、连接标志、保持连接时间。

3、消息体

可能包含设备ID、用户ID(可选)、鉴权信息(看采取什么方式登录)。

设备ID、用户ID(可选)、鉴权信息,这三项内容都为长度+内容的字符串格式

设备ID必须传递,若认证方式中不使用设备ID,应将设备ID长度设置为0;用户ID和鉴权信息,根据标志位若存在必须按顺序出现。

在这里插入图片描述

(绿色为消息头部分,黄色为可选的多个选项部分和蓝色为可选的消息体

各部分具体如下图
在这里插入图片描述

登录方式

在这里插入图片描述

方式1:

设备ID+鉴权信息(api-key)

设备ID:申请设备时平台返回的ID; 鉴权信息:在平台申请的可以操作该设备的api-key字符串;

api-key:
在这里插入图片描述

方式2:

产品ID + 鉴权信息(auth_info)

产品ID:在平台添加产品时平台生成的ID;

鉴权信息:在平台申请设备时填写设备的auth_info属性(json对象字符串),该属性需要产品内具备唯一性

具体EDP协议解读可参考以下文章:
https://open.iot.10086.cn/bbs/thread-632-1-1.html

onenet初始化程序

ONENETEDP协议部分代码可参考onenet论坛的资料:
https://open.iot.10086.cn/bbs/thread-863-1-1.html

论坛里面有很详细的资料哦,几乎都是稍微修改以下就可以用的了。


OV7670摄像头模块

引脚定义及连线

ov7670stm32f4
VCC3.3V
GNDGND
SCLPF10
SDAPF9
VSYNCPB7
HREFPA4
PCLKPA6
XCLKPA8
D7PE6
D6PE5
D5PB6
D4PE4
D3PC9
D2PC8
D1PC7
D0PC6
RETPG8
PWDNPG9

OV7670中文资料手册:
https://wenku.baidu.com/view/e60f19ea81c758f5f61f67df.html

OV7670初始化程序

ov7670.h

#ifndef _OV7670_H
#define _OV7670_H

#include "stm32f4xx.h"

#define OV7670_RST_PW_RCC		RCC_AHB1Periph_GPIOG
#define OV7670_RST_PW_Pin		GPIO_Pin_8|GPIO_Pin_9
#define OV7670_RST_PW_GPIO		GPIOG

#define OV7670_PWDN_H  			GPIO_SetBits(GPIOG,GPIO_Pin_9)			//POWER DOWN控制信号 
#define OV7670_PWDN_L  			GPIO_ResetBits(GPIOG,GPIO_Pin_9)		//POWER DOWN控制信号 

#define OV7670_RST_H  			GPIO_SetBits(GPIOG,GPIO_Pin_8)			//复位控制信号 
#define OV7670_RST_L  			GPIO_ResetBits(GPIOG,GPIO_Pin_8)		//复位控制信号 


#define PIC_START_X				0		//起始坐标x
#define PIC_START_Y				0		//起始坐标y
#define PIC_WIDTH				320		//照片长度
#define PIC_HEIGHT				200		//照片高度

extern uint16_t camera_buffer[PIC_WIDTH*PIC_HEIGHT+27];

// 
#define OV7670_MID				0X7FA2    
#define OV7670_PID				0X7673
/
	    				 
u8   OV7670_Init(void);		  	   		 
void OV7670_Light_Mode(u8 mode);
void OV7670_Color_Saturation(u8 sat);
void OV7670_Brightness(u8 bright);
void OV7670_Contrast(u8 contrast);
void OV7670_Special_Effects(u8 eft);
void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height);
void set_cif(void);

#endif

ov7670.c部分函数


void OV7670_RST_PW_Init(void)
{
	//设置IO     	   
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(OV7670_RST_PW_RCC, ENABLE);
	
	//RESET,PWDN初始化设置
	GPIO_InitStructure.GPIO_Pin = OV7670_RST_PW_Pin;//RESET,PWDN推挽输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(OV7670_RST_PW_GPIO, &GPIO_InitStructure);//初始化
}

//初始化OV7670
//返回0:成功
//返回其他值:错误代码
u8 OV7670_Init(void)
{
	u16 i=0;
	u16 reg=0;

	OV7670_RST_PW_Init();

	OV7670_PWDN_L;	//POWER ON
	delay_ms(100);
	OV7670_RST_L;	//复位OV7670
	delay_ms(100);
	OV7670_RST_H;	//结束复位 
	
	SCCB_Init();        		//初始化SCCB 的IO口	
	SCCB_WR_Reg(0X12, 0x80);	//软复位OV7670
	delay_ms(50); 
	
	reg=SCCB_RD_Reg(0X1c);	//读取厂家ID 高八位
	reg<<=8;
	reg|=SCCB_RD_Reg(0X1d);	//读取厂家ID 低八位
	if(reg!=OV7670_MID)
	{
		printf("rnMID:%drn",reg);
		return 1;
	}
	
	reg=SCCB_RD_Reg(0X0a);	//读取厂家ID 高八位
	reg<<=8;
	reg|=SCCB_RD_Reg(0X0b);	//读取厂家ID 低八位
	if(reg!=OV7670_PID)
	{
		printf("HID:%drnrn",reg);
		return 2;
	}   
	
	//初始化 OV7670,采用QVGA分辨率(320*240)  
	for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
	{
		SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
	} 

	OV7670_Window_Set(PIC_START_X,PIC_START_Y,PIC_WIDTH,PIC_HEIGHT);
	
	OV7670_Light_Mode(0);
	OV7670_Color_Saturation(2);
	OV7670_Brightness(1);
	OV7670_Contrast(2);

	My_DCMI_Init();
	DCMI_DMA_Init((uint32_t)&camera_buffer+54,(sizeof(camera_buffer)-54)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA 

	return 0x00; 	//ok
} 
}


ESP8266_WIFI模块

AT固件

用出厂自带的固件即可,当然已经刷过其他固件的小伙伴也可以在官网下载:

出厂默认 AT 固件

AT 指令集

官方链接:
https://docs.ai-thinker.com/esp8266/docs

WIFI模块初始化部分程序

From wifi.c

void WIFI_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStruct;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_IO_WIFI,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_USART_WIFI,ENABLE);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	/* USART3 GPIO口配置 */
	GPIO_InitStructure.GPIO_Pin=PIN_WIFI;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(GPIO_WIFI, &GPIO_InitStructure);
	
	GPIO_PinAFConfig(GPIO_WIFI,AF_WIFI_TX,GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIO_WIFI,AF_WIFI_RX,GPIO_AF_USART3);

	//USART3 IRQ
	NVIC_InitStruct.NVIC_IRQChannel = WIFI_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
	
	USART_InitStructure.USART_BaudRate = BAUDRATE_WIFI;         
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 
	USART_Init(WIFI_IO, &USART_InitStructure);

	USART_Cmd(WIFI_IO,ENABLE);
	
	USART_ITConfig(WIFI_IO, USART_IT_IDLE, ENABLE);
	USART_ITConfig(WIFI_IO, USART_IT_RXNE, ENABLE);
}

项目

实物&效果图

在这里插入图片描述

工程文件

衷心感谢smitoo大佬的博文[抱拳]

https://blog.csdn.net/smitoo/article/details/108086791?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32f4%25E4%25B8%258D%25E5%25B8%25A6fifo%25E7%259A%2584ov7670&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-108086791.first_rank_v2_pc_rank_v29

工程文件:https://download.csdn.net/download/LiangWF22/15052236


对了,下面的链接为CSDN图片大小设置教程:https://blog.csdn.net/weixin_44611096/article/details/105129215
不过表格的好像没找到怎么设置列宽。

最后

以上就是超帅帆布鞋为你收集整理的STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)EDP协议OV7670摄像头模块ESP8266_WIFI模块项目的全部内容,希望文章能够帮你解决STM32F407-OV7670(无FIFO)-ONENET-实现摄像头画面上传到onenet(EDP协议)EDP协议OV7670摄像头模块ESP8266_WIFI模块项目所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部