/* * Copyright (c) 2020  Jinan Bosai Network Technology Co., LTD * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "BH1750.h" #include "cmsis_os2.h" #include "iot_errno.h" #include "iot_gpio.h" #include "iot_gpio_ex.h" #include "iot_i2c.h" #include #include #include #include #define WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA 6 #define WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL 6 #define WIFI_IOT_IO_FUNC_GPIO_7_GPIO 0 #define WIFI_IOT_I2C_IDX_1 1 #define CTL_IO1 14 #define CTL_IO2 8 #define CTL_IO3 12 #define CTL_IO4 5 // #define CTL_IO5 5 // #define CTL_IO6 14 // #define CTL_IO7 8 // #define CTL_IO8 3 // #define CTL_IO9 4 // #define CTL_IO10 6 /*************************************************************** * 函数名称: FanGpioInit * 说 明: GPIO初始化 * 参 数: 无 * 返 回 值: 无 ***************************************************************/ static void FanGpioInit(void) { IoTGpioInit(CTL_IO1); IoTGpioSetFunc(CTL_IO1, IOT_GPIO_FUNC_GPIO_14_GPIO); IoTGpioSetDir(CTL_IO1, IOT_GPIO_DIR_OUT); //设置为输出模式 IoTGpioInit(CTL_IO2); IoTGpioSetFunc(CTL_IO2, IOT_GPIO_FUNC_GPIO_8_GPIO); IoTGpioSetDir(CTL_IO2, IOT_GPIO_DIR_OUT); //设置为输出模式 IoTGpioInit(CTL_IO3); IoTGpioSetFunc(CTL_IO3, IOT_GPIO_FUNC_GPIO_12_GPIO); IoTGpioSetDir(CTL_IO3, IOT_GPIO_DIR_OUT); //设置为输出模式 IoTGpioInit(CTL_IO4); IoTGpioSetFunc(CTL_IO4, IOT_GPIO_FUNC_GPIO_5_GPIO); IoTGpioSetDir(CTL_IO4, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO5); // IoTGpioSetFunc(CTL_IO5, IOT_GPIO_FUNC_GPIO_5_GPIO); // IoTGpioSetDir(CTL_IO5, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO6); // IoTGpioSetFunc(CTL_IO6, IOT_GPIO_FUNC_GPIO_14_GPIO); // IoTGpioSetDir(CTL_IO6, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO7); // IoTGpioSetFunc(CTL_IO7, IOT_GPIO_FUNC_GPIO_8_GPIO); // IoTGpioSetDir(CTL_IO7, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO8); // IoTGpioSetFunc(CTL_IO8, IOT_GPIO_FUNC_GPIO_3_GPIO); // IoTGpioSetDir(CTL_IO8, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO9); // IoTGpioSetFunc(CTL_IO9, IOT_GPIO_FUNC_GPIO_4_GPIO); // IoTGpioSetDir(CTL_IO9, IOT_GPIO_DIR_OUT); //设置为输出模式 // IoTGpioInit(CTL_IO10); // IoTGpioSetFunc(CTL_IO10, IOT_GPIO_FUNC_GPIO_6_GPIO); // IoTGpioSetDir(CTL_IO10, IOT_GPIO_DIR_OUT); //设置为输出模式 } /*************************************************************** * 函数名称: GpioInit * 说 明: GPIO初始化 * 参 数: 无 * 返 回 值: 无 ***************************************************************/ static void GpioInit(void) { IoTGpioInit(7); IoTGpioSetFunc(7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO); IoTGpioSetDir(7, IOT_GPIO_DIR_OUT); //设置GPIO_7为输出模式 IoTGpioInit(0); IoTGpioSetFunc(0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA IoTGpioInit(1); IoTGpioSetFunc(1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */ } /*************************************************************** * 函数名称: InitBH1750 * 说 明: 写命令初始化BH1750 * 参 数: 无 * 返 回 值: 0 成功; -1 失败 ***************************************************************/ static int InitBH1750(void) { int ret; uint8_t send_data[1] = {0x01}; ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x00, send_data, 1); if (ret != 0) { printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret); return -1; } return 0; } /*************************************************************** * 函数名称: StartBH1750 * 说 明: 启动BH1750 * 参 数: 无 * 返 回 值: 0 成功; -1 失败 ***************************************************************/ static int StartBH1750(void) { int ret; uint8_t send_data[1] = {0x10}; ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x00, send_data, 1); if (ret != 0) { printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret); return -1; } return 0; } /*************************************************************** * 函数名称: E53SC1Init * 说 明: 初始化E53_SC1 * 参 数: 无 * 返 回 值: 0 成功; -1 失败 ***************************************************************/ int BoardInit(void) { int ret; FanGpioInit(); GpioInit(); ret = InitBH1750(); if (ret != 0) { return -1; } return 0; } /*************************************************************** * 函数名称: BH1750ReadData * 说 明: 测量光照强度 * 参 数: data,光照强度数据指针 * 返 回 值: 0 成功; -1 失败 ***************************************************************/ int BH1750ReadData(float* data) { int ret; int result; ret = StartBH1750(); // 启动传感器采集数据 if (ret != 0) { printf("Start BH1750 failed!\r\n"); return -1; } usleep(180000); uint8_t recv_data[2] = {0}; ret = IoTI2cRead(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x01, recv_data, 2); // 读取传感器数据 if (ret != 0) { return -1; } *data = (float)(((recv_data[0] << 8) + recv_data[1]) / 1.2); //合成数据,即光照数据 return 0; } /*************************************************************** * 函数名称: LightStatusSet * 说 明: 灯状态设置 * 参 数: status,ENUM枚举的数据 * OFF,关灯 * ON,开灯 * 返 回 值: 无 ***************************************************************/ void LightStatusSet(SwitchStatus status) { if (status == ON) { IoTGpioSetOutputVal(7, 1); //设置GPIO_7输出高电平点亮LED灯 } if (status == OFF) { IoTGpioSetOutputVal(7, 0); //设置GPIO_7输出低电平点亮LED灯 } } /*************************************************************** * 函数名称: FanStatusSet * 说 明: 风扇状态设置 * 参 数: status,ENUM枚举的数据 * OFF,关风扇 * ON,开风扇 * 返 回 值: 无 ***************************************************************/ void FanStatusSet(SwitchStatus status, uint8_t gear) { if (status == ON) { IoTGpioSetOutputVal(CTL_IO4, 1); switch (gear) { case 1: IoTGpioSetOutputVal(CTL_IO1, 1); IoTGpioSetOutputVal(CTL_IO2, 0); IoTGpioSetOutputVal(CTL_IO3, 0); osDelay(10); IoTGpioSetOutputVal(CTL_IO1, 0); IoTGpioSetOutputVal(CTL_IO2, 1); IoTGpioSetOutputVal(CTL_IO3, 0); osDelay(10); IoTGpioSetOutputVal(CTL_IO1, 0); IoTGpioSetOutputVal(CTL_IO2, 0); IoTGpioSetOutputVal(CTL_IO3, 1); osDelay(10); break; default: break; } } if (status == OFF) { IoTGpioSetOutputVal(CTL_IO1, 0); IoTGpioSetOutputVal(CTL_IO2, 0); IoTGpioSetOutputVal(CTL_IO3, 0); IoTGpioSetOutputVal(CTL_IO4, 0); // IoTGpioSetOutputVal(CTL_IO5, 0); // IoTGpioSetOutputVal(CTL_IO6, 0); // IoTGpioSetOutputVal(CTL_IO7, 0); // // IoTGpioSetOutputVal(CTL_IO8, 0); // IoTGpioSetOutputVal(CTL_IO9, 0); // IoTGpioSetOutputVal(CTL_IO10, 0); } }