项目介绍、
本次借助ARDUINO NANO 33 BLE SENSE V2开发板的多个板载传感器实现了车内气压,温度,湿度,光亮度,接近传感器灯多种数据采集。结合蓝牙低功耗技术,通过手机连接板卡,即可控制红,绿,蓝,黄4种小灯颜色,模拟无线开关灯的功能。
相关的传感器数据动态的展示在本地OLED屏幕上,非常直观。
设备实物图:

系统框图、

运行流程图、

成果实物图
演示视频:B站。
https://www.bilibili.com/video/BV13FEWzjEnA/?vd_source=69f2c95df791924c208b48e010bc38a7
蓝牙连接照片:

发送指令0,红灯亮。

发送指令1,绿灯亮。

指令2,蓝灯亮。

附完整代码:
#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;
}
}
我要赚赏金
