查看: 2722|回复: 1

[分享] LPC1768+光敏电阻+PCA芯片温度传感器+水银水平开关+火焰光传...

[复制链接]
  • TA的每日心情
    开心
    2018-4-20 15:04
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    49

    主题

    188

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2954
    最后登录
    2023-7-24
    发表于 2019-11-25 22:59:36 | 显示全部楼层 |阅读模式
    本帖最后由 donatello1996 于 2019-11-26 00:39 编辑

    LPC1768+光敏电阻+PCA芯片温度传感器+水银水平开关+火焰光传感器+红外反射传感器


    看大家都玩了什么DHT11 BMP280之类的,我就不重复了,来点有意思的商业级传感器,标题的5个传感器里面,除了LPC1768内部的PCA的温度传感器以外,都是常见的商业级传感器,价格低廉,稳定性高,精度还可以,适合各种商用电子产品。

    为什么选用1768呢,因为社区之前举办活动的IRD1768板子自带了以太网接口通信功能,只需要将开发板接上路由器,用电脑浏览器访问开发板的IP就可以查看温度值和光敏值了,不像USB驱动代码那么麻烦,速率也比串口高得多。当然我一开始确实打算使用USB HID通信的,只是看了1768的USB库,看完想吐,不想脱发,直接用之前写好的HTTP驱动来通信,省去造轮子的麻烦。除了几个传感器以外,我用一个LCD2004屏来显示开发板读取到的各个传感器信息,以及一盏RGB灯来显示3个布尔值传感器的开关状态,红灯表示火焰光传感器触发,蓝灯表示水平开关触发,绿灯表示红外反射传感器触发。前几天我曾尝试过使用带大彩屏的LPC54608进行项目,无奈54608的库太难用,我找半天找不到用于TCP通信的函数,直接放弃。


    IMG_20191126_002205.jpg




    光敏电阻,商用电子领域最为广泛使用的光敏元件,优点是灵敏度高,会对极其微弱的可见光变化做出反应,缺点是强光阈值过低,仅仅是手机摄像头灯所发出的光就可以让光敏电阻阻值无限接近于0;
    IMG_20191125_231904.jpg


    此处顺便展示一种强光阈值高但灵敏度低的光敏传感器,适用于与光敏电阻侧重需求不同的场合(专门用于探测强光):
    IMG_20191126_000251.jpg IMG_20191126_000255_1.jpg




    干簧管磁力传感器,专门用于检测磁力,分常开和常闭两种,当磁铁靠近时改变状态,常开式干簧管可用于电磁开关,常闭式干簧管中根据灵敏度不同可用于检测环境电磁辐射,甚至是做保护用。

    IMG_20191126_003549.jpg

    水银水平开关,是价格非常低廉的电子水平仪,对水平变化值极其灵敏,由一管塑料管和一滴汞金属封装而成,一侧有断路银丝,当汞滴滑到银丝侧时,传感器电路闭合,数据脚输出高电平1,否则就一直为0;
    IMG_20191125_231846.jpg



    火焰光传感器,专门用于检测火光的传感器,只能由火焰光触发而不能由普通的灯光触发,并且甄别精确度极高,不知道其原理是检测火焰光的光谱还是热量;
    IMG_20191125_231854_1.jpg



    红外反射传感器,是大家最为熟知的传感器,当前面有平整的障碍物时,红外光接收端就能检测到发射端反射回来的红外光线。
    IMG_20191125_231909_1.jpg


    测试环节,首先是光敏电阻,读取到的光照强度值以百分比表示,用手机摄像头的光照就可以检测出明显变化:
    3.gif


    然后是火光传感器,可以看到火光传感器只对火机发出的火焰光反应,对手机摄像头灯光无反应:
    4.gif


    紧接着是水银水平传感器,传感器必须平放才可以确保不被触发,稍微倾斜一点都会触发,非常灵敏:
    5.gif


    最后是红外反射传感器,只需要置于障碍物前即可触发:
    6.gif


    检测光敏电阻AD电压值:
    1. int readAdcVal(LPC_ADC_T *pADC, uint8_t channel, uint16_t *data)
    2. {
    3.     uint32_t temp;
    4.     temp = pADC->DR[channel];
    5.     if (!ADC_DR_DONE(temp))
    6.     {
    7.         return -1;
    8.     }
    9.     /*    if(ADC_DR_OVERRUN(temp) && (pADC->CR & ADC_CR_BURST)) */
    10.     /*    return ERROR; */
    11.     *data = (uint16_t) ADC_DR_RESULT(temp);
    12.     return 0;
    13. }
    复制代码


    参考之前论坛大佬们移植的GPIO驱动库:

    1. typedef struct
    2. {
    3.         __IO uint32_t DIR;
    4.         uint32_t RESERVED0[3];
    5.         __IO uint32_t MASK;
    6.         __IO uint32_t PIN;
    7.         __IO uint32_t SET;
    8.         __O  uint32_t CLR;
    9. } LPC_GPIO_T;

    10. #define LPC_GPIO                  ((LPC_GPIO_T             *) LPC_GPIO0_BASE)

    11. void GPIO_Set_Port_Pin_Dir(uint8_t port,uint8_t pin,uint8_t dir)
    12. {
    13.         PINSEL_CFG_Type PinCfg;
    14.         PinCfg.Portnum = port;
    15.         PinCfg.Pinnum = pin;
    16.         PINSEL_ConfigPin(&PinCfg);        
    17.         GPIO_SetDir(port,1<<pin,dir);
    18. }

    19. void GPIO_SetPin(uint8_t port,uint8_t pin,uint8_t value)
    20. {
    21.         if(value==1)
    22.         {
    23.                 LPC_GPIO[port].SET = (1 << pin);
    24.         }
    25.         else if(value==0)
    26.         {
    27.                 LPC_GPIO[port].CLR = (1 << pin);
    28.         }
    29. }

    30. bool GPIO_GetPin(uint8_t port, uint8_t pin)
    31. {
    32.         return (bool) ((LPC_GPIO[port].PIN >> pin) & 1);
    33. }
    复制代码



    NXP的I2C库是天下第一好用:

    1. #define Temper_I2C_ADDR        0x96>>1

    2. #define Local_Temp_High        0x00
    3. #define Local_Temp_Low         0x22

    4. #define Remote_Temp_High       0x01
    5. #define Remote_Temp_Low        0x10

    6. float I2C_Temp_Read()
    7. {
    8.         unsigned char temp_buf=0,value,swap[2];
    9.         float temp;
    10.         I2C_M_SETUP_Type rxsetup;
    11.         rxsetup.sl_addr7bit = Temper_I2C_ADDR;
    12.         rxsetup.tx_data = &temp_buf;
    13.         rxsetup.tx_length = 1;
    14.         rxsetup.rx_data = &value;
    15.         rxsetup.rx_length = 1;
    16.         rxsetup.retransmissions_max = 3;
    17.         I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
    18.         swap[0]=value;
    19.         
    20.         temp_buf=0x22;
    21.         rxsetup.tx_data = &temp_buf;
    22.         rxsetup.rx_data = &value;
    23.         I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
    24.         swap[1]=value;
    25.         
    26.         if(swap[0]&&8==1)
    27.         {
    28.                 swap[0] =~swap[0];
    29.                 swap[1] = ~swap[1];
    30.                 temp=-1*(swap[0]+((swap[1]>>5)+1)*0.125f);
    31.         }
    32.         else
    33.         {
    34.                 temp=swap[0]+(swap[1]>>5)*0.125f;
    35.         }
    36.         return temp;

    37. }
    复制代码




    设置开发板IP为与路由器同一网段的任意IP号,设置好IP之后打开TCP服务器,进行bind listen等操作(库函数里面把bind和listen操作封装到同一个函数里面,即uip_listen),进入监听模式:
    1.         uip_ipaddr(ipaddr,192,168,1,10);
    2.         uip_sethostaddr(ipaddr);

    3.         uip_ipaddr(ipaddr,192,168,1,1);
    4.         uip_setdraddr(ipaddr);

    5.         uip_ipaddr(ipaddr, 255,255,255,0);
    6.         uip_setnetmask(ipaddr);

    7.     uip_listen(HTONS(8888));
    复制代码
    然后在TCP监听函数里面进行对浏览器GET和POST操作预留操作接口和判断,即可实现服务器对客户端的输入和输出,浏览器通过刷新网页来刷新传感器值,由于网页传输布尔值无太大意义,所以我只传输温度值和光照强度百分比,并且预留了POST操作接口供网页输入用,但本次传感器活动注重的是对传感器的开发,对于网页服务器可一笔带过,大家可以一起探索一下如何将HTTP功能进一步发挥。
    3.jpg

    代码 LPC1768.zip (3.16 MB, 下载次数: 1)
    IMG_20191125_233053_1.jpg
    今天心情不错
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2023-9-6 15:15
  • 签到天数: 211 天

    [LV.7]常住居民III

    34

    主题

    805

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2036
    最后登录
    2024-3-21
    发表于 2019-11-26 10:26:24 | 显示全部楼层
    这个显示器同款啊
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 00:29 , Processed in 0.104999 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表