Limitatie van het aantal metingen

Heey iedereen,

Ik heb een opdracht op school waarbij ik met behulp van een Arduino 2 verschillende voltages uitlezen. Zodat deze met behulp van data streamer in excel gezet kunnen worden. Echter zijn de metingen zo snel dat er gigantisch veel data wordt gegenereerd. hiervoor heb ik al een delay ingezet. Echter is het nu het geval dat de tijd en 2 inputs kunnen worden opgeslagen. Echter genereerd dit nog gigantisch veel onnodige data.

Vandaar dat ik met mijn gedachten een een maximale output tijd zat te denken. Echter kon ik hier nog geen script van vinden.

Daarnaast dacht ik dat ik een teller in een loop met voorwaardes ook zou kunnen werken. Dit heb ik dan ook "gedaan/ geprobeerd". hierbij kan data streamer hem alleen niet meer uitlezen.

Mochten er nog tips zijn hoor ik die natuurlijk graag :stuck_out_tongue:

Alvast bedankt!!

// Program variables ----------------------------------------------------------
float voltage_uv;
int value_uv = 0;

float voltage_valve_secinj;
int value_valve_secinj = 0;

double CycleCounter = 0;

// Serial data variables ------------------------------------------------------
//Incoming Serial Data Array
const byte kNumberOfChannelsFromExcel = 6;

// Comma delimiter to separate consecutive data if using more than 1 sensor
const char kDelimiter = ',';
// Interval between serial writes
const int kSerialInterval = 200;
// Timestamp to track serial interval
unsigned long serialPreviousTime;

char* arr[kNumberOfChannelsFromExcel];

// SETUP ----------------------------------------------------------------------
void setup() {
// Initialize Serial Communication
Serial.begin(9600);
}

// START OF MAIN LOOP ---------------------------------------------------------
void loop()
{
// Gather and process sensor data
processSensors();

// Read Excel variables from serial port (Data Streamer)
processIncomingSerial();

// Process and send data to Excel via serial port (Data Streamer)
processOutgoingSerial();

// Compares STR1 to STR2 returns 0 if true.
// if ( strcmp ("Apple", arr[0]) == 0){
// Serial.println("working");
// }
}

// SENSOR INPUT CODE-----------------------------------------------------------
void processSensors()
{
value_valve_secinj = analogRead( A0);
voltage_valve_secinj = value_valve_secinj* 5.0 / 1023;

// Add any additional raw data analysis below (e.g. unit conversions)
value_uv = analogRead(A1);
voltage_uv = value_uv* 5.0 / 1023;
}

// Add any specialized methods and processing code below

// OUTGOING SERIAL DATA PROCESSING CODE----------------------------------------
void sendDataToSerial()
{
// Send data out separated by a comma (kDelimiter)
// Repeat next 2 lines of code for each variable sent:

if (CycleCounter >= 100)
{Serial.end();
}

else {
Serial.print(voltage_valve_secinj);
Serial.print(kDelimiter);
Serial.print(voltage_uv);
Serial.print(kDelimiter);
Serial.println(); // Add final line ending character only once
CycleCounter = CycleCounter + 1;
}}

//-----------------------------------------------------------------------------
// DO NOT EDIT ANYTHING BELOW THIS LINE
//-----------------------------------------------------------------------------

// OUTGOING SERIAL DATA PROCESSING CODE----------------------------------------
void processOutgoingSerial()
{
// Enter into this only when serial interval has elapsed
if((millis() - serialPreviousTime) > kSerialInterval)
{
// Reset serial interval timestamp
serialPreviousTime = millis();
sendDataToSerial();
}
}

// INCOMING SERIAL DATA PROCESSING CODE----------------------------------------
void processIncomingSerial()
{
if(Serial.available()){
parseData(GetSerialData());
}
}

// Gathers bytes from serial port to build inputString
char* GetSerialData()
{
static char inputString[64]; // Create a char array to store incoming data
memset(inputString, 0, sizeof(inputString)); // Clear the memory from a pervious reading
while (Serial.available()){
Serial.readBytesUntil('\n', inputString, 64); //Read every byte in Serial buffer until line end or 64 bytes
}
return inputString;
}

// Seperate the data at each delimeter
void parseData(char data)
{
char token = strtok(data, ","); // Find the first delimeter and return the token before it
int index = 0; // Index to track storage in the array
while (token != NULL){ // Char
strings terminate w/ a Null character. We'll keep running the command until we hit it
arr[index] = token; // Assign the token to an array
token = strtok(NULL, ","); // Conintue to the next delimeter
index++; // incremenet index to store next value
}
}

Kun je aub je post bewerken, alle code slecteren en op de </> knop drukken om zogenaamde code-tags toe te voegen en vervolgens je post weer opslaan. Het maakt het gemakkelijker om te lezen, gemakkelijker om te kopieren en het vookomt dat de forum software delen van de code als instructies ziet (bv. [] wordt niet vertaald naar ).

Ik heb geen ervaring met excel streamer dus kan je niet verder helpen als het specifiek daar om gaat.

Zoals ik het nu zie zend je 5x per seconde data naar de PC. Heb je langzamer geprobeerd (bv iedere seconde)?

Als je niet langer wilt zenden kun je het onderstaande gebruiken; er is geen reden om Serial.end() te gebruiken.

// OUTGOING SERIAL DATA PROCESSING CODE----------------------------------------
void sendDataToSerial()
{
  // Send data out separated by a comma (kDelimiter)
  // Repeat next 2 lines of code for each variable sent:

  if (CycleCounter >= 100)
  {
    return;
  }
  else
  {
    Serial.print(voltage_valve_secinj);
    Serial.print(kDelimiter);
    Serial.print(voltage_uv);
    Serial.print(kDelimiter);
    Serial.println(); // Add final line ending character only once
    CycleCounter = CycleCounter + 1;
  }
}

Verder heeft het geen zin om CycleCounter een double te maken; een integer type (byte, unsigned int, unsigned long) is voldoende.

Leest wat makkelijker...

Doel je nu op het blokje met de if-statement waar je kijkt of er al 100 cycli zijn doorlopen? Lijkt me dat de eerste 100 lezingen dan gewoon door Excel opgepikt zouden moeten worden MITS je Excel plugin voldoende snel reageert op een herstart van de Arduino. Ik weet niet hoe je die timing doet, maar als je bv. handmatig je Arduino reset en vervolgens in Excel ergens een knopje indrukt om de data in te lezen, dan heeft je Arduino wellicht allang de eerste 100 datapunten verzameld en doorgestuurd...maar niemand luisterde nog.

Misschien is het makkelijker om gewoon de data in een serial monitor (zoals die in de IDE) binnen te halen en te copy-pasten naar Excel. Scheelt je een hoop gedoe en je ziet meteen wat er vanuit de Arduino binnenkomt. In Excel kun je relatief eenvoudig de data weer uitsplitsen in aparte cellen, zeker als je bv. een puntkomma ( ; ) tussen elk dataveld print vanuit de Arduino.

Ja dat klopt het is idd het deel met de if. Maar op dit moment blijft excel reads inlezen. Het gaat om ongeveer 10000 data punten per parameter. Wat er uiteindelijk 5 a 6 zullen zijn.
En aangezien het uiteindelijk fijn zou zijn om meerdere samples na elkaar te kunnen meten zou een kill van de export op basis van tijd ook kunnen.

Toch bedankt mocht je nog wat bedenken laat maar weten

Dankjewel ik ga de code aanpassen ga het maandag weer testen en laat het je dan horen als het niet lukt😉