Callback functie nextion gebruiken in arduino

algemene C code
Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 20 Aug 2019, 19:26

Als beginnende hobbyist zit ik met de volgende uitdaging waar ik niet uitkom.
Ik ben sinds kort in het bezit van een 3,2" Nextion touchscreen, met de bijbehorende editor. Met de editor kan ik redelijk overweg en krijg mijn layout en knoppen en tekstvelden werkend.
In Arduino heb ik een timer in millis (count-up) gemaakt welke via een char string de uren, minuten en seconden weergeeft op de display.
Op de oude manier plugde ik 3 drukschakelaars op het breadboard en middels digital.read las ik die uit.

Nu mijn probleem:
Door gebruik te maken van de Nextion zijn de fysiek knoppen verdwenen en werk je met software terugkoppeling, hoe lees ik dit uit in een if else loop?

Ik kan een actie uitvoeren dmv. de void Push- of PopCallback void *ptr, maar het lukt me niet in een if statement.
Code: Alles selecteren
/*
 *********************************************************************
   Test sketch t.b.v. het starten en stoppen/pauzeren van een timer.
   Opzet is om een timer te gebruiken om een tijdklok te maken welke
   tussentijds gepauzeerd kan worden,of gestopt. Daarna dan weer
   gestart kan worden met behoud van reeds opgelopen tijd. Dit alles
   via sofware buttons welke gemaakt zijn met de Nextion editor,
   de zgn. Push/Pop Callback buttons.
   Gebruikte hardware:
    - Arduino MEGA 2560 communiceerd op Serial2
    - Nextion Basic 3,2 inch display
 *********************************************************************
*/

#include <Nextion.h>

//*************setup variabelen voor tijd telling ********************
uint32_t timer = 0;       // de timer
uint16_t Hour = 0;
uint16_t Minute = 0;
uint16_t Second = 0;

//*************setup van nextion buttons *****************************
NexButton bstart = NexButton(0, 7, "bstart");  //start de timer
NexButton bstop = NexButton(0, 14, "bbstop");   //stop de timer
NexButton breset = NexButton(0, 11, "breset"); //zet klok weer op nul
/*
 * tekst veld - time.txt voor odo tijd
 */
//*************defineer lees lijst nextion buttons *******************
NexTouch *nex_listen_list[] =
{
  &bstart,
  &bstop,
  &breset,
  NULL
};

//*************defineer buttons als void pointers ********************
void bstartPushCallback()  // start timer
{

}

void bstopPushCallback()   //  stop timer
{

}

void bresetPushCallback(void *ptr)  // reset de tijd
{
  timer = 0;
  Hour = 0;
  Minute = 0;
  Second = 0;

  char Time[11];
  sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
  Serial2.print(F("time.txt=\""));
  Serial2.print(Time);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}


void setup() {              // put your setup code here, to run once:
  //Serial.begin(9600);     // tbv seriele monitor
  nexInit();                // Start communicatie met nextion display

//******************Callback functie initieren***************************
  bstart.attachPush(bstartPushCallback, &bstart);      // "Push" press functie
  bstop.attachPush(bstopPushCallback, &bstop);         // stuurt signaal bij
  breset.attachPush(bresetPushCallback, &breset);      // indrukken button

  char Time[11];
  sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
  Serial2.print(F("time.txt=\""));
  Serial2.print(Time);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void loop()                 // put your main code here, to run repeatedly:
{
  nexLoop(nex_listen_list); // luister naar de buttons uit de luister lijst

  if (bstartPushCallback  == HIGH);   // onbekend hoe uit te voeren
  {
    klok();
  }
  if (bstopPushCallback   == HIGH);   // onbekend hoe uit te voeren
  {
    timer = 0;              // stoppen van de timer
    while (1);              // tot start weer wordt ingedrukt
  }
}

//******************Sub programma voor klok timer ***********************

void klok()
{
   timer = millis();
   delay(1000);                     // voor rustig display

    Second++;                     // seconde verlopen
    if (Second == 60)
    {
      Minute++;                     // minuut verlopen?
      Second = 0;
    }
    if (Minute == 60)
    {
      Hour++;                       // uur verlopen?
      Minute = 0;
    }

//*********************display de tijd op nextion display ***************
    char Time[11];
    sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
    Serial2.print(F("time.txt=\""));
    Serial2.print(Time);
    Serial2.print("\"");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
}


Wie kan me op het goede spoor zetten?

Advertisement

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

Re: Callback functie nextion gebruiken in arduino

Berichtdoor nicoverduin » 20 Aug 2019, 22:14

De callback wordt aangeroepen als je iets doet vanuit de nextion. Daar kanje een globale variabele zetten of resetten. Inde loop weet je dan of de knop is ingedrukt.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 21 Aug 2019, 19:36

Dat begrijp ik en dat lukt ook bijv. bij de reset Callback of als ik een led aan of uit zet.

Maar als ik in de start Callback de timer start en de sub void klok aanspreek, zal toch op een of andere manier de loop verteld moeten worden dat void klok() moet worden aangeroepen totdat stop Callback wordt ingedrukt.
Dat had ik met een if en while in de klok() gezet maar dat werkt niet, Andere optie was de timer in de loop te plaatsten maar dan start deze gelijk met het programma en is niet te stoppen.

Dit is de code die ik uit de void klok() heb gehaald.

Code: Alles selecteren
// variabelen
int start = 0;
int stopt = 0; 


// code deel uit void klok gehaald

 start = bstartPushCallback;   
 if(start == HIGH)
 {
  klok();   
 }
  stopt = bstopPushCallback;
 if(stopt == HIGH)
 {
   klok_stop();   
   loop();
  }
}


