查看: 6443|回复: 4

[原创] LPC55S69+光照温湿度二氧化碳等传感器(持续更新)

[复制链接]
  • TA的每日心情
    奋斗
    2023-2-9 08:26
  • 签到天数: 661 天

    连续签到: 1 天

    [LV.9]以坛为家II

    3

    主题

    780

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2360
    最后登录
    2024-11-20
    发表于 2019-11-14 22:07:08 | 显示全部楼层 |阅读模式
    本帖最后由 silvery 于 2019-11-14 22:07 编辑

            为了活动和比赛,上班+加班没时间,只能熬夜学习(拼了!!!),弄了3个晚上把MAX44009(美信的光照传感器),亲测功耗只有180nA,量程范围也有18万LUX,对比其他我觉得是你的不二之选。
            拿起我手上的新板子开始调,找了个PWM的工程就开始移植,以为自己有信心能搞懂LPC库函数的开发流程(第一次用LPC开发),结果处处碰壁,过来人建议对比例程来开始学,不过也因为碰壁还是收获了几个BUG,不牢骚了,上代码。
    //使用了硬件I2C4的  用什么就接什么IO口就可以了
    uint8_t  read_iic(uint8_t reg_addr)
    {        
            uint8_t tmp;

        I2C_MasterStart(EXAMPLE_I2C_MASTER, deviceAddress, kI2C_Write);
        tmp = reg_addr;
        I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &tmp, 1, kI2C_TransferNoStopFlag);
        I2C_MasterRepeatedStart(EXAMPLE_I2C_MASTER, deviceAddress, kI2C_Read);
        I2C_MasterReadBlocking(EXAMPLE_I2C_MASTER, &tmp, 1, kI2C_TransferRepeatedStartFlag);

        return tmp;
    }

    double max44009()
    {
            uint8_t ab[2]={0};
            
            uint8_t luxHigh = read_iic(0x03);
            uint8_t luxLow = read_iic(0x04);
                            
            int exponent = (luxHigh & 0xf0) >> 4;        
            int mant = (luxHigh & 0x0f) << 4 | luxLow;        
            return (double)(((0x00000001 << exponent) * (double)mant) * 0.045);
    }
    //放在主循环就可以了每秒输出了
    void max44009_Handle()
    {
            lux = max44009();
            SDK_DelayAtLeastUs(1000*1000);
            printf("MAX44009 now lux=");
            PrintFloat(lux);//主要是输出浮点数的,不知道为什么输出不了浮点数
    }
    //引脚初始化和I2C时钟和配置就省略了,不懂回复我再给代码
    未完待续.......(下一个传感器是BME280)

    QQ浏览器截图20191114214032.jpg
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-9 08:26
  • 签到天数: 661 天

    连续签到: 1 天

    [LV.9]以坛为家II

    3

    主题

    780

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2360
    最后登录
    2024-11-20
     楼主| 发表于 2019-11-14 23:25:00 | 显示全部楼层
    本帖最后由 silvery 于 2019-11-14 23:32 编辑

        今天居然能两更,还是有BUG的(设备ID搞错,然后又莫名给自己挖坑就搞久了),当初为什么要搞这种自己给自己找麻烦的工作

    void get_bme280(struct bme280_data *comp_data)
    {
    //        int8_t rslt = BME280_OK;
    #ifdef USE_FORCED
            /*rslt = */bme280_set_sensor_mode(BME280_FORCED_MODE, &dev);
            /* Wait for the measurement to complete and print data @25Hz */
    //        dev.delay_ms(1500);
            /*rslt = */bme280_get_sensor_data(BME280_ALL, &comp_data, &dev);
    #elif USE_NORMAL
    //        dev.delay_ms(1500);
            /*rslt = */bme280_get_sensor_data(BME280_ALL, comp_data, &dev);
    #endif
       
        /*return rslt;*/
    }

    void Hal_Delay(uint32_t ms)
    {
            SDK_DelayAtLeastUs(1000*ms);
    }

    void BME280_init()
    {
            int8_t rslt = BME280_OK;
            uint8_t settings_sel;
            dev.dev_id =
    #if 1
            BME280_I2C_ADDR_PRIM;
    #else
            BME280_I2C_ADDR_SEC;
    #endif

            dev.intf = BME280_I2C_INTF;
        dev.read = user_i2c_read;
        dev.write = user_i2c_write;
        dev.delay_ms = Hal_Delay;
            
            rslt = bme280_init(&dev);
            if (rslt != BME280_OK)
        {
    //       fprintf(stderr, "Failed to initialize the device (code %+d).\n", rslt);
    //       exit(1);
            }
    #ifdef USE_FORCED
            
            dev.settings.osr_h = BME280_OVERSAMPLING_16X;
        dev.settings.osr_p = BME280_OVERSAMPLING_16X;
        dev.settings.osr_t = BME280_OVERSAMPLING_2X;
        dev.settings.filter = BME280_FILTER_COEFF_16;

        settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;

        rslt = bme280_set_sensor_settings(settings_sel, &dev);
            /*if (rslt != BME280_OK)
            {
                    fprintf(stderr, "Failed to set sensor settings (code %+d).", rslt);
                    return rslt;
            }*/
    #elif USE_NORMAL
            dev.settings.osr_h = BME280_OVERSAMPLING_16X;
            dev.settings.osr_p = BME280_OVERSAMPLING_16X;
            dev.settings.osr_t = BME280_OVERSAMPLING_16X;
            dev.settings.filter = BME280_FILTER_COEFF_16;
            dev.settings.standby_time = BME280_STANDBY_TIME_1000_MS;

            /*settings_sel = BME280_OSR_PRESS_SEL;
            settings_sel |= BME280_OSR_TEMP_SEL;
            settings_sel |= BME280_OSR_HUM_SEL;
            settings_sel |= BME280_STANDBY_SEL;
            settings_sel |= BME280_FILTER_SEL;*/
        settings_sel = BME280_ALL_SETTINGS_SEL;
            rslt = bme280_set_sensor_settings(settings_sel, &dev);
            rslt = bme280_set_sensor_mode(BME280_NORMAL_MODE, &dev);
    #endif
    }
    #define EXAMPLE_I2C_MASTER_BASE (I2C4_BASE)

    #define EXAMPLE_I2C_MASTER ((I2C_Type *)EXAMPLE_I2C_MASTER_BASE)
    int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
    {
        int8_t rslt = 0; // Return 0 for Success, non-zero for failure
                    uint8_t tmp=reg_addr;
                    I2C_MasterStart(EXAMPLE_I2C_MASTER, dev_id, kI2C_Write);
        I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &tmp, 1, kI2C_TransferNoStopFlag);
        I2C_MasterRepeatedStart(EXAMPLE_I2C_MASTER, dev_id, kI2C_Read);
                    //for(rslt=0 ; rslt < len;rslt ++ )
        I2C_MasterReadBlocking(EXAMPLE_I2C_MASTER, reg_data, len, kI2C_TransferRepeatedStartFlag);
            
            return rslt;
    }
    int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
    {
        int8_t rslt = 0;
                    uint8_t tmp;
       
        I2C_MasterStart(EXAMPLE_I2C_MASTER, dev_id, kI2C_Write);
        tmp = reg_addr;
        I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &tmp, 1, kI2C_TransferNoStopFlag);
                    //for(rslt=0 ; rslt < len;rslt ++ )
        I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, reg_data, len, 0);
            
        return rslt;
    }

    剩下还有BME280的官方库,就不放上来了,去官网找就有了......
    未完待续......(下一更二氧化碳传感器T6703)
    QQ浏览器截图20191114233209.jpg
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 2386 天

    连续签到: 95 天

    [LV.Master]伴坛终老

    84

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    22163
    最后登录
    2025-8-4
    发表于 2019-11-15 10:38:34 | 显示全部楼层
    过来支持一下。





    nxp.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-2-9 08:26
  • 签到天数: 661 天

    连续签到: 1 天

    [LV.9]以坛为家II

    3

    主题

    780

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2360
    最后登录
    2024-11-20
     楼主| 发表于 2019-11-15 23:45:06 | 显示全部楼层
    二氧化碳传感器,因今天没带串口,只能DEBUG截图了,手上还剩一个PM2.5传感器,有空再填上,发完睡觉

    /*T6703寄存器列表*/
    #define FIRMWARE_VISION 0X1389
    #define STATUS 0X138A
    #define GAS_PPM 0X138B
    #define RESET_DEV 0X03E8
    #define START_SINGLE_POINT_CAL 0X03EC
    #define SLAVE_ADDRESS 0X0FA5
    #define ABC_LOGIC 0X03EE

    uint8_t reg_data[]={0x04,0X13,0X8B,0X00,0X01};
    uint8_t co2_data[4]={0};
    #define ADDR_6713_REALLY (0x15)
    /*返回0-2000PPM值*/
    uint16_t get_co2()
    {       
        /*if(HAL_I2C_Master_Transmit(&hi2c1,ADDR_6713,(uint8_t *)reg_data,5,0x100) == HAL_OK)
        {
            HAL_Delay(10);
            if(HAL_I2C_Master_Receive(&hi2c1,ADDR_6713|0x01,co2_data,4,0x100) != HAL_OK)return 0;
        }else return 0;*/
         
                   
                    I2C_MasterStart(EXAMPLE_I2C_MASTER, ADDR_6713_REALLY, kI2C_Write);
                   
                    I2C_MasterWriteBlocking(EXAMPLE_I2C_MASTER, &reg_data, 5, kI2C_TransferDefaultFlag);
                    SDK_DelayAtLeastUs(1000*10);
        I2C_MasterStart(EXAMPLE_I2C_MASTER, ADDR_6713_REALLY, kI2C_Read);
                    //for(rslt=0 ; rslt < len;rslt ++ )
        I2C_MasterReadBlocking(EXAMPLE_I2C_MASTER, co2_data, 4, kI2C_TransferRepeatedStartFlag);
        return ((co2_data[2] & 0x3F ) << 8) | co2_data[3];
    }

    明天尝试下SPI显示
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3901

    主题

    7514

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39651
    最后登录
    2025-8-4
    发表于 2019-11-18 16:19:04 | 显示全部楼层
    辛苦辛苦
    qiandao qiandao
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-4 14:05 , Processed in 0.088116 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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