Ja fa dies que utilitzo la suite Phyphox per a obtenir dades dels sensors del telèfon mòbil, i cada dia m’agrada més. El professor Sebastian Staacks i els seus col·legues del 2n Institut de Física de la Universitat RWTH d’Aachen contínuament van afegint-li funcions i proposant nous experiments. Darrerament, amés de poder afegir experiments propis o de tercers mitjançant codis QR si són complexos o directament si són simples, han sumat l’alternativa d’incorporar experiments d’Arduino a través de bluetooth. En aquesta entrada parlaré d’aquesta última possibilitat.
Bé, quan parlo d’Arduino el faig de forma genèrica ja que els arduinos originals no tenen instal·lat de sèrie el bluetooth i, o bé se’ls ha d’afegir un extern, o s’ha d’usar un altre microprocessador compatible però que inclogui el bluetooth, com és l’esp32, per exemple la placa Wemos D1 R32 que jo utilitzo.
Fins ara emprava l’aplicació Serial Bluetooth Terminal per a recollir les dades que enviava el dispositiu Arduino per bluetooth, una vegada que havia estat programar per a fer-ho d’aquesta manera. Obtingudes les dades, posteriorment s’han de guardar o enviar-les per al seu posterior tractament.
Una avantatja de Phyphox és que dibuixa una gràfica directament amb les dades que arriben al telèfon, i una altra que després es poden analitzar directament en la mateixa aplicació, encara que sempre es poden guardar o enviar per tractar-les amb un altre programari. A més Phyphox està disponible tant per Android com per iOS.
Els projectes d’Arduino que explico a continuació, en els quals la placa es connecta a Phyphox i l’envia dades, tracten sobre dos sensors dels que ja he parlat amb anterioritat: el sensor de temperatura exterior DS18B20 i el sensor de distància VL53L0X. Dos sensors molt interessants per a fer experiments i que no tenen alternativa a l’interior dels telèfons.
Mesura de la temperatura
El termòmetre DS18B20 funciona molt bé, està encapsulat, es pot submergir en líquids i és molt fàcil de connectar a la placa Arduino, ja que funciona amb el protocol 1-Wire.
El protocol sketch_termometro_DS18B20.ino que s’ha d’instal·lar a la placa Arduino el podeu baixar i descomprimir mantenint el mateix nom per l’arxiu i la carpeta que el conté. Després s’ha d’obrir amb l’IDE d’Arduino. També podeu obrir l’IDE d’Arduino i copiar el codi de sota.
//Medida de la temperatura con la sonda de temperatura digital DS18B20 //en una placa Wemos D1 R32 con microprocesador esp32, que dispone de Bluetooth //Se ha de seleccionar la placa DOIT ESP32 DEVKIT V1 //Se pueden visualizar los valores de temperatura en un monitor sèrie en el ordenador //como es el propio del IDE de arduino o en otro como RealTerm, https://sourceforge.net/projects/realterm/ //Los datos también se pueden visualizar en el teléfono móvil o la tableta //con la aplicación Phyphox (https://phyphox.org/) a través de BT (BlueTooth) #include <phyphoxBle.h> //Phyphox BLE library #include <OneWire.h> #include <DallasTemperature.h> OneWire ourWire(26); //Se establece el pin 26 como bus OneWire DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor void setup() { PhyphoxBLE::start("Termometro"); //Nombre del experimento por bluetooth //Experiment PhyphoxBleExperiment experiment; experiment.setTitle("Termómetro"); //Nombre del experimento cuando se guarda en Phyphox experiment.setCategory("Arduino Experiments"); //Categoria de experimentos en la que se guarda //Descripción del experimento en la ayuda experiment.setDescription("Dibuja la gráfica de la temperatura con relación al tiempo."); //View PhyphoxBleExperiment::View view; //Graph PhyphoxBleExperiment::Graph graph; graph.setLabel("Temperatura frente al tiempo"); graph.setUnitX("s"); graph.setUnitY(" C"); graph.setLabelX("tiempo"); graph.setLabelY("temperatura"); graph.setChannel(1,2); view.addElement(graph); //Attach graph to view experiment.addView(view); //Attach view to experiment PhyphoxBLE::addExperiment(experiment); //Attach experiment to server Serial.begin(9600); //Se inicia el monitor serie para el ordenador sensors.begin(); //Se inicia el sensor de temperatura } void loop() { sensors.requestTemperatures(); //Se envía el comando para leer la temperatura float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC float t = 0.001 * (float)millis(); //Se define el tiempo en segundos //Ver tiempo y Temperatura por el monitor serie del ordenador //Serial.print("Tiempo= "); //Se imprime Tiempo //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo Serial.print(t,1); //Escribe el tiempo en segundos con un decimal //Serial.print("s"); //Añade s, de segundos, al valor numérico. //Mejor no ponerlo si se quieren tratar después los datos Serial.print("; "); //Separa los valores con un punto y coma //Serial.print("Temperatura= "); //Se imprime Temperatura //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo Serial.print(temp); // Envia el valor de la temperatura //Serial.print(" C"); //Indica que es en grados centígrados //Mejor no ponerlo si se quieren tratar después los datos Serial.println(); PhyphoxBLE::write(t, temp); //Se envian los datos por bluetooth a Phyphox PhyphoxBLE::poll(); //Only required for the Arduino Nano 33 IoT, but it does no harm for other boards. delay(1000); //Tiempo entre medidas de 10 s }
Instal·leu a l’IDE les llibreries que necessita la placa i el sensor, tal i com s’explica a l’entrada Mesura de la temperatura amb el sensor digital DS18B20. Després punxeu el sensor a la placa amb les indicacions de la mateixa entrada i connecteu la placa a l’ordinador per USB.
En l’última actualització de Windows 10 m’he trobat amb que en connectar les plaques Arduino a l’ordinador el sistema no les reconeixia, i he hagut de instal·lar els controladors corresponents. Per la placa Wemos D1 R32 el podeu baixar de la web de l’empresa.
També s’ha d’instal·lar la llibreria phyphox-arduino-master.zip que és la que proporciona la llibreria phyphoxBle.h, necessària per a que l’Arduino enviï les dades per bluetooth a l’aplicació Phyphox. En github s’ha de pitjat en code i baixar el zip. S’instal·la a l’IDE com totes les llibreries en programa, incloure llibreria, incloure llibreria zip.
Ara no teniu més que seleccionar la placa a Eines, assegurar-vos que està connectada al port COM que indica i carregar-li el codi (fletxa a dalt a l’esquerra de la pantalla de l’IDE). Podeu comprovar que el termòmetre ja està prenent temperatures si obriu el monitor sèrie propi de l’IDE (lupa a dalt a la dreta) ja que el projecte incorpora la sortida de dades pel port sèrie a 9600 bauds.
Però la gràcia d’aquest projecte és que es poden aconseguir els valors que la placa està enviant per bluetooth en el telèfon mòbil amb l’aplicació Phyphox. El treballar per bluetooth permet desconnectar l’Arduino de l’ordinador i que funcioni autònomament, sempre que se li aporti corrent bé amb una pila o amb una bateria, com les bateries externes que s’utilitzen pels mòbils.

