Blijvende overload problemen.

Software die niet past in bovenstaande onderwerpen
Berichten: 314
Geregistreerd: 23 Okt 2016, 20:29

Blijvende overload problemen.

Berichtdoor benvo » 22 Sep 2017, 18:33

Mijn sketch voor een aquarium controller heb ik drastisch aangepakt. De grond hiervoor was en is; overload problemen.
De zaken die niet absoluut noodzakelijk zijn heb ik weggesneden.
Zo heb ik de klok instellingen weggehaald en de klok vereenvoudigd. De temperatuur kent alleen nog z'n metingen, waarschuwings lampjes en instellingen verdwenen ook hier.
Het menu ging van 5 pagina's naar twee pagina's. Alleen het noodzakelijke is nog aanwezig. Op zich werkt alles. Maar niet goed. Zo zijn de instellingen van de minimum en maximum pH waarden niet te gebruiken. Op het drukken van de knoppen volgt geen reactie. Ook de pH ijking op pagina 1 komt soms wel maar vaker niet tot stand. Kennelijk zijn dus de overload problemen nog steeds daar. In main loop is te zien dat ik gebruik maak van timers en ook worden zaken alleen weggeschreven bij wijzigingen. Wat kan ik nog meer doen?
Hier is de sketch:

cpp code
#include <Nextion.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
#include <ChannelManager.h>
#include <EEPROM.h>
#include <AnalogPHMeter.h>


//Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

AnalogPHMeter pHSensor(A2);


//Zet de meters in NexGauge pointer

NexGauge lichtrood = NexGauge(0, 1, "z0");
NexGauge lichtblauw = NexGauge(0, 2, "z1");
NexGauge lichtwit = NexGauge (0, 3, "z2");
NexGauge pH = NexGauge(0, 4, "z3");
NexGauge temp = NexGauge(0, 5, "z4");





// ----------------------- Constanten -----------------------

const int MaxChannels = 3; // Maximaal te gebruiken kanaalnummers, indien nodig te wijzigen naar meer of minder
const int MaxPoints = 25; // Maximaal te gebruiken en in te voeren licht intensiteits punten, indie nodig te wijzigen in meer of minder
const int TxPin = 16; //Tx ledPin op 16
const int numReadings = 2; //aantal afgelezen monsters van de pH sensor/electrode.

// RTC
RTC_DS3231 rtc;

// Time
DateTime CurrentTime;

unsigned long temperatuurMillis;


// ----------------------- Variabelen -----------------------

int phInt = 0;
int pHsensorPin = A2; //sensor in
int relaisPin = 8; //relais uit

float maxPH = 7.00;
float minPH = 6.65;

float x = 0; //Wordt gebruikt om temperatuurmetingswaarde in op te slaan.



// ----------------------- Licht -----------------------

// Invul wijze (Uur, Minuut, Intensiteit)
// De verschillen in intensiteit tussen de ingegeven punten zullen gradueel toenemen of afnemen.


Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];


void InitializeChannels(int channels) {


// Channel 0:
int channelNo = 0; // Kanaal 0 wordt in gebruik genomen
int pin = 9; // Kanaal 0 gebruikt pin 9 voor de wit-rode balk
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]); // Initialiseerd kanaal en kiest de FadeMode
Channels[channelNo].AddPoint(8, 30, 0); // Voeg punt toe (Kunt ook decimale waarden gebruiken van 0 tot 1 als dat de voorkeur heeft)
Channels[channelNo].AddPoint(9, 0, 76);
Channels[channelNo].AddPoint(9 , 30, 229);
Channels[channelNo].AddPoint(18, 30, 229);
Channels[channelNo].AddPoint(20, 0, 76);
Channels[channelNo].AddPoint(20, 30, 25);
Channels[channelNo].AddPoint(21, 0, 10);
Channels[channelNo].AddPoint(23, 0, 0);




// Channel 1:In te voeren
channelNo = 1; // Kanaal 1 wordt in gebruik genomen
pin = 10; // Kanaal 1 gebruikt pin 10 voor de wit-blauwe balk
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(9, 0, 0);
Channels[channelNo].AddPoint(9, 15, 76);
Channels[channelNo].AddPoint(9, 30, 229);
Channels[channelNo].AddPoint(18, 30, 229);
Channels[channelNo].AddPoint(19, 30, 127);
Channels[channelNo].AddPoint(20, 30, 51);
Channels[channelNo].AddPoint(22, 0, 25);
Channels[channelNo].AddPoint(23, 0, 0);



// Channel 2:
channelNo = 2; // Kanaal 2 wordt in gebruik genomen
pin = 11; // Kanaal 2 gebruikt pin 11 voor de witte balk
Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
Channels[channelNo].AddPoint(9, 0, 0);
Channels[channelNo].AddPoint(9, 15, 127);
Channels[channelNo].AddPoint(9, 30, 229);
Channels[channelNo].AddPoint(17, 30, 229);
Channels[channelNo].AddPoint(17, 45, 127);
Channels[channelNo].AddPoint(18, 00, 10);
Channels[channelNo].AddPoint(18, 15, 0);




}

// ----------------------- Functies -----------------------


long lastUpdateTime = 0;

// Update licht intensiteit waarden

void UpdateLights(DateTime CurrentTime)
{
long now = Seconds(CurrentTime.hour(), CurrentTime.minute(), CurrentTime.second()); // Zet de huidige tijd naar seconden sinds middernacht
if (now != lastUpdateTime) // Geeft alleen een update als er een duidelijk waarneembaar verschil in tijd.
{
for (int channel = 0; channel < MaxChannels; channel++) // Voor elk kanaal
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Krijgt de geupdate licht intensiteit en schrijft de waarde naar de desbetreffende pin
// update wordt uitgevoerd wanneer de waarde ingelezen wordt




//Bereken het percentage output gebaseerd op de huidige licht intensiteit.

{

int channel = 0;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;

//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int rood = int(angle);
lichtrood.setValue(rood);
}

{
int channel = 1;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;


//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int blauw = int(angle);
lichtblauw.setValue(blauw);
}

{
int channel = 2;
float intensityNow = Channels[channel].GetLightIntensityInt(now);
float maxIntensity = 255;
float a = intensityNow / maxIntensity;
float currentPercent = a * 100;

//omrekening lichtwaarde naar naar graden voor lichtschaal
// licht in percentage is linear
//licht uit (0) angle=-45 degrees
//licht 100% aan angle=+225degrees
//range light % is 100
//range of angle is 270(225+45)
//float intensity
float angle = (currentPercent / 100.0 * 270.0) - 45.0;
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
int wit = int(angle);
lichtwit.setValue(wit);
}
}
}
lastUpdateTime = now;
}


