Просмотр исходного кода

Add lightmeter/lib/BH1750 from https://github.com/oleksiikutuzov/flipperzero-BH1750

git-subtree-dir: lightmeter/lib/BH1750
git-subtree-mainline: c4f69e799188c44c2a6bf89b6f5536587e6f7010
git-subtree-split: cf05c49076a54dc0559d193e5aec29ff7455aa65
Willy-JL 2 лет назад
Родитель
Сommit
697bc11f02

+ 1 - 0
lightmeter/lib/BH1750/.gitattributes

@@ -0,0 +1 @@
+* text=auto

+ 24 - 0
lightmeter/lib/BH1750/.github/workflows/build.yml

@@ -0,0 +1,24 @@
+name: Build test FAP with library
+
+on:
+  pull_request:    
+    branches:
+      - main
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout test app
+        uses: actions/checkout@v3
+        with:
+          repository: oleksiikutuzov/flipperzero-BH1750-test
+         
+      - name: Checkout library
+        uses: actions/checkout@v3
+        with:
+          path: lib/BH1750
+
+      - name: Build
+        uses: oleksiikutuzov/flipperzero-ufbt-action@v2

+ 26 - 0
lightmeter/lib/BH1750/.github/workflows/lint.yml

@@ -0,0 +1,26 @@
+name: Lint test FAP with library
+
+on:
+  pull_request:    
+    branches:
+      - main
+
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout test app
+        uses: actions/checkout@v3
+        with:
+          repository: oleksiikutuzov/flipperzero-BH1750-test
+         
+      - name: Checkout library
+        uses: actions/checkout@v3
+        with:
+          path: lib/BH1750
+
+      - name: Lint
+        uses: oleksiikutuzov/flipperzero-ufbt-action@v2
+        with:
+          lint_only: true

+ 58 - 0
lightmeter/lib/BH1750/.gitignore

@@ -0,0 +1,58 @@
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+# macOS
+.DS_Store
+
+# VSCode
+.vscode

+ 1 - 0
lightmeter/lib/BH1750/.gitsubtree

@@ -0,0 +1 @@
+https://github.com/oleksiikutuzov/flipperzero-BH1750 main /

+ 150 - 0
lightmeter/lib/BH1750/BH1750.c

