Go Down

Topic: Grafiek op Nextion HMI (Read 2010 times) previous topic - next topic

jmnijsse

#15
Dec 12, 2018, 09:31 am Last Edit: Dec 12, 2018, 09:33 am by jmnijsse
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.


nicoverduin

Ik zal van de week ff kijken of er nog een fout in zit ergens. Zou zomaar kunnen:)
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

nicoverduin

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()
{
}


Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

nicoverduin

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.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

MAS3

Zul je net zien dat ie er met het 150e jaar mee ophoudt...
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Jantje

Zul je net zien dat ie er met het 150e jaar mee ophoudt...
Neen, dat zal je niet zien  :smiley-confuse:
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

shooter

even een opmerking 0.0 is niet hetzelfde als 0 dus opletten.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

nicoverduin

Paul
Waar heb je het over?
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

jmnijsse

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

jmnijsse

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

nicoverduin

Je denkwijze is juist, je uitvoering niet. Ik zou ff kijken hoe je een for loop maakt Arduino of C/C++
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

jmnijsse

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.

nicoverduin

Flash geheugen is alleen voor het programma en constantes(als je het goed aanpakt). Variabelen gaan in RAM en EEPROM
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Go Up