// Converteerd de uren:minuten naar seconden sinds middernacht

long Seconds(int hours, int minutes, int seconds) {
return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

//-------------------- pagina 1 -------------------------------

NexButton b2 = NexButton(1, 2, "b2"); //knop plus maximum pH
NexButton b3 = NexButton(1, 3, "b3"); //knop min maximum pH
NexButton b4 = NexButton(1, 4, "b4"); //knop plus minimum pH
NexButton b5 = NexButton(1, 5, "b5"); //knop min minimum pH
NexButton for_c = NexButton(1, 6, "b6"); //knop "Clear"
NexButton for_l = NexButton(1, 7, "b7"); //knop "pH 4.0"
NexButton for_m = NexButton(1, 8, "b8"); //knop "pH 7.0"
NexButton for_h = NexButton(1, 9, "b9"); //knop "pH 10.0"



//Declaratie tekstvelden

//Op de homepagina 0

NexText t0 = NexText(0, 11, "t0"); //uren, minuten en seconden
NexText t1 = NexText(0, 12, "t1"); //dag, maand en jaar


//Op pagina 1

NexText t11 = NexText(1, 11, "t11"); //maximum pH
NexText t12 = NexText(1, 12, "t12"); //minimum pH
NexText t10 = NexText(1, 10, "t10"); //pH kalibratie waarde


//buffer definities

char buffer_pHtemp[10]; //buffer pH sensor
char buffer_maxPH[10]; //buffer pH maximum instel waardes
char buffer_minPH[10]; //buffer pH minimum instel waardes

// Registeer een button object op de touch event lijst.

NexTouch *nex_listen_list[] =
{
&b2,
&b3,
&b4,
&b5,
&for_c,
&for_l,
&for_m,
&for_h,
&t0,
&t1,
&t10,
&t11,
&t12,
NULL
};





//------------ pagina 1 Instellingen en kalibratie pH ----------------



void b2PopCallback(void*ptr)
{
maxPH += 0.01;
dtostrf(maxPH, 5, 2, buffer_maxPH);
t11.setText(buffer_maxPH);
}

void b3PopCallback(void*ptr)
{
maxPH -= 0.01;
dtostrf(maxPH, 5, 2, buffer_maxPH);
t11.setText(buffer_maxPH);
}

void b4PopCallback(void*ptr)
{
minPH += 0.01;
dtostrf(minPH, 5, 2, buffer_minPH);
t12.setText(buffer_minPH);
}

void b5PopCallback(void*ptr)
{
minPH -= 0.01;
dtostrf(minPH, 5, 2, buffer_minPH);
t12.setText(buffer_minPH);
}

void PopCallback_c(void*ptr)
{
pHSensor.calibrationClear(); //Clear
}

void PopCallback_l(void*ptr)
{
pHSensor.calibrationLow(4.000f); //pH 4
}

void PopCallback_m(void*ptr)
{
pHSensor.calibrationMid(7.000f); //pH 7
}

void PopCallback_h(void*ptr)
{
pHSensor.calibrationHigh(10.000f); //pH 10
}








// ----------------------- Setup -----------------------
void setup()
{
Wire.begin();

// Klok
rtc.begin();


//Zet de baudrate nodig voor de communicatie met het Nextion scherm
nexInit();




//Merkt de losgelaten knop op.

b2.attachPop(b2PopCallback, &b2);
b3.attachPop(b3PopCallback, &b3);
b4.attachPop(b4PopCallback, &b4);
b5.attachPop(b5PopCallback, &b5);

for_c.attachPop(PopCallback_c, &for_c);
for_l.attachPop(PopCallback_l, &for_l);
for_m.attachPop(PopCallback_m, &for_m);
for_h.attachPop(PopCallback_h, &for_h);




//Pin is uitgang
pinMode(TxPin, OUTPUT); //TxPin wordt als uitgang gebruikt.
pinMode(relaisPin, OUTPUT); //relaisPin wordt als uitgang gebruikt

pinMode(pHsensorPin, INPUT); //pHsensorPin wordt als ingang gebruikt


sensors.begin(); //Start de Temperatuurlibrary/sensor


pHSensor.initialize(); //Start de pH sensor


// Initialiseer de kanaal schema's
InitializeChannels(MaxChannels);

rtc.adjust(DateTime(__DATE__, __TIME__)); // Stelt de RTC tijd in op de sketch samenstelling, wordt gebruikt voor één run. De tijd wordt gereset op het moment dat een apparaat wordt gereset!




}


// ----------------------- Loop -----------------------


void loop(void)
{

nexLoop(nex_listen_list);




// Zet de maximum en minimum pH waardes op het pagina 4 scherm.
float vorigemaxPH;
if (maxPH != vorigemaxPH) //schrijft alleen bij wijziging weg
{
dtostrf(maxPH, 5, 2, buffer_maxPH);
t11.setText(buffer_maxPH);
vorigemaxPH = maxPH;
}
float vorigeminPH;
if (minPH != vorigeminPH) //schrijft alleen bij wijziging weg.
{
dtostrf(minPH, 5, 2, buffer_minPH);
t12.setText(buffer_minPH);
vorigeminPH = minPH;
}



// Stelt in op de huidige tijd

CurrentTime = rtc.now();

//------------- temperatuurmeting -----------------

unsigned long huidigeTemp = millis();
if (huidigeTemp - temperatuurMillis >= 6000)
{
sensors.requestTemperatures(); // Zend het commando om de temperatuurmeting te halen.
x = sensors.getTempCByIndex(0); //Zet de verkregen waarde in x



//Omrekening waarde naar graden voor de temperatuurschaal
// Temperature (linear)
// temperature = 0, angle = -45 degrees
// temperature = 50, angle = +225 degrees.
// range of temperature is 50
// range of angle is 270 (225 + 45)
//float temperature;
float angle = (x / 50.0 * 270.0) - 45.0;
int degrees = int(angle);
temp.setValue(degrees);
if (angle < 0) //Als de stand lager is dan 0 en dus negatief wordt.
{
angle += 360; //maak een positief aantal graden voor de meter
}
temperatuurMillis = huidigeTemp;
}



//--------------------- pH waarden meting --------------------------

static unsigned long t = millis();
if (millis() - t > 1000)
{


float pHvalue = (pHSensor.singleReading().getpH());

dtostrf(pHvalue, 5, 2, buffer_pHtemp); //conversie pH value naar een string
t10.setText(buffer_pHtemp);

if (pHvalue >= maxPH) //Als de gemeten pH waarde groter is dan de maxPH waarde
{
digitalWrite(relaisPin, LOW); //relais is aangetrokken, magneetklep open. CO2 toevoer.
}

if (pHvalue <= minPH) //Als de gemeten pH waarde kleiner is dan de minPH waarde
{
digitalWrite(relaisPin, HIGH); //relais is open, magneetklep gesloten. Geen CO2 toevoer.
}


//omrekening naar ronde meter

phInt = pHvalue * 100; // alles met 100 vermenigvulden om een heel getal te hebben
signed int graden = map (phInt, 600, 850, -45, 225); // nu heb je de graden

if (graden < 0) // Als de stand lager is als nul en dus negatief wordt.
{
graden += 360; // maak een positief aantal graden voor de meter
}

pH.setValue(graden); //zet de meternaald
t = millis();
}


// Tijd en datum update

DateTime now = rtc.now();
char tijdString[9];
static char vorigeTijd[9];

sprintf(tijdString, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());

if (strcmp(tijdString, vorigeTijd) != 0)
{
t0.setText (tijdString); //Tijd update
strcpy(vorigeTijd, tijdString); //Bewaar vorigeTijd voor de volgende vergelijking
}


char datumString[9];
static char vorigeDatum[9];

sprintf(datumString, "%02d-%02d-%02d", now.day(), now.month(), now.year());

if (strcmp(datumString, vorigeDatum) != 0)
{
t1.setText (datumString); //Datum update
strcpy(vorigeDatum, datumString); //Bewaar vorigeDatum voor de volgende vergelijking
}



// Update lights

UpdateLights(CurrentTime);
}


Groet,
Ben.

Advertisement

Gebruikers-avatar
Berichten: 1796
Geregistreerd: 06 Aug 2016, 01:03

Re: Blijvende overload problemen.

Berichtdoor Koepel » 22 Sep 2017, 20:47

Het plaatje hieronder is je sketch. De rode delen probeer je duizenden keren per seconde te doen en de oranje delen misschien ook.
Waarom ?

Afbeelding

Berichten: 314
Geregistreerd: 23 Okt 2016, 20:29

Re: Blijvende overload problemen.

Berichtdoor benvo » 23 Sep 2017, 16:17

In het verlichting deel staat een deel die alleen bij wijziging een update toepast? (void update lights) (rood) "Geeft alleen een update als er een duidelijk waarneem verschil is in tijd" (zie commentaar)
MaxpH en minpH zou ook maar één maal weggeschreven moeten worden. (rood)"Schrijft alleen bij wijziging weg" (zie commentaar)
Het oranje, daarna, deel doet alleen iets als er aan de if voldaan wordt?

De pH meting gebeurd nu éénmaal per seconde waar ook weer een timer zorg voor draagt.

Zo begrijp ik dit en daarom staat alles er zo. Ik zou dus eigenlijk niet weten hoe dit anders kan of zou moeten. Ik neem dus aan dat je me ergens op wijst. Alleen, ik zie het niet hoe ik dit zou kunnen of moeten wijzigen. Een zet in de goede richting zou ik dus zeer op prijs stellen, Koepel!

Dank voor je reactie!

Groet,
Ben.

Gebruikers-avatar
Berichten: 1796
Geregistreerd: 06 Aug 2016, 01:03

Re: Blijvende overload problemen.

Berichtdoor Koepel » 24 Sep 2017, 07:13

Oeps, ik was weer te snel met mijn reactie. Ik zag een paar dingen over het hoofd. Sorry. Shame on me :oops: Eigenlijk zou ik mijn reactie weg moeten halen.

Vanwege alle libraries die gebruikt worden, is het bijna onmogelijk dat ik zelf de sketch op een Arduino laat draaien. Dan zou ik vanzelf kunnen zien met een logic analyzer wat de seriële data van/naar het display is.

Mijn project met een Nextion display staat altijd aan en het werkt. Dus zo langzamerhand vergeet ik een beetje hoe die Nextion communicatie ook al weer ging :?


In setup() kun je "pinMode(pHsensorPin, INPUT);" weglaten. De pinMode() wordt alleen gebruiken voor digitale pinnen. Je kunt gewoon analogRead() doen, zonder eerst die pin als input te zetten.

Een globale variabele (de variabelen gedeclareerd in het bovenste deel van de sketch) behoudt zijn waarde, ongeacht of in en uit functies gesprongen wordt.
Wil je een variabele lokaal (binnen een functie) gebruiken die toch zijn waarde behoudt, dan maak je die static.
Dus in de loop(), heb je float vorigemaxPH; en float vorigeminPH; als tijdelijke variabelen. Dus het vergelijken met de vorige waarde gaat niet op. Maak ze beide globaal of zet er "static" voor.

Is now.year() 4 cijfers ? En "%02d" heeft "2" als minimaal aantal tekens ? Dan zouden je arrays voor de datum te klein zijn. Dit zou ik even uit moeten proberen, maar dat is te lastig :(
Kun je die buffers voor de zekerheid 16 maken ?
Code: Alles selecteren
  char datumString[16];
  static char vorigeDatum[16];


Er zijn dus drie kanalen voor het licht.
Je gaat voor elk kanaal een "lichtrood.setValue(rood);" en een "lichtblauw.setValue(blauw);" en een "lichtwit.setValue(wit);" doen.
Ik neem aan dat je die alleen voor dat ene kanaal wilt doen.
Je kunt voor elk stukje zetten "if ( channel == 0)" enzovoorts. Of met een switch-case statement kijken welk "channel" op dat moment gebruikt wordt.

Verder is het nodig om alleen gegevens te sturen naar de pagina op het scherm die op dat moment aktief is. Volgens mij ontstaat er anders een foutmelding, en dat zorgt alleen maar voor onnodig gebruik van de seriële poort van/naar het display.
Doe je dit op een Arduino Mega 2560 ? En gebruik je een hardware seriële poort voor het display ?

Gebruikers-avatar
Berichten: 1796
Geregistreerd: 06 Aug 2016, 01:03

Re: Blijvende overload problemen.

Berichtdoor Koepel » 24 Sep 2017, 11:42

Ik heb toch maar even een kleine test sketch gemaakt voor de Adafruit RTClib.
Volgens mij is het beter op deze manier:
Code: Alles selecteren
// Adafruit RTClib via Library Manager.
#include <RTClib.h>

RTC_Millis rtc;     // tijdelijk even een test zonder RTC chip.

void setup()
{
  Serial.begin(9600);
  Serial.println("Started");
  rtc.begin( DateTime(F(__DATE__), F(__TIME__)));
}

void loop(void)
{
  DateTime now = rtc.now();

  char tijdString[16];
  static char vorigeTijd[16];
  sprintf(tijdString, "%02d:%02d:%02d", (int) now.hour(), (int) now.minute(), (int) now.second());
  Serial.print(tijdString);
  Serial.print(", ");

  char datumString[16];
  static char vorigeDatum[16];
  sprintf(datumString, "%02d-%02d-%04d", (int) now.day(), (int) now.month(), (int) now.year());
  Serial.println(datumString);

  delay(1000);
}


Heb je de datum en tijd wel eens laten zien op het display of de seriële monitor ? Volgens mij heb je niet de juiste tijd en datum. De correcte manier om de compiler tijd en datum te gebruiken is op deze manier: "rtc.begin( DateTime(F(__DATE__), F(__TIME__)));". Heb je ergens een voorbeeld gezien om de manier zoals jij het doet ?

Bij de parameters van "sprintf" heb ik overal "(int)" er voor gezet. De Adafruit RTClib geeft namelijk een byte terug in plaats van een integer. Dat is een nogal curieuze optimalisatie van Adafruit. Maar goed, daarom heb ik dus overal "(int)" er bij gezet.

Door de verkeerde tijd en datum en doordat het jaartal 4 cijfers is, ontstond er er een bufferoverflow in vier arrays.

Verder viel mij nog op dat je twee keer een variabele "CurrentTime" hebt. Dat is erg verwarrend. Je hebt een keer als globale variabele en een keer als parameter van een funtie.

Berichten: 314
Geregistreerd: 23 Okt 2016, 20:29

Re: Blijvende overload problemen.

Berichtdoor benvo » 24 Sep 2017, 16:27

Afbeelding
Afbeelding

Dit zijn de twee pagina's die ik gebruik, Koepel. Mijn Nextion scherm wordt gebruikt met een Arduino Mega.
Alle suggesties die je doet heb ik toegepast. Behalve een deel dat ik eigenlijk niet goed begrijp maar waar naar mijn verwachting wel eens problemen zouden kunnen liggen. De verlichting.

Jou alinea:
"Er zijn dus drie kanalen voor het licht.
Je gaat voor elk kanaal een "lichtrood.setValue(rood);" en een "lichtblauw.setValue(blauw);" en een "lichtwit.setValue(wit);" doen.
Ik neem aan dat je die alleen voor dat ene kanaal wilt doen.
Je kunt voor elk stukje zetten "if ( channel == 0)" enzovoorts. Of met een switch-case statement kijken welk "channel" op dat moment gebruikt wordt."

Elk kanaal stuurt, apart, een ledbalk aan, de wit-rode, de wit-blauwe en een witte balk. Maar in het programma staat al een deel dat ook voor elk kanaal apart bekijkt of er een update nodig is. Deze regel:

" for (int channel = 0; channel < MaxChannels; channel++) // Voor elk kanaal
{
analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now)); // Krijgt de geupdate licht intensiteit en schrijft de waarde naar de desbetreffende pin
// update wordt uitgevoerd wanneer de waarde ingelezen wordt"

Zou het goed zijn om in de main loop om de laatste regel, "UpdateLights(CurrentTime);" een timer te zetten? Deze regel kan ook, bijvoorbeeld, één keer om de 30 seconden kijken of er een update nodig is?

Als laatste:
De tijd en datum op mijn scherm zijn altijd juist. Wel is het zo dat wanneer de spanning eraf is geweest de klok niet meer de juiste tijd geeft. Nu heb ik altijd begrepen dat in de door jou aangehaalde regel één keer de datum en tijd ingevuld zou moeten worden, vervolgens zou de klok, mits voorzien van een batterij, altijd de juiste tijd moeten aangeven. Dit heb ik dan ook wel gedaan, kennelijk niet goed?

Dank voor de vele reacties die ik al kreeg van je. Ik moet zeggen dat ik daar al veel van leerde maar er blijft altijd leertijd over, zo blijkt.

Groet,
Ben.

Berichten: 314
Geregistreerd: 23 Okt 2016, 20:29

Re: Blijvende overload problemen.

Berichtdoor benvo » 24 Sep 2017, 17:08

Update vorige reactie:
De ingevoerde suggesties hebben geen merkbaar effect.

Wanneer ik de datum, now.year[16] geef i.p.v. 9 verdwijnt de datum na het schakelen tussen pagina 0 en 1.

Wanneer ik vorigemaxPH en vorigeminPH globaal maak verschijnt er niets op mijn scherm. Zet ik er static voor wordt er ook niets op de Nextion gezet zoals wel gebeurd in de oude situatie. Dat snap ik niet. Ik heb even nagelezen wat static precies doet, je hebt volkomen gelijk! Blijft, hoe kan dit?

Verder heb ik als proef een timer van 10 seconden op "updatelights" gezet. Dat levert in ieder geval wel wat verbetering op, de knoppen reageren, voor het eerst nu, na wel herhaaldelijk drukken.

Gebruikers-avatar
Berichten: 1796
Geregistreerd: 06 Aug 2016, 01:03

Re: Blijvende overload problemen.

Berichtdoor Koepel » 25 Sep 2017, 04:47

Beste benvo, ik denk dat de sketch ongeveer 10 keer ingewikkelder is dan wat jij kunt, en ik denk dat de sketch nog maar halverwege is op weg naar een werkende sketch. Hoe gaat dit ooit goed komen ?

De arrays voor de datum zijn in ieder geval te klein. Voor de zekerheid zou ik ook maar die van de tijd vergroten.
Ik heb dit al twee keer laten zien, dus ik weet niet of een derde keer nog veel uit maakt.
Code: Alles selecteren
  char tijdString[16];
  static char vorigeTijd[16];
  ...

  char datumString[16];
  static char vorigeDatum[16];
  ...


Om een vorige waarde te onthouden is het echt nodig dat float vorigemaxPH; en float vorigeminPH; globaal of static zijn. Het is anders onmogelijk om te vergelijken met een vorige waarde. Dat daarna er iets niet meer werkt, dat doet er niet toe. Dat is het volgende probleem om op te lossen.

Binnen de functie "UpdateLights()", binnen de for-loop met channel ga je die waarde van channel nog zitten wijzigen. Dat is niet de bedoeling.
In die functie "UpdateLight()" stuur je negen keer iets naar het scherm. Dat is ook niet de bedoeling.

Zie je die __DATE__ en __TIME__ ?
Als je die in je sketch gebruikt, dan vult de compiler daar de datum en tijd van het compileren in.
Die kun je eenmalig gebruiken om de tijd goed te zetten. Daarna kun je die regel verwijderen (maak er bijvoorbeeld commentaar van) en dan loopt de tijd op de RTC chip.

Berichten: 314
Geregistreerd: 23 Okt 2016, 20:29

Re: Blijvende overload problemen.

Berichtdoor benvo » 25 Sep 2017, 13:53

Hallo Koepel,

Om de een of andere manier schijnt men te denken dat hier sprake is van eigenzinnigheid. Althans dat proef ik in de manier van schrijven. Dat is beslist niet het geval!
Even langs je opmerkingen:
De sketch is nu verder dan dat ik nu zelf had gedacht, ik kom daar zo op terug.
De char tijdString[16] werkt niet! Zodra ik dit doe, en ik heb dit echt vaker dan een keer geprobeerd, verschijnt er géén tijd of datum meer op het beeld. Daar komt nog bij dat Nico van Duin mij leerde dat er als volgt geredeneerd zou moeten worden; HH:MM:SS zijn 8 plaatsen plus een nul, dat zijn negen plekken. En dit werkt wel.

Dat er static toegevoegd moet zijn om te werken , dat klopt zoals ik ook al opmerkte in mijn mail update! Je hebt volkomen gelijk! Alleen ook dit werkt niet daarom was en is de vraag waarom niet. Of zoals je zelf zegt, dat is de volgende fout.

De verlichting, daar schreef ik al over dat ik dit niet begreep en vroeg om verduidelijking! Als extra schreef ik bovendien dat er een regel instaat waarom de kanalen afzonderlijk afgehandeld worden. Geen eigenwijsheid, onduidelijkheid!

Voor de datum tijd regel: Dit heb ik exact zo gedaan! Er zit dan een klein verschil in tijd nl de compilatietijd. Om de een of de andere redenen houdt mijn klok dit niet vast. (Zit wel een goede, oplaadbare, batterij in)

Nu even terugkomend op de sketch. De maxPH en minPH cijfers verwerk ik nu anders, buiten de loop. Met de toegepaste timers leidt dit tot werkende knoppen, twee keer indrukken blijkt afdoende, een hele verbetering dus! Om de cijfers in de tekstvelden te laten zien moet er wel eerst een knop ingedrukt worden, hetgeen me bevreemd. Maar dat moet kennelijk op een andere manier opgelost worden.

Wellicht ten overvloede! Ik ben uiterst tevreden met de hulp die ik hier kreeg van [u]alle[/u] mensen! Ook is het erg fijn dat mensen hun eigen tijd hierin willen steken én veel moeite doen om iets uit te leggen. Voor beginners is het niet altijd eenvoudig om dit op een goede manier op te pakken. Wat voor een kenner logisch is behoeft dat niet zo te zijn voor ons. Soms maken jullie ook opmerkingen om iets te doen wat bepaalde gevolgen heeft, voor jullie is het vaak logisch dat daar iets bij hoort. Alweer voor ons, waar die gevolgtrekking helemaal niet van toepassing is. Graag wil ik duidelijk maken dat ik al veel geleerd heb, dank zij jullie, maar ook bereidt ben om deze kennis uit te breiden. Waar ik ze dan ook kan halen!

Mijn gemeende dank, Koepel!

cpp code
Code: Alles selecteren

#include <Nextion.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <RTClib.h>
#include <ChannelManager.h>
#include <EEPROM.h>
#include <AnalogPHMeter.h>


//Data aansluiting is aangesloten op pin 7 on the Arduino.
#define ONE_WIRE_BUS 7

// Legt een oneWire aan om te communiceren met elk oneWire apparaat.
OneWire oneWire(ONE_WIRE_BUS);

// Verbind onze oneWire referentie aan Dallas Temperature.
DallasTemperature sensors(&oneWire);

AnalogPHMeter pHSensor(A2);


//Zet de meters in NexGauge pointer

NexGauge lichtrood = NexGauge(0, 1, "z0");
NexGauge lichtblauw = NexGauge(0, 2, "z1");
NexGauge lichtwit = NexGauge (0, 3, "z2");
NexGauge pH = NexGauge(0, 4, "z3");
NexGauge temp = NexGauge(0, 5, "z4");





// ----------------------- Constanten -----------------------

const int MaxChannels = 3;       // Maximaal te gebruiken kanaalnummers, indien nodig te wijzigen naar meer of minder
const int MaxPoints = 25;        // Maximaal te gebruiken en in te voeren licht intensiteits punten, indie nodig te wijzigen in meer of minder
const int TxPin = 16;            //Tx ledPin op 16
const int numReadings = 2;      //aantal afgelezen monsters van de pH sensor/electrode.

// RTC
RTC_DS3231 rtc;

// Time
DateTime CurrentTime;

unsigned long temperatuurMillis;
unsigned long tijdMillis;
unsigned long updateMillis;


// ----------------------- Variabelen -----------------------

int phInt = 0;
int pHsensorPin = A2;                 //sensor in
int relaisPin = 8;                    //relais uit

float maxPH = 7.00;
float minPH = 6.65;

float x = 0;                           //Wordt gebruikt om temperatuurmetingswaarde in op te slaan.



// ----------------------- Licht -----------------------

// Invul wijze (Uur, Minuut, Intensiteit)
// De verschillen in intensiteit tussen de ingegeven punten zullen gradueel toenemen of afnemen.


Channel Channels[MaxChannels];
Point Points[MaxChannels][MaxPoints];


void InitializeChannels(int channels) {


  // Channel 0:
  int channelNo = 0;                               // Kanaal 0 wordt in gebruik genomen
  int pin = 9;                                      // Kanaal 0 gebruikt  pin 9 voor de wit-rode balk
  Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);      // Initialiseerd kanaal en kiest de FadeMode
  Channels[channelNo].AddPoint(8, 30, 0);           // Voeg punt toe (Kunt ook decimale waarden gebruiken van 0 tot 1 als dat de voorkeur heeft)
  Channels[channelNo].AddPoint(9, 0, 76);
  Channels[channelNo].AddPoint(9 , 30, 229);
  Channels[channelNo].AddPoint(18, 30, 229);
  Channels[channelNo].AddPoint(20, 0, 76);
  Channels[channelNo].AddPoint(20, 30, 25);
  Channels[channelNo].AddPoint(21, 0, 10);
  Channels[channelNo].AddPoint(23, 0, 0);




  // Channel 1:In te voeren
  channelNo = 1;                                // Kanaal 1 wordt in gebruik genomen
  pin = 10;                                     // Kanaal 1 gebruikt pin 10 voor de wit-blauwe balk
  Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
  Channels[channelNo].AddPoint(9, 0, 0);
  Channels[channelNo].AddPoint(9, 15, 76);
  Channels[channelNo].AddPoint(9, 30, 229);
  Channels[channelNo].AddPoint(18, 30, 229);
  Channels[channelNo].AddPoint(19, 30, 127);
  Channels[channelNo].AddPoint(20, 30, 51);
  Channels[channelNo].AddPoint(22, 0, 25);
  Channels[channelNo].AddPoint(23, 0, 0);



  // Channel 2:
  channelNo = 2;                              // Kanaal 2 wordt in gebruik genomen
  pin = 11;                                   // Kanaal 2 gebruikt pin 11 voor de witte balk
  Channels[channelNo] = Channel(pin, MaxPoints, fademode_linear, Points[channelNo]);
  Channels[channelNo].AddPoint(9, 0, 0);
  Channels[channelNo].AddPoint(9, 15, 127);
  Channels[channelNo].AddPoint(9, 30, 229);
  Channels[channelNo].AddPoint(17, 30, 229);
  Channels[channelNo].AddPoint(17, 45, 127);
  Channels[channelNo].AddPoint(18, 00, 10);
  Channels[channelNo].AddPoint(18, 15, 0);




}

