This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

Temperature Measurement- Sending Data from ESP32
#1
Hi everyone, 
I am currently working on a little project that might be intresting for a range of experiments. 
I want to show the current status because I think a temperature control can be a handy tool for quite a lot of experiments. 
I divided the post in 3 parts: 
1. Story - Why am i building a temperature conrol and what purpose shall it fit?
2. Hardware - What hardware am I using and why?
3. Software - What code and Phyphox experiment am I using?
Story:
I am currently operating a rally car with a friend of mine.
At our first event we had a brakefailure because of an overheating brake. 
Brakes have a temperature area where they perform well. For a "normal" brake this means that it should work good at any cold temperature but will work worse as soon as it get to hot. The big issue here: In racing conditions a brake will get really hot! 
The fix for our problem was rather easy. Get some better brake pads!
This worked fine. We invested some money into brakepads and got some racingbrakes.
But the basic problem stays. Brakes have a temperature area where they perform well. For the racing brakes this area is only shifted to a hotter area... by a lot. Our old brake worked fine at -50°C up to ~300°C while our new brake starts to work properly at ~150°C until 450°C.
This opens a new problem. Cold brakes. 
We now have to preheat the brakes up to the operating temperature to make sure that we are safe. 

For this I wanted to build a smal and robust temperature sensor which is logging my brake temperature data. 

The requirements for ths build are: 
- Measure temperatures up to 700°C. (The end of operational area for our brake is ~650°).
- Be able to log the data and read it live and after the race. 
- Have a robust build that is able to withstand the loads and enviourmental effects of rally racing. 


Hardware:
First I had to decide how I want to measure the temperature. 
I had 2 ideas in mind. Eigther Infrared or a termocouple wire. Due to the harsh enviourment I have to operate I decided for the termocouple. Also I can measure the temperature direktly on the pad, which is not moving. If I want to measure the temperature of the disc or tyre I will need a infrared measurment, which is also easy to implement. 
Due to the very high temperatures we might face I decided to buy a industrial grade termocouple wire. This can be bought much cheaper If you do not need high temperature readings. I could propably also use wire with a lower rating myself. The aplifier can handle the types K, J, T, N, S, E, B, and R. I used a type K. 
The termocouple wire is connected to a MCP9601 Termocouple ampliefier which is connected to a microcontroller (XIAO ESP32C3) via I2C. 
This microcontroller is used to send the sensordata to my smartphone via bluetooth. 
   
Software:
I used this script for my microcontroler: 
Code:
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <phyphoxBle.h>
#include <Wire.h>
#include "Adafruit_MCP9601.h"
#include <Adafruit_GFX.h>
#include <Adafruit_MLX90614.h>
//RR mcp4 67
#define I2C_ADDRESS1 (0x67)
#define temp_alert1 100
#define temp_alert2 300
#define temp_alert3 400
#define temp_alert4 500
//BLE server name
#define bleServerName "TempControl"
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
Adafruit_MCP9601 mcp1;
uint16_t temp;
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
bool deviceConnected = false;
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "0ef187e8-eb07-45d3-9a5a-0c736f917661"
// Temperature Characteristic and Descriptor
BLECharacteristic TemperatureCharacteristics("813b7a91-c7ef-47fd-844e-dc28ffdf9dfe", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor bmeTemperatureDescriptor(BLEUUID((uint16_t)0x2902));
//Setup callbacks onConnect and onDisconnect
class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
  };
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
  }
};
// ... //
void setup()

Serial.begin(9600);
// Create the BLE Device
BLEDevice::init(bleServerName);
// Create the BLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service
BLEService *bmeService = pServer->createService(SERVICE_UUID);
// Create BLE Characteristics and Create a BLE Descriptor
// Temperature
bmeService->addCharacteristic(&TemperatureCharacteristics);
bmeTemperatureDescriptor.setValue("IR Temperature Celsius");
TemperatureCharacteristics.addDescriptor(&bmeTemperatureDescriptor);
 