Per obtenir les dades en el telèfon s’ha de tenir connectat el bluetooth i la ubicació, s’ha d’obrir l’aplicació Phyphox i s’ha de pitjar en el botó més. Apareixerà una pantalla com la de sota a l’esquerra on es pot escollir entre afegir un experiment amb codi QR, afegir-lo per bluetooth o iniciar un experiment simple que es genera “simplement” escollint el sensor del telèfon que es vol utilitzar. Si s’opta per experiment per bluetooth apareix una pantalla en la que s’ha de seleccionar el dispositiu Termometro, que és el nom que s’ha assignat en el codi del projecte. En aquest moment l’app pregunta si es vol guardar l’experiment en la llista de la pantalla d’inici per altres vegades.
I ja es pot començar a agafar dades de temperatura que aniran apareixen en el gràfic. El gràfic es pot ampliar i consultar els valors sobre ell mateix. En aturar la presa de dades es poden guardar o enviar per tractar-les posteriorment i/o guardar aquest experiment concret en la pantalla inicial de l’aplicació.
Mesura de la distancia
El sensor de distància per làser d’infraroigs VL53L0X funciona molt bé entre 20 i 100 cm i és molt fàcil de connectar a la placa Arduino ja que funciona a través del bus I²C.
Si ja s’han fet els passos per a utilitzar el termòmetre, ara no caldrà més que punxar el sensor en la placa tal i com van fer en Mesura de distàncies amb el sensor làser d’infraroigs VL53L0X, i instal·lar la llibreria del sensor. Si es comença per aquest sensor s’hauran d’instal·lar totes les llibreries que explico a dalt.

