Hi,
For my project, I want to send data (height and RPM) from two Arduino Nano 33 BLEs (peripherals) to another Arduino Nano 33 BLE (central) and save the data on a SD card without opening up their serial monitors. I could able to save data by opening up the serial monitors of all three boards. However, when I commented all serial monitor lines in the codes (below), I could see the Yellow light on the two peripheral boards is ON (sending data), but the data was not saved on the SD card attached to the central board.
How can I solve this issue?
Thank you for your help in Advance.
Height sensor code
#include <ArduinoBLE.h>
BLEService HeightRPMService("170C");
BLEFloatCharacteristic HeightRPMChar("2A57", // standard 16-bit characteristic UUID
BLERead | BLENotify | BLEBroadcast); // remote clients will be able to get notifications if this characteristic changes
int noPin1 = 4;
int buttonState1 = 0;
int noPin2 = 5;
int buttonState2 = 0;
int noPin3 = 6;
int buttonState3 = 0;
long previousMillis = 0;
int OldHeightRPM=0;
String myString;
float Height_Interval=0.5;
void setup() {
// Serial.begin(9600);
pinMode(noPin1,INPUT_PULLUP);
pinMode(noPin2,INPUT_PULLUP);
pinMode(noPin3,INPUT_PULLUP);
// while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
// begin initialization
if (!BLE.begin()) {
// Serial.println("starting BLE failed!");
while (1);
}
BLE.setLocalName("HeightRPMMonitor");
BLE.setAdvertisedService(HeightRPMService);
HeightRPMService.addCharacteristic(HeightRPMChar);
BLE.addService(HeightRPMService);
HeightRPMChar.writeValue(OldHeightRPM);
BLE.advertise();
// Serial.println("Bluetooth device active, waiting for connections...");
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
// Serial.print("Connected to central: ");
// Serial.println(central.address());
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateHeight();
}
}
digitalWrite(LED_BUILTIN, LOW);
// Serial.print("Disconnected from central: ");
// Serial.println(central.address());
}
}
void updateHeight() {
delay(1000);
buttonState1 = digitalRead(noPin1);
buttonState2 = digitalRead(noPin2);
buttonState3 = digitalRead(noPin3);
int Deciaml=(buttonState1*1)+(buttonState2*2)+(buttonState3*4);//convert binary values to decimal
float Height = Deciaml*Height_Interval;//Height in inch
// Serial.print("Height: ");
// Serial.print(Height);
// Serial.println(" in");
HeightRPMChar.writeValue(Height);
}
RPM sensor code
#include <ArduinoBLE.h>
BLEService HeightRPMService("170C");
BLEFloatCharacteristic HeightRPMChar("2A57", // standard 16-bit characteristic UUID
BLERead | BLENotify| BLEBroadcast); // remote clients will be able to get notifications if this characteristic changes
int sensor = 2;
volatile byte counts;
unsigned int rpm;
unsigned long previoustime;
const byte interruptPin = 2;
long previousMillis = 0;
int OldHeightRPM=0;
void count_function()
{
counts++;
}
void setup() {
// Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(interruptPin), count_function, RISING);
pinMode(sensor, INPUT);
counts = 0;
rpm = 0;
previoustime = 0;
// while (!Serial);
pinMode(LED_BUILTIN, OUTPUT);
if (!BLE.begin()) {
// Serial.println("starting BLE failed!");
while (1);
}
BLE.setLocalName("HeightRPMMonitor");
BLE.setAdvertisedService(HeightRPMService);
HeightRPMService.addCharacteristic(HeightRPMChar);
BLE.addService(HeightRPMService);
HeightRPMChar.writeValue(OldHeightRPM);
BLE.advertise();
// Serial.println("Bluetooth device active, waiting for connections...");
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
// Serial.print("Connected to central: ");
// Serial.println(central.address());
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
long currentMillis = millis();
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateRPM();
}
}
digitalWrite(LED_BUILTIN, LOW);
// Serial.print("Disconnected from central: ");
// Serial.println(central.address());
}
}
void updateRPM() {
delay(1000);
noInterrupts();
float rpm= (counts * 60000) / (millis() - previoustime);
previoustime = millis();
counts = 0;
interrupts();
// Serial.print("RPM: ");
// Serial.println(rpm);
HeightRPMChar.writeValue(rpm);
}
Central board code:
#include <ArduinoBLE.h>
#include <SD.h>
#include <SPI.h>
#define BLE_UUID_HEIGHTRPM_SERVICE "170C"
#define BLE_UUID_HEIGHTRPM_LEVEL "2A57"
#define BLE_MAX_PERIPHERALS 2
#define BLE_SCAN_INTERVALL 10000
BLEDevice peripherals[BLE_MAX_PERIPHERALS];
BLECharacteristic HeightRPMLevelCharacteristics[BLE_MAX_PERIPHERALS];
int peripheralsConnected = 0;
const int BLE_LED_PIN = LED_BUILTIN;
const int BLE_SCAN_LED_PIN = LED_BUILTIN;
File myFile;
int pinCS = 10;
void setup()
{
// Serial.begin( 9600 );
pinMode(pinCS, OUTPUT);
// while ( !Serial );
pinMode( BLE_SCAN_LED_PIN, OUTPUT );
BLE.begin();
digitalWrite( BLE_SCAN_LED_PIN, HIGH );
BLE.scanForUuid( BLE_UUID_HEIGHTRPM_SERVICE );
int peripheralCounter = 0;
unsigned long startMillis = millis();
while ( millis() - startMillis < BLE_SCAN_INTERVALL && peripheralCounter < BLE_MAX_PERIPHERALS )
{
BLEDevice peripheral = BLE.available();
if ( peripheral )
{
if ( peripheral.localName() == "HeightRPMMonitor" )
{
boolean peripheralAlreadyFound = false;
for ( int i = 0; i < peripheralCounter; i++ )
{
if ( peripheral.address() == peripherals[i].address() )
{
peripheralAlreadyFound = true;
}
}
if ( !peripheralAlreadyFound )
{
peripherals[peripheralCounter] = peripheral;
peripheralCounter++;
}
}
}
}
BLE.stopScan();
digitalWrite( BLE_SCAN_LED_PIN, LOW );
for ( int i = 0; i < peripheralCounter; i++ )
{
peripherals[i].connect();
peripherals[i].discoverAttributes();
BLECharacteristic HeightRPMLevelCharacteristic = peripherals[i].characteristic( BLE_UUID_HEIGHTRPM_LEVEL );
if ( HeightRPMLevelCharacteristic )
{
HeightRPMLevelCharacteristics[i] = HeightRPMLevelCharacteristic;
HeightRPMLevelCharacteristics[i].subscribe();
}
}
peripheralsConnected = peripheralCounter;
}
void loop()
{
myFile = SD.open("test.txt", FILE_WRITE);
float HeightRPMLevels[BLE_MAX_PERIPHERALS];
bool newDataPrint = false;
for ( int i = 0; i < peripheralsConnected; i++ )
{
if ( HeightRPMLevelCharacteristics[i].valueUpdated() )
{
newDataPrint = true;
float HeightRPMLevel;
HeightRPMLevelCharacteristics[i].readValue( &HeightRPMLevel,4 );
HeightRPMLevels[i] = HeightRPMLevel;
}
}
if ( newDataPrint )
{
for ( int i = 0; i < peripheralsConnected; i++ )
{
delay(1000);
// Serial.print( HeightRPMLevels[i] );
// Serial.print( "," );
if (myFile) {
myFile.print(HeightRPMLevels[i]);
myFile.print( "," );
}
}
myFile.print( "\n" );
// Serial.print( "\n" );
}
myFile.close(); // close the file
}