这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【ARDUINONANO33BLESENSE】车内多传感器监控设备

共2条 1/1 1 跳转至

【ARDUINONANO33BLESENSE】车内多传感器监控设备

助工
2025-05-16 11:41:59     打赏

项目介绍、

本次借助ARDUINO NANO 33 BLE SENSE V2开发板的多个板载传感器实现了车内气压,温度,湿度,光亮度,接近传感器灯多种数据采集。结合蓝牙低功耗技术,通过手机连接板卡,即可控制红,绿,蓝,黄4种小灯颜色,模拟无线开关灯的功能。

相关的传感器数据动态的展示在本地OLED屏幕上,非常直观。

设备实物图:

image.png

系统框图、

image.png

运行流程图、

image.png

成果实物图

演示视频:B站。

https://www.bilibili.com/video/BV13FEWzjEnA/?vd_source=69f2c95df791924c208b48e010bc38a7

蓝牙连接照片:

image.png

发送指令0,红灯亮。

image.png

发送指令1,绿灯亮。

image.png

指令2,蓝灯亮。

image.png

附完整代码:

#include <Arduino.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_HS300x.h>
#include <Arduino_APDS9960.h>
#include <U8g2lib.h>
#include <math.h>
#include <ArduinoBLE.h>

enum {
  LED_OFF = -1,
  LED_R = 0,
  LED_G = 1,
  LED_B = 2,
  LED_Default = 3
};

int led = -1;

const char* deviceServiceUuid = "19b10000-e8f2-537e-4f6c-d104768a1214";
const char* deviceServiceCharacteristicUuid = "19b10001-e8f2-537e-4f6c-d104768a1214";

BLEService ledService(deviceServiceUuid);
BLEByteCharacteristic ledCharacteristic(deviceServiceCharacteristicUuid, BLERead | BLEWrite);

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);

void UpdateSensorValue(void);

void setup(void) {
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);

  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  digitalWrite(LED_BUILTIN, LOW);

  if (!BLE.begin()) {
    Serial.println("- Starting Bluetooth® Low Energy module failed!");
    while (1)
      ;
  }

  BLE.setLocalName("EEPW_DIGIKEY");
  BLE.setAdvertisedService(ledService);
  ledService.addCharacteristic(ledCharacteristic);
  BLE.addService(ledService);
  ledCharacteristic.writeValue(-1);
  BLE.advertise();

  Serial.println("Nano 33 BLE (Peripheral Device)");
  Serial.println(" ");


  u8g2.begin();
  u8g2.enableUTF8Print();
  Serial.begin(9600);  //Serial monitor to display all sensor values


  if (!BARO.begin()) {
    Serial.println("Failed to initialize pressure sensor!");
    while (1)
      ;
  }

  if (!HS300x.begin()) {
    Serial.println("Failed to initialize humidity temperature sensor!");
    while (1)
      ;
  }
  if (!APDS.begin()) {
    Serial.println("Error initializing APDS-9960 sensor!");
  }
}

void loop_Test() {
  BLEDevice central = BLE.central();
  Serial.println("- Discovering central device...");

  if (central) {
    Serial.println("* Connected to central device!");
    Serial.print("* Device MAC address: ");
    Serial.println(central.address());
    Serial.println(" ");

    while (central.connected()) {
      if (ledCharacteristic.written()) {
        led = ledCharacteristic.value();
        writeled(led);
      }
    }

    Serial.println("* Disconnected to central device!");
  }
}

void loop(void) {
  BLEDevice central = BLE.central();
  Serial.println("- Discovering central device...");

  if (central) {
    Serial.println("* Connected to central device!");
    Serial.print("* Device MAC address: ");
    Serial.println(central.address());
    Serial.println(" ");

    while (central.connected()) {
      if (ledCharacteristic.written()) {
        led = ledCharacteristic.value();
        writeled(led);
      }

      UpdateSensorValue();
    }

    Serial.println("* Disconnected to central device!");
  }

  UpdateSensorValue();

}  //end of loop

void UpdateSensorValue(void) {
  /******************read the sensor value begin*******************/
  float pressure = BARO.readPressure();

  // print the sensor value
  Serial.print("Pressure = ");
  Serial.print(pressure);
  Serial.println(" kPa");

  float temperature = BARO.readTemperature();

  // print the sensor value
  Serial.print("Temperature = ");
  Serial.print(temperature);
  Serial.println(" C");

  float humidity = HS300x.readHumidity();
  Serial.print("Humidity    = ");
  Serial.print(humidity);
  Serial.println(" %");
  // print an empty line
  Serial.println();

  static int proximity;
  if (APDS.proximityAvailable()) {
    // read the proximity
    // - 0   => close
    // - 255 => far
    // - -1  => error
    proximity = APDS.readProximity();

    // print value to the Serial Monitor
    Serial.print("Proximity    = ");
    Serial.println(proximity);
  }

  static int r, g, b;
#if 1
  // Check if a color reading is available
  if (APDS.colorAvailable()) {
    APDS.readColor(r, g, b);
  }

  // print the values
  Serial.print("r = ");
  Serial.println(r);
  Serial.print("g = ");
  Serial.println(g);
  Serial.print("b = ");
  Serial.println(b);
  Serial.println();

  float lux;
  lux = ((r * 299.0) + (g * 587.0) + (b * 114.0)) / 1000.0;
#endif
  /******************read the sensor value end*******************/

  u8g2.clearBuffer();  // clear the internal memory
  u8g2.setFont(u8g2_font_wqy15_t_gb2312a);
  u8g2.setFontDirection(0);
  u8g2.setCursor(6, 14);
  u8g2.print("In-Vehicle Sensor");
  u8g2.setFont(u8g2_font_t0_11_tr);  // 这里可以修改字体大小

  u8g2.drawStr(0, 26, "Pres: ");
  u8g2.setCursor(32, 24);  // write something to the internal memory
  u8g2.print(pressure);
  u8g2.drawStr(70, 24, "kPa");
  //u8g2.setFont(u8g_font_unifont);

  u8g2.drawStr(0, 34, "Temp: ");
  u8g2.setCursor(32, 34);
  u8g2.print(temperature);
  u8g2.drawStr(70, 28, ".");
  u8g2.drawStr(72, 34, "C");

  u8g2.drawStr(0, 44, "Humi: ");
  u8g2.setCursor(32, 44);
  u8g2.print(humidity);
  u8g2.drawStr(70, 44, "%");

  u8g2.drawStr(0, 54, "Prox: ");
  u8g2.setCursor(32, 54);
  u8g2.print(proximity);

  u8g2.drawStr(0, 64, "Lumi: ");
  u8g2.setCursor(32, 64);
  u8g2.print(lux);
  u8g2.drawStr(70, 64, "LUX");
  u8g2.sendBuffer();

  delay(50);
}

void writeled(int led) {
  Serial.println("- Characteristic <led_type> has changed!");

  switch (led) {
    case LED_R:
      Serial.println("* Actual value: UP (red LED on)");
      Serial.println(" ");
      digitalWrite(LEDR, LOW);
      digitalWrite(LEDG, HIGH);
      digitalWrite(LEDB, HIGH);
      digitalWrite(LED_BUILTIN, LOW);
      break;
    case LED_G:
      Serial.println("* Actual value: DOWN (green LED on)");
      Serial.println(" ");
      digitalWrite(LEDR, HIGH);
      digitalWrite(LEDG, LOW);
      digitalWrite(LEDB, HIGH);
      digitalWrite(LED_BUILTIN, LOW);
      break;
    case LED_B:
      Serial.println("* Actual value: LEFT (blue LED on)");
      Serial.println(" ");
      digitalWrite(LEDR, HIGH);
      digitalWrite(LEDG, HIGH);
      digitalWrite(LEDB, LOW);
      digitalWrite(LED_BUILTIN, LOW);
      break;
    case LED_Default:
      Serial.println("* Actual value: RIGHT (built-in LED on)");
      Serial.println(" ");
      digitalWrite(LEDR, HIGH);
      digitalWrite(LEDG, HIGH);
      digitalWrite(LEDB, HIGH);
      digitalWrite(LED_BUILTIN, HIGH);
      break;
    default:
      digitalWrite(LEDR, HIGH);
      digitalWrite(LEDG, HIGH);
      digitalWrite(LEDB, HIGH);
      digitalWrite(LED_BUILTIN, LOW);
      break;
  }
}





院士
2025-05-16 14:43:34     打赏
2楼

这个小模块还能干这么多的活呀!


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]