在线时间234 小时
UID3301905
注册时间2017-1-8
NXP金币113
TA的每日心情 | 开心 2018-4-20 15:04 |
---|
签到天数: 8 天 [LV.3]偶尔看看II
金牌会员
- 积分
- 2954
- 最后登录
- 2023-7-24
|
本帖最后由 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通信的函数,直接放弃。
光敏电阻,商用电子领域最为广泛使用的光敏元件,优点是灵敏度高,会对极其微弱的可见光变化做出反应,缺点是强光阈值过低,仅仅是手机摄像头灯所发出的光就可以让光敏电阻阻值无限接近于0;
此处顺便展示一种强光阈值高但灵敏度低的光敏传感器,适用于与光敏电阻侧重需求不同的场合(专门用于探测强光):
干簧管磁力传感器,专门用于检测磁力,分常开和常闭两种,当磁铁靠近时改变状态,常开式干簧管可用于电磁开关,常闭式干簧管中根据灵敏度不同可用于检测环境电磁辐射,甚至是做保护用。
水银水平开关,是价格非常低廉的电子水平仪,对水平变化值极其灵敏,由一管塑料管和一滴汞金属封装而成,一侧有断路银丝,当汞滴滑到银丝侧时,传感器电路闭合,数据脚输出高电平1,否则就一直为0;
火焰光传感器,专门用于检测火光的传感器,只能由火焰光触发而不能由普通的灯光触发,并且甄别精确度极高,不知道其原理是检测火焰光的光谱还是热量;
红外反射传感器,是大家最为熟知的传感器,当前面有平整的障碍物时,红外光接收端就能检测到发射端反射回来的红外光线。
测试环节,首先是光敏电阻,读取到的光照强度值以百分比表示,用手机摄像头的光照就可以检测出明显变化:
然后是火光传感器,可以看到火光传感器只对火机发出的火焰光反应,对手机摄像头灯光无反应:
紧接着是水银水平传感器,传感器必须平放才可以确保不被触发,稍微倾斜一点都会触发,非常灵敏:
最后是红外反射传感器,只需要置于障碍物前即可触发:
检测光敏电阻AD电压值:
- int readAdcVal(LPC_ADC_T *pADC, uint8_t channel, uint16_t *data)
- {
- uint32_t temp;
- temp = pADC->DR[channel];
- if (!ADC_DR_DONE(temp))
- {
- return -1;
- }
- /* if(ADC_DR_OVERRUN(temp) && (pADC->CR & ADC_CR_BURST)) */
- /* return ERROR; */
- *data = (uint16_t) ADC_DR_RESULT(temp);
- return 0;
- }
复制代码
参考之前论坛大佬们移植的GPIO驱动库:
- typedef struct
- {
- __IO uint32_t DIR;
- uint32_t RESERVED0[3];
- __IO uint32_t MASK;
- __IO uint32_t PIN;
- __IO uint32_t SET;
- __O uint32_t CLR;
- } LPC_GPIO_T;
- #define LPC_GPIO ((LPC_GPIO_T *) LPC_GPIO0_BASE)
- void GPIO_Set_Port_Pin_Dir(uint8_t port,uint8_t pin,uint8_t dir)
- {
- PINSEL_CFG_Type PinCfg;
- PinCfg.Portnum = port;
- PinCfg.Pinnum = pin;
- PINSEL_ConfigPin(&PinCfg);
- GPIO_SetDir(port,1<<pin,dir);
- }
- void GPIO_SetPin(uint8_t port,uint8_t pin,uint8_t value)
- {
- if(value==1)
- {
- LPC_GPIO[port].SET = (1 << pin);
- }
- else if(value==0)
- {
- LPC_GPIO[port].CLR = (1 << pin);
- }
- }
- bool GPIO_GetPin(uint8_t port, uint8_t pin)
- {
- return (bool) ((LPC_GPIO[port].PIN >> pin) & 1);
- }
复制代码
NXP的I2C库是天下第一好用:
- #define Temper_I2C_ADDR 0x96>>1
- #define Local_Temp_High 0x00
- #define Local_Temp_Low 0x22
- #define Remote_Temp_High 0x01
- #define Remote_Temp_Low 0x10
- float I2C_Temp_Read()
- {
- unsigned char temp_buf=0,value,swap[2];
- float temp;
- I2C_M_SETUP_Type rxsetup;
- rxsetup.sl_addr7bit = Temper_I2C_ADDR;
- rxsetup.tx_data = &temp_buf;
- rxsetup.tx_length = 1;
- rxsetup.rx_data = &value;
- rxsetup.rx_length = 1;
- rxsetup.retransmissions_max = 3;
- I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
- swap[0]=value;
-
- temp_buf=0x22;
- rxsetup.tx_data = &temp_buf;
- rxsetup.rx_data = &value;
- I2C_MasterTransferData(LPC_I2C0,&rxsetup,I2C_TRANSFER_POLLING);
- swap[1]=value;
-
- if(swap[0]&&8==1)
- {
- swap[0] =~swap[0];
- swap[1] = ~swap[1];
- temp=-1*(swap[0]+((swap[1]>>5)+1)*0.125f);
- }
- else
- {
- temp=swap[0]+(swap[1]>>5)*0.125f;
- }
- return temp;
- }
复制代码
设置开发板IP为与路由器同一网段的任意IP号,设置好IP之后打开TCP服务器,进行bind listen等操作(库函数里面把bind和listen操作封装到同一个函数里面,即uip_listen),进入监听模式:
- uip_ipaddr(ipaddr,192,168,1,10);
- uip_sethostaddr(ipaddr);
- uip_ipaddr(ipaddr,192,168,1,1);
- uip_setdraddr(ipaddr);
- uip_ipaddr(ipaddr, 255,255,255,0);
- uip_setnetmask(ipaddr);
- uip_listen(HTONS(8888));
复制代码 然后在TCP监听函数里面进行对浏览器GET和POST操作预留操作接口和判断,即可实现服务器对客户端的输入和输出,浏览器通过刷新网页来刷新传感器值,由于网页传输布尔值无太大意义,所以我只传输温度值和光照强度百分比,并且预留了POST操作接口供网页输入用,但本次传感器活动注重的是对传感器的开发,对于网页服务器可一笔带过,大家可以一起探索一下如何将HTTP功能进一步发挥。
代码
LPC1768.zip
(3.16 MB, 下载次数: 1)
|
-
|