[Linux项目实践] 物联网单板测试之任务四:光敏电阻

完成单板代码

/*任务4:通过光敏电阻读取光强数值*/

步骤:

4.1、查找电路图(FS_11C14 V3.0.pdf)找到光敏电阻的接口

4.2、这个IC没有使用过,查找这个光敏电阻的IC资料ISL29003.pdf

由光敏电阻的电路资料可知,光敏电阻的 SDASCL分别连接到MCU中的I2C总线控制器

4.3、首先初始化I2C总线:

uint32_t I2CInit( uint32_t I2cMode, uint32_t slaveAddr )

{

  /* It seems to be bit0 is for I2C, different from

  UM. To be retested along with SSP reset. SSP and I2C

  reset are overlapped, a known bug, for now, both SSP 

  and I2C use bit 0 for reset enable. Once the problem

  is fixed, change to "#if 1". */

#if 1

  LPC_SYSCON->PRESETCTRL |= (0x1<<1);

#else

  LPC_SYSCON->PRESETCTRL |= (0x1<<0);

#endif

  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5);

  LPC_IOCON->PIO0_4 &= ~0x3F; /*  I2C I/O config */

  LPC_IOCON->PIO0_4 |= 0x01; /* I2C SCL */

  LPC_IOCON->PIO0_5 &= ~0x3F;

  LPC_IOCON->PIO0_5 |= 0x01; /* I2C SDA */

  /*--- Clear flags ---*/

  LPC_I2C->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;    

  /*--- Reset registers ---*/

#if FAST_MODE_PLUS

  LPC_IOCON->PIO0_4 |= (0x1<<9);

  LPC_IOCON->PIO0_5 |= (0x1<<9);

  LPC_I2C->SCLL   = I2SCLL_HS_SCLL;

  LPC_I2C->SCLH   = I2SCLH_HS_SCLH;

#else

  LPC_I2C->SCLL   = I2SCLL_SCLL;

  LPC_I2C->SCLH   = I2SCLH_SCLH;

#endif

  if ( I2cMode == I2CSLAVE )

  {

LPC_I2C->ADR0 = slaveAddr;

  }    

  /* Enable the I2C Interrupt */

  NVIC_EnableIRQ(I2C_IRQn);

  LPC_I2C->CONSET = I2CONSET_I2EN;

  return( TRUE );

}

4.4、光敏电阻的初始化管脚

4.5、对管脚进行初始化

void light_init (void)

{

    /* nothing to initialize. light_enable enables the sensor */

    //add by terry

    GPIOSetDir(PORT0, 7, 1);      //set the light pio0_7 output

    GPIOSetValue(PORT0, 7, 0); //set the light pio0_7 high 

}

4.6、设置光敏电阻的敏感度

void light_setRange(light_range_t newRange)

{

    uint8_t ctrl = readControlReg();

    /* clear range */

    ctrl &= ~(3 << 2);

    ctrl |= CTRL_GAIN(newRange);

    I2CMasterBuffer[0] = ADDR_CTRL;

    I2CMasterBuffer[1] = ctrl;

    I2CWrite(LIGHT_I2C_ADDR, I2CMasterBuffer, 2);

    switch(newRange) {

    case LIGHT_RANGE_1000:

        range = RANGE_K1;

        break;

    case LIGHT_RANGE_4000:

        range = RANGE_K2;

        break;

    case LIGHT_RANGE_16000:

        range = RANGE_K3;

        break;

    case LIGHT_RANGE_64000:

        range = RANGE_K4;

        break;

    }

}

4.7、读取光敏电阻的感光值

uint32_t light_read(void)

{

    uint32_t data = 0;

    uint8_t buf[1];

    buf[0] = ADDR_LSB_SENSOR;

    I2CWrite(LIGHT_I2C_ADDR, buf, 1);

    I2CRead(LIGHT_I2C_ADDR, buf, 1);

    data = buf[0];

    buf[0] = ADDR_MSB_SENSOR;

    I2CWrite(LIGHT_I2C_ADDR, buf, 1);

    I2CRead(LIGHT_I2C_ADDR, buf, 1);

    data = (buf[0] << 8 | data);

    /* Rext = 100k */

    /* E = (range(k) * DATA)  / 2^n */

    //return (range*data / width);

data *= range;

data /= width;

return data;

}

4.8、测试方法

void Light_Test(void)

{

  char buf[24];

  uint32_t lux;

  //set a title

  OLED_ClearScreen();

  OLED_DisStrLine(0, 0, "Light");

  printf("\r\nLight\r\n");

  

  I2CInit(I2CMASTER, 0);                   

  light_init();

  

  light_enable()    //add here

  light_setRange(LIGHT_RANGE_4000);

  while(1)

  {

    lux = light_read();

    snprintf(buf, 20, "%d    ", lux);

    OLED_DisStrLine(2, 0, (uint8_t *)buf);

printf("%d ", lux);

delay_ms(300);

    if(KEY_Read() == KEY_ESC)

  break;

  }

}

4.9、编译烧录验证可以实现实时读取感光值

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值