Ik snap het niet helemaal.
Ik heb de code wat aangepast. Excuses dat ik mogelijk heel lompe dingen gedaan heb.
/*
Name: SDArray.ino
Created: 6-12-2018 08:41:43
Author: nico verduin
Brief: Eenvoudige manier om met een array een ringbuffer te maken
*/
// Temperatuursensor
#include
#include
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature temp(&oneWire);
// 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);
// start temp-sensor
temp.begin();
// initialiseer onze tabel
for (uint16_t i = 0; i < ARRAY_SIZE; i++) {
array[i] = 0.0;
}
}
void loop()
{
// vul de tabel met waarden van de DS18B20.
for (uint16_t i = 0; i < (ARRAY_SIZE); i++) {
temp.requestTemperatures();
addEntry((double)temp.getTempCByIndex(0));
delay(2000);
printArray();
//als de array vol is, zet alle indexen weer op 0
if (i == ARRAY_SIZE) {
for (uint16_t i = 0; i < ARRAY_SIZE; i++) {
array[i] = 0.0;
}
}
}
}
Nu verwacht ik dat de temperatuur één voor één de array in gestopt wordt. En dat gebeurt ook.
Maar als de array vol is (bijv. na een week), wil ik weer allemaal 0-en en opnieuw beginnen.
Anders krijg je een vreemde grafiek waarvan de eerste helft de afgelopen paar dagen geweest zijn en de laatste helft van vorige week.
Ik heb de meting laten lopen en bij rij 13 ongeveer de temperatuur laten dalen, maar hij lijkt vanaf rij 14 o.i.d achteruit terug te gaan.
25.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 0.0 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 0.0 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 0.0 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 0.0 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 0.0 0.0
25.3 25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 0.0
25.5 25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 25.3
25.4 25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 25.5
25.4 25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 25.4
25.4 25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 25.4
25.3 25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 25.4
25.2 25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 25.3
25.3 25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 25.2
25.3 25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 20.7 25.3
25.1 25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 20.7 20.5 25.3
25.2 25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 20.7 20.5 20.4 25.1
25.1 24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 20.7 20.5 20.4 20.4 25.2
24.5 23.4 22.6 22.0 21.7 21.3 21.2 20.9 20.6 20.7 20.5 20.4 20.4 20.4 25.1
Ik kan het niet precies verklaren.
Wat is de werking precies van de coderegels in de addEntry-functie? Mij leek daar iets te zitten wat niet goed gaat of wat ik niet begrijp, speciaal die %.
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;
}
Afijn, ik ben voor m'n gevoel verder dan vorige week, maar er moet nog wat gebeuren... :-)
Groet,
Johan