Loading...

Ваша корзина пуста.

 
 
 
×

Registration

Profile Informations

Login Datas

or login

First name is required!
Last name is required!
First name is not valid!
Last name is not valid!
This is not an email address!
Email address is required!
This email is already registered!
Password is required!
Enter a valid password!
Please enter 6 or more characters!
Please enter 16 or less characters!
Passwords are not same!
Terms and Conditions are required!
Email or Password is wrong!
Captcha is required!
Captcha is wrong!

Руководство по библиотеки Nextion Arduino

 Всем привет! Из этого руководства вы узнаете как работать с дисплеем Nextion при помощи ITEADLIB_Arduino_Nextion_Library.

Руководство состоит из 3 разделов.

Для начала, скачайте библиотеку, HMI файлы и Nextion Editor по ссылкам:

1. ITEADLIB Arduino Nextion Library

2. HMI файлы: Chapter1 Chapter2  Chapter3

3. The latest Nextion Editor 

Потом, подготовьте железо:

1.  Iteaduino UNO  или MEGA2560

2. 1-4 штуки Light bricks или Relay modules или Buzzer bricks

3.  RTC модуль (часы реального времени)

4. A 10k NTC Temperature Sensor with Steel Head and Plastic Connector and a 6.4K resistor

5. Безпаечную плату или паечную макетную плату

6.  20 соединительных проводков.

7.  USB шнур для UNO или MEGA

8.  Nextion display, вам еще нужен USB-TTL  для скачания проекты в дисплей. Мы используем Foca.

Итак, начнём!


Раздел1: управление микроконтроллером при помощи нажатий на дисплей.

В руководстве будем всё разбирать на примере MEGA2560. В конце поста будут указания по использованию Iteaduino UNO.

1. Запустите Nextion Editor и создайте новый HMI проект. Или откройте скаченный HMI файл.
2. Выберите подходящее фоновое изображение. Добавьте 4 кнопки и 5 текстовых полей как на рисунке ниже. Эти элементы можете настраивать как хотите.

Руководство по быстрому старту Nextion Editor

3.Чтобы дисплей отправлял сообщения генерируемые кнопками, отметьте флажок "Send key value" как показано ниже:

4. Загрузите файл проекта в Nextion при помощи Foca.
Nextion     Foca(USB—TTL)
TX    →    RX
RX    →    TX
G    →     G
V    →     V

5. Скачайте и установите arduino IDE, скачайте Nextion_library  со страницы ITEAD на github и сохраните в каталог
\arduino\arduino-1.x.x\libraries

6. Откройте Arduino IDE, создайте новый проект и напишите программу с использованием библиотеки Nextion для работы с четырьмя кнопками.
Код программы:


#include "NexButton.h"
#include "NexText.h"

NexButton b0 = NexButton(0, 2, "b0");
NexButton b1 = NexButton(0, 3, "b1");
NexButton b2 = NexButton(0, 4, "b2");
NexButton b3 = NexButton(0, 5, "b3");

char buffer[10] = {0};

NexTouch *nex_Listen_List[] = 
{
    &b0,
    &b1,
    &b2,
    &b3,
    NULL
};

