Er zat nog een klein foutje in als de tabel nog niet helemaal is opgevuld. IS nu opgelost
/*
Name: SDArray.ino
Created: 6-12-2018 08:41:43
Author: nico verduin
Brief: Eenvoudige manier om met een array een ringbuffer te maken
*/
// programma constantes
const uint16_t ARRAY_SIZE = 15; // we gaan een array maken van 10 entries
// globale variabelen
uint16_t beginIndex = 0; // startpunt van de ring buffer
uint16_t eindIndex = 0; // eindpunt van de ring buffer
double array[ARRAY_SIZE]; // creer onze tabel
/*
* @name addEntry
* @param value double die aan de tabel wordt toegevoegd
* @brief voegt een waarde toe aan de tabel. Als de tabel vol is, wordt de oudste waarde overschreden
*/
void addEntry(double value) {
static bool loopAround = false; // nodig voor het afvangen als de tabel nog nooit is gevuld of deels
// voeg de waarde toe op de laatste plek
array[eindIndex] = value;
// verhoog naar nieuwe laatste plek en loop around als we op het einde zitten
eindIndex++;
if (eindIndex == ARRAY_SIZE) {
loopAround = true; // de tabel is vol
}
eindIndex = eindIndex % ARRAY_SIZE; // meest eenvoudige loop around
// pas doen als de tabel helemaal vol is
if (loopAround) {
beginIndex++;
beginIndex = beginIndex % ARRAY_SIZE;
}
}
/*
* @name getEntry
* @param index index in de array waarvan we de waarde willen hebben
* @returns double
* @brief Geeft de waarde terug uit de tabel relatief tov de eerste waarde.
*/
double getEntry(uint16_t index) {
// reken de index om naar de juiste plek in de array
uint16_t berekendeIndex = beginIndex + index;
// modulo nemen en restwaarde gebruiken
berekendeIndex = berekendeIndex % ARRAY_SIZE;
// en geef de waarde maar terug
return array[berekendeIndex];;
}
/*
* @name printArray
* @brief print de tabel uit
*/
void printArray() {
char floatAsString[6]; // buffer voor float conversie
for (uint16_t i = 0; i < ARRAY_SIZE; i++) {
dtostrf(getEntry(i), 5, 1, floatAsString);
Serial.print(floatAsString);
Serial.print(" ");
}
Serial.println();
}
/*
* @name setup()
* @brief Initializes the program
*/
void setup()
{
// initialiseer Serial
Serial.begin(115200);
// initialiseer onze tabel
for (uint16_t i = 0; i < ARRAY_SIZE; i++) {
array[i] = 0.0;
}
// vul onze tabel met wat random waarden. Laat de laatste 3 waarden nog ff leeg
randomSeed(analogRead(0));
for (uint16_t i = 0; i < (ARRAY_SIZE - 3); i++) {
addEntry((double)random(0, 99) / 10.0);
}
// print de array
printArray();
// voeg nu 5 nieuwe waardes toe
for (uint16_t i = 0; i < 5; i++) {
addEntry((double)random(0, 99) / 10.0);
// en print de tabel elke keer opnieuw uit
printArray();
}
}
// Add the main program code into the continuous loop() function
void loop()
{
}