项目介绍、
本次借助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; } }