// ----------------------- Functies -----------------------


long lastUpdateTime = 0;

// Update licht intensiteit waarden

void UpdateLights(DateTime CurrentTime)
{
  long now = Seconds(CurrentTime.hour(), CurrentTime.minute(), CurrentTime.second());         // Zet de huidige tijd naar seconden sinds middernacht
  if (now != lastUpdateTime)                                                                 // Geeft alleen een update als er een duidelijk waarneembaar verschil in tijd.
  {
    for (int channel = 0; channel < MaxChannels; channel++)                                    // Voor elk kanaal
    {
      analogWrite(Channels[channel].GetPin(), Channels[channel].GetLightIntensityInt(now));   // Krijgt de geupdate licht intensiteit en schrijft de waarde naar de desbetreffende pin
      // update wordt uitgevoerd wanneer de waarde ingelezen wordt




      //Bereken  het percentage output gebaseerd op de huidige licht intensiteit.

      {

        int channel = 0;
        float intensityNow = Channels[channel].GetLightIntensityInt(now);
        float maxIntensity = 255;
        float a = intensityNow / maxIntensity;
        float currentPercent = a * 100;

        //omrekening lichtwaarde naar naar graden voor lichtschaal
        // licht in percentage is linear
        //licht uit (0) angle=-45 degrees
        //licht 100% aan angle=+225degrees
        //range light % is 100
        //range of angle is 270(225+45)
        //float intensity
        float angle = (currentPercent / 100.0 * 270.0) - 45.0;
        if (angle < 0)                          //Als de stand lager is dan 0 en dus negatief wordt.
        {
          angle += 360;                         //maak een positief aantal graden voor de meter
        }
        int rood = int(angle);
        lichtrood.setValue(rood);
      }

      {
        int channel = 1;
        float intensityNow = Channels[channel].GetLightIntensityInt(now);
        float maxIntensity = 255;
        float a = intensityNow / maxIntensity;
        float currentPercent = a * 100;


        //omrekening lichtwaarde naar naar graden voor lichtschaal
        // licht in percentage is linear
        //licht uit (0) angle=-45 degrees
        //licht 100% aan angle=+225degrees
        //range light % is 100
        //range of angle is 270(225+45)
        //float intensity
        float angle = (currentPercent / 100.0 * 270.0) - 45.0;
        if (angle < 0)                            //Als de stand lager is dan 0 en dus negatief wordt.
        {
          angle += 360;                           //maak een positief aantal graden voor de meter
        }
        int blauw = int(angle);
        lichtblauw.setValue(blauw);
      }

      {
        int channel = 2;
        float intensityNow = Channels[channel].GetLightIntensityInt(now);
        float maxIntensity = 255;
        float a = intensityNow / maxIntensity;
        float currentPercent = a * 100;

        //omrekening lichtwaarde naar naar graden voor lichtschaal
        // licht in percentage is linear
        //licht uit (0) angle=-45 degrees
        //licht 100% aan angle=+225degrees
        //range light % is 100
        //range of angle is 270(225+45)
        //float intensity
        float angle = (currentPercent / 100.0 * 270.0) - 45.0;
        if (angle < 0)                               //Als de stand lager is dan 0 en dus negatief wordt.
        {
          angle += 360;                              //maak een positief aantal graden voor de meter
        }
        int wit = int(angle);
        lichtwit.setValue(wit);
      }
    }
  }
  lastUpdateTime = now;
}


