Hello Mr. Krzysztof
Some time has passed since our discussions on YT - I had a long break from working with the project but I am going back to continuing the topic. After changing / rearranging the pages (order), problems with which I am not able to deal with have broken down. The clock, lamps and thermometers flickered nicely and it was over

. The project generally concerns the controller / controller of the aquarium in a slightly expanded version.
The driver options include:
- control of two PWM channels with indication of the time of day of lamp operation (LED lamps)
- temperature control and fan control (two channels) - animation of the fan operation on the panel when one of them is turned on,
- measurement of the pH value and with the appropriate kH introduced, calculation of the value of carbon dioxide in the water Co2,
- of course the current date and time,
- fertilizer dispenser control.
The whole in the one-channel version works on the arduino nano and the 20x4 LCD display, but there is no possibility of setting parameters from the display position only in the program and the need to reload the program to arduino, which is tiring and cumbersome.
And now my heartfelt request to the experts from arduino and Nextion displays to help me embrace the subject, because I do not know how to handle it anymore.
In the connection, I put the file for the display, my model is: NX3224T024_011. The Arduino to be operated is the MEGA 2560 version.
Of course, if someone sees the use of such a project, I will be happy to share it, but let it work

.
below the skech for arduino:
[syntax=c]#include "Arduino.h"
#include "Nextion.h"
#include
#include
#include
#include
#include
#include
#define ONE_WIRE_BUS 13 // pin 13 termomoetr
#define TEMPERATURE_RECISION 9
#define ODSTEP 1000
#define SensorPin A7 // wejście analogowe dla sensora pH - pin analogowy 7
#define LED A7 // nowy wpis do pH
#define samplingInterval 20 // nowy wpis do pH
#define printInterval 800 // nowy wpis do pH
#define ArrayLenth 40 // times of collection
#define Offset 0.50 // kalibracja pH
//-----------------------PINY WE/WY ---------------------------------
int W1 = 5; // pin 5 - wyjście do stycznika nr 1 - wentylator
int dozownik_1 = 6; // pin 6 - wyjście do stycznika nr 2 - dozownik
int LED1 = 11; // pin 11 - wyjście PWM do sterowania LED1
int LED2 = 10; // pin 11 - wyjście PWM do sterowania LED2
int STEP = 1; // długość trwania jednego kroku
int CZAS; //czas do lampy led
int czas1;
int czas2;
int GODZ; // godziny
int MIN; // minuty
int maxD1 = 60; // maksymalna moc kanału LED1
int maxD2 = 60; // maksymalna moc kanału LED2
int ZMIANA = 60;
int godzina_ON; // godzina włączenia dozownika
int godzina_OFF; // godzina wyłączenia dozownika
int minuta_ON; // minuty włączenia dozownika
int minuta_OFF; // minuty wyłączenia dozownika
int sekunda_ON; // sekunty włączenia dozownika
int sekunda_OFF; // sekundy wyłączenia dozownika
int porcja; // ilość wdozowywanego nawozu w ml
//int dzienG = 7; // początek dnia - godziny
//int dzienM = 00; // początek dnia - minuty
//int nocG = 20; // początek nocy - godziny
//int nocM = 00; // początek nocy - minuty
unsigned long czas_poprzedni = 0;
int licznik = 0;
int stan = 0;
int pH;
float b;
//float pH; // dla sensora pH
int pHArray[ArrayLenth]; //Store the average value of the sensor feedback
int pHArrayIndex=0; // nowy wpis do pH
//-----------------------ZMIENNE DLA TERMOMETRÓW -------------------------------
NexText t1 = NexText(1, 23, "t2"); //zmienna tekstowa dla termometra 1 (strona0)
NexText t2 = NexText(1, 24, "t3"); //zmienna tekstowa dla termometra 2 (strona0)
//-----------------------ZMIENNE DLA RTC -------------------------------
NexNumber g = NexNumber(1, 16, "page0.n1"); //zmienna numeryczna do zegara dla godzin (strona0)
NexNumber m = NexNumber(1, 17, "page0.n2"); //zmienna numeryczna do zegara dla minut (strona0)
NexNumber s = NexNumber(1, 18, "page0.n3"); //zmienna numeryczna do zegara dla sekund (strona0)
NexNumber d = NexNumber(1, 19, "page0.n4"); //zmienna numeryczna do kalendarza dla dni
NexNumber mie = NexNumber(1, 20, "page0.n5"); //zmienna numeryczna do kalendarza dla mieięcy
NexNumber r = NexNumber(1, 21, "page0.n6"); //zmienna numeryczna do kalendarza dla lat
//-----------------------ZMIENNE DLA TEMPERATURY - WIATRAK -------------------------------
NexNumber limes = NexNumber(3, 4, "te0"); //zmienna numeryczna dla ustawień temperatury pobierana ze strony 3
//-----------------------ZMIENNE DLA SONDY PH -------------------------------
NexNumber PHval = NexNumber(1, 12, "page0.n7"); //zmienna numeryczna dla wartosci pH wyswietlanej na stronie 0
//-----------------------ZMIENNE DLA TWARTOŚCI/co2 -------------------------------
NexNumber num1 = NexNumber(1, 31, "n0"); //zmienna numeryczna dla twardości wyświetlanej na stronie 0
NexNumber co2 = NexNumber(1, 29, "n8"); // obliczenie wartosci Co2 wyswietlanej na stronie 0
//-----------------------ZMIENNE DO STEROWANIA LAMPAMI -------------------------------
NexNumber dG1 = NexNumber(3, 5, "page2.dg1"); //zmienna numeryczna dla twardości wyświetlanej na stronie 0
NexNumber dM1 = NexNumber(3, 7, "page2.dm1"); //zmienna numeryczna dla ustawień twardości pobierana ze strony 5
NexNumber nG1 = NexNumber(3, 4, "page2.ng1"); //zmienna numeryczna dla twardości wyświetlanej na stronie 0
NexNumber nM1 = NexNumber(3, 6, "page2.nm1"); //zmienna numeryczna dla ustawień twardości pobierana ze strony 5
NexNumber dzienG2 = NexNumber(7, 5, "page8.dzienG2"); //zmienna numeryczna dla twardości wyświetlanej na stronie 0
NexNumber dzienM2 = NexNumber(7, 7, "page8.dzienM2"); //zmienna numeryczna dla ustawień twardości pobierana ze strony 5
NexNumber nocG2 = NexNumber(7, 4, "page8.nocG2"); //zmienna numeryczna dla twardości wyświetlanej na stronie 0
NexNumber nocM2 = NexNumber(7, 6, "page8.nocM2"); //zmienna numeryczna dla ustawień twardości pobierana ze strony 5
NexText pora = NexText(0, 6, "po"); //zmienna tekstowa dla pory dnia oświetlenia
NexNumber lamp1 = NexNumber(1, 23, "page0.l1"); //zmienna numeryczna dla statusu % lampy 1
NexNumber lamp2 = NexNumber(1, 24, "page0.l2"); //zmienna numeryczna dla statusu % lampy 2
NexTouch *nex_Listen_List[]=
{
NULL
};
char buffer[10] = {0};
OneWire oneWire(ONE_WIRE_BUS); // termometr one wire
DallasTemperature sensors(&oneWire); // termometr
int numberOfDevices;
DeviceAddress tempDeviceAddress;
//--------------------------------------------------------------------------------------------------------
//-------------------SETUP-------------------------------
//--------------------------------------------------------------------------------------------------------
void setup() {
//nexInit();
sensors.begin(); // aktywacja termometr
Serial.begin(9600); // aktywacja portu szeregowego
while (!Serial) ; // wait until Arduino Serial Monitor opens
numberOfDevices = sensors.getDeviceCount(); // pobranie danych z sensora
// pinMode(LED1, OUTPUT); // LED 1
// pinMode(LED2, OUTPUT); // LED 2
// pinMode(W1, OUTPUT); // wyjście wentylator
// pinMode(W2, OUTPUT); // wyjście dozownik
tmElements_t tm;
} // koniec void setup
//--------------------------------------------------------------------------------------------------------
//------------------- loop -------------------------------
//--------------------------------------------------------------------------------------------------------
void loop()
{
unsigned long czas_aktualny = millis();
if(czas_poprzedni - czas_aktualny> ODSTEP)
czas_poprzedni = czas_aktualny;
licznik = licznik + 1;
//------------------- ZEGAR -------------------------------
tmElements_t tm;
if (RTC.read(tm)) { // pobierz czas na wyświetlacz
Serial.print("DS1307 configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
d.setValue(tm.Day);
mie.setValue(tm.Month);
r.setValue(tmYearToCalendar(tm.Year));
g.setValue(tm.Hour);
m.setValue(tm.Minute);
s.setValue(tm.Second);
}
Serial.println("swiatła start");
LAMPY(); // dane z bloku lampy
Serial.println("temperatura start");
// printTemperature(DeviceAddress deviceAddress, int index); // dane z bloku temperatury
Serial.print("");
dozownik(); // dane z bloku dozownika
Serial.println("dozownik start");
PH_SONDA(); // dane z bloku sondy pH
Serial.println("sonda pH start");
} // konice void loop
//-----------------------------------------------------------------------------------------
bool setSys0(uint32_t number)
{
char buf[10] = {0};
String cmd;
utoa(number, buf, 10);
cmd += "sys0=";
cmd += buf;
sendCommand(cmd.c_str());
return recvRetCommandFinished();
} // koniec funkcji bool
uint32_t numLimes;
//--------------------------------------------------------------------------------------------------------
//-------------------void TEMPERATURY-------------------------------
//--------------------------------------------------------------------------------------------------------
void printTemperature(DeviceAddress deviceAddress, int index)
{
float tempC = sensors.getTempC(deviceAddress);
memset(buffer, 0, sizeof(buffer));
String tempTXT = String(tempC, 2);
tempTXT.toCharArray(buffer, 10);
if(index == 0){
t1.setText(buffer);
Serial.print("temperatura 1=");
Serial.print(buffer);
limes.getValue(&numLimes);
if(tempC > numLimes){
setSys0(1);
digitalWrite(W1,HIGH);
Serial.println("wiatrak 1 - ON");
}
else{
setSys0(0);
digitalWrite(W1,LOW);
Serial.println("wiatrak 1 - OFF");
}
}
if(index ==1){
t2.setText(buffer);
Serial.print("temperatura 2=");
Serial.print(buffer);
}
}
uint32_t num;
uint32_t dg1;
uint32_t dm1;
uint32_t ng1;
uint32_t nm1;
//uint32_t dG2;
//uint32_t dM2;
//uint32_t nG2;
//uint32_t nM2;
//--------------------------------------------------------------------------------------------------------
//-------------------VOID DOZOWNIK-------------------------------
//--------------------------------------------------------------------------------------------------------
void dozownik()
{
tmElements_t tm;
sekunda_OFF= porcja*60/100; // przeliczenie porcji w ml na czas dosowania w sekundach
if((godzina_ON==tm.Hour)&&(minuta_ON==tm.Minute)&&(sekunda_ON==tm.Second)) // warunek włączenia dozownika
{
digitalWrite(dozownik_1,HIGH); //właczenie dozownika
Serial.println("dozownik start");
}
if((godzina_OFF==tm.Hour)&&(minuta_OFF==tm.Minute)&&(sekunda_OFF==tm.Second)) // warunek wyłączenia dozownika
{
digitalWrite(dozownik_1,LOW); //wyłaczenie dozownika
Serial.println("dozownik stop");
}
} //koniec void dozownik
//--------------------------------------------------------------------------------------------------------
//-------------------VOID LAMPY-------------------------------
//--------------------------------------------------------------------------------------------------------
void LAMPY()
{
//------------------- ZEGAR -------------------------------
tmElements_t tm;
if (RTC.read(tm)) { // pobierz czas na wyświetlacz
//------------------- OŚWIETLENIE -------------------------------
dG1.getValue(&dg1);
dM1.getValue(&dm1);
nG1.getValue(&ng1);
nM1.getValue(&nm1);
// dzienG2.getValue(&dG2);
// dzienM2.getValue(&dM2);
// nocG2.getValue(&nG2);
// nocM2.getValue(&nM2);
GODZ = (tm.Hour); // pobranie godziny z zegara
MIN = (tm.Minute); // pobranie minut z zegara
int CZAS = (GODZ*60+MIN); // przejście na minuty - czas ogólny
int czas1 = (dg1*60+dm1); // przeliczenie na minuty dla czasu gdy dzień
int czas2 = (ng1*60+nm1); // przeliczenie na minuty dla czsu gdy noc
// int czas1L2 = (dG2*60+dm2); // przeliczenie na minuty dla czasu gdy dzień
// int czas2L2 = (nG2*60+nm2); // przeliczenie na minuty dla czsu gdy noc
static int D1; //stopień rozjaśniania LED1, LED2
// static int D2; //stopień rozjaśniania LED1, LED2
// -------------- LAMPA 1 --------------------------------------------
int mocD1[61] = //stopień rozjaśniania LED1
{
0,1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
25,30,35,40,45,50,55,60,65,70,
75,80,85,90,95,100,105,110,115,120,
125,130,135,140,145,150,155,160,165,170,
175,175,179,190,205,205,205,205,205,205 // zasilanie na 100%
};
int mocD2[61] = //stopień rozjaśniania LED1
{
0,1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
25,30,35,40,45,50,55,60,65,70,
75,80,85,90,95,100,105,110,115,120,
125,130,135,140,145,150,155,160,165,170,
175,175,179,195,210,215,225,235,245,255 // zasilanie na 100%
};
if (CZAS < czas1) // warunek gdy NOC
{
D1=0; //
// sendCommand("po.val=NOC");
Serial.println("LED - NOC");
pora.setText("NOC");
}
if ((czas1