Quant al projecte Sketch_telemetro_VL53L0X.ino per a la mesura de la distancia amb aquest sensor, m’he basat en l’exemple rangefinder que porta la mateixa llibreria phyphox-arduino-master de Phyphox (a l’IDE, en Arxiu, exemples). El podeu baixar o bé copiar-lo d’aquí
//Medida de distancia por ecos de Infrarrojos con el sensor VL53L0X //en una placa Wemos D1 R32 con microprocesador esp32, que dispone de Bluetooth //Se ha de seleccionar la placa DOIT ESP32 DEVKIT V1 //Los datos se pueden visualizar en el monitor serie del IDE de Arduino //y con el programa para ordenador RealTerm, https://sourceforge.net/projects/realterm/ //Los datos también se pueden visualizar en el teléfono móvil o la tableta //con la aplicación Phyphox (https://phyphox.org/) a través de BT (BlueTooth) //Este sketch és una adaptación del sketch Rangefinder, ejemplo incluído en la librería Phyphox BLE. //Conexiones: GND a Gnd, Vcc a +3.3 o +5 V, SCL a SCL y SDA a SDA #include <phyphoxBle.h> //Phyphox BLE library #include <Wire.h> //Required for the VL53L0X rangefinder #include <VL53L0X.h> //Required for the VL53L0X rangefinder https://www.arduinolibraries.info/libraries/vl53-l0-x VL53L0X sensor; //Instance of el sensor distancia per llum (telémetro) void setup() { PhyphoxBLE::start("Telémetro"); //Experiment PhyphoxBleExperiment experiment; experiment.setTitle("Telémetro"); experiment.setCategory("Arduino Experiments"); experiment.setDescription("Dibuja la gráfica de la distancia, medida por eco de infrarrojos (time-of-flight) con relación al tiempo."); //View PhyphoxBleExperiment::View view; //Graph PhyphoxBleExperiment::Graph graph; graph.setLabel("Distancia frente al tiempo"); graph.setUnitX("s"); graph.setUnitY("mm"); graph.setLabelX("tiempo"); graph.setLabelY("distancia"); //In contrast to other examples, we will not generate the timestamp on the phone. //For experiments with a high data rate, we can achieve a better temporal //accuracy if we generate the timestamp on the Arduino and send it in pairs with the //measured values. graph.setChannel(1,2); view.addElement(graph); //Attach graph to view experiment.addView(view); //Attach view to experiment PhyphoxBLE::addExperiment(experiment); //Attach experiment to server //Start the rangefinder Wire.begin(); while (!sensor.init()) delay(100); sensor.setTimeout(500); sensor.startContinuous(); Serial.begin(9600); //inicia el terminal serie } void loop() { float t = 0.001 * (float)millis(); //Time in seconds float distance = sensor.readRangeContinuousMillimeters(); //Distance in millimeters if (distance == 8190) //This is an error state if no distance could be determined. Zero looks better in this case. distance = 0; PhyphoxBLE::write(t, distance); //Send data to phyphox Serial.print(t,3); //Escribe el tiempo en segundos con tres decimales Serial.print("; "); //separa los valores de tiempo y distancia con un punto y coma Serial.println(distance); //Escribe la distancia en milímetros PhyphoxBLE::poll(); //Only required for the Arduino Nano 33 IoT, but it does no harm for other boards. }
Després, per a carregar el codi i fer funciona l’aplicació i mesurar distàncies s’han de seguir els mateixos passos que en el cas del termòmetre, i ja es pot començar a mesurar distàncies, com es veu en la captura de pantalla de sota.

[…] un sensor d’aquest tipus connectat a Arduino fent la funció de telèmetre. Ja he explicat en Connectar Arduino i Phyphox: Termòmetre i telèmetre com fer per instal·lar el codi i aconseguir els valors de distància en la pantalla del telèfon […]
[…] una entrada anterior explicava com s’havia de fer amb l’aplicació Phyphox per obtenir en el telèfon les dades […]