// Converteerd de uren:minuten naar seconden sinds middernacht

long Seconds(int hours, int minutes, int seconds) {
  return ((long)hours * 60 * 60) + (minutes * 60) + seconds ;
}

//-------------------- pagina 1 -------------------------------

NexButton b2 = NexButton(1, 2, "b2");                 //knop plus maximum pH
NexButton b3 = NexButton(1, 3, "b3");                 //knop min maximum pH
NexButton b4 = NexButton(1, 4, "b4");                 //knop plus minimum pH
NexButton b5 = NexButton(1, 5, "b5");                 //knop min minimum pH
NexButton for_c = NexButton(1, 6, "b6");              //knop "Clear"
NexButton for_l = NexButton(1, 7, "b7");              //knop "pH 4.0"
NexButton for_m = NexButton(1, 8, "b8");              //knop "pH 7.0"
NexButton for_h = NexButton(1, 9, "b9");              //knop "pH 10.0"



//Declaratie tekstvelden

//Op de homepagina 0

NexText t0 = NexText(0, 11, "t0");                     //uren, minuten en seconden
NexText t1 = NexText(0, 12, "t1");                     //dag, maand en jaar


//Op pagina 1

NexText t11 = NexText(1, 11, "t11");                    //maximum pH
NexText t12 = NexText(1, 12, "t12");                    //minimum pH
NexText t10 = NexText(1, 10, "t10");                    //pH kalibratie waarde


//buffer definities

char buffer_pHtemp[10];                                  //buffer pH sensor
char buffer_maxPH[10];                                   //buffer pH maximum instel waardes
char buffer_minPH[10];                                   //buffer pH minimum instel waardes

// Registeer een button object op de touch event lijst.

NexTouch *nex_listen_list[] =
{
  &b2,
  &b3,
  &b4,
  &b5,
  &for_c,
  &for_l,
  &for_m,
  &for_h,
  &t0,
  &t1,
  &t10,
  &t11,
  &t12,
  NULL
};





//------------ pagina 1 Instellingen en kalibratie pH ----------------

void t11PopCallback(void*ptr)                                            //Drukt maxPH af.
{
  dtostrf(maxPH, 5, 2, buffer_maxPH);
  t11.setText(buffer_maxPH);
}

void t12PopCallback(void*ptr)                                            //Drukt minPH af.
{
  dtostrf(minPH, 5, 2, buffer_minPH);
  t12.setText(buffer_minPH);
}

void b2PopCallback(void*ptr)
{
  maxPH += 0.01;
  dtostrf(maxPH, 5, 2, buffer_maxPH);
  t11.setText(buffer_maxPH);
}

void b3PopCallback(void*ptr)
{
  maxPH -= 0.01;
  dtostrf(maxPH, 5, 2, buffer_maxPH);
  t11.setText(buffer_maxPH);
}