/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b0PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(9, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(9, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
   
}

/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b1PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
         digitalWrite(10, HIGH);
         strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(10, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b2PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(11, HIGH);
        strcpy(buffer, "ON");
     
    }
    else
    {
        digitalWrite(11, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b3PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(12, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(12, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}

void setup(void)
{
    nexInit();
    b0.attachPop(b0PopCallback, &b0);
    b1.attachPop(b1PopCallback, &b1);
    b2.attachPop(b2PopCallback, &b2);
    b3.attachPop(b3PopCallback, &b3);
//setting port OUTPUT
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
//initializing  port 
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
}

void loop(void)
{
    nexLoop(nex_Listen_List);
}


7. Обратите внимание, что работа с компонентами осуществляется посредством Page ID, Component ID и Component Name:

8. Соединения:
Light LED    MEGA2560
Sinal    →     9
G       →       G
V       →       V

UV LED    MEGA2560
Sinal   →   10
G       →       G
V       →       V

Pump LED    MEGA2560
Sinal     →     11
G        →        G
V        →         V

Food LED    MEGA2560
Sinal    →     12
G        →       G
V        →        V

Nextion     MEGA2560
TX     →     RX2
RX     →     TX2
G       →       G
V       →       V

9. Загрузите программу в mega2560 и коснувшись экрана сможет получить такой эффект:

Что делать, если у вас UNO?

1. Откройте файл“NexConfig.h”из ITEADLIB_Arduino_Nextion_Library.

* Закомментируйте вывод отладочной информации через последовательный порт #define DEBUG_SERIAL_ENABLE —> //#define DEBUG_SERIAL_ENABLE

* Измените последовательный порт: #define nexSerial Serial2  —> #define nexSerial Serial

2. Загрузите программу из Arduino IDE в UNO не подключая дисплей Nextion.

3. Одновременно использовать симулятор Nextion Editor с подключенным UNO не получится.

5. Соединение модулей как и в Меге, но вместо TX2 RX2 в Меге, тут используем TX RX.

Раздел 2. Получаем данные от MCU

В первом разделе вы научились отправлять команды своему MCU. По крайней мере, должны были. В этом разделе к тому что у нас получилось мы добавим отображение времени и температуры. Если вы ещё не прочитали раздел 1, то самое время это сделать!

1. Откройте HMI файл который получился у вас при изучении первого раздела или скаченный файл для раздела 2.

2. Добавьте текстовые поля t5-t11 как на картинке ниже. Можете их изменять на своё усмотрение.

3. Загрузите HMI файл в дисплей Nextion при помощи Foca и подключите mega2560 (также как в первом разделе)

4. Скачайте библиотеку RTC и сохраните её в каталоге библиотек Arduino.

5.Запустив Arduino IDE создайте новый проект. Поместите в него программу отображения времени использующую библиотеки Nextion и RTC.
Исходный код:


#include "NexButton.h"
#include "NexText.h"
#include "Arduino.h"
#include "Wire.h"
#include "RTCLib.h"


NexButton b0 = NexButton(0, 2, "b0");
NexButton b1 = NexButton(0, 3, "b1");
NexButton b2 = NexButton(0, 4, "b2");
NexButton b3 = NexButton(0, 5, "b3");
NexText t5 = NexText(0, 10, "t5");
NexText t6 = NexText(0, 11, "t6");
NexText t7 = NexText(0, 12, "t7");
NexText t8 = NexText(0, 13, "t8");
NexText t9 = NexText(0, 14, "t9");

char buffer[10] = {0};
char buffer_temp[10] = {0};
char buffer_hour[10] = {0};
char buffer_week[10] = {0};
char buffer_second[10] = {0};
char buffer_year[10] = {0};
char buffer_temperature[10] = {0};

RTCLib rtc;

uint8_t number = 0;
uint16_t sensor_pin = A0;    // select the input pin for the potentiometer
uint16_t sensor_value = 0;  // variable to store the value coming from the sensor
uint16_t temperature = 0;
uint16_t temp = 0;

NexTouch *nexListenList[] = 
{
    &b0,
    &b1,
    &b2,
    &b3,
    &t5,
    &t6,
    &t7,
    &t9,
    &t8,
    NULL
};



/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b0PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(9, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(9, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
   
}

/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b1PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
         digitalWrite(10, HIGH);
         strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(10, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b2PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(11, HIGH);
        strcpy(buffer, "ON");
     
    }
    else
    {
        digitalWrite(11, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b3PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(12, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(12, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}

void updateTime()
{
    memset(buffer, 0, sizeof(buffer)); 
    number = rtc.hour();
    itoa(number, buffer, 10);
    strcat(buffer, ":");
    number = rtc.minute();
    itoa(number, buffer_temp, 10);
    if (rtc.minute() < 10)
    {
        strcat(buffer, "0");
    }
    strcat(buffer, buffer_temp);
    strcat(buffer, ":");
    if (strcmp(buffer_hour, buffer))
    {
        t6.setText(buffer);
        strcpy(buffer_hour, buffer); 
    }
        
    memset(buffer, 0, sizeof(buffer)); 
    memset(buffer_temp, 0, sizeof(buffer_temp)); 
        
    number = rtc.second();
    itoa(number, buffer_temp, 10);
    if (number < 10)
    {
        strcpy(buffer, "0");
        strcat(buffer, buffer_temp);
        if (strcmp(buffer, buffer_second))
        {
            t9.setText(buffer);
            strcpy(buffer_second, buffer);
         }
    } 
    else
    {
        if (strcmp(buffer_temp, buffer_second))
        {
            t9.setText(buffer_temp);
            strcpy(buffer_second, buffer_temp);
        }
    }
        
/*week's data dispaly*/
 
    switch (rtc.dayOfWeek())
    {
        case 1:
                strcpy(buffer, "Sunday");
                break;
        case 2: 
                strcpy(buffer, "Monday");
                break;
        case 3:
                strcpy(buffer, "Tuesday");
                break;
        case 4:
                strcpy(buffer, "Wednesday");
                break;
        case 5:
                strcpy(buffer, "Thursday");
                break;
        case 6:
                strcpy(buffer, "Friday");
                break;
        case 7:
                strcpy(buffer, "Saturday");
                break;
        default:
                strcpy(buffer, "fail");
                break;
    }

    if (strcmp(buffer_week, buffer))
    {
        t7.setText(buffer);
        strcpy(buffer_week, buffer);
    }

    memset(buffer, 0, sizeof(buffer));
    memset(buffer_temp, 0, sizeof(buffer_temp));
      
/*receive  year's data*/
    number = rtc.year();
    strcat(buffer, "20");
    itoa(number, buffer_temp, 10);
    strcat(buffer, buffer_temp);
    strcat(buffer, "/");
        
/*receive  month's data*/ 
    number = rtc.month();
    itoa(number, buffer_temp, 10);
    strcat(buffer, buffer_temp);
    strcat(buffer, "/");

/*receive  day's data*/
    number = rtc.day();
    itoa(number, buffer_temp, 10);
    strcat(buffer, buffer_temp);
        
/*send to Nextion txt5*/
    if (strcmp(buffer_year, buffer))
    {
        t5.setText(buffer);
        strcpy(buffer_year, buffer);
    }
}
void ntcTemperature()
{
    sensor_value = analogRead(sensor_pin);
    temp = sensor_value-185;
    temperature = 100-temp/5.4;

    memset(buffer, 0, sizeof(buffer));
    memset(buffer_temp, 0, sizeof(buffer_temp));

    itoa(temperature, buffer, 10);
    
    if (strcmp(buffer, buffer_temperature))
    {
        t8.setText(buffer);
        strcpy(buffer_temperature, buffer);
    }
    delay(100);
    
  
}
void setup(void)
{
    dbSerial.begin(9600);
    nexInit();
    b0.attachPop(b0PopCallback, &b0);
    b1.attachPop(b1PopCallback, &b1);
    b2.attachPop(b2PopCallback, &b2);
    b3.attachPop(b3PopCallback, &b3);
    dbSerial.println("setup done");
/*setting port OUTPUT*/
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
/*initializing  port */
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    
/* Only used once, then disabled
 *rtc.set(0, 5, 16, 6, 28, 7, 15);
 *RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte
 *dayOfMonth, byte month, byte year);*/

 }

void loop(void)
{
    unsigned long nowtime = millis(); 
    unsigned long update = 10000;
    if (nowtime > update)
    {
        ntcTemperature();
        update+=10000;
    }
    nexLoop(nexListenList);
    rtc.refresh();
    updateTime();
    
}

6. После загрузки программы в Мегу, добавьте резистор на 6.4 кОм как показано на схеме:

Глянем код подробнее. Числовые значения приведены только для примера. Температурный коэффициент = (максимальная температура – минимальная температура) / считанное с АЦП значение (можно увидеть в мониторе последовательного порта).

7. Соединение модулей:

RTC     MEGA2560
SDA   →    SDA
SCL   →    SCL
V      →      V
G      →      G

NTC     MEGA2560
V     →      A0
V     →      V
G     →      G

8. Вот и всё! Включайте Мегу и увидите эффект показанный ниже (температура воды 48 С)

Раздел 3. Взаимодействие между Nextion и MCU

В предыдущих разделах мы реализовали одностороннюю передачу данных: отправку или получение. Теперь научимся реализовывать двухсторонние коммуникации. Например, получение микроконтроллером настроек часов от дисплея.

1. Откройте получившийся у вас  в предыдущем разделе или скаченный для 3-го раздела .HMI файл. Добавьте кнопку "set" и разделите время и дату на большее число текстовых полей как показано ниже.

2.  Создайте страницу l и добавьте на неё 3 кнопки и 12 текстовых полей. Отредактируйте их как показано ниже (названия любые).

(Чтобы эти кнопки генерировали события, поставьте флажок "Send key value".  )

3. Загрузите .HMI проект в Nextion дисплей при помощи Foca, соедините дисплей с Мегой (также как в первом разделе)

4. Замените код полученный в предыдущих разделах кодом показанным ниже (обратите внимание на проблему с указанием даты).


#include "NexButton.h"
#include "NexText.h"
#include "Arduino.h"
#include "Wire.h"
#include "RTCLib.h"
#include "NexPage.h"


NexButton b0 = NexButton(0, 2, "b0");
NexButton b1 = NexButton(0, 3, "b1");
NexButton b2 = NexButton(0, 4, "b2");
NexButton b3 = NexButton(0, 5, "b3");
NexButton b4 = NexButton(0, 17, "b4");
NexText t5 = NexText(0, 10, "t5");
NexText t6 = NexText(0, 11, "t6");
NexText t7 = NexText(0, 12, "t7");
NexText t8 = NexText(0, 13, "t8");
NexText t9 = NexText(0, 14, "t9");
NexText t13 = NexText(0, 19, "t13");
NexText t16 = NexText(0, 22, "t16");
NexText t18 = NexText(0, 24, "t18");
NexButton d6 = NexButton(1, 15, "d6");
NexText d7 = NexText(1, 14, "d7");
NexPage page0 = NexPage(0, 0, "page0");
NexPage page1 = NexPage(1, 0, "page1");
NexButton k1 = NexButton(1, 2, "k1");
NexButton k2 = NexButton(1, 3, "k2");
NexButton k3 = NexButton(1, 4, "k3");
NexButton k4 = NexButton(1, 5, "k4");
NexButton k5 = NexButton(1, 6, "k5");
NexButton k6 = NexButton(1, 7, "k6");
NexButton k7 = NexButton(1, 8, "k7");
NexButton k8 = NexButton(1, 9, "k8");

char buffer[10] = {0};
char buffer_temp[10] = {0};
char buffer_year[10] = {0};
char buffer_month[10] = {0};
char buffer_day[10] = {0};
char buffer_hour[10] = {0};
char buffer_minute[10] = {0};
char buffer_second[10] = {0};
char buffer_week[10] = {0};

int8_t settime_type = -1;
int8_t settime_up = -1;
int8_t number_settime_year = 0;
int8_t number_settime_month = 0;
int8_t number_settime_day = 0;
int8_t number_settime_hour = 0;
int8_t number_settime_minute = 0;
int8_t number_settime_week = 0;

char buffer_temperature[10] = {0};

RTCLib rtc;

uint8_t number = 0;
uint16_t sensor_pin = A0;    /*select the input pin for the potentiometer*/
uint16_t sensor_value = 0;  /* variable to store the value coming from the sensor*/
uint16_t temperature = 0;
uint16_t temp = 0;

NexTouch *nex_Listen_List[] = 
{
    &b0, &b1, &b2, &b3, &b4,
    &t5, &t6, &t7, &t9, &t8,
    &t13, &t16, &t18, &d7,
    &k1, &k2, &k3, &k4, &k5,
    &k6, &k7, &k8, &d6, &page0,
    &page1,
    NULL
};

void b4PopCallback(void *ptr)
{
    page1.show();
    k3.setText(buffer_year);
    k4.setText(buffer_month);
    k5.setText(buffer_day);
    k6.setText(buffer_hour);
    k7.setText(buffer_minute);
    k8.setText(buffer_week);
    number_settime_year = atoi(buffer_year);
    number_settime_month = atoi(buffer_month);
    number_settime_day = atoi(buffer_day);
    number_settime_hour = atoi(buffer_hour);
    number_settime_minute = atoi(buffer_minute);
    if(strcmp(buffer_week, "Sunday") == 0)
    {
        number_settime_week = 1;
    }
    if(strcmp(buffer_week, "Monday") == 0)
    {
        number_settime_week = 2;
    }
    if(strcmp(buffer_week, "Tuesday") == 0)
    {
        number_settime_week = 3;
    }
    if(strcmp(buffer_week, "Wednesday") == 0)
    {
        number_settime_week = 4;
    }
    if(strcmp(buffer_week, "Thursday") == 0)
    {
        number_settime_week = 5;
    }
    if(strcmp(buffer_week, "Friday") == 0)
    {
        number_settime_week = 6;
    }
    if(strcmp(buffer_week, "Saturday") == 0)
    {
        number_settime_week = 7;
    }
    if(strcmp(buffer_week, "Fail") == 0)
    {
        number_settime_week = -1;
    }
    
    
}

void d6PopCallback(void *ptr)
{
    rtc.set(0, number_settime_minute, number_settime_hour, 
            number_settime_week, number_settime_day, 
            number_settime_month, number_settime_year);
}

void d7PopCallback(void *ptr)
{
    page0.show();
    t5.setText(buffer_year);
    t16.setText(buffer_month);
    t18.setText(buffer_day);
    t6.setText(buffer_hour);
    t13.setText(buffer_minute);
    t7.setText(buffer_week);
}


void k1PopCallback(void *ptr)
{
    settime_up = 1;
    setTime();
}

void k2PopCallback(void *ptr)
{
    settime_up = 0;
    setTime();
}

void k3PopCallback(void *ptr)
{
    settime_type = 1;   
}

void k4PopCallback(void *ptr)
{
    settime_type = 2;
}

void k5PopCallback(void *ptr)
{
    settime_type = 3;
}

void k6PopCallback(void *ptr)
{
    settime_type = 4;
}

void k7PopCallback(void *ptr)
{
    settime_type = 5;
}

void k8PopCallback(void *ptr)
{
    settime_type = 6;

}

void setTime(void)
{
    switch (settime_type)
    {
        case 1: 
            if (settime_up == 1)
            {
               number_settime_year++;
               if (number_settime_year > 99)
               {
                    number_settime_year = 10;
               }
               memset(buffer, 0, sizeof(buffer));  
               itoa(number_settime_year, buffer, 10);
               k3.setText(buffer);
            }   
            else if (settime_up == 0)
            {
                number_settime_year--;
                if (number_settime_year < 10)
                {
                    number_settime_year = 99;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_year, buffer, 10);
                k3.setText(buffer);
            }
            break;
        case 2:
            if (settime_up == 1)
            {
                number_settime_month++;
                if (number_settime_month > 12)
                {
                    number_settime_month = 1;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_month, buffer, 10);
                k4.setText(buffer);
            }
            else if (settime_up == 0)
            {
                number_settime_month--;
                if (number_settime_month < 1)
                {
                    number_settime_month= 12;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_month, buffer, 10);
                k4.setText(buffer);
            }
            break;
        case 3:
        {
            memset(buffer, 0, sizeof(buffer)); 
            k4.getText(buffer,sizeof(buffer));
            uint8_t dayofmonth = atoi(buffer);
            if (settime_up == 1)
            {
                number_settime_day++;
                if (dayofmonth == 1 || dayofmonth == 3 || dayofmonth == 5 
                    || dayofmonth == 7 || dayofmonth == 8 || dayofmonth == 10
                    || dayofmonth == 12 )
                {
                    if (number_settime_day > 31)
                    {
                        number_settime_day = 1;
                    }
                }
                if (dayofmonth == 4 || dayofmonth == 6 || dayofmonth == 9 
                    || dayofmonth == 11)
                {
                    if (number_settime_day > 30)
                    {
                        number_settime_day = 1;
                    }
                }
                if (dayofmonth == 2)
                {
                    if(number_settime_day > 28)
                    {
                        number_settime_day = 1;
                    }
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_day, buffer, 10);
                k5.setText(buffer);
            }
            else if (settime_up == 0)
            {
                number_settime_day--;
                if (dayofmonth == 1 || dayofmonth == 3 || dayofmonth == 5 
                    || dayofmonth == 7 || dayofmonth == 8 || dayofmonth == 10
                    || dayofmonth == 12 )
                {
                    if (number_settime_day < 1)
                    {
                        number_settime_day = 31;
                    }
                }
                if (dayofmonth == 4 || dayofmonth == 6 || dayofmonth == 9 
                    || dayofmonth == 11)
                {
                    if (number_settime_day < 1)
                    {
                        number_settime_day = 30;
                    }
                }
                if (dayofmonth == 2)
                {
                    if(number_settime_day < 1)
                    {
                        number_settime_day = 28;
                    }
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_day, buffer, 10);
                k5.setText(buffer);
            }
            break;
        }
        case 4:
            if (settime_up == 1)
            {
                number_settime_hour++;
                if (number_settime_hour > 23)
                {
                    number_settime_hour = 0;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_hour, buffer, 10);
                k6.setText(buffer);
            }
            else if (settime_up == 0)
            {
                number_settime_hour--;
                if (number_settime_hour < 0)
                {
                    number_settime_hour = 23;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_hour, buffer, 10);
                k6.setText(buffer);
            }
            break;
        case 5:
            if (settime_up == 1)
            {
                number_settime_minute++;
                if (number_settime_minute > 59)
                {
                    number_settime_minute = 0;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_minute, buffer, 10);
                k7.setText(buffer);
            }
            else if (settime_up == 0)
            {
                number_settime_minute--;
                if (number_settime_minute < 0)
                {
                    number_settime_minute = 59;
                }
                memset(buffer, 0, sizeof(buffer));  
                itoa(number_settime_minute, buffer, 10);
                k7.setText(buffer);
            }
            break;                
        case 6:
            if (settime_up == 1)
            {
                number_settime_week++;
                if (number_settime_week > 7)
                {
                    number_settime_week = 1;
                }  
            }
            else if (settime_up == 0)
            {
                number_settime_week--;
                if (number_settime_week < 1)
                {
                    number_settime_week = 7;
                }
            }
            switch (number_settime_week)
            {
                case 1:
                        strcpy(buffer, "Sunday");
                        break;
                case 2: 
                        strcpy(buffer, "Monday");
                        break;
                case 3:
                        strcpy(buffer, "Tuesday");
                        break;
                case 4:
                        strcpy(buffer, "Wednesday");
                        break;
                case 5:
                        strcpy(buffer, "Thursday");
                        break;
                case 6:
                        strcpy(buffer, "Friday");
                        break;
                case 7:
                        strcpy(buffer, "Saturday");
                        break;
                default:
                        strcpy(buffer, "fail");
                        break;
            }
            k8.setText(buffer);
            break;
    }
}

/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b0PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(9, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(9, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
}

/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b1PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
         digitalWrite(10, HIGH);
         strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(10, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b2PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(11, HIGH);
        strcpy(buffer, "ON");
     
    }
    else
    {
        digitalWrite(11, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}
/**
 * Button to return the response.
 * 
 * @param ptr - the parameter was transmitted to pop event function pointer. 
 * 
 */
void b3PopCallback(void *ptr)
{
    NexButton *btn = (NexButton *)ptr;
    memset(buffer, 0, sizeof(buffer));
    btn->getText(buffer, sizeof(buffer));
    if (strcmp(buffer,"ON"))
    {
        digitalWrite(12, HIGH);
        strcpy(buffer, "ON");
    }
    else
    {
        digitalWrite(12, LOW);
        strcpy(buffer, "OFF");
    }
    btn->setText(buffer);
    
}

void timeDisplay()
{
    memset(buffer, 0, sizeof(buffer)); 
    number = rtc.hour();
    itoa(number, buffer, 10);
    if (strcmp(buffer_hour, buffer))
    {
        t6.setText(buffer);
        strcpy(buffer_hour, buffer); 
    }

    memset(buffer, 0, sizeof(buffer));
    memset(buffer_temp, 0, sizeof(buffer_temp));
    number = rtc.minute();
    itoa(number, buffer_temp, 10);
    if (rtc.minute() < 10)
    {
        strcat(buffer, "0");
    }
    strcat(buffer, buffer_temp);
    if (strcmp(buffer_minute, buffer))
    {
        t13.setText(buffer);
        strcpy(buffer_minute, buffer); 
    }
    
    memset(buffer, 0, sizeof(buffer)); 
    memset(buffer_temp, 0, sizeof(buffer_temp)); 
    number = rtc.second();
    itoa(number, buffer_temp, 10);
    if (number < 10)
    {
        strcpy(buffer, "0");
        strcat(buffer, buffer_temp);
        if (strcmp(buffer, buffer_second))
        {
            t9.setText(buffer);
            strcpy(buffer_second, buffer);
         }
    } 
    else
    {
        if (strcmp(buffer_temp, buffer_second))
        {
            t9.setText(buffer_temp);
            strcpy(buffer_second, buffer_temp);
        }
    }
        
 
    switch (rtc.dayOfWeek())
    {
        case 1:
                strcpy(buffer, "Sunday");
                break;
        case 2: 
                strcpy(buffer, "Monday");
                break;
        case 3:
                strcpy(buffer, "Tuesday");
                break;
        case 4:
                strcpy(buffer, "Wednesday");
                break;
        case 5:
                strcpy(buffer, "Thursday");
                break;
        case 6:
                strcpy(buffer, "Friday");
                break;
        case 7:
                strcpy(buffer, "Saturday");
                break;
        default:
                strcpy(buffer, "fail");
                break;
    }

    if (strcmp(buffer_week, buffer))
    {
        t7.setText(buffer);
        strcpy(buffer_week, buffer);
    }

    memset(buffer, 0, sizeof(buffer));
    memset(buffer_temp, 0, sizeof(buffer_temp));
    number = rtc.year();
    itoa(number, buffer, 10);
    if (strcmp(buffer_year, buffer))
    {
        t5.setText(buffer);
        strcpy(buffer_year, buffer);
    }
    
    memset(buffer, 0, sizeof(buffer));     
    number = rtc.month();
    itoa(number, buffer, 10);
    if (strcmp(buffer_month, buffer))
    {
        t16.setText(buffer);
        strcpy(buffer_month, buffer);
    }
    
    memset(buffer, 0, sizeof(buffer));
    number = rtc.day();
    itoa(number, buffer, 10);
    if (strcmp(buffer_day, buffer))
    {
        t18.setText(buffer);
        strcpy(buffer_day, buffer);
    }
}

void ntcTemperature()
{
    sensor_value = analogRead(sensor_pin);
    temp = sensor_value-185;
    temperature = 100-temp/5.4;

    memset(buffer, 0, sizeof(buffer));
    memset(buffer_temp, 0, sizeof(buffer_temp));

    itoa(temperature, buffer, 10);
    
    if (strcmp(buffer, buffer_temperature))
    {
        t8.setText(buffer);
        strcpy(buffer_temperature, buffer);
    }
    delay(100);
}

void setup(void)
{
    nexInit();
    b0.attachPop(b0PopCallback, &b0);
    b1.attachPop(b1PopCallback, &b1);
    b2.attachPop(b2PopCallback, &b2);
    b3.attachPop(b3PopCallback, &b3);
    b4.attachPop(b4PopCallback);
    d6.attachPop(d6PopCallback);
    d7.attachPop(d7PopCallback);
    k1.attachPop(k1PopCallback);
    k2.attachPop(k2PopCallback);
    k3.attachPop(k3PopCallback);
    k4.attachPop(k4PopCallback);
    k5.attachPop(k5PopCallback);
    k6.attachPop(k6PopCallback);
    k7.attachPop(k7PopCallback);
    k8.attachPop(k8PopCallback);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT); 
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    /* RTCLib::set(byte second, byte minute, byte hour, 
     * byte dayOfWeek, byte dayOfMonth, byte month, byte year);
     */
    rtc.set(0, 5, 16, 3, 15, 2, 16); 
}

void loop(void)
{
    unsigned long nowtime = millis(); 
    unsigned long update = 0;
    if (nowtime > update)
    {
        ntcTemperature();
        update += 10000;
    }
    nexLoop(nex_Listen_List);
    rtc.refresh();
    timeDisplay();
    
}


5. В этом руководстве использовано две кнопки для управления датой: плюс и минус. Они используют settime_type для определения текущих year_month_day или hour_minute.
(settime_type=1 при нажатии кнопки "year")

6. Когда закончите с установкой даты и времени, переходите на страницу 0, где надо сделать отправку времени обратно на экран:

7. После того как загрузите Arduino программу в свою mega2560 результат должен быть такой:

Ура! Наш умный аквариум V2.0 теперь полностью готов! Здесь можно ещё почитать про него.