// Start the service
bmeService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
mlx.begin();
/* Initialise the driver with I2C_ADDRESS and the default I2C bus. */
if (! mcp1.begin(I2C_ADDRESS1)) {
    Serial.println("Sensor not found. Check wiring!");
    while (1);
    }
  Serial.println("Found MCP9601!");
  mcp1.setADCresolution(MCP9600_ADCRESOLUTION_18);
  Serial.print("ADC resolution set to ");
  switch (mcp1.getADCresolution()) {
    case MCP9600_ADCRESOLUTION_18:   Serial.print("18"); break;
    case MCP9600_ADCRESOLUTION_16:   Serial.print("16"); break;
    case MCP9600_ADCRESOLUTION_14:   Serial.print("14"); break;
    case MCP9600_ADCRESOLUTION_12:   Serial.print("12"); break;
  }
  Serial.println(" bits");
  mcp1.setThermocoupleType(MCP9600_TYPE_N);
  Serial.print("Thermocouple type set to ");
  switch (mcp1.getThermocoupleType()) {
    case MCP9600_TYPE_K:  Serial.print("K"); break;
    case MCP9600_TYPE_J:  Serial.print("J"); break;
    case MCP9600_TYPE_T:  Serial.print("T"); break;
    case MCP9600_TYPE_N:  Serial.print("N"); break;
    case MCP9600_TYPE_S:  Serial.print("S"); break;
    case MCP9600_TYPE_E:  Serial.print("E"); break;
    case MCP9600_TYPE_B:  Serial.print("B"); break;
    case MCP9600_TYPE_R:  Serial.print("R"); break;
  }
  Serial.println(" type");
  mcp1.setFilterCoefficient(0);
  Serial.print("Filter coefficient value set to: ");
  Serial.println(mcp1.getFilterCoefficient());
  mcp1.setAlertTemperature(1, temp_alert1);
  Serial.print("Alert #1 temperature set to ");
  Serial.println(mcp1.getAlertTemperature(1));
  mcp1.configureAlert(1, true, true, false, true, true);  // alert 1, enabled, rising temp, cold junction,high on alert
  mcp1.setAlertTemperature(2, temp_alert2);
  Serial.print("Alert #1 temperature set to ");
  Serial.println(mcp1.getAlertTemperature(1));
  mcp1.configureAlert(2, true, true, false, true, true);  // alert 1, enabled, rising temp, cold junction,high on alert
  mcp1.setAlertTemperature(3, temp_alert3);
  Serial.print("Alert #1 temperature set to ");
  Serial.println(mcp1.getAlertTemperature(1));
  mcp1.configureAlert(3, true, true, false, true, true);  // alert 1, enabled, rising temp, cold junction,high on alert
  mcp1.setAlertTemperature(4, temp_alert4);
  Serial.print("Alert #1 temperature set to ");
  Serial.println(mcp1.getAlertTemperature(1));
  mcp1.configureAlert(3, true, true, false, true, true);  // alert 1, enabled, rising temp, cold junction,high on alert

  mcp1.enable(true);
  Serial.println(F("------------------------------"));

}
void loop()
{
// Read temperature as Celsius (the default)
uint16_t temp = mcp1.readThermocouple();
//Notify temperature reading from BME sensor
//Set temperature Characteristic value and notify connected client
TemperatureCharacteristics.setValue(temp);
TemperatureCharacteristics.notify();
Serial.println(mlx.readObjectTempC());
Serial.println(mcp1.readThermocouple());
delay(50);
}
The code is written is such a way that I can easily change the thermocouple against an infrared laser (mlx90614).

To use the microcontroller with phyphox I had to generate a cusom experiment. This experiment also includes a gps logging ans acceleration logging because this data can be really intresting for rally driving aswell. 

The experiment is defined by this xml: 
Code:
<phyphox xmlns="http://phyphox.org/xml" xmlns:editor="http://phyphox.org/editor/xml" version="1.7" editor:version="1.0" locale="en">
    <title>Temp_light</title>
    <category>Rally</category>
    <color>green</color>
    <description>GPS 1Hz
Acceleration 20Hz
Temp 1 Hz</description>
    <icon format="base64">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</icon>
    <data-containers>
        <container size="1000" static="false">Output 1</container>
        <container size="1000" static="false">out</container>
        <container size="1000" static="false">dir</container>
        <container size="1000" static="false">v</container>
        <container size="1000" static="false">y</container>
        <container size="1000" static="false">z</container>
        <container size="1000" static="false">x</container>
        <container size="1000" static="false">status</container>
        <container size="1000" static="false">accuracy</container>
        <container size="1000" static="false">lon</container>
        <container size="1000" static="false">zAccuracy</container>
        <container size="1000" static="false">satellites</container>
        <container size="1000" static="false">z (1)</container>
        <container size="1000" static="false">lat</container>
        <container size="1000" static="false">t</container>
        <container size="1000" static="false">count</container>
        <container size="1000" static="false">sum</container>
        <container size="1000" static="false">result</container>
        <container size="1000" static="false">count (1)</container>
        <container size="1000" static="false">out (1)</container>
        <container size="1000" static="false">out (2)</container>
        <container size="1000" static="false">out (3)</container>
        <container size="1000" static="false">out (4)</container>
        <container size="1000" static="false">out (5)</container>
        <container size="1000" static="false">out (6)</container>
        <container size="1000" static="false">first</container>
        <container size="1000" static="false">first (1)</container>
        <container size="1000" static="false">out (7)</container>
    </data-containers>
    <input>
        <bluetooth editor:uuid="821" editor:posx="788.2153043746948" editor:posy="53.22222137451172"    mode="notification" rate="1" subscribeOnStart="false">
            <output char="813b7a91-c7ef-47fd-844e-dc28ffdf9dfe" conversion="int16LittleEndian">Output 1</output>
        </bluetooth>
        <location editor:uuid="822" editor:posx="48.11111068725586" editor:posy="881.0000267028809">
            <output component="lat">lat</output>
            <output component="lon">lon</output>
            <output component="z">z (1)</output>
            <output component="v">v</output>
            <output component="dir">dir</output>
            <output component="t">t</output>
            <output component="accuracy">accuracy</output>
            <output component="zAccuracy">zAccuracy</output>
            <output component="status">status</output>
            <output component="satellites">satellites</output>
        </location>
        <sensor editor:uuid="823" editor:posx="27.302084922790527" editor:posy="1476.222312927246" rate="20" average="false" type="linear_acceleration">
            <output component="x">x</output>
            <output component="y">y</output>
            <output component="z">z</output>
        </sensor>
    </input>
    <output>
    </output>
    <analysis sleep="0"  onUserInput="false">
        <timer editor:uuid="871" editor:posx="33.486117362976074" editor:posy="1351.9410018920898">
            <output as="out">out</output>
        </timer>
        <count editor:uuid="911" editor:posx="1193.6729354858398" editor:posy="1023.9874649047852">
            <input as="buffer" clear="false">t</input>
            <output as="count">count</output>
        </count>
        <first editor:uuid="923" editor:posx="1196.859375" editor:posy="577.8297119140625">
            <input as="value" clear="false">lat</input>
            <output as="first">first</output>
        </first>
        <first editor:uuid="921" editor:posx="1200.09375" editor:posy="690.5">
            <input as="value" clear="false">lon</input>
            <output as="first">first (1)</output>
        </first>
        <add editor:uuid="913" editor:posx="1205.84375" editor:posy="850.3171997070312">
            <input as="summand" clear="false">count (1)</input>
            <input as="summand" type="value">1</input>
            <output as="sum">sum</output>
        </add>
        <if editor:uuid="912" editor:posx="1410.3604736328125" editor:posy="1022.6332778930664" less="false" equal="false" greater="true">
            <input as="a" clear="false">count</input>
            <input as="b" clear="false">sum</input>
            <input as="true" clear="false">out (5)</input>
            <output as="result">result</output>
        </if>
        <formula editor:uuid="924" editor:posx="1494.7280883789062" editor:posy="571.9375" formula="6371*acos(sin(0.01745329252*[1])*sin(0.01745329252*[3])+cos(0.01745329252*[1])*cos(0.01745329252*[3])*cos(0.01745329252*([2]-[4])))">
            <input as="in" clear="false">first</input>
            <input as="in" clear="false">first (1)</input>
            <input as="in" clear="false">lat</input>
            <input as="in" clear="false">lon</input>
            <output as="out">out (7)</output>
        </formula>
        <count editor:uuid="915" editor:posx="1655.53125" editor:posy="1170.125">
            <input as="buffer" clear="false">result</input>
            <output as="count">count (1)</output>
        </count>
        <integrate editor:uuid="920" editor:posx="1665.3096923828125" editor:posy="975.8937377929688">
            <input as="in" clear="false">result</input>
            <output as="out">out (6)</output>
        </integrate>
        <subrange editor:uuid="916" editor:posx="1869.8341064453125" editor:posy="1250.8626098632812">
            <input as="in" clear="false">lon</input>
            <input as="from" clear="false">count (1)</input>
            <output as="out">out (1)</output>
        </subrange>
        <subrange editor:uuid="914" editor:posx="1871.0625" editor:posy="1084.828125">
            <input as="in" clear="false">lat</input>
            <input as="from" clear="false">count (1)</input>
            <output as="out">out (2)</output>
        </subrange>
        <differentiate editor:uuid="918" editor:posx="2100.737060546875" editor:posy="1256.4612426757812">
            <input as="in" clear="false">out (1)</input>
            <output as="out">out (4)</output>
        </differentiate>
        <differentiate editor:uuid="917" editor:posx="2103.13916015625" editor:posy="1084.6487426757812">
            <input as="in" clear="false">out (2)</input>
            <output as="out">out (3)</output>
        </differentiate>
        <formula editor:uuid="919" editor:posx="2388.0828857421875" editor:posy="1139.3125" formula="0.01745329252*sqrt((cos(0.01745329252*[1_])*[2_])^2+[1_]*[1_])*6371">
            <input as="in" clear="false">out (3)</input>
            <input as="in" clear="false">out (4)</input>
            <output as="out">out (5)</output>
        </formula>
    </analysis>
    <views>
        <view label="Temp Values">
            <value editor:uuid="878" editor:posx="1010.2604703903198" editor:posy="53.37152862548828" label="Temperature" size="3" precision="2" scientific="false"  factor="1" >
                <input>Output 1</input>
            </value>
        </view>
        <view label="Acceleration">
            <graph editor:uuid="879" editor:posx="1122.7258024215698" editor:posy="1418.4479293823242" label="Accelerometer x" aspectRatio="2.5" style="lines" lineWidth="1" color="green" partialUpdate="true" history="1" labelX="t" labelY="a" labelZ="" unitX="s" unitY="m/s²" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">out</input>
                <input axis="y">x</input>
            </graph>
            <graph editor:uuid="880" editor:posx="1120.7361783981323" editor:posy="1548.8125228881836" label="Accelerometer y" aspectRatio="2.5" style="lines" lineWidth="1" color="blue" partialUpdate="true" history="1" labelX="t" labelY="a" labelZ="" unitX="s" unitY="m/s²" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">out</input>
                <input axis="y">y</input>
            </graph>
            <graph editor:uuid="881" editor:posx="1119.5417203903198" editor:posy="1681.5485153198242" label="Accelerometer z" aspectRatio="2.5" style="lines" lineWidth="1" color="yellow" partialUpdate="true" history="1" labelX="t" labelY="a" labelZ="" unitX="s" unitY="m/s²" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">out</input>
                <input axis="y">z</input>
            </graph>
        </view>
        <view label="Movement">
            <value editor:uuid="882" editor:posx="704.8542203903198" editor:posy="1127.8783798217773" label="Status" size="1" precision="2" scientific="false"  factor="1" >
                <input>status</input>
                <map  max="-1">GPS disabled</map>
                <map min="0" >GPS active</map>
            </value>
            <separator editor:uuid="883" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <graph editor:uuid="884" editor:posx="957.390625" editor:posy="697.8734436035156" label="Speed" aspectRatio="2.5" style="lines" lineWidth="1" color="ff7e22" partialUpdate="true" history="1" labelX="t" labelY="v" labelZ="" unitX="s" unitY="m/s" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">out</input>
                <input axis="y">v</input>
            </graph>
            <graph editor:uuid="885" editor:posx="962.0234375" editor:posy="845.0750122070312" label="Direction" aspectRatio="2.5" style="dots" lineWidth="1" color="ff7e22" partialUpdate="true" history="1" labelX="t" labelY="Direction" labelZ="" unitX="s" unitY="°" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">out</input>
                <input axis="y">dir</input>
            </graph>
            <graph editor:uuid="886" editor:posx="1900" editor:posy="940.6875" label="Distance travelled" aspectRatio="2.5" style="lines" lineWidth="1" color="ff7e22" partialUpdate="true" history="1" labelX="t" labelY="d" labelZ="" unitX="s" unitY="km" unitZ="" logX="false" logY="false" logZ="false" xPrecision="3" yPrecision="3" zPrecision="3" scaleMinX="auto" scaleMaxX="auto" scaleMinY="auto" scaleMaxY="auto" scaleMinZ="auto" scaleMaxZ="auto" minX="0" maxX="0" minY="0" maxY="0" minZ="0" maxZ="0"  mapWidth="0"       >
                <input axis="x">t</input>
                <input axis="y">out (6)</input>
            </graph>
        </view>
        <view label="Simple">
            <value editor:uuid="887" editor:posx="705.5243253707886" editor:posy="1213.8992538452148" label="Status" size="1" precision="2" scientific="false"  factor="1" >
                <input>status</input>
                <map  max="-1">GPS disabled</map>
                <map min="0" >GPS active</map>
            </value>
            <separator editor:uuid="888" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <value editor:uuid="889" editor:posx="715.8368253707886" editor:posy="438.5171771645546" label="Latitude" size="1" precision="6" scientific="false" unit="°" factor="1" >
                <input>lat</input>
            </value>
            <value editor:uuid="890" editor:posx="715.9444913864136" editor:posy="525.003303527832" label="Longitude" size="1" precision="6" scientific="false" unit="°" factor="1" >
                <input>lon</input>
            </value>
            <value editor:uuid="891" editor:posx="711.8611173629761" editor:posy="610.8887252807617" label="Height" size="1" precision="1" scientific="false" unit="m" factor="1" >
                <input>z (1)</input>
            </value>
            <separator editor:uuid="892" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <value editor:uuid="893" editor:posx="714.6111173629761" editor:posy="698.3401412963867" label="Speed" size="1" precision="1" scientific="false" unit="m/s" factor="1" >
                <input>v</input>
            </value>
            <value editor:uuid="894" editor:posx="711.6250333786011" editor:posy="781.6769638061523" label="Speed" size="1" precision="1" scientific="false" unit="km/h" factor="3.6" >
                <input>v</input>
            </value>
            <separator editor:uuid="895" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <value editor:uuid="896" editor:posx="709.4201993942261" editor:posy="869.4338912963867" label="Direction" size="1" precision="1" scientific="false" unit="°" factor="1" >
                <input>dir</input>
            </value>
            <value editor:uuid="897" editor:posx="707.5243864059448" editor:posy="951.5693588256836" label="Compass" size="1" precision="2" scientific="false"  factor="1" >
                <input>dir</input>
                <map  max="-157.5">S</map>
                <map  max="-112.5">SW</map>
                <map  max="-67.5">W</map>
                <map  max="-22.5">NW</map>
                <map  max="22.5">N</map>
                <map  max="67.5">NE</map>
                <map  max="112.5">E</map>
                <map  max="157.5">SE</map>
                <map  max="202.5">S</map>
                <map  max="247.5">SW</map>
                <map  max="292.5">W</map>
                <map  max="337.5">NW</map>
                <map  >N</map>
            </value>
            <separator editor:uuid="898" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <value editor:uuid="899" editor:posx="1919.0795593261719" editor:posy="796.175048828125" label="Distance travelled" size="1" precision="3" scientific="false" unit="km" factor="1" >
                <input>out (6)</input>
            </value>
            <value editor:uuid="900" editor:posx="1729.521728515625" editor:posy="575.3484191894531" label="Distance from start" size="1" precision="3" scientific="false" unit="km" factor="1" >
                <input>out (7)</input>
            </value>
            <separator editor:uuid="901" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <value editor:uuid="902" editor:posx="706.6284818649292" editor:posy="1035.3367233276367" label="Horizontal Accuracy" size="1" precision="1" scientific="false" unit="m" factor="1" >
                <input>accuracy</input>
            </value>
            <value editor:uuid="903" editor:posx="961.7562713623047" editor:posy="1246.7582778930664" label="Vertical Accuracy" size="1" precision="1" scientific="false" unit="m" factor="1" >
                <input>zAccuracy</input>
            </value>
            <value editor:uuid="904" editor:posx="706.6458463668823" editor:posy="1299.9895553588867" label="Satellites" size="1" precision="0" scientific="false"  factor="1" >
                <input>satellites</input>
            </value>
            <separator editor:uuid="905" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <info editor:uuid="906" editor:posx="0" editor:posy="0" label="Note, that some devices do not have a GPS sensor, but provide location data through mobile or WIFI connections. These data sources produce data with bad accuracy." >
            </info>
            <separator editor:uuid="907" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <info editor:uuid="908" editor:posx="0" editor:posy="0" label="Also make sure that your system's location setting is not set to &quot;Power saving&quot; because this usually turns off the precise GPS source." >
            </info>
            <separator editor:uuid="909" editor:posx="0" editor:posy="0" height="1" color="404040">
            </separator>
            <info editor:uuid="910" editor:posx="0" editor:posy="0" label="The horizontal accuracy is the uncertainty of your location, while the vertical accuracy is the (usually worse) uncertainty of your elevation (height). If the accuracy is zero, this information is not available." >
            </info>
        </view>
    </views>
    <export>
        <set name="Temp Data">
            <data name="Temp">Output 1</data>
        </set>
    </export>
</phyphox>

I want to streamline the project in the future and also comment many things a bit better. 
If someone is intrested in using a microcontroller to send data to phyphox this might be a little help to understand the concept. 

I think the base project can also be used for a lot of cool microcontroller experiments.
Reply
#2
Thank you for sharing. You do not use “phyphoxBLE”, do you? Why did you decide against it? (You are apparently experienced enough to handle the BLE server by yourselves, still there is an include… Smile)
Reply


Forum Jump: