STM32
直播中

李斌

7年用户 1299经验值
私信 关注
[问答]

OV7670摄像头模块是如何实现摄像头画面上传到onenet的

OV7670摄像头模块是如何实现摄像头画面上传到onenet的?


回帖(1)

h1654155275.5809

2021-9-30 14:20:16
  EDP协议
  服务器登录
  登录流程:
  (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字符串;
  方式2:
  产品ID + 鉴权信息(auth_info)
  产品ID:在平台添加产品时平台生成的ID;
  鉴权信息:在平台申请设备时填写设备的auth_info属性(json对象字符串),该属性需要产品内具备唯一性
  onenet初始化程序
  论坛里面有很详细的资料哦,几乎都是稍微修改以下就可以用的了。
  OV7670摄像头模块
  引脚定义及连线
  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 指令集
  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);
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分