hoe plaats ik dit onder de Callback functie?

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

Re: Callback functie nextion gebruiken in arduino

Berichtdoor nicoverduin » 21 Aug 2019, 23:07

Je kan toch een globale boolean aanzetten in die buttonstart functies. En in de loop() deze aftesten. Maar misschien kan je je ook eens verdiepen in de werking van functies en variabelen
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 22 Aug 2019, 07:53

ok, ik ga lezen en proberen, het resultaat zal ik laten weten.
Alvast bedankt voor de hints.

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 23 Aug 2019, 15:48

Nico,

Ik heb je advies opgevolgd en gelezen over de verschillende variabelen en de functie's.
Ik heb mij programma aangepast en de reset eruit gehaald omdat deze werkte en nu gaat nog om het stoppen van de tijd telling.

Daarom heb ik nu 2 globale boolean variabelen gemaakt, die false beginnen.
In de callback functie van startbutton maak ik deze true, in void loop staat nu een if statement verwijzend naar de functie void klok()
en hier heb ik een while lus gemaakt voor zolang start true blijft.

Dit werkt, echter het stoppen van de timer krijg ik nog steeds niet voor elkaar.

Ik heb geprobeerd met timer = 0; statement, met start = false; met stop = true, return; en nog veel meer variatie's.
Als ik de while lus in de functie klok vergroot met een start == false; argument loopt alles vast.


Code: Alles selecteren
/*
 *********************************************************************
   Test sketch t.b.v. het starten en stoppen/pauzeren van een timer.
   Gebruikte hardware:
    - Arduino MEGA 2560 communiceerd op Serial2
    - Nextion Basic 3,2 inch display
 *********************************************************************
*/
#include <Nextion.h>

//*************declareer de globale constante*************************
boolean start = false;
boolean stopt = false;

//*************setup variabelen voor tijd telling ********************
uint32_t timer;           // de timer
uint16_t Hour = 0;
uint16_t Minute = 0;
uint16_t Second = 0;

//*************setup van nextion buttons *****************************
NexButton bstart = NexButton(0, 7, "bstart");  //start de timer
NexButton bstop = NexButton(0, 14, "bbstop");   //stop de timer
/*
   tekst veld - time.txt voor odo tijd
*/
//*************defineer lees lijst nextion buttons *******************
NexTouch *nex_listen_list[] =
{
  &bstart,
  &bstop,
  NULL
};

//*************defineer buttons als void pointers ********************
void bstartPushCallback(void *ptr)  // start timer
{
  start = true;                  // zet timer/klok aan
}

void bstopPushCallback(void *ptr)   //  stop timer
{
  start = false;                  // zet timer/klok stop
}

void setup() {              // put your setup code here, to run once:
  //Serial.begin(9600);     // tbv seriele monitor
 
 start = false;
 stopt = false;

 nexInit();                // Start communicatie met nextion display

  //******************Callback functie initieren***************************
  bstart.attachPush(bstartPushCallback, &bstart);      // "Push" press functie
  bstop.attachPush(bstopPushCallback, &bstop);         // stuurt signaal bij

  //******************Display tijd op display 000:00:00********************
  char Time[11];
  sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
  Serial2.print(F("time.txt=\""));
  Serial2.print(Time);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void loop()                 // put your main code here, to run repeatedly:
{
  nexLoop(nex_listen_list); // luister naar de buttons uit de luister lijst

  if (start == true)
  {
    klok();
  }
  else
  {
    timer = 0 ;
    start = false;
  }
}

//******************Sub programma voor klok timer ***********************

void klok()                 // funcie aanroepen in main loop
{
  while (start == true)
  {
    timer = millis();
    delay(1000);                    // voor rustig display

    Second++;                       // seconde verlopen
    if (Second == 60)
    {
      Minute++;                     // minuut verlopen?
      Second = 0;
    }
    if (Minute == 60)
    {
      Hour++;                       // uur verlopen?
      Minute = 0;
    }

    //*********************display de tijd op nextion display ***************
    char Time[11];
    sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
    Serial2.print(F("time.txt=\""));
    Serial2.print(Time);
    Serial2.print("\"");
    Serial2.write(0xff);
    Serial2.write(0xff);
    Serial2.write(0xff);
  }
}
/*
  void klok_stop()
  {
  if (stopt == 1)
  {
      timer = 0;
      return;
  }
  }
  /*
  void klok_reset()
  {
  return;  //exiting the program and returning to the point where entered the program
  }*/

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

Re: Callback functie nextion gebruiken in arduino

Berichtdoor nicoverduin » 23 Aug 2019, 18:22

De nextion functie nexloop() kijkt of er iets op de nextion is ingedrukt. Dus als jij een while in klok() heb staan komt ie nooit meer terug in de loop en reageert hij niet op je buttons. Jouw gekozen oplossing werkt dus niet en zal je het programma ontwerp moeten veranderen
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 23 Aug 2019, 20:06

ok,

Ik moet dus zorgen dat dat in de klok() de while wordt vervangen door een statement en dat er ieder cycle naar de loop wordt gekeken of er iets is veranderd in de button state?
Maar dan leest de loop toch geen verandering in de button state omdat die maar 1 keer is ingedrukt?

Nu druk ik op start, de loop leest de state en gaat naar klok(), Als ik in klok() een opdracht geef om terug naar de loop te gaan, veranderd er niets en stop de timer, dan heb ik 1 sec tijd, toch.

waar ga ik fout in mijn redenatie?

Berichten: 77
Geregistreerd: 17 Mrt 2016, 17:05
Woonplaats: Julianadorp

Re: Callback functie nextion gebruiken in arduino

Berichtdoor Creator » 23 Aug 2019, 20:14

Ik heb hem:)

