OPENMV脱机调阈值

用到了7个按钮,第一个用来选择是否进入调阈值模式。

后6个用来调整OPENMV阈值编辑器的6个滑动条

OPENMV代码

import sensor, image, time, pyb,math, display
from pyb import UART

sensor.reset()
sensor.set_framesize(sensor.QQVGA)
sensor.set_pixformat(sensor.RGB565)
sensor.skip_frames(time = 10)
clock = time.clock()
threshold_index = 0 
red=[24, 69, 16, 127, -128, 127]
#
uart = UART(3, 9600)

lcd = display.SPIDisplay()


while True:
   
    # 检查是否有数据可读
    if uart.any():
        # 读取数据
        data = uart.read()

        # 检查数据是否符合要求
        if len(data) >= 3 and data[0] == 0xa1 and data[1] == 0xb2 and data[-1] == 0xc3:
            # 打印接收到的数据包
            print("接收到的数据包:", list(data))
 
 
            if data[2]==0: thr = 0;
            if data[2]==1: thr = 1;
            if thr == 1:
               red[0]=data[3]
               red[1]=data[4]
               red[2]=data[5]-128
               red[3]=data[6]-128
               red[4]=data[7]-128
               red[5]=data[8]-128
               
               for i in range(100):
                    clock.tick()
                    img = sensor.snapshot()  
                    img.binary([red])
                    lcd.write(img)  
                    print("阈值",list(red))
                    print("data",data[8])
            if thr == 0:   
                clock.tick()
                img = sensor.snapshot()
              # 拍照并显示图像。
                
                
                for blob in img.find_blobs([red],pixels_threshold=200,area_threshold=200):#循环blobs
                    img.draw_rectangle(blob.rect())#返回这个色块的外框
                lcd.write(img)  

 

 MSPM0G3507代码


#include "ti_msp_dl_config.h"

#include "oled.h"
#include "stdio.h"
uint8_t Serial_TxPacket[7];				//定义发送数据包数组,数据包格式:aa bb 01 02 03 04 cc


int openmv_data[5]; //openmv发来的数据包


//给OPENMV脱机调阈值发的数据
int a1=0;
int a2=0;
int a3=0;
int a4=0;
int a5=0;
int a6=0;
int a7=0;

/**
  * 函    数:串口发送一个字节
  * 参    数:Byte 要发送的一个字节
  * 返 回 值:无
  */
void Serial_SendByte(uint8_t Byte)
{
	DL_UART_Main_transmitDataBlocking(UART_1_INST  ,Byte);	//将字节数据写入数据寄存器,写入后USART自动生成时序波形
}



/**
  * 函    数:串口发送一个数组
  * 参    数:Array 要发送数组的首地址
  * 参    数:Length 要发送数组的长度
  * 返 回 值:无
  */
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)		//遍历数组
	{
		Serial_SendByte(Array[i]);		//依次调用Serial_SendByte发送每个字节数据
	}
}


/**
  * 函    数:串口发送数据包
  * 参    数:无
  * 返 回 值:无
  * 说    明:调用此函数后,Serial_TxPacket数组的内容将加上包头(FF)包尾(FE)后,作为数据包发送出去
  */
void Serial_SendPacket(void)
{

Serial_SendByte(0xa1);    
Serial_SendByte(0xb2);        
Serial_SendArray(Serial_TxPacket, 7);
Serial_SendByte(0xc3);
    	    
}



int data_test(int data[])           //判断数据是否合理的函数
{

	if(data[4]!=0xc3) return 0;  //帧尾
	
	//if(data[2]>150)   return 0;  //x坐标上限
	//if(data[3]>110)   return 0;  //y坐标上限
	
	return 1;
}



void delay_ms(uint32_t ms)
{
    while(ms--)
    {
        delay_cycles(CPUCLK_FREQ/2500);
    }
}



int main(void)
{

   
    SYSCFG_DL_init();

    OLED_Init(I2C_OLED_INST     );//初始化OLED
    OLED_Clear(I2C_OLED_INST     );//OLED清屏

    // NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);                 //先清除一下中断,防止直接接入中断
    // NVIC_EnableIRQ(UART_0_INST_INT_IRQN);                       //开启串口的中断

      //NVIC_EnableIRQ(UART_1_INST_INT_IRQN);                           //允许串口1的中断,OPENMV中断


   
    while (1)
     {
   
    OLED_ShowFloat(I2C_OLED_INST     , 0,0, a1, 3, 1, 8);
 OLED_ShowFloat(I2C_OLED_INST     , 0,1, a2, 3, 1, 8);
  OLED_ShowFloat(I2C_OLED_INST     , 0,2, a3, 3, 1, 8);
   OLED_ShowFloat(I2C_OLED_INST     , 0,3, a4, 3, 1, 8);
    OLED_ShowFloat(I2C_OLED_INST     , 0,4, a5, 3, 1, 8);
     OLED_ShowFloat(I2C_OLED_INST     , 0,5, a6, 3, 1, 8);
      OLED_ShowFloat(I2C_OLED_INST     , 0,6, a7, 3, 1, 8);
  


            //第一个按键用来判断是否进入调阈值模式
             if (DL_GPIO_readPins(KEY1_PORT_PORT     ,KEY1_PORT_KET1_PIN_PIN )==KEY1_PORT_KET1_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY1_PORT_PORT     , KEY1_PORT_KET1_PIN_PIN )==KEY1_PORT_KET1_PIN_PIN)       //一直按下
                    {

                    }
                    //松手之后
                    a1++;           //a1为1则进入调阈值模式,a1为0则退出调阈值模式
                    if(a1>1)
                    {
                        a1=0;
                    }
                    
            }     

            //第二个按键调第一个阈值
             if (DL_GPIO_readPins(KEY2_PORT_PORT     ,KEY2_PORT_KEY2_PIN_PIN )==KEY2_PORT_KEY2_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY2_PORT_PORT     , KEY2_PORT_KEY2_PIN_PIN )==KEY2_PORT_KEY2_PIN_PIN)       //一直按下
                    {

                    }
                    a2=a2+4;
                    if(a2>100)
                    {
                        a2=0;
                    }
            }     

             //第三个按键调第二个阈值
             if (DL_GPIO_readPins(KEY3_PORT_PORT     ,KEY3_PORT_KEY3_PIN_PIN )==KEY3_PORT_KEY3_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY3_PORT_PORT     , KEY3_PORT_KEY3_PIN_PIN )==KEY3_PORT_KEY3_PIN_PIN)       //一直按下
                    {

                    }
                    a3=a3+4;
                    if(a3>100)
                    {
                        a3=0;
                    }
            }     

            //第四个按键调第三个阈值
             if (DL_GPIO_readPins(KEY4_PORT_PORT     ,KEY4_PORT_KEY4_PIN_PIN )==KEY4_PORT_KEY4_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY4_PORT_PORT     , KEY4_PORT_KEY4_PIN_PIN )==KEY4_PORT_KEY4_PIN_PIN)       //一直按下
                    {

                    }
                    a4=a4+4;
                    if(a4>=252)
                    {
                        a4=0;
                    }
            }

            //第五个按键调第四个阈值
             if (DL_GPIO_readPins(KEY5_PORT_PORT     ,KEY5_PORT_KEY5_PIN_PIN )==KEY5_PORT_KEY5_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY5_PORT_PORT     , KEY5_PORT_KEY5_PIN_PIN )==KEY5_PORT_KEY5_PIN_PIN)       //一直按下
                    {

                    }
                    a5=a5+4;
                    if(a5>=252)
                    {
                        a5=0;
                    }
            }

            //第六个按键调第五 个阈值
             if (DL_GPIO_readPins(KEY6_PORT_PORT     ,KEY6_PORT_KEY6_PIN_PIN )==KEY6_PORT_KEY6_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY6_PORT_PORT     , KEY6_PORT_KEY6_PIN_PIN )==KEY6_PORT_KEY6_PIN_PIN)       //一直按下
                    {

                    }
                    a6=a6+4;
                    if(a6>=252)
                    {
                        a6=0;
                    }
            }  


             //第七个按键调第六个阈值
             if (DL_GPIO_readPins(KEY7_PORT_PORT     ,KEY7_PORT_KEY7_PIN_PIN )==KEY7_PORT_KEY7_PIN_PIN)       //按下为高电平
            {
                    while(DL_GPIO_readPins(KEY7_PORT_PORT     , KEY7_PORT_KEY7_PIN_PIN )==KEY7_PORT_KEY7_PIN_PIN)       //一直按下
                    {

                    }
                    a7=a7+4;
                    if(a7>=252)
                    {
                        a7=0;
                    }
            }  

            Serial_TxPacket[0] =a1;
            Serial_TxPacket[1] =a2;
            Serial_TxPacket[2] =a3;
            Serial_TxPacket[3] =a4;
            Serial_TxPacket[4] =a5;
            Serial_TxPacket[5] =a6;
            Serial_TxPacket[6] =a7;
            Serial_SendPacket();        //将帧头帧尾和中间的7个数据都发过去


    }
}

 

 

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值