void b4PopCallback(void*ptr)
{
  minPH += 0.01;
  dtostrf(minPH, 5, 2, buffer_minPH);
  t12.setText(buffer_minPH);
}

void b5PopCallback(void*ptr)
{
  minPH -= 0.01;
  dtostrf(minPH, 5, 2, buffer_minPH);
  t12.setText(buffer_minPH);
}

void PopCallback_c(void*ptr)
{
  pHSensor.calibrationClear();                           //Clear
}

void PopCallback_l(void*ptr)
{
  pHSensor.calibrationLow(4.000f);                       //pH 4
}

void PopCallback_m(void*ptr)
{
  pHSensor.calibrationMid(7.000f);                       //pH 7
}

void PopCallback_h(void*ptr)
{
  pHSensor.calibrationHigh(10.000f);                     //pH 10
}








// ----------------------- Setup -----------------------
void setup()
{
  Wire.begin();

  // Klok
  rtc.begin();


  //Zet de baudrate nodig voor de communicatie met het Nextion scherm
  nexInit();

  //Merkt de tekstvensters t11 en t12 op.

  t11.attachPop(t11PopCallback);
  t12.attachPop(t12PopCallback);

  //Merkt de losgelaten knop op.

  b2.attachPop(b2PopCallback, &b2);
  b3.attachPop(b3PopCallback, &b3);
  b4.attachPop(b4PopCallback, &b4);
  b5.attachPop(b5PopCallback, &b5);

  for_c.attachPop(PopCallback_c, &for_c);
  for_l.attachPop(PopCallback_l, &for_l);
  for_m.attachPop(PopCallback_m, &for_m);
  for_h.attachPop(PopCallback_h, &for_h);




  //Pin is uitgang
  pinMode(TxPin, OUTPUT);                                   //TxPin wordt als uitgang gebruikt.
  pinMode(relaisPin, OUTPUT);                               //relaisPin wordt als uitgang gebruikt



  sensors.begin();                                          //Start de Temperatuurlibrary/sensor


  pHSensor.initialize();                                    //Start de pH sensor


  // Initialiseer de kanaal schema's
  InitializeChannels(MaxChannels);

  rtc.adjust(DateTime(__DATE__, __TIME__));                  // Stelt de RTC tijd in op de sketch samenstelling, wordt gebruikt voor één run. De tijd wordt gereset op het moment dat een apparaat wordt gereset!


}


