Arduino Forum

International => Nederlands => Topic started by: jmnijsse on Dec 04, 2018, 11:45 am

Title: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 04, 2018, 11:45 am
Ben bezig met een project om aquarium waterwaardes weer te geven op een Nextion display.
Het realtime uitlezen is inmiddels werkend. Mede met dank aan dit forum!

Nu wil ik verder met het weergeven van grafieken van deze waarden (o.a. temp, pH, geleidbaarheid), die ook de historie laat zien en liefst ook nog ergens opslaat.
De standaard grafiek-module in Nextion begint echter elke keer met een leeg assenstelsel.

Wat ik dus zou willen is dat de data ergens (kan dat in Arduino zelf? moet dat op een SD-kaartje?) weggeschreven wordt en op het moment dat ik op de grafiek-knop klik, moeten de waardes weergegeven worden die opgeslagen zijn.

Nu heb ik van Nextion nog niet alles door.

De volgende vragen:



Wie kan me een duw in de goede richting geven?

Vriendelijke groet,
Johan
Title: Re: Grafiek op Nextion HMI
Post by: MAS3 on Dec 05, 2018, 12:36 am
Hoi jmnijsse.

Bij jouw verhaal moest ik meteen denken aan een data logger shield.
Daar zijn er heel veel van, ook voor een schijntje uit China.
Die hebben allemaal een SD card slot (kunnen wel voor verschillende fysieke afmetingen bedoeld zijn), een Real Time Clock chip, plus een batterij al dan niet in een houder die er voor zorgt dat de klok ook blijft door "tikken" als het geheel zonder spanning zit.
Soms zit er nog meer nuttigs op, zoals level shifters .

Het gebruiken van een SD kaartje geeft je een gigantische hoeveelheid opslag als je het vergelijkt met het beschikbare geheugen op welke Arduino variant dan ook.
Want geheugen is een achilleshiel voor de Arduino.
En bovendien is een kaart niet vluchtig geheugen, en vaker overschrijfbaar dan het geheugen van je Arduino.

Over de Nextion kan ik je helemaal niets vertellen, daar verwacht ik dat Nico wel bovenop zal springen..
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 05, 2018, 08:32 am
Als je op een WaveForm in een keer een grafiek wil laten zien met recente data zul je die inderdaad moeten opslaan. Dat kan in een Array (als je voldoende geheugen hebt. MAAR....
Dan moet je ook pointers gaan bij houden om een soort ringbuffer te maken. Een die het begin aangeeft en een die het einde aangeeft. Immers je gaat een array vullen beginnend bij index 0 tot het einde van de tabel. Daarna ga je weer de eerste waarde overschrijven. Dus moet je bijhouden waar het begin en het einde van de reeks is in de tabel.

Op het moment dat je de grafiek (waveform) wil laten zien bouw je hem op en ga je de array uitlezen. Ook hier maak je weer gebruik van de pointers om de juiste volgorde te houden.

Op een SD kaart kan je hetzelfde geintje doen door een bestand te maken en elke  waarde weg te schrijven. Zou je dit volg-ordelijk doen dan blijft hij de data achteraan wegschrijven. Op enig moment is de SD kaart vol en dat lijkt mij niet wenselijk. Wat wel kan is tijdens de setup() een leeg bestand maken met x maal het aantal datapunten dat je wilt laten zien op de grafiek. De waarden kunnen dan gewoon 0 zijn. 

Met de seek() functie kan je overal midden in de SD file prikken en de variabele lezen. Maar ook schrijven (write() functie).

Er zijn wel wat voorbeelden uit het verleden te vinden die de seek() gebruiken om te lezen. Om te schrijven zag ik niet zoveel.

Je hebt dus nog al wat zaken uit te zoeken:


Het had mooi geweest als iemand een keer een mooie library had gemaakt (wie weet is die er al). Het zou betekenen dat je met arrays kan werken ter grootte van een SD kaart).... op een eenvoudige Arduino.   
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 06, 2018, 01:23 pm
Bedankt voor de reacties. Ik dacht dat ik wel een melding zou krijgen dat er gereageerd was, maar niet dus...

Ik zat idd ook al aan een SD shield te denken, maar begreep niet hoe dat via Arduino aan een Nextion gekoppeld kon worden.

Nu heb ik dus dit om een temperatuurgrafiek te krijgen:

Code: [Select]

void get_temp()
{
 
  sensors.requestTemperatures();

  float t = sensors.getTempCByIndex(0);

  //convert to char
  char temperatureCTemp[6];
  dtostrf(t, 5, 1, temperatureCTemp);

  //update display
  tTempC.setText(temperatureCTemp);

  ch0_data = t;

  wGraph.addValue(0, ch0_data);

}


Maar i.p.v. die laatste regel moet niet slechts één ch0_data weggeschreven worden, maar dus een hele array.

Als ik je verhaal zo lees, Nico, zal dit niet eenvoudig worden voor een niet-heel-ervaren programmeur. Maar ik ben aan dit project begonnen om er iets nieuws van te leren dus ik ga eens in de wereld van pointers en ringbuffers duiken.

Dank voor de duw!

Gr.
johan


Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 06, 2018, 01:26 pm
Een plaatje maken vooraf helpt heel veel voor het oplossen van een probleem
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 06, 2018, 03:55 pm
Hier heb je ff een test programma met een ringbuffer.
Code: [Select]
/*
    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 = 10; // 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) {

// 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++;
eindIndex = eindIndex % ARRAY_SIZE; // meest eenvoudige loop around
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
randomSeed(analogRead(0));
for (uint16_t i = 0; i < ARRAY_SIZE; 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()
{


}
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 07, 2018, 11:45 am
Er zat nog een klein foutje in als de tabel nog niet helemaal is opgevuld. IS nu opgelost
Code: [Select]
/*
    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()
{
}


Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 07, 2018, 04:00 pm
Zo, bedankt Nico. Dit is wel helder, al moet ik het allemaal nog gaan toepassen in mijn eigen code. Komende weken, hopelijk.

Even voor m'n begrip:

Een ringbuffer is een buffer (soort array van sensorwaarden in mijn geval) die de eigenschap heeft dat als hij vol is, de oudste waarde weer overschreven wordt?

Wat is het voordeel om uint16_t te gebruiken? Terwijl er toch eigenlijk kleine getallen in staan? Waarom niet gewoon int?

Bedankt voor het meedenken. Moeilijk, maar wel interessant.

Goed weekend alvast!

J.
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 07, 2018, 04:13 pm
Een int is een signed integer en loopt van -32767 tot +32768. Dat alleen al is eigenlijk fout omdat je geen negatieve index kan hebben in een array.
uint16_t is hetzelfde als een int op de 8bit arduino. Op een 32bit machine is hij nog steeds 16bit. Terwijl een gewone int ineens 32bits is geworden. En als je speciale berekeningen doet oid is jouw uitgangspunt weg.
Title: Re: Grafiek op Nextion HMI
Post by: Jantje on Dec 07, 2018, 07:18 pm
>uint16_t is hetzelfde als een int op de 8bit arduino.

u in uint16_t staat voor unsigned en gaat dus van 0 to 65.535
Das dus niet hetzelfde als int op 8 bit processoren die gaan van -32767 tot +32768
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 07, 2018, 07:47 pm
Een int is een signed integer en loopt van -32767 tot +32768. Dat alleen al is eigenlijk fout omdat je geen negatieve index kan hebben in een array.
int16_t is hetzelfde als een int op de 8bit arduino. Op een 32bit machine is hij nog steeds 16bit. Terwijl een gewone int ineens 32bits (iets van +/- 2^31)is geworden. En als je speciale berekeningen doet oid is je uitgangspunt weg

Dank je Jan... zat ff te pitten
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 09, 2018, 12:32 pm
Ik denk doe 's en schrijf een library om maar gelijk die arrays op een SD te laten werken. Inmiddels werkt het alleen nu nog alleen voor unsigned ints (4 bytes). Ik hem nog generaliseren voor elk type variabele en de code nog netter maken. Maar de resultaten zijn veelbelovend. Getest op een gewone UNO met een oud 256mb sd kaartje uit het jaar 0 :)

Code: [Select]
____________________________________________________________
     10 records to file      W10 created in      0.002 seconds
     10 records initialized in ............      0.005 seconds
     10 records read in ...................      0.002 seconds
      1 record random read in .............      0.000 seconds
____________________________________________________________
    100 records to file     W100 created in      0.003 seconds
    100 records initialized in ............      0.014 seconds
    100 records read in ...................      0.018 seconds
      1 record random read in .............      0.001 seconds
____________________________________________________________
   1000 records to file    W1000 created in      0.004 seconds
   1000 records initialized in ............      0.137 seconds
   1000 records read in ...................      0.198 seconds
      1 record random read in .............      0.003 seconds
____________________________________________________________
  10000 records to file   W10000 created in      0.005 seconds
  10000 records initialized in ............      1.367 seconds
  10000 records read in ...................      1.974 seconds
      1 record random read in .............      0.003 seconds
____________________________________________________________
 100000 records to file  W100000 created in      0.006 seconds
 100000 records initialized in ............     13.723 seconds
 100000 records read in ...................     19.734 seconds
      1 record random read in .............      0.005 seconds
____________________________________________________________
1000000 records to file W1000000 created in      0.010 seconds
1000000 records initialized in ............    136.413 seconds
1000000 records read in ...................    197.318 seconds
      1 record random read in .............      0.009 seconds




Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 11, 2018, 03:17 pm
Ik snap het niet helemaal.
Ik heb de code wat aangepast. Excuses dat ik mogelijk heel lompe dingen gedaan heb.
Code: [Select]

/*
    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 <OneWire.h>
#include <DallasTemperature.h>

#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.


Code: [Select]

 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 %.

Code: [Select]
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
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 11, 2018, 03:28 pm
Als ik in de serial monitor

beginIndex, eindIndex,
Array

print, krijg ik dit:

Code: [Select]
0,1
 19.8   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
0,2
 19.8  19.8   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,3
 19.8  19.8  19.8   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,4
 19.8  19.8  19.8  19.8   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
0,5
 19.8  19.8  19.8  19.8  19.7   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
0,6
 19.8  19.8  19.8  19.8  19.7  19.8   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
0,7
 19.8  19.8  19.8  19.8  19.7  19.8  19.7   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
0,8
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7   0.0   0.0   0.0   0.0   0.0   0.0   0.0
0,9
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8   0.0   0.0   0.0   0.0   0.0   0.0
0,10
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8   0.0   0.0   0.0   0.0   0.0
0,11
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8   0.0   0.0   0.0   0.0
0,12
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8   0.0   0.0   0.0
0,13
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8   0.0   0.0
0,14
 19.8  19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8   0.0
1,0
 19.8  19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.8
2,1
 19.8  19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8
3,2
 19.8  19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8
4,3
 19.7  19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8
5,4
 19.8  19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.7
6,5
 19.7  19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.8  19.8
7,6
 19.7  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.8  19.8  19.7
8,7
 19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.8  19.8  19.8  19.7
9,8
 19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.8
10,9
 19.8  19.8  19.8  19.8  19.8  19.9  19.8  19.8  19.8  19.8  19.8  19.8  19.8  19.9  19.8
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 11, 2018, 05:07 pm
Hoe hij was, was dat in de array altijd de laatste entries staan. Als je die doorloopt dan krijg je van zelf de oudste waarde op index 0 en de nieuwste op de hoogste index.
Stel je hebt 100 metingen gedaan dan kijk ahw via een window naar de laatste waardes. Al het omrekenen gebeurt automatisch. En dat doe ik met modulo %. Google maar eens
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 12, 2018, 09:31 am
O ja, nu zie ik het.

Maar dan gebeurt dat toch eigenlijk één entry te vroeg?
Want als er nog één positie over is (dwz op 0.0 staat) gaat hij al 'opschuiven'.

Code: [Select]

 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


Als er bij regel 14 dus nog één positie open is, zie ik toch die waarde van 23.4 al terug schuiven, terwijl hij nog ééntje verder zou kunnen?
In regel 15 verwacht ik eigenlijk vervolgwaarde van 23.4 op index 15.
Of heb je die positie juist nodig om de oudste waarde weer op te slaan?


Modulo moet ik nog eens goed bekijken. Ik begrijp dat de uitkomst 'het deel wat na deling overblijft' is. Maar dat kwartje moet nog iets verder vallen.

Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 12, 2018, 04:30 pm
Ik zal van de week ff kijken of er nog een fout in zit ergens. Zou zomaar kunnen:)
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 13, 2018, 11:51 am
Dit zou wel goed moeten zijn
Code: [Select]
/*
    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 = 10;        // 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

    // kijk of we een loop around moeten doen
    if (eindIndex == ARRAY_SIZE) {
        loopAround = true;                        // de tabel is vol
    }
    eindIndex = eindIndex % ARRAY_SIZE;           // meest eenvoudige loop around

    // 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++;
    // 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
    for (uint16_t i = 0; i < ARRAY_SIZE; i++) {
        addEntry((double)i);
        // print de array
        printArray();
    }

    // print de array
    printArray();

    // voeg nu 5 nieuwe waardes toe
    for (uint16_t i = 10; i < 15; i++) {
        addEntry((double)i);

        // en print de tabel elke keer opnieuw uit
        printArray();
    }
}

// Add the main program code into the continuous loop() function
void loop()
{
}


Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 14, 2018, 08:03 am
Project SD kaart is ten einde  :'(. Ik had een oud SD kaartje gebruikt (256Mb). Op enig moment stopte het veranderen van de data op de schijf. Na wat verdieping bleek dat met name die oude kaarten iets van 10.000 W cycles aan kunnen. En als je dan experimenteert met 1.000.000 write cycles wijzigt de data niet meer.
Echter vandaag komt er een module binnen met een 32Kb F-Ram binnen. Die kan 10^14 write cycles aan. behoudt de data voor 151 jaar en is verkrijgbaar als I2C of SPI interface. Eens kijken of dat beter gaat. Ik maak er wel een apart topic van. En inmiddels heb je al IC's met 1Mb (wel prijzig, rond de 20 euri)
Voor de TS kan dit wel interessant zijn omdat ik sowieso er een aparte library maak.
Title: Re: Grafiek op Nextion HMI
Post by: MAS3 on Dec 14, 2018, 11:20 pm
Zul je net zien dat ie er met het 150e jaar mee ophoudt...
Title: Re: Grafiek op Nextion HMI
Post by: Jantje on Dec 15, 2018, 01:47 pm
Zul je net zien dat ie er met het 150e jaar mee ophoudt...
Neen, dat zal je niet zien  :smiley-confuse:
Title: Re: Grafiek op Nextion HMI
Post by: shooter on Dec 16, 2018, 12:18 pm
even een opmerking 0.0 is niet hetzelfde als 0 dus opletten.
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Dec 16, 2018, 01:32 pm
Paul
Waar heb je het over?
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Dec 20, 2018, 10:07 am
Voor dit jaar, bedankt weer voor alle hulp en meedenken.
Hier op school draaien we de laatste uren van dit kalenderjaar.
Ik hoop het project na de vakantie weer op te pakken.

Goede dagen allen!


Gr.
Johan
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Jan 15, 2019, 11:59 am
Zo, het de school is inmiddels weer volop begonnen, dus wij ook. Ik probeer de draad weer even op te pakken.

In de laatste post van Nico zat een werkende sketch om sensordata in een buffer te plaatsen.

Nu wil ik gaan proberen die totale array van een temperatuursensor zichtbaar te maken op het Nextion display. En ik denk maar een beetje hardop, dan kunnen jullie m'n gedachten corrigeren...


Code: [Select]
void get_temp()
{
 
  sensors.requestTemperatures();

  float t = sensors.getTempCByIndex(0);

  //convert to char
  char temperatureCTemp[6];
  dtostrf(t, 5, 1, temperatureCTemp);

  //update display
  tTempC.setText(temperatureCTemp);

 
//update Waveform
  ch0_data = t;
  wGraph.addValue(0, ch0_data);

//volgens mij kan die update van de Waveform ook zo:
//wGraph.addValue(0,t);
//Of niet?

}


Dit is de code die ik had en die werkte. Maar, met deze code begint de grafiek dus steeds leeg en vult ie 'm realtime aan met de waardes die hij uitleest.

Maar hij kan (denk ik) niet in één keer 'plop' die array weergeven.  Dus hij moet (dmv een for-loop??) de array index voor index uitlezen en met addValue toevoegen aan het beeld.

Dan zou je zoiets krijgen, even in eigen woorden:

Code: [Select]
for (arrayindex; arrayindex < ARRAY_SIZE; arrayindex++)
  {
    wGraph.addValue(0, temperatuurwaarde[arrayindex]);
  }




Is dit een beetje in de goede richting gedacht?

Gr.
Johan
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Jan 15, 2019, 07:35 pm
Je denkwijze is juist, je uitvoering niet. Ik zou ff kijken hoe je een for loop maakt Arduino of C/C++
Title: Re: Grafiek op Nextion HMI
Post by: jmnijsse on Jan 16, 2019, 09:27 am
Ja, oke, daarom zei ik 'in eigen woorden' :) . Het ging me even om de vorm.
Ik ga er mee aan de slag.

Verder, en ik denk maar weer even hardop door, zitten we dan nog met de opslag van die waardes.
Als ik temperatuur, geleidbaarheid en pH elk uur bijv. wil opslaan, zit ik per maand aan zo'n 2000 entries van het type float, dus 4 byte x 2000 = 8 kB.
Ik neem aan dat dit op het Flash Memory terecht komt?
Dat zou op een Uno Wifi Rev2 wel moeten passen, aangezien de rest van het programma zo'n 15 kB inneemt en de Rev2 48 kB Flash heeft.

Of mag ik dat zo weer niet zeggen?

Maar als we meer historie willen dan een maand of een hogere meetfrequentie (maar dat is niet echt zinvol), zullen we idd naar die sd oplossing moeten.

Tot voor kort had ik de boel op een UNO uitgeprobeerd en dat ging foutloos, maar met die Uno Wifi Rev2 geeft de sketch een boel foutmeldingen over een SD library. Dus dat wordt het volgende... :-(

Code: [Select]
Arduino: 1.8.5 (Windows 10), Board:"Arduino Uno WiFi Rev2, ATMEGA328"

Build-opties gewijzigd, alles wordt opnieuw gebuild
In file included from C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2Card.h:26:0,

                 from C:\Program Files (x86)\Arduino\libraries\SD\src/utility/SdFat.h:29,

                 from C:\Program Files (x86)\Arduino\libraries\SD\src/SD.h:20,

                 from C:\Users\Beheerder\Documents\Arduino\libraries\ITEADLIB_Arduino_Nextion-master\NexUpload.h:20,

                 from C:\Users\Beheerder\Documents\Arduino\libraries\ITEADLIB_Arduino_Nextion-master\NexUpload.cpp:16:

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:424:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 0},  // D0  0

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:425:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 1},  // D1  1

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:426:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 2},  // D2  2

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:427:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 3},  // D3  3

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:428:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 4},  // D4  4

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:429:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 5},  // D5  5

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:430:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 6},  // D6  6

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:431:12: error: 'PIND' was not declared in this scope

   {&DDRD, &PIND, &PORTD, 7},  // D7  7

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:432:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 0},  // B0  8

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:433:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 1},  // B1  9

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:434:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 2},  // B2 10

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:435:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 3},  // B3 11

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:436:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 4},  // B4 12

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:437:12: error: 'PINB' was not declared in this scope

   {&DDRB, &PINB, &PORTB, 5},  // B5 13

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:438:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 0},  // C0 14

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:439:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 1},  // C1 15

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:440:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 2},  // C2 16

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:441:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 3},  // C3 17

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:442:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 4},  // C4 18

            ^

C:\Program Files (x86)\Arduino\libraries\SD\src/utility/Sd2PinMap.h:443:12: error: 'PINC' was not declared in this scope

   {&DDRC, &PINC, &PORTC, 5}   // C5 19

            ^

Meerdere bibliotheken gevonden voor "SoftwareSerial.h"
Gebruikt: C:\Users\Beheerder\AppData\Local\Arduino15\packages\arduino\hardware\megaavr\1.6.24\libraries\SoftwareSerial
Niet gebruikt: C:\Users\Beheerder\Documents\Arduino\libraries\espsoftwareserial-master
exit status 1
Fout bij het compileren voor board Arduino Uno WiFi Rev2

Dit rapport zou meer informatie bevatten met
"Uitgebreide uitvoer weergeven tijden compilatie"
optie aan in Bestand -> Voorkeuren.
Title: Re: Grafiek op Nextion HMI
Post by: nicoverduin on Jan 16, 2019, 08:12 pm
Flash geheugen is alleen voor het programma en constantes(als je het goed aanpakt). Variabelen gaan in RAM en EEPROM