用到了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个数据都发过去
}
}