BH1750.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * Copyright (c) 2020  Jinan Bosai Network Technology Co., LTD
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include "BH1750.h"
  16. #include "cmsis_os2.h"
  17. #include "iot_errno.h"
  18. #include "iot_gpio.h"
  19. #include "iot_gpio_ex.h"
  20. #include "iot_i2c.h"
  21. #include <math.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <unistd.h>
  25. #define WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA 6
  26. #define WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL 6
  27. #define WIFI_IOT_IO_FUNC_GPIO_7_GPIO 0
  28. #define WIFI_IOT_I2C_IDX_1 1
  29. #define CTL_IO1 14
  30. #define CTL_IO2 8
  31. #define CTL_IO3 12
  32. #define CTL_IO4 5
  33. // #define CTL_IO5 5
  34. // #define CTL_IO6 14
  35. // #define CTL_IO7 8
  36. // #define CTL_IO8 3
  37. // #define CTL_IO9 4
  38. // #define CTL_IO10 6
  39. /***************************************************************
  40. * 函数名称: FanGpioInit
  41. * 说 明: GPIO初始化
  42. * 参 数: 无
  43. * 返 回 值: 无
  44. ***************************************************************/
  45. static void FanGpioInit(void)
  46. {
  47. IoTGpioInit(CTL_IO1);
  48. IoTGpioSetFunc(CTL_IO1, IOT_GPIO_FUNC_GPIO_14_GPIO);
  49. IoTGpioSetDir(CTL_IO1, IOT_GPIO_DIR_OUT); //设置为输出模式
  50. IoTGpioInit(CTL_IO2);
  51. IoTGpioSetFunc(CTL_IO2, IOT_GPIO_FUNC_GPIO_8_GPIO);
  52. IoTGpioSetDir(CTL_IO2, IOT_GPIO_DIR_OUT); //设置为输出模式
  53. IoTGpioInit(CTL_IO3);
  54. IoTGpioSetFunc(CTL_IO3, IOT_GPIO_FUNC_GPIO_12_GPIO);
  55. IoTGpioSetDir(CTL_IO3, IOT_GPIO_DIR_OUT); //设置为输出模式
  56. IoTGpioInit(CTL_IO4);
  57. IoTGpioSetFunc(CTL_IO4, IOT_GPIO_FUNC_GPIO_5_GPIO);
  58. IoTGpioSetDir(CTL_IO4, IOT_GPIO_DIR_OUT); //设置为输出模式
  59. // IoTGpioInit(CTL_IO5);
  60. // IoTGpioSetFunc(CTL_IO5, IOT_GPIO_FUNC_GPIO_5_GPIO);
  61. // IoTGpioSetDir(CTL_IO5, IOT_GPIO_DIR_OUT); //设置为输出模式
  62. // IoTGpioInit(CTL_IO6);
  63. // IoTGpioSetFunc(CTL_IO6, IOT_GPIO_FUNC_GPIO_14_GPIO);
  64. // IoTGpioSetDir(CTL_IO6, IOT_GPIO_DIR_OUT); //设置为输出模式
  65. // IoTGpioInit(CTL_IO7);
  66. // IoTGpioSetFunc(CTL_IO7, IOT_GPIO_FUNC_GPIO_8_GPIO);
  67. // IoTGpioSetDir(CTL_IO7, IOT_GPIO_DIR_OUT); //设置为输出模式
  68. // IoTGpioInit(CTL_IO8);
  69. // IoTGpioSetFunc(CTL_IO8, IOT_GPIO_FUNC_GPIO_3_GPIO);
  70. // IoTGpioSetDir(CTL_IO8, IOT_GPIO_DIR_OUT); //设置为输出模式
  71. // IoTGpioInit(CTL_IO9);
  72. // IoTGpioSetFunc(CTL_IO9, IOT_GPIO_FUNC_GPIO_4_GPIO);
  73. // IoTGpioSetDir(CTL_IO9, IOT_GPIO_DIR_OUT); //设置为输出模式
  74. // IoTGpioInit(CTL_IO10);
  75. // IoTGpioSetFunc(CTL_IO10, IOT_GPIO_FUNC_GPIO_6_GPIO);
  76. // IoTGpioSetDir(CTL_IO10, IOT_GPIO_DIR_OUT); //设置为输出模式
  77. }
  78. /***************************************************************
  79. * 函数名称: GpioInit
  80. * 说 明: GPIO初始化
  81. * 参 数: 无
  82. * 返 回 值: 无
  83. ***************************************************************/
  84. static void GpioInit(void)
  85. {
  86. IoTGpioInit(7);
  87. IoTGpioSetFunc(7, WIFI_IOT_IO_FUNC_GPIO_7_GPIO);
  88. IoTGpioSetDir(7, IOT_GPIO_DIR_OUT); //设置GPIO_7为输出模式
  89. IoTGpioInit(0);
  90. IoTGpioSetFunc(0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA); // GPIO_0复用为I2C1_SDA
  91. IoTGpioInit(1);
  92. IoTGpioSetFunc(1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL); // GPIO_1复用为I2C1_SCL
  93. IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000); /* baudrate: 400kbps */
  94. }
  95. /***************************************************************
  96. * 函数名称: InitBH1750
  97. * 说 明: 写命令初始化BH1750
  98. * 参 数: 无
  99. * 返 回 值: 0 成功; -1 失败
  100. ***************************************************************/
  101. static int InitBH1750(void)
  102. {
  103. int ret;
  104. uint8_t send_data[1] = {0x01};
  105. ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x00, send_data, 1);
  106. if (ret != 0) {
  107. printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret);
  108. return -1;
  109. }
  110. return 0;
  111. }
  112. /***************************************************************
  113. * 函数名称: StartBH1750
  114. * 说 明: 启动BH1750
  115. * 参 数: 无
  116. * 返 回 值: 0 成功; -1 失败
  117. ***************************************************************/
  118. static int StartBH1750(void)
  119. {
  120. int ret;
  121. uint8_t send_data[1] = {0x10};
  122. ret = IoTI2cWrite(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x00, send_data, 1);
  123. if (ret != 0) {
  124. printf("===== Error: I2C write ret = 0x%x! =====\r\n", ret);
  125. return -1;
  126. }
  127. return 0;
  128. }
  129. /***************************************************************
  130. * 函数名称: E53SC1Init
  131. * 说 明: 初始化E53_SC1
  132. * 参 数: 无
  133. * 返 回 值: 0 成功; -1 失败
  134. ***************************************************************/
  135. int BoardInit(void)
  136. {
  137. int ret;
  138. FanGpioInit();
  139. GpioInit();
  140. ret = InitBH1750();
  141. if (ret != 0) {
  142. return -1;
  143. }
  144. return 0;
  145. }
  146. /***************************************************************
  147. * 函数名称: BH1750ReadData
  148. * 说 明: 测量光照强度
  149. * 参 数: data,光照强度数据指针
  150. * 返 回 值: 0 成功; -1 失败
  151. ***************************************************************/
  152. int BH1750ReadData(float* data)
  153. {
  154. int ret;
  155. int result;
  156. ret = StartBH1750(); // 启动传感器采集数据
  157. if (ret != 0) {
  158. printf("Start BH1750 failed!\r\n");
  159. return -1;
  160. }
  161. usleep(180000);
  162. uint8_t recv_data[2] = {0};
  163. ret = IoTI2cRead(WIFI_IOT_I2C_IDX_1, (BH1750_ADDR << 1) | 0x01, recv_data, 2); // 读取传感器数据
  164. if (ret != 0) {
  165. return -1;
  166. }
  167. *data = (float)(((recv_data[0] << 8) + recv_data[1]) / 1.2); //合成数据,即光照数据
  168. return 0;
  169. }
  170. /***************************************************************
  171. * 函数名称: LightStatusSet
  172. * 说 明: 灯状态设置
  173. * 参 数: status,ENUM枚举的数据
  174. * OFF,关灯
  175. * ON,开灯
  176. * 返 回 值: 无
  177. ***************************************************************/
  178. void LightStatusSet(SwitchStatus status)
  179. {
  180. if (status == ON) {
  181. IoTGpioSetOutputVal(7, 1); //设置GPIO_7输出高电平点亮LED灯
  182. }
  183. if (status == OFF) {
  184. IoTGpioSetOutputVal(7, 0); //设置GPIO_7输出低电平点亮LED灯
  185. }
  186. }
  187. /***************************************************************
  188. * 函数名称: FanStatusSet
  189. * 说 明: 风扇状态设置
  190. * 参 数: status,ENUM枚举的数据
  191. * OFF,关风扇
  192. * ON,开风扇
  193. * 返 回 值: 无
  194. ***************************************************************/
  195. void FanStatusSet(SwitchStatus status, uint8_t gear)
  196. {
  197. if (status == ON) {
  198. IoTGpioSetOutputVal(CTL_IO4, 1);
  199. switch (gear)
  200. {
  201. case 1:
  202. IoTGpioSetOutputVal(CTL_IO1, 1);
  203. IoTGpioSetOutputVal(CTL_IO2, 0);
  204. IoTGpioSetOutputVal(CTL_IO3, 0);
  205. osDelay(10);
  206. IoTGpioSetOutputVal(CTL_IO1, 0);
  207. IoTGpioSetOutputVal(CTL_IO2, 1);
  208. IoTGpioSetOutputVal(CTL_IO3, 0);
  209. osDelay(10);
  210. IoTGpioSetOutputVal(CTL_IO1, 0);
  211. IoTGpioSetOutputVal(CTL_IO2, 0);
  212. IoTGpioSetOutputVal(CTL_IO3, 1);
  213. osDelay(10);
  214. break;
  215. default:
  216. break;
  217. }
  218. }
  219. if (status == OFF) {
  220. IoTGpioSetOutputVal(CTL_IO1, 0);
  221. IoTGpioSetOutputVal(CTL_IO2, 0);
  222. IoTGpioSetOutputVal(CTL_IO3, 0);
  223. IoTGpioSetOutputVal(CTL_IO4, 0);
  224. // IoTGpioSetOutputVal(CTL_IO5, 0);
  225. // IoTGpioSetOutputVal(CTL_IO6, 0);
  226. // IoTGpioSetOutputVal(CTL_IO7, 0);
  227. // // IoTGpioSetOutputVal(CTL_IO8, 0);
  228. // IoTGpioSetOutputVal(CTL_IO9, 0);
  229. // IoTGpioSetOutputVal(CTL_IO10, 0);
  230. }
  231. }