in de klok een if statement

if (start == true) // als het waar is
{
loop; // run functie
}
else
{
return; // naar begin programma
}

dit doet het, bedankt om me on track te krijgen Nico.

Ik weet alleen niet of dit de nette manier is om zo te programmeren?


Code: Alles selecteren
/*
 *********************************************************************
   Test sketch t.b.v. het starten en stoppen/pauzeren van een timer.
   Gebruikte hardware:
    - Arduino MEGA 2560 communiceerd op Serial2
    - Nextion Basic 3,2 inch display
 *********************************************************************
*/
#include <Nextion.h>

//*************declareer de globale constante*************************
boolean start = false;

//*************setup variabelen voor tijd telling ********************
uint32_t timer;           // de timer
uint16_t Hour = 0;
uint16_t Minute = 0;
uint16_t Second = 0;

//*************setup van nextion buttons *****************************
NexButton bstart = NexButton(0, 7, "bstart");  //start de timer
NexButton bstop = NexButton(0, 14, "bbstop");   //stop de timer
/*
   tekst veld - time.txt voor odo tijd
*/
//*************defineer lees lijst nextion buttons *******************
NexTouch *nex_listen_list[] =
{
  &bstart,
  &bstop,
  NULL
};

//*************defineer buttons als void pointers ********************
void bstartPushCallback(void *ptr)  // start timer
{
  start = true;                  // zet timer/klok aan
}

void bstopPushCallback(void *ptr)   //  stop timer
{
  start = false;                  // zet timer/klok stop
}

void setup() {              // put your setup code here, to run once:
  //Serial.begin(9600);     // tbv seriele monitor
  start = false;
 
  nexInit();                // Start communicatie met nextion display

  //******************Callback functie initieren***************************
  bstart.attachPush(bstartPushCallback, &bstart);      // "Push" press functie
  bstop.attachPush(bstopPushCallback, &bstop);         // stuurt signaal

  //******************Display tijd op display 000:00:00********************
  char Time[11];
  sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
  Serial2.print(F("time.txt=\""));
  Serial2.print(Time);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void loop()                 // put your main code here, to run repeatedly:
{
  nexLoop(nex_listen_list); // luister naar de buttons uit de luister lijst

  if (start == true)
  {
    klok();
  }
  else
  {
    timer = 0 ;
    start = false;
  }
}

//******************Sub programma voor klok timer ***********************

void klok()                 // funcie aanroepen in main loop
{
  if (start == true)
  {
    loop;
  }
  else
  {
    return;
  } 
    timer = millis();
    delay(1000);                    // voor rustig display

    Second++;                       // seconde verlopen
    if (Second == 60)
    {
      Minute++;                     // minuut verlopen?
      Second = 0;
    }
    if (Minute == 60)
    {
      Hour++;                       // uur verlopen?
      Minute = 0;
    }

  //*********************display de tijd op nextion display ***************
  char Time[11];
  sprintf(Time, "%03d:%02d:%02d", Hour, Minute, Second);
  Serial2.print(F("time.txt=\""));
  Serial2.print(Time);
  Serial2.print("\"");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

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

Re: Callback functie nextion gebruiken in arduino

Berichtdoor nicoverduin » 23 Aug 2019, 22:06

Ik zou die if er compleet uitslopen uit klok. Dat heb je al bepaald in de loop(). Daarna een oplossing zoeken om die delay eruit slopen (zie blink without delay) met een timer(moet in de loop() gebeuren) en dan is ie denk ik we goed
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 13 gasten