启航KS_IoT智能开发套件案例及代码(第一部分) 原创 精华

发布于 2022-2-11 14:32
浏览
8收藏

启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

1.案例简介

启航KS包括1块核心板和4块扩展板,本文档包括以下功能案例:
启航KS核心板实现的案例
1)OLED显示
2)温湿度监测
3)超声波测距
4)人体红外感应
5)电机控制
6)蜂鸣器
7)光照强度监测
8)按键功能
9)RGB呼吸灯
10)NFC
11)Wi-Fi
12)光电开关监测
13)可燃气体监测
启航KS扩展板实现的案例
1)PM2.5监测
2)甲醛监测
3)BDS/GPS定位
4)姿态监测
5)蓝牙

2.启航KS核心板功能实现

核心板功能区分布图如下:
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.1.OLED显示实现

2.1.1.OLED显示原理

通过I2C接口控制OLED屏显示字符。

2.1.2.OLED硬件接口

OLED
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
OLED使用的I2C接口为I2C0,其引脚连接说明如下:
OLED_SDA ----- GPIO13
OLED_SCL ----- GPIO14
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.1.3.OLED显示软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_oled
|—iss_oled_font.c
|—iss_oled_font.h
|—iss_oled_ssd1306.c
|—iss_oled_ssd1306.h
1、配置I2C引脚
初始化I2C0
初始化I2C0波特率
配置GPIO13为I2C0_SDA,GPIO14为I2C0_SCL
uint32_t IssInitI2cIdx0Config(uint32_t baudrate)
{
// Initialize I2C
uint32_t state = HI_ERR_FAILURE;
state = IoTI2cInit(HI_I2C_IDX_0, baudrate);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “i2c init error”);
state = IoTI2cSetBaudrate(HI_I2C_IDX_0, baudrate);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “i2c set baudrate error”);
state = hi_io_set_func(HI_IO_NAME_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “io set func gpio13 error”);
state = hi_io_set_func(HI_IO_NAME_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “io set func gpio14 error”);
return HI_ERR_SUCCESS;
}
2、初始化OLED
void IssInitOledI2cConfig()
{
uint32_t state = IssInitI2cIdx0Config(BAUDRATE_VAL_400KBPS);
RUNTIME_ERR_RET_VOID(state != HI_ERR_SUCCESS, “init i2c config error,state=0x%x.\r\n”, state);
while (HI_ERR_SUCCESS != IssOledInit()) {
printf(“Connecting oled board falied!Please access oled board\r\n”);
}
}
3、OLED寄存器初始化
uint32_t IssOledInit(void)
{
uint32_t i, status;
static const uint32_t initCmds[] = {
DISPLAY_OFF,
SET_LOW_COLUMN_ADDRESS,
SET_HIGH_COLUMN_ADDRESS,
SET_START_LINE_ADDRESS,
SET_PAGE_ADDRESS,
CONTRACT_CONTROL,
FULL_SCREEN,
SET_SEGMENT_REMAP,
NORMAL,
SET_MULTIPLEX,
DUTY,
SCAN_DIRECTION,
DISPLAY_OFFSET,
DISPLAY_TYPE,
OSC_DIVISION,
DIVISION,
COLOR_MODE_OFF,
COLOR,
PRE_CHARGE_PERIOD,
PERIOD,
PIN_CONFIGUARTION,
CONFIGUARTION,
SET_VCOMH,
VCOMH,
SET_CHARGE_PUMP_ENABLE,
PUMP_ENABLE,
TURN_ON_OLED_PANEL,
};

hi_udelay(MILLISECOND_TO_MICROSECOND(SLEEP_300_MS)); // need delay

for (i = 0; i < ARRAY_SIZE(initCmds); i++) {
    status = IssWriteCmd(initCmds[i]);
    if (status != HI_ERR_SUCCESS) {
        return status;
    }
}

return HI_ERR_SUCCESS;
}
4、显示字符串
void IssOledShowStr(uint8_t xAxis, uint8_t yAxis, char *chr, uint8_t charSize)
{
if (chr == NULL) {
printf(“Parameter is NULL!\r\n”);

    return;
}

while (*chr != '\0') {
    IssOledShowChar(xAxis, yAxis, *chr, charSize);
    xAxis += 8;
    if (xAxis > 120) {
        xAxis = 0;
        yAxis += 2;
    }
    chr++;

}
}
5、清屏
void IssOledFillScreen(uint8_t fiiData)
{
uint8_t m, n;

for (m = 0; m < MAC_LINE; m++) {
    IssWriteCmd(SET_PAGE_ADDRESS + m);
    IssWriteCmd(SET_LOW_COLUMN_ADDRESS);
    IssWriteCmd(SET_HIGH_COLUMN_ADDRESS);

    for (n = 0; n < MAC_COLUMN; n++) {
        IssWriteData(fiiData);
    }
}

}

2.2.温湿度功能实现

2.2.1.温湿度功能原理

采用集成式温湿度传感器,型号为AHT20,实现温湿度数据采集。

2.2.2.温湿度硬件接口

启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
温湿度传感器使用的I2C接口为I2C0,其引脚连接说明如下:
SDA ----- GPIO13
SCL ----- GPIO14
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.2.3.温湿度监测软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_temp_humi
|—iss_humidity.c
|—iss_humidity.h
温湿度传感器通过I2C协议读取温湿度数据。
1、配置I2C引脚
主要操作:
I2C发送数据和接受数据
温湿度和OLED使用共同的I2C0接口,在OLED模块中已初始化,这里不需要重复初始化
2、读取温湿度数据
获取温湿度数据。
读取测量结果并转换为温湿度
uint32_t IssReadTemperatureAndHumidityData(BoardEnvInfoValue *envInfo)
{
uint32_t state = HI_ERR_FAILURE;

hi_i2c_data i2cData = {0};
uint8_t sendUserCmd[3] = {0xAC, 0X33, 0X33};

i2cData.send_buf = sendUserCmd;
i2cData.send_len = 3;

state = IoTI2cWrite(HI_I2C_IDX_0, WRITE_ADDR, i2cData.send_buf, i2cData.send_len);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "i2c write failure.state=0x%x", state);

uint8_t recvData[I2C_READ_TH_DATA_LENGTH] = {0};

i2cData.receive_buf = recvData;
i2cData.receive_len = I2C_READ_TH_DATA_LENGTH;

state = IoTI2cRead(HI_I2C_IDX_0, READ_ADDR, i2cData.receive_buf, i2cData.receive_len);
if (state != HI_ERR_SUCCESS) {
    envInfo->tempHumi.tempValue = -1;
    envInfo->tempHumi.humiValue = -1;
}
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "i2c read failure.state=0x%x", state);

// Temperature value: T = (s_t / 2 ^ 20) * 200-50
float tmpVal = (float)((recvData[3] & 0x0f) << 16 | recvData[4] << 8 | recvData[5]);
envInfo->tempHumi.tempValue = (float)((tmpVal / (1 << 20)) * 200 - 50);
// Humidity value: H = (s_h / 2 ^ 20) * 100
tmpVal = ((recvData[1] << 12) | (recvData[2] << 4) | ((recvData[3] & 0xf0) >> 4));
envInfo->tempHumi.humiValue = (tmpVal / (1 << 20)) * 100;
return HI_ERR_SUCCESS;

}

2.3.超声波测距实现

2.3.1.超声波测距原理

超声波传感器,型号为HC-SR04,实现超声波数据采集。基本工作原理为:
1.采用IO口TRIG触发测距,给至少10us的高电平信号。
2.模块自动发送8个40hz的方波检测是否由信号返回。
3.有信号返回,通过IO口ECHO输入一个高电平,高电平持续时间就是超声波从发送到返回的时间。
4.测试距离(m)= ((高电平时间)(s)) 声速(340m/s))/2或测试距离 (cm) = 高电平时间(us)(1000/17/(us/cm)) = 高电平时间*58。

2.3.2.超声波测距硬件接口

HC-SR04
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
特殊说明:
使用该功能,需要按下SW1按键,此时该功能才有效。
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
超声波测距使用的GPIO接口为GPIO7, GPIO8,其引脚连接说明如下:
TRIG ----- GPIO7
ECHO ----- GPIO8
超声波测距中,GPIO7和GPIO8引脚配置设置见4.2章节
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.3.3.超声波测距软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_ultrasonic
|—iss_ultrasonic.c
|—iss_ultrasonic.h
超声波测距传感器通过GPIO协议读取超声测距波数据。
配置引脚:GPIO7为DIR_OUR, GPIO8 为DIR_IN

uint32_t IssInitUltrasonicGpioPin(void)
{
    uint32_t state = HI_ERR_FAILURE;
    // Ultrasonic echo port, set as input mode
    state = hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO_7 func failure,state=0x%x", state);
    state = IoTGpioSetDir(HI_GPIO_IDX_7, HI_GPIO_DIR_OUT);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO_7 dir failure,state=0x%x", state);
    state = hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_GPIO);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO_8 func failure,state=0x%x", state);
    state = IoTGpioSetDir(HI_GPIO_IDX_8, HI_GPIO_DIR_IN);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO_8 dir failure,state=0x%x", state);
    return HI_ERR_SUCCESS;
}

获取超声测距波数据

float IssGetDistance(BoardEnvInfoValue *envInfo)
{
    hi_u64 startTime = 0, endTime = 0;
    float distance = 0.0f;
    IotGpioValue gpio8Value = HI_GPIO_VALUE0;
    bool startFlag = FALSE;
    IssInitUltrasonicGpioPin();
    // Send 10 microseconds high level to pin 7, and then pull it low to trigger sensor ranging
    IoTGpioSetOutputVal(HI_GPIO_IDX_7, HI_GPIO_VALUE1);
    hi_udelay(20);
    IoTGpioSetOutputVal(HI_GPIO_IDX_7, HI_GPIO_VALUE0);
    printf("start IssGetDistance\r\n");
    hi_u64 timeout = hi_get_us();
    while (TRUE) {
        IoTGpioGetInputVal(HI_GPIO_IDX_8, &gpio8Value);
        if (!startFlag) {
            // Read the level value of pin 8
            if ((gpio8Value == HI_GPIO_VALUE1)) {
                startTime = hi_get_us();
                startFlag = TRUE;
            }
        }
        if (startFlag) {
            // The level of pin 8 is low, indicating the end of ranging
            if (gpio8Value == HI_GPIO_VALUE0) {
                endTime = hi_get_us();
                break;
            }
        }
        hi_udelay(1);
        if ((hi_get_us() - timeout) > 1000000) {
            // no distance board, timeout
            printf("no distance board\r\n");
            envInfo->ultraSonic = -1;
            return -1;
        }
    }
    distance = (endTime - startTime - 1) / 58.0;
    envInfo->ultraSonic = distance;
    return distance;
}

2.4.人体红外感应实现

2.4.1.人体红外感应原理

人体红外感应采用数字智能热释电红外传感器,型号为AS312,实现红外数据采集。AS312人体红外传感器是将数字智能控制电路与人体探测敏感源都集中成电磁屏蔽罩内的热释电红外传感器。人体探测源将感应到的人体移动信号通过高阻抗差分输入电路耦合到数字智能集成电路芯片上,数字智能集成电路将信号转化成15位ADC数字信号,当PIR信号超过选定的数字阈值时就会有延时的REL电平输出。

2.4.2.人体红外感应硬件接口

IRQ
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
红外传感器使用的GPIO接口为GPIO7,其引脚连接说明如下:
REL ----- GPIO7
人体红外感应中,GPIO7引脚配置设置见4.1章节
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.4.3.人体红外感应软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_infrared
|—iss_infrared.c
|—iss_infrared.h
主要操作:
设置GDIO7和GDIO2的硬件引脚
设置GPIO7为DIR_IN,GPIO2为DIR_OUT
设置GPIO7和GPIO2为低电平

uint32_t IssInitInfraredGpioConfig(void)
{
    uint32_t state = HI_ERR_FAILURE;
    // set pin function
    state = hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO7 func failure,state=0x%x", state);
    // set pin function

    state = IoTGpioSetDir(HI_GPIO_IDX_7, IOT_GPIO_DIR_IN);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO7 dir failure,state=0x%x", state);

    // Set pin 7 to low level by default
    state = hi_io_set_pull(HI_IO_NAME_GPIO_7, HI_IO_PULL_DOWN);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "set GPIO7 pull failure,state=0x%x", state);

    return HI_ERR_SUCCESS;
}

读取测量结果

int32_t IssInfraredRead(BoardEnvInfoValue *envInfo)
{
    int32_t state = HI_ERR_FAILURE;
    IotGpioValue gpioValue = IOT_GPIO_VALUE0;
    state = IoTGpioSetDir(INFRARED_GPIO_IDX, IOT_GPIO_DIR_IN);
    if (state != HI_ERR_SUCCESS) {
        envInfo->infrared = -1;
    }
    RUNTIME_ERR_RET_FALSE(state != HI_ERR_SUCCESS, "gpio IoTGpioSetDir HI_GPIO_IDX_7 fail");
    usleep(300);
    state = IoTGpioGetInputVal(INFRARED_GPIO_IDX, &gpioValue);
    if (state != HI_ERR_SUCCESS) {
        envInfo->infrared = -1;
    }
    RUNTIME_ERR_RET_FALSE(state != HI_ERR_SUCCESS, "gpio read HI_GPIO_IDX_7 fail");
    envInfo->infrared = gpioValue;
    return state;
}

2.5.电机控制实现

2.5.1.电机控制原理

电机驱动控制器型号为BDR6122T,控制电机转动。通过两个引脚控制电机,一个引脚作为GPIO输出,另一个引脚作为PWM输出。

2.5.2.电机硬件接口

Motor_Driver
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

特殊说明:
使用该功能,需要按下SW1按键,此时该功能才有效。
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

电机控制使用的GPIO接口GPIO9和GPIO10,其引脚连接说明如下:
OUTA ----- GPIO9
OUTB ----- GPIO10
电机控制功能中,GPIO9和GPIO10引脚配置设置见4.5章节
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.5.3.电机控制软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_motor
|—iss_motor.c
|—iss_motor.h
主要操作:
1、PWM输出:
PWM初始化
启动PWM
uint32_t IssPwmOutput(WifiIotPwmPort pwmPort, WifiIotIoName ioName, uint8_t ioFuncVal)
{
uint32_t state = HI_ERR_FAILURE;
state = hi_io_set_func(ioName, ioFuncVal);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “hi_io_set_func failure,state=0x%x”, state);
state = IoTPwmInit(pwmPort);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “PwmInit failure,state=0x%x”, state);
state = IoTPwmStart(pwmPort, DUTY, FREQ);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “PwmStart failure,state=0x%x”, state);
return HI_ERR_SUCCESS;
}
2、GPIO引脚电平输出
设置引脚电平值

uint32_t IssGpioOutput(WifiIotIoName ioName, uint8_t ioFuncVal, WifiIotGpioIdx gpioIdx, WifiIotGpioValue gpioValue)
{
    uint32_t state = HI_ERR_FAILURE;
    state = hi_io_set_func(ioName, ioFuncVal);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "hi_io_set_func failure,state=0x%x", state);
    state = IoTGpioSetDir(gpioIdx, HI_GPIO_DIR_OUT);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "IoTGpioSetDir failure,state=0x%x", state);
    state = IoTGpioSetOutputVal(gpioIdx, gpioValue);
    RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "GpioSetOutputVal failure,state=0x%x", state);
    return HI_ERR_SUCCESS;
}

3、电机转动控制
电机向前旋转
uint32_t IssRotateForward(void)
{
uint32_t state = HI_ERR_FAILURE;
state = IssGpioOutput(HI_IO_NAME_GPIO_9,
HI_IO_FUNC_GPIO_9_GPIO, HI_GPIO_IDX_9, HI_GPIO_VALUE1);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssGpioOutput failure,state=0x%x”, state);
state = IssPwmOutput(HI_PWM_PORT_PWM1, HI_IO_NAME_GPIO_10, HI_IO_FUNC_GPIO_10_PWM1_OUT);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssPwmOutput failure,state=0x%x”, state);
return HI_ERR_SUCCESS;
}
电机向后旋转
uint32_t IssRotateBackward(void)
{
uint32_t state = HI_ERR_FAILURE;
state = IssPwmOutput(HI_PWM_PORT_PWM0, HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_PWM0_OUT);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssPwmOutput failure,state=0x%x”, state);
state = IssGpioOutput(HI_IO_NAME_GPIO_10, HI_IO_FUNC_GPIO_10_GPIO, HI_GPIO_IDX_10,
HI_GPIO_VALUE1);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssGpioOutput failure,state=0x%x”, state);
return HI_ERR_SUCCESS;
}
电机停止旋转
uint32_t IssRotateStop(void)
{
uint32_t state = HI_ERR_FAILURE;
state = IssGpioOutput(HI_IO_NAME_GPIO_9,
HI_IO_FUNC_GPIO_9_GPIO, HI_GPIO_IDX_9, HI_GPIO_VALUE0);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssGpioOutput failure,state=0x%x”, state);
state = IssGpioOutput(HI_IO_NAME_GPIO_10,
HI_IO_FUNC_GPIO_10_GPIO, HI_GPIO_IDX_10, HI_GPIO_VALUE0);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “IssGpioOutput failure,state=0x%x”, state);

state = IoTPwmStop(HI_PWM_PORT_PWM0);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "PwmStop failure,state=0x%x", state);
state = IoTPwmStop(HI_PWM_PORT_PWM1);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "PwmStop failure,state=0x%x", state);
return HI_ERR_SUCCESS;

}

2.6.蜂鸣器实现

2.6.1.蜂鸣器原理

采用无源蜂鸣器,需要控制引脚输出PWM信号使蜂鸣器工作。

2.6.2.蜂鸣器硬件接口

BEEP
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
蜂鸣器使用的GPIO接口GPIO9。
蜂鸣器功能中,GPIO9引脚配置设置见4.4章节
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.6.3.蜂鸣器软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_beep
|—iss_beep.c
|—iss_beep.h
主要操作:
PWM初始化
设置GPIO9为PWM0_OUT
设置GPIO9为DIR_OUT
蜂鸣器启动
uint32_t IssStartBeep(void)
{
uint32_t state = HI_ERR_FAILURE;
state = IoTPwmInit(HI_PWM_PORT_PWM0);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “init pwm failure.state=0x%x”, state);
// Set the function of pin 9 to pwm0 output
state = hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_PWM0_OUT);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “io set GPIO_9 failure.state=0x%x”, state);
// Set the direction of pin 9 to output
state = IoTGpioSetDir(HI_GPIO_IDX_9, IOT_GPIO_DIR_OUT);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “io set dir IDX_9 failure.state=0x%x”, state);

state = IoTPwmStart(HI_PWM_PORT_PWM0, 25000, 50000); /* duty: 750 freq:1500      scope:1~65535 */
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "pwm start failure.state=0x%x", state);
hi_udelay(500);
return HI_ERR_SUCCESS;

}
蜂鸣器停止
void IssStopBeep(void)
{
IoTPwmStop(HI_PWM_PORT_PWM0);
IoTPwmDeinit(HI_PWM_PORT_PWM0);
}

2.7.光照强度监测实现

2.7.1.光照强度监测原理

光照强度传感器型号为BH750,实现光照强度数据采集和光照强度设置。
光照强度传感器采用热点效应原理,最主要是使用了对弱光性有较高反应的探测部件,内部有绕线电镀式多接点热电堆,其表面涂有高吸收率的黑色涂层,热接点在感应面上,而冷结点则位于机体内,冷热接点产生温差电势,从而将光照强度值转为电压值。

2.7.2.光照强度硬件接口