// ----------------------- Loop -----------------------


void loop(void)
{

  nexLoop(nex_listen_list);


  // Stelt in op de huidige tijd

  CurrentTime = rtc.now();

  //------------- temperatuurmeting -----------------

  unsigned long huidigeTemp = millis();
  if (huidigeTemp - temperatuurMillis >= 6000)
  {
    sensors.requestTemperatures();                            // Zend het commando om de temperatuurmeting te halen.
    x = sensors.getTempCByIndex(0);                           //Zet de verkregen waarde in x



    //Omrekening waarde naar graden voor de temperatuurschaal
    // Temperature (linear)
    // temperature = 0, angle = -45 degrees
    // temperature = 50, angle = +225 degrees.
    // range of temperature is 50
    // range of angle is 270 (225 + 45)
    //float temperature;
    float angle = (x / 50.0 * 270.0) - 45.0;
    int degrees = int(angle);
    temp.setValue(degrees);
    if (angle < 0)                                             //Als de stand lager is dan 0 en dus negatief wordt.
    {
      angle += 360;                                            //maak een positief aantal graden voor de meter
    }
    temperatuurMillis = huidigeTemp;
  }



  //--------------------- pH waarden meting  --------------------------

  static unsigned long t = millis();
  if (millis() - t > 1000)
  {


    float  pHvalue = (pHSensor.singleReading().getpH());

    dtostrf(pHvalue, 5, 2, buffer_pHtemp);                     //conversie pH value naar een string
    t10.setText(buffer_pHtemp);

    if (pHvalue >= maxPH)                                     //Als de gemeten pH waarde groter is dan de maxPH waarde
    {
      digitalWrite(relaisPin, LOW);                           //relais is aangetrokken, magneetklep open. CO2 toevoer.
    }

    if (pHvalue <= minPH)                                     //Als de gemeten pH waarde kleiner is dan de minPH waarde
    {
      digitalWrite(relaisPin, HIGH);                          //relais is open, magneetklep gesloten. Geen CO2 toevoer.
    }


    //omrekening naar ronde meter

    phInt = pHvalue * 100;                                   // alles met 100 vermenigvulden om een heel getal te hebben
    signed int graden = map (phInt, 600, 850, -45, 225);     // nu heb je de graden

    if (graden < 0)                                          // Als de stand lager is als nul en dus negatief wordt.
    {
      graden += 360;                                        // maak een positief aantal graden voor de meter
    }

    pH.setValue(graden);                                    //zet de meternaald
    t = millis();
  }


  // Tijd en datum update
  unsigned long huidigetijdMillis = millis();
  if (huidigetijdMillis - tijdMillis > 1000)
  {
    DateTime now = rtc.now();
    char tijdString[9];
    static char vorigeTijd[9];

    sprintf(tijdString, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());

    if (strcmp(tijdString, vorigeTijd) != 0)
    {
      t0.setText (tijdString);                              //Tijd update
      strcpy(vorigeTijd, tijdString);                       //Bewaar vorigeTijd voor de volgende vergelijking
    }



    char datumString[9];
    static char vorigeDatum[9];

    sprintf(datumString, "%02d-%02d-%02d", now.day(), now.month(), now.year());

    if (strcmp(datumString, vorigeDatum) != 0)
    {
      t1.setText (datumString);                            //Datum update
      strcpy(vorigeDatum, datumString);                    //Bewaar vorigeDatum voor de volgende vergelijking
    }
    tijdMillis = huidigetijdMillis;
  }

  // Update lights
  unsigned long huidigeupdateMillis = millis();
  if (huidigeupdateMillis - updateMillis > 10000)
  {
    UpdateLights(CurrentTime);
    updateMillis = huidigeupdateMillis;
  }
}
Code: Alles selecteren

Gebruikers-avatar
Berichten: 1796
Geregistreerd: 06 Aug 2016, 01:03

Re: Blijvende overload problemen.

Berichtdoor Koepel » 25 Sep 2017, 18:54

Je proeft wel een beetje frustratie van mijn kant, maar ik maak je geen verwijten hoor.
Hoe ik tegen programmeren aan kijk, dat is een deel aanleg, een deel studie, en een deel ervaring. Dus bij mijn geboorte had ik al aanleg voor programmeren ;)

Een typische beginnersfout is dat iemand meteen naar het resultaat wil toewerken en een sketch heeft gemaakt waarin serieuze fouten staan, maar diegene denkt zelf dat het "bijna" werkt, en dat alleen nog een klein dingetje nodig is. Dan moeten wij gaan vertellen dat het nog lang niet werkt, en soms klopt de opbouw niet waardoor die sketch sowieso niet werkend te krijgen is.

Een ervaring programmeur leunt eerst eens achterover, en bedenkt hoe de verschillende functionaliteit in verschillende blokken/brokjes kan worden opgedeeld en hoe die blokken aan elkaar verbonden zijn. Vervolgens wordt blokje voor blokje gemaakt en getest. Dus niet het resultaat telt, maar de opbouw en de juiste brokjes code die getest zijn en werken.


Met mijn test met de Adafruit RTClib ging er iets niet goed, en ik kreeg voor de HH:MM:SS zoiets als "165:165:10". Het jaartal met now.year() is altijd vier cijfers.
Je hebt daarom geen andere keus dan het array voldoende groot maken, zodat het er altijd in past. Dus maak ze alle vier maar 16 groot, of 20, of 30.
Dat je sketch daarna niet meer werkt, dat is totaal niet interessant. Je kunt niet het risico lopen om een willekeurige geheugenplaats op de stack te gaan overschrijven.

De regel met __DATE__ en __TIME__ kun je commentaar voor zetten. Zo:
Code: Alles selecteren
//  rtc.adjust(DateTime(__DATE__, __TIME__));
En dan hopen dat de RTC chip loopt en daar de tijd van gelezen wordt.

Je hebt nu van alles achter een millis() timer, werken de knoppen normaal ?
Als een pagina op het scherm verschijnt, dan moet natuurlijk eerst alle waarden ingevuld worden. Dat heb je nog niet. Omdat je in een enorm hoog tempo de waarden naar het scherm schreef, merkte je dat eerst niet.

Dan de for-loop om door de kanalen te lopen nog aanpassen. Je hebt nog steeds twee variabelen die CurrentTime heten. En alleen schrijven naar de Nextion pagina die op dat moment aktief is. Daarna komt pas het daadwerkelijk werkend krijgen.

Volgende

Terug naar Overige Software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast