Probleempje met een Nextion scherm

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Probleempje met een Nextion scherm

Berichtdoor MarcelK » 16 Okt 2016, 15:42

Hallo allemaal,

Vorige week een Nextion 2,8 inch schermpje binnen gekregen en ben er wat mee aan het spelen.
Waar ben ik mee bezig:
Ik heb al geruime tijd een soort Meteostationnetje wat draait op een Mega die van buiten via een Nrf24L01 momenteel 1 temperatuur (ds18b20) en een luchtvochtigheid (dht22) ontvangt.
Binnen heb ik nog een ds18b20 voor de binnentemperatuur, een luchtdruk met bmp180 en relatieve vochtigheid met dht22, en een DS3231 voor de klok.
E.e.a wordt weergegeven op een 7735 tft-schermpje en mbv een HLKRM01 wordt de data naar een database op een webserver verstuurd.

Ik wil het tft-schermpje vervangen door een Nextion en loop daar tegen wat probleempjes aan.

De sketch voor het stationnetje heb ik uitgekleed v.w.b. ontvangst van externe signalen en de interne signalen zijn hardcoded.
Ik heb hier op tafel alleen een Mega met een ds3231 en een nextion-scherm liggen om te testen.

Mijn bedoeling in de nieuwe uitvoering:
Op pagina 0 weergave van datum, tijd en de temperaturen, luchtdruk en luchtvochtigheid
Met drukken op de datum ga je naar pagina 1 waar je de datum gelijk kunt zetten, terug naar pagina 0 d.m.v. drukken op een knopje

Met drukken op de tijd ga je naar pagina 2 waar je de tijd gelijk kunt zettten, ook daar weer een knop naar pagina 0

Het refreshen van de tijd naar pagina 0 wordt uitgezet op het moment dat je op een andere pagina komt anders krijg je errors op de seriele poort te zien en kan je niets meer bedienen.
Echter: als ik een minuutje alleen op pagina 0 sta dan krijg ik na een minuutje in de seriele poort een konstante stroom van "recvRetCommandFinished ok"
te zien, dit zou echter om de 10 seconden moeten zijn, de interval waarmee de data naar het scherm wordt gestuurd.

De klok werd eerst iedere seconde naar het scherm gestuurd maar dan was de ramp nog groter.
De delay onderin de loop heb ik toegevoegd om het geheel iets rustiger te krijgen.
Er is dus duidelijk ergens een probleem met de timing, maar ik zie hem niet.
Iemand wat meer ervaring met Nextion ?

Hieronder mijn testsketch waar ik nu mee werk:

cpp code
#include <Wire.h>            // Needed for I2C
#include <DS3231.h> // Clock shield (I2C=A4,A5) Library: DS3231_TEST
//#include <EEPROM.h> // gebruikt om DST-vlag op te slaan (zomer/wintertijd)
#include "Nextion.h"

/*
Declare a text object [page id:0,component id:1, component name: "t0"].
*/
/* page Home=0*/
//NexText Ndatum = NexText(0, 1, "datum");
//NexText Ntijd = NexText(0, 1, "tijd");
NexText Ntempbin = NexText(0, 1, "tempbin");
NexText Ntempbuit = NexText(0, 1, "tempbuit");
NexText Nrvbin = NexText(0, 1, "rvbin");
NexText Nrvbuit = NexText(0, 1, "rvbuit");
NexText Ndruk = NexText(0, 1, "druk");
NexButton knop = NexButton(0, 18, "b0");
NexButton knop2 = NexButton(0, 19, "b1");


/* page ZetTijd=2*/
NexButton HU = NexButton(2, 3, "b6"); // uren UP
NexButton HD = NexButton(2, 4, "b7"); // uren DOWN
NexButton Home1 = NexButton(1, 19, "b9");
NexButton Home2 = NexButton(2, 15, "b1");


NexPage page0 = NexPage(0, 0, "Home");
NexPage page1 = NexPage(1, 0, "ZetDatum");
NexPage page2 = NexPage(2, 0, "ZetTijd");

char Nbuffer[15] = {0};
char buffer[10] = {0};

NexTouch *nex_listen_list[] =
{
&knop,
&knop2,
&page0,
&page1,
&page2,
&Ntempbin,
&Ntempbuit,
&Nrvbin,
&Nrvbuit,
&Ndruk,
&Home1,
&Home2,
&HU,
&HD,
NULL
};

char dateBuffer[12];
long KlokInterval = 10000; // Klok iedere 10 seconden
long KlokCounter = 0; // I use these variables to store the amount of time it's been since the led was last on, or off.
long DrukInterval = KlokInterval * 6;
long DrukCounter = 0;

long currentPressure;
float buitentemp;
float binnentemp;

float humiditybinnen;
float humiditybuiten;

int Pagina = 0;

DS3231 Clock;
bool Century = true;
bool h12 = false;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
char* dagen[] = {"", "Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"};


void setup() {
nexInit();
Ndatum.attachPop(datumPopCallback, &Ndatum);
Ntijd.attachPop(tijdPopCallback, &Ntijd);
HU.attachPop(HUPopCallback, &HU);
HD.attachPop(HDPopCallback, &HD);
Home1.attachPop(Home1PopCallback, &Home1);
Home2.attachPop(Home2PopCallback, &Home2);
knop.attachPop(knopPopCallback, &knop);
knop2.attachPop(knop2PopCallback, &knop2);
Wire.begin();
}

void datumPopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexText *btn = (NexText *)ptr;
dbSerialPrintln("datumPopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 1; // Vlag voor ga naar Pagina 1
page1.show();
}

void tijdPopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexText *txt = (NexText *)ptr;
dbSerialPrintln("tijdPopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 2; // Vlag voor ga naar Pagina 2
page2.show();
}

void HUPopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("HUPopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
//memset(buffer, 0, sizeof(buffer));

/* Get the text value of button component [the value is string type]. */
//btn->getText(buffer, sizeof(buffer));
//number = atoi(buffer);
//number += 1;
//memset(buffer, 0, sizeof(buffer));
//itoa(number, buffer, 10);
/* Set the text value of button component [the value is string type]. */
//btn->setText(buffer);
}

void knopPopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("knopPopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 1;
dbSerialPrint("Pagina:");
dbSerialPrintln(Pagina);
page1.show();
}

void knop2PopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("knop2PopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 2;
dbSerialPrint("Pagina:");
dbSerialPrintln(Pagina);
page2.show();
}

void HDPopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("HDPopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
//memset(buffer, 0, sizeof(buffer));
/* Get the text value of button component [the value is string type]. */
//btn->getText(buffer, sizeof(buffer));
//number = atoi(buffer);
//number += 1;
//memset(buffer, 0, sizeof(buffer));
//itoa(number, buffer, 10);
/* Set the text value of button component [the value is string type]. */
//btn->setText(buffer);
}

void Home1PopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("Home1PopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 0; // Vlag voor ga naar Pagina 0
page0.show();
}

void Home2PopCallback(void *ptr)
{
uint16_t len;
uint16_t number;
NexButton *btn = (NexButton *)ptr;
dbSerialPrintln("Home2PopCallback");
dbSerialPrint("ptr=");
dbSerialPrintln((uint32_t)ptr);
Pagina = 0; // Vlag voor ga naar Pagina 0
page0.show();
}

void displayClock(void) {
if (millis() - KlokCounter > KlokInterval)
{
// debugging info
dbSerialPrint("KlokPagina:");
dbSerialPrintln(Pagina);
//
if (Pagina == 0) {
KlokCounter = millis();
int second, minute, hour, date, month, year, temperature, day;
second = Clock.getSecond();
minute = Clock.getMinute();
hour = Clock.getHour(h12, PM);
date = Clock.getDate();
month = Clock.getMonth(Century);
year = 2000 + Clock.getYear();
// print DoW
day = Clock.getDoW();
char* dag = dagen[day];
char dateBuffer[16];
sprintf(dateBuffer, "%s %02u-%02u-%04u ", dag, date, month, year);
Ndatum.setText(dateBuffer);
knop.setText(dateBuffer);
// print tijd
sprintf(dateBuffer, "%02u:%02u:%02u", hour, minute, second);
//sprintf(dateBuffer, "%02u:%02u", hour, minute);
knop2.setText(dateBuffer);
}
}
}

void getBinnenTemp(void) {
binnentemp = 21.00;
}


void HumidityBinnen(void) {
humiditybinnen = 67.2;
}

void DisplayData(void) {
// Druk
memset(Nbuffer, 0, sizeof(Nbuffer));
itoa(currentPressure / 100, Nbuffer, 10);
Ndruk.setText(Nbuffer);
// Binnen temperatuur
memset(Nbuffer, 0, sizeof(Nbuffer));
dtostrf(binnentemp, 2, 2, Nbuffer);
Ntempbin.setText(Nbuffer);
// Temp.Voeler buiten //
memset(Nbuffer, 0, sizeof(Nbuffer));
dtostrf(buitentemp, 2, 2, Nbuffer);
Ntempbuit.setText(Nbuffer);
// // RH% Binnen
memset(Nbuffer, 0, sizeof(Nbuffer));
//sprintf(Nbuffer, "%04.2f", humiditybinnen);
dtostrf(humiditybinnen, 2, 2, Nbuffer);
Nrvbin.setText(Nbuffer);
// // RH% Buiten
memset(Nbuffer, 0, sizeof(Nbuffer));
dtostrf(humiditybuiten, 2, 2, Nbuffer);
Nrvbuit.setText(Nbuffer);
}
void getBMP180(void) {
if (millis() - DrukCounter > DrukInterval) // 1x per minuut
{
currentPressure = 101200;
getBinnenTemp();
// Meet rH% binnen
HumidityBinnen();
// Zet alles op scherm
DisplayData();
}
}

void loop() {
nexLoop(nex_listen_list);

//Laat alleen deklok zien
displayClock();
// Meet de luchtdruk, binnentemperatuur, relatieve vochtigheid en print dan alle meetwaarden (druk, luchtvochtigheid, temperatuur) op scherm
getBMP180();
/*****************************************************/
delay(100);
}

Advertisement

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: Probleempje met een Nextion scherm

Berichtdoor MarcelK » 16 Okt 2016, 16:58

Probleem opgelost, ik vergat een millis te resetten ;-)
DrukCounter=millis();

Code: Alles selecteren
void getBMP180(void) {
  if (millis() - DrukCounter > DrukInterval)  // 1x per minuut
  {
   DrukCounter=millis();
    currentPressure = 101200;
    getBinnenTemp();
    // Meet rH% binnen
    HumidityBinnen();
    // Zet alles op scherm
    DisplayData();
  }
}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Probleempje met een Nextion scherm

Berichtdoor nicoverduin » 16 Okt 2016, 17:00

Moet je die drukcounter in getBMP180 niet opnieuw zetten als het interval is verlopen?
verder zou ik:
a) als het een timer is, noemt het ook een timer? Scheelt in de verwarring
b) maak timers ALTIJD unsigned long of uint32_t. Nu zijn ze signed long en dat gaat een keer verkeerd.
c) die delay(100) eruit slopen
d) memset heb je niet nodig in displayData(). dtostrf() geeft altijd al een zero-terminated char array terug. memset zet de array op allemaal '\0' maar is dus eigenlijk zinloos.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 97
Geregistreerd: 05 Nov 2014, 22:04

Re: Probleempje met een Nextion scherm

Berichtdoor MarcelK » 16 Okt 2016, 21:37

nicoverduin schreef:Moet je die drukcounter in getBMP180 niet opnieuw zetten als het interval is verlopen?
verder zou ik:
a) als het een timer is, noemt het ook een timer? Scheelt in de verwarring
b) maak timers ALTIJD unsigned long of uint32_t. Nu zijn ze signed long en dat gaat een keer verkeerd.
c) die delay(100) eruit slopen
d) memset heb je niet nodig in displayData(). dtostrf() geeft altijd al een zero-terminated char array terug. memset zet de array op allemaal '\0' maar is dus eigenlijk zinloos.


Dank voor de opbouwende kritiek Nico.
a) heet nu DrukTimer
b) done
c) done
d) was me niet bekend, is er ook uit nu.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten