Buongiorno a tutti,
Ho un problema con arduino nano 33 BLE sense, stiamo facendo un progetto per l’università e dobbiamo prendere alcuni dati.
Il problema è che se rimane attaccato alla USB del pc, riusciamo a vedere il dispositivo col Bluetooth, ma se lo stacchiamo e colleghiamo ad una powerbank o ad un altro pc, non riusciamo a vederlo.
Inoltre, un consiglio per come creare un file csv per salvare i dati?
Grazie mille
Utile vedere il codice. Mi raccomando, usando i tag code.
Magari nel setup() hai delle righe che carcano la seriale ?
Per un csv, è un semplice file di testo, con i dati (colonne) separati da ;
che puoi anche caricare da excel. Se fai una tabella in excel e la esporti in csv, puoi vedere poi con notepad che dentro è un file di testo semplice.
P.S. ha hai una SD per salvare i file ?
[quote="smarty_97, post:3, topic:1321598"]
il codice utilizzato è il seguente, questo è quello che ci ha condiviso il professore, per il file CSV ci ha fatto utilizzare pyton e praticamente creava il file li.
#include <ArduinoBLE.h>
#include <Arduino_HTS221.h>
BLEService sensorService("19b10010-e8f2-537e-4f6c-d104768a1214");
BLECharacteristic temperatureCharacteristic("19b10010-e8f2-537e-4f6c-d104768a1214", BLERead | BLENotify, 4);
const int ledPin = LED_BUILTIN;
void setup() {
Serial.begin(9600);
//while (!Serial)
//;
pinMode(ledPin, OUTPUT);
if (!HTS.begin()) {
Serial.println("Failed to initialize humidity and temperature sensor!");
while (1)
;
} else {
Serial.println("Humidity and temperature sensor initialized!");
}
if (!BLE.begin()) {
Serial.println("Starting BLE failed!");
while (1)
;
} else {
Serial.println("BLE initialized!");
}
sensorService.addCharacteristic(temperatureCharacteristic);
BLE.addService(sensorService);
BLE.advertise();
Serial.print("Arduino BLE Sense MAC Address: ");
Serial.println(BLE.address());
}
void loop() {
BLEDevice central = BLE.central();
if (central) {
Serial.print("Connected to central: ");
Serial.println(central.address());
digitalWrite(ledPin, HIGH);
while (central.connected()) {
union FloatToBytes {
float floatValue;
uint8_t byteValues[sizeof(float)];
};
FloatToBytes temperatureConverter;
float temperature = HTS.readTemperature();
temperatureConverter.floatValue = temperature;
temperatureCharacteristic.writeValue(temperatureConverter.byteValues, sizeof(float));
delay(1000);
}
Serial.println("Central disconnected");
digitalWrite(ledPin, LOW);
}
}
Da altro PC provate a vedere su serial monitor che stampa.
Se non avete su quello ide arduino, potete usare un qualsiasi programma per seriale ad esempio putty.
Per il csv, non capisco il discorso di python. Cioè sapete creare un file testo con quel linguaggio ma non con Arduino ?
Di solito si una una libreria SD e si collega un modulino per SD. La libreria permette anche di creare file e "stamparci" dentro con delle print()
la prima parte riesci a essere un po' più chiaro? perchè abbiamo delle conoscenze di arduino ma abbastanza base.
per la seconda domanda si, ci ha fatto vedere come crearlo in python e non con arduino.
tieni conto che ci ha fatto vedere 2/3 programmi, molto base base come accendere 3 led una volta connesso arduino al bluetooth del telefono e poi ci ha fornito i codici per prendere vari dati (temperatura, prossimità, giroscopio ecc) su un'applicazione.
Nella setup() aggiungete un delay(500); ad inizio come prima cosa.
Poi riempite di Serial.print("1"); e poi "2" con i vari punti in cui passa il programma e su Serial monitor di Arduino IDE vedrete questi messaggi.
void setup() {
delay(500);
Serial.begin(9600);
Serial.println("avvio");
pinMode(ledPin, OUTPUT);
Serial.println("1");
if (!HTS.begin()) {
Serial.println("Failed to initialize humidity and temperature sensor!");
while (1) ;
} else {
Serial.println("Humidity and temperature sensor initialized!");
}
Serial.println("2");
...etc.
Sul pc che usate e compilate avete arduino ide e il comodo monitor seriale.
Su altro pc o installate arduino ide oppure un altro programma per vedere i dati/msg sulla seriale/usb. Senza un "debug" tramite msg su seriale difficile dire dove si blocca.
Sapete usare il serial monitor di arduino IDE ?
Non capisco però ancora con cosa dovete fare il csv. Se spedite i dati via BT a un programma su PC, sarà poi quello a creare il csv.
Se invece deve farlo arduino, dovete aggiungere un modulo con scheda sd.
Una cosa come questa:
La libreria di arduino è la SD, ci sono esempi. C'e' anche uno che crea e legge un file.
"https://docs.arduino.cc/learn/programming/sd-guide/"
Una volta creato il file, ci scrivete dentro come sulla seriale
Serial.print("Temperatura:"); Serial.print(temp); // dati su seriale
myFile.print("Temperatura:"); myFile.print(temp); // dati dentro al file
per il csv abbiamo questo codice in phyton, quindi spediamo i dati via BT ad un programma su PC.
# pip install git+https://github.com/hbldh/bleak@0d3fa86
import csv
import struct
import asyncio
import warnings
from bleak import BleakClient
# UUIDs for BLE service and characteristic
SERVICE_UUID = "19b10010-e8f2-537e-4f6c-d104768a1214"
CHARACTERISTIC_UUID = "19b10010-e8f2-537e-4f6c-d104768a1214"
def parse_temperature_data(data):
# Assuming the data is a 4-byte float in little-endian format
temperature = struct.unpack('<f', data)[0]
return temperature
async def run(address):
async with BleakClient(address) as client:
print("Connected to client %s"%address)
# Find the BLE service and characteristic
services = await client.get_services()
print(services)
for service in services:
if service.uuid == SERVICE_UUID:
print("Temperature service with UUID %s found!"%SERVICE_UUID)
characteristics = service.characteristics
for characteristic in characteristics:
if characteristic.uuid == CHARACTERISTIC_UUID:
while True:
# Read data from the characteristic
data = await client.read_gatt_char(characteristic.uuid)
# Parse temperature data
temperature = parse_temperature_data(data)
# Print and save the temperature
print(f'Temperature: {temperature}')
#ct=datetime.datetime.now()
with open('temperature_data.csv', 'a', newline='') as csvfile:
fieldnames = ['Temperature']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerow({'Temperature': temperature})
await asyncio.sleep(1) # Adjust the delay based on your requirements
if __name__ == "__main__":
arduino_mac_address = "a8:f4:f8:ab:38:42"
warnings.simplefilter(action='ignore', category=FutureWarning)
loop = asyncio.get_event_loop()
loop.run_until_complete(run(arduino_mac_address))
su tutti i PC abbiamo installato arduino Ide, per il serial monitor, sappiamo leggerlo, abbiamo provato ad aggiungere le linee di codice che ci hai scritto e ci escono questi messaggi. trovi in allegato un'immagine.
ho un aggiornamento importante, dopo ore a provare e modificare il codice abbiamo trovato alcune righe che caricavano la seriale e quindi le abbiamo commentate, il programma gira e riusciamo a connetterlo al mio Pc tramite Bluetooth.
il problema riscontrato ora è che non riusciamo a trasmettere i dati al mio pc.
come possiamo sistemare o riuscirci?
Dovete capire se non trasmette o non riceve.
Nella loop() di arduino (che trasmette) mettete delle Serial.print() anche con i valori da trasmettere ( Serial.print(temperature); ) e vedete se li fa le cose per bene.
Con i msg attuali sapete solo che si connette (Connected to central:) e sconnette (Central disconnected) ma quello che fa in mezzo non sapete.
Poi verificate se riceve. Però non conosco Python quindi non so aiutarvi.
In teoria essendo Python interpretato, se usate un editor Python dovrebbe permettervi di fare il debug passo passo.
Anche python dovrebbe avere una maschera terminal in cui vedete i vari msg print, tipo
print("Connected to client %s"%address)