OrangePi3 LTS 驱动开发-i2c通信(三)

OrangePi3 LTS 驱动开发- veml7700 轮询解析

上面一章如果驱动加载正常的话,节点显示如下:
在这里插入图片描述
所以,我们去轮询读取lux节点的数据就好了。

在这里插入图片描述

代码

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>

#define ERR_BUF_MAX 64
#define NODE_BUF_MAX 128
#define MAX_ARG_NUM 64
#define VEML_FILE_PATH          "/sys/class/max_veml7700/veml7700"
#define VEML_SUPPORT_PATH       "/sys/class/max_veml7700/veml7700/support"
#define VEML_GAIN_PATH          "/sys/class/max_veml7700/veml7700/gain"
#define VEML_IT_PATH            "/sys/class/max_veml7700/veml7700/it"
#define VEML_LUX_PATH           "/sys/class/max_veml7700/veml7700/lux"

#define ALS_GAIN_X1                      0x0
#define ALS_GAIN_X2                      0x1
#define ALS_GAIN_d8                      0x2
#define ALS_GAIN_d4                      0x3

#define ALS_INTEGRATION_25ms             0xC
#define ALS_INTEGRATION_50ms             0x8
#define ALS_INTEGRATION_100ms            0x0
#define ALS_INTEGRATION_200ms            0x1
#define ALS_INTEGRATION_400ms            0x2
#define ALS_INTEGRATION_800ms            0x3


int sysfs_read(const char *path, char *buf, int count)
{
    char err_buf[ERR_BUF_MAX];
    int size;
    int fd;

	fd = open(path, O_RDONLY);
    if (fd < 0) {
        strerror_r(errno, err_buf, sizeof(err_buf));
        printf("Error open %s: %s\n", path, err_buf);
        return -1;
    }

	memset(buf, 0, count);

	size = read(fd, buf, count - 1);
    if(size < 0) {
        strerror_r(errno, err_buf, sizeof(err_buf));
        printf("Error read %s: %s\n", path, err_buf);
    } else {
        buf[size] = '\0';
    }

    close(fd);

	printf("count = %d, read size = %d \n",count,size);
	printf(" %s -> buf = %s ",__FUNCTION__,buf);

    return size;
}

int sysfs_write(const char *path, char *buf)
{
    char err_buf[ERR_BUF_MAX];
    int size;
	int fd;

	fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd < 0) {
        strerror_r(errno, err_buf, sizeof(err_buf));
        printf("Error open %s: %s\n", path, err_buf);
        return -1 ;
    }

	printf(" %s -> buf = %s ",__FUNCTION__,buf);
	
    size = write(fd, buf, strlen(buf));
    if (size < 0) {
        strerror_r(errno, err_buf, sizeof(err_buf));
        printf("Error write %s: %s\n", path, err_buf);
    }

    close(fd);

    return size;
}


int sysfs_write_int(const char *path, int val)
{
	char buf[NODE_BUF_MAX];
	snprintf(buf, sizeof(buf), "%d", val);

	return sysfs_write(path,buf);
}

int sysfs_read_int(const char *path)
{
    int fd;
    int val = 0;
    char  bcmd[16];
    fd = open(path, O_RDONLY);
    if (fd >= 0) {
        read(fd, bcmd, sizeof(bcmd));
        val = strtol(bcmd, NULL, 10);
        close(fd);
    } else {
        printf("unable to open file %s,err: %s", path, strerror(errno));
    }
    return val;
}

int get_is_support_light_sensor(bool *support)
{
    *support = sysfs_read_int(VEML_SUPPORT_PATH);
    return 0;
}

int get_light_sensor_gain(unsigned short *gain)
{
    *gain = sysfs_read_int(VEML_GAIN_PATH);
    return 0;
}

int get_light_sensor_it(unsigned short *it)
{
    *it = sysfs_read_int(VEML_IT_PATH);
    return 0;
}

int get_light_sensor_lux(unsigned short *it)
{
    *it = sysfs_read_int(VEML_LUX_PATH);
    return 0;
}

void scale_lux(unsigned short raw_counts, float *lux)
{
  unsigned short gain;
  unsigned short itime;
  get_light_sensor_gain(&gain);
  get_light_sensor_it(&itime);

  float factor1, factor2;

  switch(gain & 0x3){
  case ALS_GAIN_X1:
    factor1 = 1.f;
    break;
  case ALS_GAIN_X2:
    factor1 = 0.5f;
    break;
  case ALS_GAIN_d8:
    factor1 = 8.f;
    break;
  case ALS_GAIN_d4:
    factor1 = 4.f;
    break;
  default:
    factor1 = 1.f;
    break;
  }

  switch(itime){
  case ALS_INTEGRATION_25ms:
    factor2 = 0.2304f;
    break;
  case ALS_INTEGRATION_50ms:
    factor2 = 0.1152f;
    break;
  case ALS_INTEGRATION_100ms:
    factor2 = 0.0576f;
    break;
  case ALS_INTEGRATION_200ms:
    factor2 = 0.0288f;
    break;
  case ALS_INTEGRATION_400ms:
    factor2 = 0.0144f;
    break;
  case ALS_INTEGRATION_800ms:
    factor2 = 0.0072f;
    break;
  default:
    factor2 = 0.2304f;
    break;
  }

  *lux = raw_counts * factor1 * factor2;

  printf("this is value %f\n",*lux);


  // apply correction from App. Note for all readings
  //   using Horner's method
  *lux = *lux * (1.0023f + *lux * (8.1488e-5f + *lux * (-9.3924e-9f + 
                                                    *lux * 6.0135e-13f)));
}

int main(int argc,char *argv[])
{
    bool is_support;
    unsigned short reg_value;
    float light_value;

    get_is_support_light_sensor(&is_support);
    if (is_support){
        printf("Support light sensor, model Veml7700\n");
        do
        {
            get_light_sensor_lux(&reg_value);
            scale_lux(reg_value,&light_value);
            /* code */
            printf("get light sensor value = %f\n",light_value);
            sleep(3);
        } while (1);
    
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值