Lamp
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
光照强度传感器使用的I2C接口为I2C0。使用的GPIO 引脚分别是 GPIO13,GPIO14,其引脚连接说明如下:
SUN_SDA ----- GPIO13
SUN_SCL ----- GPIO14
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.7.3.光照强度监测软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_bh1750fvi
|—iss_bh1750fvi.c
|—iss_bh1750fvi.h
1、初始化光照强度配置
uint32_t IssInitBh1750fviConfig(void)
{
uint32_t state = HI_ERR_FAILURE;
state = IoTI2cInit(HI_I2C_IDX_0, I2C_INIT_BAUDRATE);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “INIT I2C IDX_0 FAILURE,state = 0x%x”, state);
state = IoTI2cSetBaudrate(HI_I2C_IDX_0, I2C_INIT_BAUDRATE);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “SET I2C IDX_0 BAUDRATE FAILURE,state = 0x%x”, state);
state = IssBh1750I2cWrite(0x01);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “I2C IDX_0 WRITE FAILURE,state = 0x%x”, state);
return HI_ERR_SUCCESS;
}
2、光照强度操作
写寄存器
uint32_t IssBh1750I2cWrite(uint8_t sendCmd)
{
uint32_t state = HI_ERR_FAILURE;
hi_i2c_data i2cSendData = {0};
memset_s(&i2cSendData, sizeof(hi_i2c_data), 0x00, sizeof(hi_i2c_data));
uint8_t sendBuf[BH1750FVI_SEND_BUF_SIZE] = {sendCmd};
i2cSendData.send_buf = sendBuf;
i2cSendData.send_len = BH1750FVI_SEND_BUF_SIZE;
state = IoTI2cWrite(HI_I2C_IDX_0, BH1750_DEVICE_ADDR_WRITE, i2cSendData.send_buf, i2cSendData.send_len);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “I2C write FAILURE,state = 0x%x”, state);
return HI_ERR_SUCCESS;
}
读取光照强度
int32_t IssBh1750I2cRead(BoardEnvInfoValue *envInfo)
{
int32_t state = HI_ERR_FAILURE;
hi_i2c_data i2cReceData = {0};
uint8_t receBuf[BH1750FVI_RECE_BUF_SIZE] = {0};

IssBh1750I2cWrite(0x10);

memset_s(&i2cReceData, sizeof(hi_i2c_data), 0x00, sizeof(hi_i2c_data));
memset_s(&receBuf, BH1750FVI_RECE_BUF_SIZE, 0x00, BH1750FVI_RECE_BUF_SIZE);
i2cReceData.receive_buf = receBuf;
i2cReceData.receive_len = BH1750FVI_RECE_BUF_SIZE;
state = IoTI2cRead(HI_I2C_IDX_0, BH1750_DEVICE_ADDR_READ, i2cReceData.receive_buf, i2cReceData.receive_len);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "I2C read FAILURE,state = 0x%x", state);
envInfo->lightIntensity = (receBuf[1] << 8 | receBuf[0]) / 1.2;
return state;

}

2.8.按键功能实现

2.8.1.按键功能原理

按键说明:
S1按键:OLED屏幕功能切换按键,每按一次OLED界面会切换一种功能,循环工作。
S2按键:保留。
S3按键:下载复位按键,烧录程序时,需要按下该按键才能开始烧录。
S4按键:切换RGB灯模式和红绿灯模式,默认RGB灯模式,按下红绿灯模式。

2.8.2.按键硬件接口

Button
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区
按键控制使用的GPIO接口为GPIO5,GPIO08。
GPIO8引脚作为按键时,设置见4.3章节
用跳线帽连接下图原理图中紫色方框位置
启航KS_IoT智能开发套件案例及代码(第一部分)-开源基础软件社区

2.8.3.按键功能软件实现

代码目录:
applications\sample\wifi-iot\app\issdemo
|—iss_button
|—iss_btn_control.c
|—iss_btn_control.h
1、初始化按键GPIO
int32_t InitButtonGpioPin(hi_gpio_idx ioName, uint8_t ioFunc, hi_gpio_idx gpioIdx)
{
int32_t state = HI_ERR_FAILURE;
// Set pin multiplexing to GPIO pin and input direction
state = hi_io_set_func(ioName, ioFunc);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “io set func GPIO8 failure.state=0x%x”, state);

state = hi_gpio_set_dir(gpioIdx, HI_GPIO_DIR_IN);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "io set dir GPIO8 failure.state=0x%x", state);

// The default setting is high
state = hi_io_set_pull(ioName, HI_IO_PULL_UP);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "io set pull GPIO8 failure.state=0x%x", state);
return state;

}
2、配置GPIO5、GPIO8为按键功能
GPIO初始化
设置GPIO5的硬件引脚
设置GPIO8的硬件引脚
int32_t IssRegisterBtnPressHandle(void)
{
int32_t state = HI_ERR_FAILURE;
// Set pin 5 (S1 button)
state = IoTGpioInit(HI_GPIO_IDX_5);

state = InitButtonGpioPin(KEY_MENU_NAME, KEY_MENU_FUNC, KEY_MENU_IDX);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, "gpio init btn KEY_MENU failure.state=0x%x", state);

#if (GPIO8_USE_TO_FUNC == GPIO8_USE_TO_BUTTON)
// Set pin 8 (S4 button)
state = InitButtonGpioPin(KEY_RGB_NAME, KEY_RGB_FUNC, KEY_RGB_IDX);
RUNTIME_ERR_RET_FAIL(state != HI_ERR_SUCCESS, “gpio init btn KEY_RGB failure.state=0x%x”, state);
#endif
return state;
}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2022-2-11 14:32:09修改
11
收藏 8
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