精华内容
下载资源
问答
  • sharp传感器
    2020-09-14 12:34:53

    GP2Y0D810Z0F,固定距离10cm,夏普传感器,冠宇铭通,v--x--15-110-264-988

    RohsLead free / RoHS Compliant
    厂家的应用说明 
    标准包装40
    感应距离10cm
    Output 型Digital
    - 电源电压4.5 V ~ 5.5 V
    电流 - 电源9mA
    输出电压差(典型值)的距离-
    输出电压(典型值)的距离-
    包装14DIP
    家庭GP2Y0D810Z0F
    标准包装Tape & Reel
    产品种类Proximity Sensors
    RoHSRoHS Compliant
    检测方法Optical
    感应距离为5mm13 cm
    最高工作温度60 C
    最低工作温度- 10 C
    工厂包装数量1000
    供应商封装形式DIP
    标准包装名称DIP
    欧盟RoHS指令Compliant
    引脚数14
    铅形状Through Hole
    输出类型Digital
    电流 - 电源9mA
    电压 - 电源4.5 V ~ 5.5 V
    其他名称425-2616-5
    RoHS指令Lead free / RoHS Compliant
    封装/外壳DIP-14
    电压 - 电源4.5 V ~ 5.5 V
    感应距离10cm
    输出类型Digital
    电流 - 电源9mA
    最高工作温度+60°C
    工作温度范围-10 → +60°C
    峰值感应器距离100mm
    输出设备光电二极管
    最低工作温度-10°C
    更多相关内容
  • 用于 Arduino 的夏普传感器演示 此存储库的目的是帮助 Arduino 用户开始使用 Sharp Corporation 的传感器组件。 对于每个传感器,您都会找到一个用于 Arduino 的演示程序(草图)和相应的 wiki 应用指南。该指南为...
  • 电子-夏普传感器sharpsensorList.pdf,单片机/嵌入式STM32-F0/F1/F2
  • 但是,夏普还生产光电子元件和传感器,这些光器件和传感器被其他公司广泛用于制造自己的产品,例如空气净化器,机器人吸尘器,自动水龙头等等。 对于每个传感器,您将找到一个可与Arduino一起使用的演示程序(草图...
  • 夏普粉尘传感器STM32代码,本代码已经进过测试,可以正常使用,测得粉尘浓度
  • 日本夏普SHARP)公司日前发布了和日本静冈大学大学共同开发的能同时测量图像距离的CMOS传感器。  该传感器,基于了夏普公司先进的CCD技术,采用了电荷转送的特种像素构造方式,以及红外线距离测量的Time of ...
  • 夏普红外测距传感器

    千次阅读 2019-08-24 11:40:54
    红外测距传感器,具备10-100cm厘米测距,5v供电,led屏,指定距离灯光语音报警 红外测距传感器利用ADC获取指定电压变化 void GetVolt() { u8 i; for(i=0;i<160;i++) { temp+=RegularConvData_Tab[i]; } ...

    红外测距传感器,具备10-100cm厘米测距,5v供电,led屏,指定距离灯光语音报警
    红外测距传感器利用ADC获取指定电压变化

    void GetVolt()
    {
    	u8 i;
    	
    	for(i=0;i<160;i++)	
    	{
    	temp+=RegularConvData_Tab[i];  
    	}
    	temp=temp/160;
    	Volt1=temp*3300/4096;
      if(1500<Volt1&&Volt1<=2700)
      {
    	  LLL=Volt1/180;
      }
      if(1000<Volt1&&Volt1<=1500)
      {
    	  LLL=Volt1/25;
      }
        if(500<Volt1&&Volt1<=1000)
      {
    	  LLL=Volt1/9.4;
      }
          if(Volt1<=500)
      {
    	  LLL=Volt1/3.8;
      }
    
    }
    

    10-100cm测距根据adc获取的电压变化获取距离公式

    void GetDistance()
    	{
    		u32 x;
    		x = Volt1;
    
    	
    		//µÚÒ»¸öºìÍâÓú¯Êý
    			
    		if(2450<=Volt1)
    		{
    				Distance = 63.426 - 0.018*x;
    		}
    				if(1801<=Volt1&&Volt1<2450)
    		{
    			Distance = 70.344 - 0.0206*x;
    		}
    		if(1000<=Volt1&&Volt1<1801)
    		{
    			Distance = 100 - 0.04*x;
    		}
    		if(780<=Volt1&&Volt1<1000)
    		{
    			Distance = 184.18 - 0.1245*x;
    		}
    		if(700<=Volt1&&Volt1<780)
    		{
    			Distance = 172.5 - 0.125*x;
    		}
    		if(0<Volt1&&Volt1<700)
    		{
    			Distance = 155-0.1*x;
    		}
    
    	}
    

    将获取的距离值放在led屏幕上显示
    利用iic来链接led屏
    并配置相关led功能函数

    void IIC_Start()
    {
    
    	OLED_SCLK_Set() ;
    	OLED_SDIN_Set();
    	OLED_SDIN_Clr();
    	OLED_SCLK_Clr();
    }
    
    /**********************************************
    //IIC Stop
    **********************************************/
    void IIC_Stop()
    {
    	OLED_SCLK_Set() ;
    //	OLED_SCLK_Clr();
    	OLED_SDIN_Clr();
    	OLED_SDIN_Set();
    	
    }
    
    void IIC_Wait_Ack()
    {
    
    	//GPIOB->CRH &= 0XFFF0FFFF;	//ÉèÖÃPB12ΪÉÏÀ­ÊäÈëģʽ
    	//GPIOB->CRH |= 0x00080000;
    //	OLED_SDA = 1;
    //	delay_us(1);
    	//OLED_SCL = 1;
    	//delay_us(50000);
    /*	while(1)
    	{
    		if(!OLED_SDA)				//ÅжÏÊÇ·ñ½ÓÊÕµ½OLED Ó¦´ðÐźÅ
    		{
    			//GPIOB->CRH &= 0XFFF0FFFF;	//ÉèÖÃPB12ΪͨÓÃÍÆÃâÊä³öģʽ
    			//GPIOB->CRH |= 0x00030000;
    			return;
    		}
    	}
    */
    	OLED_SCLK_Set() ;
    	OLED_SCLK_Clr();
    }
    /**********************************************
    // IIC Write byte
    **********************************************/
    
    void Write_IIC_Byte(unsigned char IIC_Byte)
    {
    	unsigned char i;
    	unsigned char m,da;
    	da=IIC_Byte;
    	OLED_SCLK_Clr();
    	for(i=0;i<8;i++)		
    	{
    			m=da;
    		//	OLED_SCLK_Clr();
    		m=m&0x80;
    		if(m==0x80)
    		{OLED_SDIN_Set();}
    		else OLED_SDIN_Clr();
    			da=da<<1;
    		OLED_SCLK_Set();
    		OLED_SCLK_Clr();
    		}
    
    
    }
    /**********************************************
    // IIC Write Command
    **********************************************/
    void Write_IIC_Command(unsigned char IIC_Command)
    {
       IIC_Start();
       Write_IIC_Byte(0x78);            //Slave address,SA0=0
    	IIC_Wait_Ack();	
       Write_IIC_Byte(0x00);			//write command
    	IIC_Wait_Ack();	
       Write_IIC_Byte(IIC_Command); 
    	IIC_Wait_Ack();	
       IIC_Stop();
    }
    /**********************************************
    // IIC Write Data
    **********************************************/
    void Write_IIC_Data(unsigned char IIC_Data)
    {
       IIC_Start();
       Write_IIC_Byte(0x78);			//D/C#=0; R/W#=0
    	IIC_Wait_Ack();	
       Write_IIC_Byte(0x40);			//write data
    	IIC_Wait_Ack();	
       Write_IIC_Byte(IIC_Data);
    	IIC_Wait_Ack();	
       IIC_Stop();
    }
    void OLED_WR_Byte(unsigned dat,unsigned cmd)
    {
    	if(cmd)
    			{
    
       Write_IIC_Data(dat);
       
    		}
    	else {
       Write_IIC_Command(dat);
    		
    	}
    
    
    }
    
    
    /********************************************
    // fill_Picture
    ********************************************/
    void fill_picture(unsigned char fill_Data)
    {
    	unsigned char m,n;
    	for(m=0;m<8;m++)
    	{
    		OLED_WR_Byte(0xb0+m,0);		//page0-page1
    		OLED_WR_Byte(0x00,0);		//low column start address
    		OLED_WR_Byte(0x10,0);		//high column start address
    		for(n=0;n<128;n++)
    			{
    				OLED_WR_Byte(fill_Data,1);
    			}
    	}
    }
    
    
    /***********************Delay****************************************/
    void Delay_50ms(unsigned int Del_50ms)
    {
    	unsigned int m;
    	for(;Del_50ms>0;Del_50ms--)
    		for(m=6245;m>0;m--);
    }
    
    void Delay_1ms(unsigned int Del_1ms)
    {
    	unsigned char j;
    	while(Del_1ms--)
    	{	
    		for(j=0;j<123;j++);
    	}
    }
    
    //×ø±êÉèÖÃ
    
    	void OLED_Set_Pos(unsigned char x, unsigned char y) 
    { 	OLED_WR_Byte(0xb0+y,OLED_CMD);
    	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
    	OLED_WR_Byte((x&0x0f),OLED_CMD); 
    }   	  
    //¿ªÆôOLEDÏÔʾ    
    void OLED_Display_On(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
    	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
    	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
    }
    //¹Ø±ÕOLEDÏÔʾ     
    void OLED_Display_Off(void)
    {
    	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
    	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
    	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
    }		   			 
    //ÇåÆÁº¯Êý,ÇåÍêÆÁ,Õû¸öÆÁÄ»ÊǺÚÉ«µÄ!ºÍûµãÁÁÒ»Ñù!!!	  
    void OLED_Clear(void)  
    {  
    	u8 i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©
    		OLED_WR_Byte (0x00,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
    		OLED_WR_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   
    		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
    	} //¸üÐÂÏÔʾ
    }
    void OLED_On(void)  
    {  
    	u8 i,n;		    
    	for(i=0;i<8;i++)  
    	{  
    		OLED_WR_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©
    		OLED_WR_Byte (0x00,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
    		OLED_WR_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   
    		for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); 
    	} //¸üÐÂÏÔʾ
    }
    //ÔÚÖ¸¶¨Î»ÖÃÏÔʾһ¸ö×Ö·û,°üÀ¨²¿·Ö×Ö·û
    //x:0~127
    //y:0~63
    //mode:0,·´°×ÏÔʾ;1,Õý³£ÏÔʾ				 
    //size:Ñ¡Ôñ×ÖÌå 16/12 
    void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
    {      	
    	unsigned char c=0,i=0;	
    		c=chr-' ';//µÃµ½Æ«ÒƺóµÄÖµ			
    		if(x>Max_Column-1){x=0;y=y+2;}
    		if(Char_Size ==16)
    			{
    			OLED_Set_Pos(x,y);	
    			for(i=0;i<8;i++)
    			OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
    			OLED_Set_Pos(x,y+1);
    			for(i=0;i<8;i++)
    			OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
    			}
    			else {	
    				OLED_Set_Pos(x,y);
    				for(i=0;i<6;i++)
    				OLED_WR_Byte(F6x8[c][i],OLED_DATA);
    				
    			}
    }
    //m^nº¯Êý
    u32 oled_pow(u8 m,u8 n)
    {
    	u32 result=1;	 
    	while(n--)result*=m;    
    	return result;
    }				  
    //ÏÔʾ2¸öÊý×Ö
    //x,y :Æðµã×ø±ê	 
    //len :Êý×ÖµÄλÊý
    //size:×ÖÌå´óС
    //mode:ģʽ	0,Ìî³äģʽ;1,µþ¼Óģʽ
    //num:ÊýÖµ(0~4294967295);	 		  
    void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
    {         	
    	u8 t,temp;
    	u8 enshow=0;						   
    	for(t=0;t<len;t++)
    	{
    		temp=(num/oled_pow(10,len-t-1))%10;
    		if(enshow==0&&t<(len-1))
    		{
    			if(temp==0)
    			{
    				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
    				continue;
    			}else enshow=1; 
    		 	 
    		}
    	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
    	}
    } 
    //ÏÔʾһ¸ö×Ö·ûºÅ´®
    void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
    {
    	unsigned char j=0;
    	while (chr[j]!='\0')
    	{		OLED_ShowChar(x,y,chr[j],Char_Size);
    			x+=8;
    		if(x>120){x=0;y+=2;}
    			j++;
    	}
    }
    
    /***********¹¦ÄÜÃèÊö£ºÏÔʾÏÔʾBMPͼƬ128¡Á64Æðʼµã×ø±ê(x,y),xµÄ·¶Î§0¡«127£¬yΪҳµÄ·¶Î§0¡«7*****************/
    void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
    { 	
     unsigned int j=0;
     unsigned char x,y;
      
      if(y1%8==0) y=y1/8;      
      else y=y1/8+1;
    	for(y=y0;y<y1;y++)
    	{
    		OLED_Set_Pos(x0,y);
        for(x=x0;x<x1;x++)
    	    {      
    	    	OLED_WR_Byte(BMP[j++],OLED_DATA);	    	
    	    }
    	}
    } 
    
    //³õʼ»¯SSD1306					    
    void OLED_Init(void)
    { 	
     
     	 
    
    
    	delay_ms(800);
    	OLED_WR_Byte(0xAE,OLED_CMD);//--display off
    	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
    	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
    	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
    	OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
    	OLED_WR_Byte(0x81,OLED_CMD); // contract control
    	OLED_WR_Byte(0xFF,OLED_CMD);//--128   
    	OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
    	OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
    	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
    	OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
    	OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
    	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
    	OLED_WR_Byte(0x00,OLED_CMD);//
    	
    	OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
    	OLED_WR_Byte(0x80,OLED_CMD);//
    	
    	OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
    	OLED_WR_Byte(0x05,OLED_CMD);//
    	
    	OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
    	OLED_WR_Byte(0xF1,OLED_CMD);//
    	
    	OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
    	OLED_WR_Byte(0x12,OLED_CMD);//
    	
    	OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
    	OLED_WR_Byte(0x30,OLED_CMD);//
    	
    	OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
    	OLED_WR_Byte(0x14,OLED_CMD);//
    	
    	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
    	OLED_Clear();
    	//OLED_ShowString(6,3,"0.96' OLED TEST",16);
    }  
    
    
    
    void OLED_ShowCharh(u8 x,u8 y,u8 chr)
    {      	
    		unsigned char c=0,i=0;	
    		c=chr;//µÃµ½Æ«ÒƺóµÄÖµ			
    		if(x>Max_Column-1){x=0;y=y+2;}
    
    		//16 X 32,Ô­À´ÊÇ24*48
    		OLED_Set_Pos(x,y);	
    		for(i=0;i<16;i++)
    		OLED_WR_Byte(F18X16[c*64+i],OLED_DATA);
    		
    		OLED_Set_Pos(x,y+1);
    		for(i=0;i<16;i++)
    		OLED_WR_Byte(F18X16[c*64+i+16],OLED_DATA);
    		
    		OLED_Set_Pos(x,y+2);
    		for(i=0;i<16;i++)
    		OLED_WR_Byte(F18X16[c*64+i+32],OLED_DATA);			
    
    		OLED_Set_Pos(x,y+3);
    		for(i=0;i<16;i++)
    		OLED_WR_Byte(F18X16[c*64+i+48],OLED_DATA);
    		OLED_Set_Pos(x,y+4);
    
    			
    				
    
    }
    //ÏÔʾһ¸ö×Ö·ûºÅ´®
    void OLED_ShowStringh(u8 x,u8 y,u8 *chr,u8 Char_Size)
    {
    	unsigned char j=0;
    	while (chr[j]!='\0')
    	{
    		if(chr[j]<='9'&&chr[j]>='0')
    			OLED_ShowCharh(x,y,chr[j]+1-'0');
    		else
    			OLED_ShowCharh(x,y,0);
    			
    			x+=16;
    		if(x>120){x=0;y+=2;}
    			j++;
    	}
    }
    

    将电压值和和距离值传送到led屏幕上去

    void ShowLED()
    {
    	u8 text[25];
    	u16 baud;
    	sprintf(text,"Vat:");
    	OLED_ShowString(0,2,text,16);		
    	sprintf(text,"%4d",Volt1);
    	OLED_ShowStringh(32,0,text,16);
    
    
    	
    	sprintf(text,"Dtc:");
    	OLED_ShowString(0,5,text,16);		
    	sprintf(text,"%4dcm",Distance);;
    	OLED_ShowStringh(32,4,text,16);
    	
    	
    	if(ModelBaud==2)
    		baud = 9600;
    	else if (ModelBaud==1)
    		baud = 4800;
    	else 
    		baud = 2400;			
    
    
    	sprintf(text,"ID:%03d B:%d",ModelID,baud);
    	//OLED_ShowString(0,6,text,16);
    }
    

    指定距离灯光语音报警,可用modbus设置两个不同距离档位LLoff1,LLoff20,外设声光报警器,通过控制继电器,来进行开关

    if(biaozhiwei==1)//´ò¿ª±¨¾¯¹¦ÄÜ
    {
    if(LLoff1<Distance&&Distance<LLoff2)//´óÓÚÒ»µµ£¬Ð¡ÓÚ¶þµ²
    {
    	GPIO_ResetBits(GPIOA,GPIO_Pin_9);
    	delay_ms(100);
    	GPIO_SetBits(GPIOA,GPIO_Pin_9);
    	delay_ms(100);
    }
    if(Distance>LLoff2)//´óÓÚ¶þµ²
    {
    	GPIO_ResetBits(GPIOA,GPIO_Pin_9);
    	delay_ms(1000);
    	GPIO_SetBits(GPIOA,GPIO_Pin_9);
    	delay_ms(1000);
    	
    }
    }
    else
    {
    	GPIO_SetBits(GPIOA,GPIO_Pin_9);
    }
    	}
    }
    
    展开全文
  • GP2Y0E03夏普红外测距传感器简单使用

    千次阅读 2021-07-27 18:30:47
    GP2Y0E03夏普红外测距传感简单使用

    夏普红外测距传感器规格书引脚如下

     一共七个引脚,如果要改地址的话还需要用到第八个引脚(当时改地址试了半天,仔细一看数据手册还有第八个引脚),第八个引脚Vpp如下图所示

     和GP2Y0E03通讯是用IIC协议,数据手册上具体协议格式如下

     笔者使用STM32F103系列单片机IIC通讯代码如下

    void GP2_SDA_Mode(GPIOMode_TypeDef  sdagpio_mode)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    
    	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; 
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
     	GPIO_InitStructure.GPIO_Mode = sdagpio_mode;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    } 
    void delay_us_us(u16 time)
    {    
       u16 i=0;  
       while(time--)
       {
          i=10;  
          while(i--) ;    
       }
    }
    void GP2_IIC_Start(void)
    {
    	GP2_IIC_SCL=0;
    	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
    	GP2_IIC_SDA=1;	  	  
    	GP2_IIC_SCL=1;
    	delay_us_us(4);
     	GP2_IIC_SDA=0;
    	delay_us_us(4);
    	GP2_IIC_SCL=0;
    }
    
    void GP2_IIC_Stop(void)
    {
    	GP2_IIC_SCL=0;
    	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
    	GP2_IIC_SCL=0;
    	GP2_IIC_SDA=0;
     	GP2_IIC_SCL=1; 
    	delay_us_us(4);
    	GP2_IIC_SDA=1;
    	delay_us_us(4);	
    	GP2_IIC_SCL=0;	
    }
    uint8_t GP2_IIC_Wait_Ack(void)
    {
    	uint8_t ucErrTime=0;
    	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	   
    	delay_us_us(4);	   
    	GP2_IIC_SCL=1;
    	delay_us_us(4);	
    	while(GP2_READ_SDA)
    	{
    		ucErrTime++;
    		if(ucErrTime>250)
    		{
    			GP2_IIC_Stop();
    			return 1;
    		}
    	}
    	GP2_IIC_SCL=0;//ʱÖÓÊä³ö0 	   
    	return 0;  
    }
    void GP2_IIC_Ack(void)
    {
    	GP2_IIC_SCL=0;
    	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
    	GP2_IIC_SDA=0;
    	delay_us_us(4);
    	GP2_IIC_SCL=1;
    	delay_us_us(4);
    	GP2_IIC_SCL=0;
    }
    void GP2_IIC_NAck(void)
    
    {
    	GP2_IIC_SCL=0;
    	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
    	GP2_IIC_SDA=1;
    	delay_us_us(4);
    	GP2_IIC_SCL=1;
    	delay_us_us(4);
    	GP2_IIC_SCL=0;
    }
    void GP2_IIC_Send_Byte(uint8_t txd)
    
    {                        
        uint8_t t;   
    		GP2_SDA_Mode(GPIO_Mode_Out_OD);	 	    
        GP2_IIC_SCL=0;
        for(t=0;t<8;t++)
        {              
    			if(txd&0x80)GP2_IIC_SDA=1;			
    			else GP2_IIC_SDA=0;				
    			txd<<=1; 	  
    			delay_us_us(4);  
    			GP2_IIC_SCL=1;
    			delay_us_us(4); 
    			GP2_IIC_SCL=0;	
    			delay_us_us(4);
        }	 
    } 
    uint8_t GP2_IIC_Read_Byte(void)
    
    {
    	unsigned char i,receive=0;
    	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	        
    	delay_us_us(4);
    	for(i=0;i<8;i++ )
    	{
    		receive<<=1;		
    	  GP2_IIC_SCL=1;
    		delay_us_us(4);
    		if(GP2_READ_SDA)receive |= 0x01; 
    		delay_us_us(4); //1
    		GP2_IIC_SCL=0; 
    		delay_us_us(4); //1
    	}	
    	return receive;
    }
    uint8_t GP2_IIC_Write_1Byte(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data)
    {
    	GP2_IIC_Start();
    	GP2_IIC_Send_Byte(SlaveAddress);
    	if(GP2_IIC_Wait_Ack())
    	{
    		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
    		return 1;//ûӦ´ðÔòÍ˳ö
    	}
    
    	GP2_IIC_Send_Byte(REG_Address);
    	GP2_IIC_Wait_Ack();	
    	delay_us_us(5);
    	GP2_IIC_Send_Byte(REG_data);
    	GP2_IIC_Wait_Ack();	
    	GP2_IIC_Stop();
    	return 0;
    }
    uint8_t GP2_IIC_Read_1Byte(uint8_t SlaveAddress, uint8_t REG_Address)
    {
    	uint8_t REG_data; 
    	GP2_IIC_Start();
    	GP2_IIC_Send_Byte(SlaveAddress);
    	if(GP2_IIC_Wait_Ack())
    	{
    		 GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
    		 return 1;//ûӦ´ðÔòÍ˳ö
    	}		
    
    	GP2_IIC_Send_Byte(REG_Address);
    	GP2_IIC_Wait_Ack();
    	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
    	delay_us_us(5);
    	GP2_IIC_Start(); 
    	GP2_IIC_Send_Byte(SlaveAddress|0x01);
    	GP2_IIC_Wait_Ack();
    	REG_data = GP2_IIC_Read_Byte();
    	GP2_IIC_Stop();
    	return REG_data;
    }
     
    uint8_t GP2_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
    {
    	GP2_IIC_Start();
    	GP2_IIC_Send_Byte(SlaveAddress);
    	if(GP2_IIC_Wait_Ack()) 
    	{
    		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
    		return 1;//ûӦ´ðÔòÍ˳ö
    	}
    	GP2_IIC_Send_Byte(REG_Address);
    	GP2_IIC_Wait_Ack();
    	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
    	delay_us_us(5);
    	GP2_IIC_Start(); 
    	GP2_IIC_Send_Byte(SlaveAddress|0x01);
    	GP2_IIC_Wait_Ack();
    	while(len)
    	{
    		*buf = GP2_IIC_Read_Byte();
    		if(1 == len)
    		{
    			GP2_IIC_NAck();
    		}
    		else
    		{
    			GP2_IIC_Ack();
    		}
    		buf++;
    		len--;
    	}
    	GP2_IIC_Stop();
    
    	return STATUS_OK;
    }
    uint8_t GP2_I2C_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
    {
    	GP2_IIC_Start();
    	GP2_IIC_Send_Byte(SlaveAddress);
    	if(GP2_IIC_Wait_Ack()) 
    	{
    		GP2_IIC_Stop();
    		return 1;
    	}
    	GP2_IIC_Send_Byte(REG_Address);
    	GP2_IIC_Wait_Ack();
    	while(len--)
    	{
    		GP2_IIC_Send_Byte(*buf++);
    		GP2_IIC_Wait_Ack();
    	}
    	GP2_IIC_Stop();
    	return STATUS_OK;
    }

    PS:使用时请注意镜面反射的影响,如果不改地址使用多个传感器模块,需控制使能脚依次读取数据

    展开全文
  • 夏普(Sharp)将上市业界最小、最薄的CMOS传感器LZ0P396D,尺寸仅1/11英寸,面向手机等便携终端应用。该款CMOS传感器外形尺寸为5.5mm×5.5mm×2.43mm,总像素达到11万。  据介绍,通过基于高密度设计技术的光学系统...
  • 此提交包括夏普红外传感器的测量数据,该传感器用于多个步骤(不同模型)以构建传感器的工厂模型。 该模型包括噪声、高频和低频尖峰以及传感器的非线性特性。 然后使用构建工厂模型的知识在可在 Arduino Mega 上运行...
  • 夏普红外测距传感器GP2D12线性转换表格,可以利用该表格通过简单的实验测距,计算出相应的公式,有利于数据采集的准确性!
  • Sharp将在下月推出一款Aquos系列LCD电视。提到Aquos系列电视,使人想到这系列...它内部的亮度传感器可以自动调节图像亮度。  这款LCD电视将会在3月15日在日本上市。计划每月生产10,000台。目前具体价格尚未知晓。 
  • PM2.5SHARP空气传感器

    2015-07-09 13:51:42
    开发空气净化器所用的检测PM2.5传感器,数据传输十六进制,转十进制即可显示所测数据
  • Shimadzu、Sharp和Shindengen电子制造公司已经开发出一种非晶硒(a-Se)薄膜,可直接转换平板检测器X射线工艺,在降低辐射剂量的同时能更清楚地显示血管。  这三家公司将致力于该处理的实际应用,它使用17英寸方形...
  • 生活在魔都的朋友们是否都有此感慨:浓重的雾霾天气,一推开窗,让你鼓不起勇气迈步杀进那个仿佛时刻在摧毁你五脏六腑的外面的世界。...Sharp GP2Y1010A U0F粉尘传感器数据表 IO 传感器扩展板原理图 转接模块电路图
  • 代码,TI的msp430f5529读取夏普灰尘传感器,并在液晶显示PM值.并且附带一些传感器资料。
  • 允许从Sharp模拟距离传感器获取距离数据的Arduino库 当前支持的传感器型号 GP2Y0A41SK0F GP2Y0A21YK0F GP2Y0A02YK0F 用法 将库添加到草图 # include 创建一个等距 SharpIR sensorName (sensorModel, sensorPin...
  • PM2.5传感器 GP2Y1014AU粉尘传感器 传感器模块代替GP2Y1010AU0F.PDF,灰尘传感器的使用说明
  • 传感器(Light)距离传感器(Proximity )原理 光谱;光度学物理量——发光强度(I/Intensity);光度学物理量——光通量(F/Flux);光度学物理量——照度(E/Illuminance);光度学物理量——亮度(L/Luminance...
  • GP2Y10 数据文档
  • Shimadzu、Sharp和Shindengen电子制造公司已经开发出一种非晶硒(a-Se)薄膜,可直接转换平板检测器X射线工艺,在降低辐射剂量的同时能更清楚地显示血管。  这三家公司将致力于该处理的实际应用,它使用17英寸方形...
  • 夏普GP2Y1010AU0F灰尘传感器使用

    万次阅读 2019-03-22 11:34:12
    夏普GP2Y1010AU0F灰尘传感器在STM32平台上的使用 一、传感器的概述 GP2Y1010AUOF是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对角分布的红外发光二极管和光电晶体管,利用光敏原理来工作。用于...

    夏普GP2Y1010AU0F灰尘传感器在STM32平台上的使用
    一、传感器的概述

       GP2Y1010AUOF是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对角分布的红外发光二极管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。

     

    二、传感器的一些参数 

       

         

     

    三、传感器的工作原理

     

                                                             图(1)

                          

                                                                图(2)

           夏普GP2Y1010AU0F灰尘传感器价格较便宜,只能检测出室内空气中的灰尘和烟尘含量.并不能测出所谓的PM2.5浓度,然而现在市面上有好多红外发光二极管的传感器都称自己是PM2.5传感器,能测PM2.5的值,其实并不是,真正能测PM2.5浓度的是那种上百的激光传感器,这种红外的连PM10都测不了,只能用来玩玩,或者大概描述空气质量的等级而已,经我多次实验,发现这传感器显示的灰尘浓度与网上公布的AQI空气质量指数比较接近,跟真实的PM2.5浓度有很大的区别,这测出的灰尘浓度其实就是所有不同直径的颗粒物总和,里面包含了PM1.0,PM2.5,PM10

         其原理如上图(2)所示,传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。

    四、传感器与STM32的连接

     

      (注:把图中的430单片机直接换成STM32就行,接线顺序跟电阻、电容的大小都不变)

     

         在这里简单地说一下,为什么要这样接? 

    1. 电阻R1和电容C1:因为V-LED和LED-GND是给红外发光二极管供电的,所以不能直接接上5V,需要串一个150欧的电阻来限流,另外为了稳定供电,还需要在给发光二极管供电的正极和负极上并一个220uf的电容。

    2. 三极管:可以增加LED的驱动能力(建议加上,加上后比较稳定)

    3. 电阻R2:起到限流作用,因为该传感器的最大工作电流为20mA

    4. 电阻R3和R4:起分压作用(因为该传感器是5V供电,而32单片机的AD采样最大电压为3.3V)

    5. 上图中的P1.2为脉冲输入脚,为传感器提供输入信号(该PWM的占空比规定为0.032)

    6. 上图中的P6.5为单片机的ADC模拟输入脚,用来输出信号的

                                                       

       

                            (图1)                                                                (图2)

     

      图1为脉冲输入波形,周期为10ms,高电平为0.32ms

      图2为AD采样时序,由图可知,在输入上升沿到输出的峰值,时间为280us左右,就在此时进行采样,因为整个高电平持续的时间为320us,所以在打开红外发光二极管280us后采样,然后延时40us后关闭红外发光二极管,最后再延时9680us(输入波形的周期为10ms),这就实现了一次完整的工作

     

                      数据手册上面有关电压值与灰尘浓度的关系比例图

             

     

        由图可知,该曲线在前半部分是有一定的斜率的,大约到0.6mg/m3左右,该曲线不再增长,此时输出的电压最大为3.6V左右,但是在曲线的前半部分,是可以得出电压值与灰尘浓度的关系:Dust density = 0.17 * Output Voltage  

     

      根据技术手册可知,当空气洁净的时候,Vo的范围是0~1.5V,典型值是0.9V

          

     

         当空气灰尘浓度很高的时候,Vo的数值大于3.6V。但是该传感器输出的最大电压为3.6V,所以当灰尘浓度再增加时,我们这款传感器已经测不出了


        0.9V表示空气洁净,3.6V表示空气灰尘很多。由于空气中不可能一点灰尘都没有,所以取个正常值0.9V,换成灰尘浓度就是0.053mg/m3

    当达到最大电压值3.6V时,此时的灰尘浓度为0.512mg/m3
    所以我们这个传感器的范围就是0~512ug/m3(这个512只是一个估算大约的值,实际情况中还是有可能超出这值的)

    五、主要的程序代码

     

    Main.c

     

    #include "stm32f10x.h"

    #include "bsp_SysTick.h"

    #include "bsp_usart1.h"

    #include "bsp_GP2Y.h"

    #include "bsp_pwm_output.h"

    #include "bsp_TiMbase.h" 

    #define FILTER_N 7

     

    int  A[32];

    volatile u32 time = 0; // ms 计时变量

     

    void Delay(__IO uint32_t nCount)

    {

      for(; nCount != 0; nCount--);

    }

    voidTIM3_Configuration(void);

    void  TIM3_NVIC_Configuration(void);

     

    int main(void)

    {

    float  calcVoltage ;

    int  filter_sum, i ,j ,dust;

    int filter_max, filter_min;

    int filter_buf[FILTER_N];

     

    SysTick_Init();

    USART1_Config();

    TIM3_Configuration();

    TIM3_NVIC_Configuration();

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);

    Adc_Init();

    TIM3_PWM_Init();

     

    Delay_ms(200);  //等待传感器稳定工作//

     while(1)

     {

       if(time==200)    //10ms发生一次中断,等到中断200次后,即2s//

         {

          time=0;

          for(i = 0; i < FILTER_N; i++)

        {

          GP2Y_Low;                //打开红外二极管//

          Delay_us(280);            //延时280us//  

         filter_buf[i]=Get_Adc(ADC_Channel_10);    //采样,读取AD值//  

         Delay_us(19);           //延时19us,因为这里我设了AD采样的周     期为239.5,所以AD转换一次需耗时21us,19加21再加280刚好是320us,这跟上面说的高电平持续的时间为0.32ms//

         GP2Y_High;             //关闭红外二极管//

        Delay_us(9680);         //延时9680us//

       }

              filter_max = filter_buf[0];

              filter_min = filter_buf[0];

              filter_sum = filter_buf[0];

         for(i = FILTER_N - 1; i > 0; i--)

      {

        if(filter_buf[i] > filter_max)

          filter_max=filter_buf[i];

         else if(filter_buf[i] < filter_min)

          filter_min=filter_buf[i];

          filter_sum = filter_sum + filter_buf[i];

          filter_buf[i] = filter_buf[i - 1];

         }

           i = FILTER_N - 2;

          filter_sum = filter_sum - filter_max - filter_min + i/2;          //加上i/2是为了四舍五入//

          filter_sum = filter_sum / i;

          calcVoltage=filter_sum*(3.3/ 4096)*2;   /因为上面采集到的是AD值,这里要把它转换为电压值//

      (注:为什么我在公式的最后要乘以2呢?这个2是一定不能少的,因为我们将它与32单片机连接的时候,加了两个10K的电阻分压,读取到的电压值已减小了一半,但这不是实际采取到的电压,所以要在最后乘以2返回原来的电压值)

         dust=(0.17*calcVoltage-0.1)*1000;  //乘以1000单位换成ug/m3//

         if (dust<0)

          dust=0;            //限位//

         if (dust>500)        

          dust=500;

          printf("\r\n电压值:%fV\n",calcVoltage);

         printf("\r\n灰尘浓度:%dug/m3\n",dust);

     }

     }

    }

    以上就是主要的一些程序,由于该传感器不太稳定,输出波形抖动较大,所以在程序里我加上了数字滤波算法,我采用那种去极值取平均的中位值滤波法,在传感器工作一次时,取输出波形的连续几个波峰的峰值,存到数组里,然后进行去掉最大值,最小值的操作,剩下的取平均

     

     六、实际操作

     

     实物连接图如下:

                                                                         

     

     把程序烧进单片机,观察其输出的值

                                      

     

       对比右图可知,一般室内的灰尘浓度所对应的电压值都是0.9V左右

        

     再对比一下网上公布的空气指数

     

     

    对比可知,该传感器测出的值与网上公布的AQI指数比较接近

     

      我们再来看看这输入波形和输出波形

     

     

     

     

         黄色的是输入波形,蓝色的是输出波形

      (注:这图像上显示的电压值是分压后的)

       当我往传感器的中心孔里放根杜邦线时,可以看到其输出波形立马飙升,说明这传感器还是挺灵敏的

              

     

     

        当往孔里插根杜邦线或者一支笔时,测出的值立马到达最大值3.6V左右,这是对颗粒物的灵敏度,对于烟雾类型的也很敏感,我利用电烙铁焊锡时产生的烟雾,经传感器测量也能到达最大值,显示的灰尘浓度达530ug/m3.

        由于这传感器的内部存有空隙,所以当你外加烟雾给它时,会有少量的烟雾残留在内部的空隙里,才会出现为什么我把烟雾撤去之后,显示的浓度依然很大,这时你需往孔里吹口气,将里面残留的烟雾吹走,这时才恢复你室内正常的浓度,否则的话,你得等待一段时间,待里面的烟雾慢慢散去.
    --------------------- 
    作者:思念中华 
    来源:CSDN 
    原文:https://blog.csdn.net/qq_38021919/article/details/78764764 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • Sharp_GP2Y0A GP2Y0A02YK0F, GP2Y0A710K0F Arduino 程序 GP2Y0A02YK0F 传感器参数: 20~150cm Analog output type. 4.5 to 5.5V, 33mA Block diagram Timing Chart Output 参考V-cm图, 用查表法, ...
  • Sharp红外传感器的原理以及使用技巧

    千次阅读 2010-04-27 17:57:00
    转自:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3938682&bbs_page_no=10&bbs_id=1000### (原文件名:sharp红外距离传感器.jpg) 引用图片 (原文件名:sharp红外距离传感器2.jpg) 引用图片 (原文件名:sharp...
  • 这种手机的型号是904SH,是夏普为沃达丰制作的。相比之下,以前最好的手机显示屏的分辨率也只是QVGA(四分之一VGA)。 据英国IT新闻网站theinquirer.net报道,904SH型手机的分辨率是其竞争对手的四倍。这款手机向...
  • esp8266-夏普空气传感器 这是将 Sharp GP2Y1010AU0F 与 NodeMCU 一起使用的简单 Lua 脚本。 它的灵感来自 Chris Nafis 和,但我使用了更精确的校准传感器的方法。 虽然 Chris Nafis 有机会将他的传感器与 Dylos DC...
  • 添加其他模拟夏普传感器意味着复制/粘贴一些现有的(.cpp 和 .h)文件并更改函数“getDistanceCentimeter”的计算中的一些参数。您可以从数据表中导出参数,也可以使用(1/X 轴上的距离!)对实验数据执行线性回归 ...
  • 智能手机中最常见的传感器之一是加速度传感器。正如其名字揭示的那样,加速度传感器能测量手机的加速度。使手机在任何方向上运动,加速度传感器就会有信号输出,手机静止不动时加速度传感器则没有信号输出。加速度...
  • CCD(Charge Coupled Device)图像传感器(以下简称CCD)和CMOS图像传感器(CMOS Image Sensor以下简称CIS)的主要区别是由感光单元及读出电路结构不同而导致制造工艺的不同。CCD感光单元实现光电转换后,以电荷的...
  • 关于GP2Y1010AU0F SHARP传感器使用

    千次阅读 2013-09-27 14:07:12
    关于GP2Y1010AU0F SHARP传感器使用 1.先上传该传感器PDF上的部分资料 SHARP传感器使用" title="关于GP2Y1010AU0F SHARP传感器使用" style="margin:0px; padding:0px; border:0px; list-style:none"> SHARP传感器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,131
精华内容 852
关键字:

sharp传感器