Hello i am trying to establish connection via ble module in arduino r4 wifi , when i connect via my phone i see no data displayed (mind that i am a beginner coder) i would be glad if someone could point out why isnt it working .
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <RTClib.h>
#include <BH1750.h>
#include <SD.h>
#include <ArduinoBLE.h>
// ---- SENSOR OBJECTS ----
Adafruit_BME280 bme; // I2C BME280
RTC_DS3231 rtc; // RTC
BH1750 lightMeter; // Light sensor
File dataFile;
// ---- SD CARD ----
const int SD_CS = 10; // SD card CS pin
// ---- ALTITUDE CALIBRATION ----
float actualAltitude = 63.0; // meters
float seaLevelPressure;
// ---- DELAY ----
unsigned long delayTime = 5000; // 5 seconds
// ---- BLE SERVICE AND CHARACTERISTICS ----
BLEService sensorService("12345678-1234-5678-1234-56789abcdef0");
BLEFloatCharacteristic tempChar("12345678-1234-5678-1234-56789abcdef1", BLERead | BLENotify);
BLEFloatCharacteristic pressureChar("12345678-1234-5678-1234-56789abcdef2", BLERead | BLENotify);
BLEFloatCharacteristic humidityChar("12345678-1234-5678-1234-56789abcdef3", BLERead | BLENotify);
BLEFloatCharacteristic lightChar("12345678-1234-5678-1234-56789abcdef4", BLERead | BLENotify);
// ===== FORWARD DECLARATIONS =====
void printValues(float temperature, float pressure, float altitude, float humidity, float lux);
bool isDST(int year, int month, int day, int hour);
void setup() {
Serial.begin(115200);
Wire.begin();
// ---- BME280 ----
if (!bme.begin(0x76)) {
Serial.println("Could not find BME280!");
while (1);
}
float currentPressure = bme.readPressure() / 100.0F;
seaLevelPressure = currentPressure / pow(1.0 - (actualAltitude / 44330.0), 5.255);
Serial.print("Calibrated Sea-Level Pressure: ");
Serial.println(seaLevelPressure);
// ---- RTC ----
if (!rtc.begin()) {
Serial.println("RTC not found!");
while (1);
}
// ---- BH1750 ----
if (!lightMeter.begin(BH1750::ONE_TIME_HIGH_RES_MODE)) {
Serial.println("BH1750 not found!");
while (1);
}
// ---- SD CARD ----
if (!SD.begin(SD_CS)) {
Serial.println("SD card initialization failed!");
while (1);
}
Serial.println("SD card initialized.");
// Create/Open file and write header
dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println("Date,Time,Temperature,Pressure,Altitude,Humidity,Light");
dataFile.close();
} else {
Serial.println("Error opening datalog.txt");
}
// ---- BLE ----
if (!BLE.begin()) {
Serial.println("Starting BLE failed!");
while (1);
}
BLE.setLocalName("ArduinoSensor");
BLE.setAdvertisedService(sensorService);
sensorService.addCharacteristic(tempChar);
sensorService.addCharacteristic(pressureChar);
sensorService.addCharacteristic(humidityChar);
sensorService.addCharacteristic(lightChar);
BLE.addService(sensorService);
BLE.advertise();
Serial.println("BLE device active, waiting for connections...");
}
void loop() {
// ---- BLE CENTRAL CONNECTION ----
BLEDevice central = BLE.central();
if (central) {
Serial.print("Connected to central: ");
Serial.println(central.address());
while (central.connected()) {
// ---- TIME ----
DateTime now = rtc.now();
int hour = now.hour();
if (isDST(now.year(), now.month(), now.day(), hour)) {
hour++;
if (hour >= 24) hour = 0;
}
// ---- SENSOR READINGS ----
float temperature = bme.readTemperature();
float pressure = bme.readPressure() / 100.0F;
float altitude = bme.readAltitude(seaLevelPressure);
float humidity = bme.readHumidity();
float lux = -1;
if (lightMeter.measurementReady(true)) {
lux = lightMeter.readLightLevel();
// Adjust sensitivity
if (lux > 40000.0) lightMeter.setMTreg(32);
else if (lux > 10.0) lightMeter.setMTreg(69);
else lightMeter.setMTreg(138);
}
// ---- BLE UPDATE ----
tempChar.writeValue(temperature);
pressureChar.writeValue(pressure);
humidityChar.writeValue(humidity);
lightChar.writeValue(lux);
// ---- SERIAL + SD LOG ----
printValues(temperature, pressure, altitude, humidity, lux);
// ---- DELAY ----
delay(delayTime);
}
Serial.print("Disconnected from central: ");
Serial.println(central.address());
}
}
// ===== PRINT TO SERIAL AND LOG TO SD =====
void printValues(float temperature, float pressure, float altitude, float humidity, float lux) {
DateTime now = rtc.now();
int hour = now.hour();
if (isDST(now.year(), now.month(), now.day(), hour)) {
hour++;
if (hour >= 24) hour = 0;
}
// Serial output
Serial.print(now.year()); Serial.print("-"); Serial.print(now.month()); Serial.print("-"); Serial.print(now.day()); Serial.print(" ");
Serial.print(hour); Serial.print(":"); Serial.print(now.minute()); Serial.print(":"); Serial.println(now.second());
Serial.print("Temperature = "); Serial.println(temperature);
Serial.print("Pressure = "); Serial.println(pressure);
Serial.print("Altitude = "); Serial.println(altitude);
Serial.print("Humidity = "); Serial.println(humidity);
Serial.print("Light = "); Serial.println(lux);
Serial.println();
// SD logging
dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(now.year()); dataFile.print("-"); dataFile.print(now.month()); dataFile.print("-"); dataFile.print(now.day()); dataFile.print(",");
dataFile.print(hour); dataFile.print(":"); dataFile.print(now.minute()); dataFile.print(":"); dataFile.print(now.second()); dataFile.print(",");
dataFile.print(temperature); dataFile.print(",");
dataFile.print(pressure); dataFile.print(",");
dataFile.print(altitude); dataFile.print(",");
dataFile.print(humidity); dataFile.print(",");
dataFile.println(lux);
dataFile.close();
} else {
Serial.println("Error opening datalog.txt");
}
}
// ===== DST FUNCTION =====
bool isDST(int year, int month, int day, int hour) {
int lastSundayMarch = 31;
while (DateTime(year, 3, lastSundayMarch).dayOfTheWeek() != 0)
lastSundayMarch--;
int lastSundayOct = 31;
while (DateTime(year, 10, lastSundayOct).dayOfTheWeek() != 0)
lastSundayOct--;
if (month > 3 && month < 10) return true;
if (month == 3 && day >= lastSundayMarch) return true;
if (month == 10 && day < lastSundayOct) return true;
return false;
}