@@ -0,0 +1,150 @@
+/**
+ * @file BH1750.h
+ * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com)
+ * @brief 
+ * @version 0.1
+ * @date 2022-11-06
+ * 
+ * @copyright Copyright (c) 2022
+ * 
+ * Ported from:
+ * https://github.com/lamik/Light_Sensors_STM32
+ */
+
+#include "BH1750.h"
+
+BH1750_mode bh1750_mode = BH1750_DEFAULT_MODE; // Current sensor mode
+uint8_t bh1750_mt_reg = BH1750_DEFAULT_MTREG; // Current MT register value
+uint8_t bh1750_addr = BH1750_ADDRESS;
+
+BH1750_STATUS bh1750_init() {
+    if(BH1750_OK == bh1750_reset()) {
+        if(BH1750_OK == bh1750_set_mt_reg(BH1750_DEFAULT_MTREG)) {
+            return BH1750_OK;
+        }
+    }
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_init_with_addr(uint8_t addr) {
+    bh1750_addr = (addr << 1);
+    return bh1750_init();
+}
+
+BH1750_STATUS bh1750_reset() {
+    uint8_t command = 0x07;
+    bool status;
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &command, 1, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+
+    if(status) {
+        return BH1750_OK;
+    }
+
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn) {
+    PowerOn = (PowerOn ? 1 : 0);
+    bool status;
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &PowerOn, 1, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+
+    if(status) {
+        return BH1750_OK;
+    }
+
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_set_mode(BH1750_mode mode) {
+    if(!((mode >> 4) || (mode >> 5))) {
+        return BH1750_ERROR;
+    }
+
+    if((mode & 0x0F) > 3) {
+        return BH1750_ERROR;
+    }
+
+    bool status;
+
+    bh1750_mode = mode;
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &mode, 1, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+
+    if(status) {
+        return BH1750_OK;
+    }
+
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_set_mt_reg(uint8_t mt_reg) {
+    if(mt_reg < 31 || mt_reg > 254) {
+        return BH1750_ERROR;
+    }
+
+    bh1750_mt_reg = mt_reg;
+
+    uint8_t tmp[2];
+    bool status;
+
+    tmp[0] = (0x40 | (mt_reg >> 5));
+    tmp[1] = (0x60 | (mt_reg & 0x1F));
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[0], 1, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+    if(!status) {
+        return BH1750_ERROR;
+    }
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[1], 1, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+    if(status) {
+        return BH1750_OK;
+    }
+
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_trigger_manual_conversion() {
+    if(BH1750_OK == bh1750_set_mode(bh1750_mode)) {
+        return BH1750_OK;
+    }
+    return BH1750_ERROR;
+}
+
+BH1750_STATUS bh1750_read_light(float* result) {
+    float result_tmp;
+    uint8_t rcv[2];
+    bool status;
+
+    furi_hal_i2c_acquire(I2C_BUS);
+    status = furi_hal_i2c_rx(I2C_BUS, bh1750_addr, rcv, 2, I2C_TIMEOUT);
+    furi_hal_i2c_release(I2C_BUS);
+
+    if(status) {
+        result_tmp = (rcv[0] << 8) | (rcv[1]);
+
+        if(bh1750_mt_reg != BH1750_DEFAULT_MTREG) {
+            result_tmp *= (float)((uint8_t)BH1750_DEFAULT_MTREG / (float)bh1750_mt_reg);
+        }
+
+        if(bh1750_mode == ONETIME_HIGH_RES_MODE_2 || bh1750_mode == CONTINUOUS_HIGH_RES_MODE_2) {
+            result_tmp /= 2.0;
+        }
+
+        *result = result_tmp / BH1750_CONVERSION_FACTOR;
+
+        return BH1750_OK;
+    }
+    return BH1750_ERROR;
+}

+ 110 - 0
lightmeter/lib/BH1750/BH1750.h

@@ -0,0 +1,110 @@
+/**
+ * @file BH1750.h
+ * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com)
+ * @brief 
+ * @version 0.1
+ * @date 2022-11-06
+ * 
+ * @copyright Copyright (c) 2022
+ * 
+ * Ported from:
+ * https://github.com/lamik/Light_Sensors_STM32
+ */
+
+#include <furi.h>
+#include <furi_hal.h>
+
+#ifndef BH1750_H_
+#define BH1750_H_
+
+// I2C BUS
+#define I2C_BUS &furi_hal_i2c_handle_external
+#define I2C_TIMEOUT 10
+
+#define BH1750_ADDRESS (0x23 << 1)
+
+#define BH1750_POWER_DOWN 0x00
+#define BH1750_POWER_ON 0x01
+#define BH1750_RESET 0x07
+#define BH1750_DEFAULT_MTREG 69
+#define BH1750_DEFAULT_MODE ONETIME_HIGH_RES_MODE
+
+#define BH1750_CONVERSION_FACTOR 1.2
+
+typedef enum { BH1750_OK = 0, BH1750_ERROR = 1 } BH1750_STATUS;
+
+typedef enum {
+    CONTINUOUS_HIGH_RES_MODE = 0x10,
+    CONTINUOUS_HIGH_RES_MODE_2 = 0x11,
+    CONTINUOUS_LOW_RES_MODE = 0x13,
+    ONETIME_HIGH_RES_MODE = 0x20,
+    ONETIME_HIGH_RES_MODE_2 = 0x21,
+    ONETIME_LOW_RES_MODE = 0x23
+} BH1750_mode;
+
+/**
+ * @brief Initialize the sensor. Sends the reset command and sets the measurement register to the default value.
+ * 
+ * @return BH1750_STATUS
+ */
+BH1750_STATUS bh1750_init();
+
+/**
+ * @brief Change the I2C device address and then initialize the sensor.
+ * 
+ * @return BH1750_STATUS
+ */
+BH1750_STATUS bh1750_init_with_addr(uint8_t addr);
+
+/**
+ * @brief Reset all registers to the default value.
+ * 
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_reset();
+
+/**
+ * @brief Sets the power state. 1 - running; 0 - sleep, low power. 
+ * 
+ * @param PowerOn sensor state.
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn);
+
+/**
+ * @brief Set the Measurement Time register. It allows to increase or decrease the sensitivity.
+ * 
+ * @param MTreg value from 31 to 254, defaults to 69.
+ * 
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_set_mt_reg(uint8_t MTreg);
+
+/**
+ * @brief Set the mode of converting. Look into the bh1750_mode enum.
+ * 
+ * @param Mode mode enumerator
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_set_mode(BH1750_mode Mode);
+
+/**
+ * @brief Trigger the conversion in manual modes. 
+ * 
+ * @details a low-resolution mode, the conversion time is typically 16 ms, and for a high-resolution 
+ * mode is 120 ms. You need to wait until reading the measurement value. There is no need 
+ * to exit low-power mode for manual conversion. It makes automatically.
+ * 
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_trigger_manual_conversion();
+
+/**
+ * @brief Read the converted value and calculate the result.
+ * 
+ * @param Result stores received value to this variable.
+ * @return BH1750_STATUS 
+ */
+BH1750_STATUS bh1750_read_light(float* Result);
+
+#endif /* BH1750_H_ */

+ 21 - 0
lightmeter/lib/BH1750/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Oleksii Kutuzov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 2 - 0
lightmeter/lib/BH1750/README.md

@@ -0,0 +1,2 @@
+# flipperzero-BH1750
+BH1750 light sensor library for Flipper Zero 

BIN
lightmeter/lib/BH1750/docs/BH1750.pdf