Per Mårtensson 211901e462 Fork 3 anos atrás
..
media 211901e462 Fork 3 anos atrás
README.html 211901e462 Fork 3 anos atrás

README.html












Easy Nextion Library


Description


A simple library that uses only four functions. You can easily benefit from Nextion’s wide range of features and advantages in just a few easy steps.

The library uses a custom protocol that can prove to be a powerful tool for advanced users as it can be easily modified to meet one’s needs.

This is an attempt to give a very simple method to use Nextion monitors for beginners at programming and at the same time to be a strong and reliable method that can be capable of satisfying the needs of the advance programming.

The handling of Nextion should be as simple and at the same time as professional as a display of this kind deserves.


I have invested time and resources providing open source codes, like this one. Please do not hesitate to support my work!

If you found this work useful and has saved you time and effort,

just simply paypal me at this Link: seithagta@gmail.com


You can find more examples, tutorials and projects with Nextion on my website seithan.com or at my YouTube channel Thanasis Seitanis


Installation


First Method



  1. In the Arduino IDE, navigate to Sketch > Include Library > Manage Libraries

  2. Then the Library Manager will open and you will find a list of libraries that are already installed or ready for installation.

  3. Then search for EasyNextionLibrary using the search bar.

  4. Click on the text area and then select the latest version and install it.


enter image description here


Second Method



  1. Download the latest release of EasyNextionLibrary.




  1. Extract the .zip file

  2. Copy the EasyNextionLibrary folder, to: …\Arduino\libraries\


NOTE: .HMI files for Nextion Editor are also included in every example’s folder.

All .HMIs are set for 2.8" Basic screens, so as to be easier to modify it for bigger screens.


The main functions



  • begin();

  • writeNum();

  • writeStr();

  • readNumber();

  • trigger();

  • readStr(); Added with version 1.0.4


And the public variables:



  • currentPageId (Data Type: Integer)

  • lastCurrentPageId (Data Type: Integer)


Functions for user custom command protocol



  • readByte(); Added with version 1.0.5

  • easyNexReadCustomCommand() Added with version 1.0.5

    and the public variables for user custom command protocol Added with version 1.0.5

  • cmdGroup (Data Type: Byte)

  • cmdLength (Data Type: Byte)


Details, examples and explanation on custom protocol, can be found on my website at:


https://seithan.com/Easy-Nextion-Library/Custom-Protocol/


4-step Example



  1. Include EasyNextionLibrary and create an object of EasyNex class


#include "EasyNextionLibrary.h"  // Include EasyNextionLibrary

EasyNex myNex(Serial); // Create an object of EasyNex class with the name < myNex >
// Set as parameter the Hardware Serial you are going to use


  1. Begin the object and give the desired baud rate as a parameter. Also, initialize the built-in LED as output


void setup(){
myNex.begin(9600); // Begin the object with a baud rate of 9600
// If no parameter was given in the begin(), the default baud rate of 9600 will be used
pinMode(LED_BUILTIN, OUTPUT); // The built-in LED is initialized as an output
}


  1. Place the NextionListen() function in the loop.


void loop(){
myNex.NextionListen(); // This function must be called repeatedly to response touch events
// from Nextion touch panel. Actually, you should place it in your loop function.
}


  1. Select one of the 50 predefined trigger() functions and use it as a simple void function (nothing returned).

    Declare the void function by simply writing:


void trigger0(){
[ put your code here !!!!]
}


  • Write the code you want to run in there.

    The trigger0() function will run every time the following sequence of bytes (in HEX format) 23 02 54 00 comes to Arduino’s Serial. To do that, write in the Touch Release Event of the button b0, this command: printh 23 02 54 00


void trigger0(){

digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
if(digitalRead(LED_BUILTIN) == HIGH){
myNex.writeNum("b0.bco", 2016); // Set button b0 background color to GREEN (color code: 2016)
myNex.writeStr("b0.txt", "ON"); // Set button b0 text to "ON"

}else if(digitalRead(LED_BUILTIN) == LOW){
myNex.writeNum("b0.bco", 63488); // Set button b0 background color to RED (color code: 63488)
myNex.writeStr("b0.txt", "OFF"); // Set button b0 text to "ON"
}
}

Enjoy the Easy Nextion Library!! Please do not forget the LED on :)


Full Example Code


/*
* FourStepExample.ino - Simple example code
* Copyright (c) 2020 Athanasios Seitanis < seithagta@gmail.com >.
* All rights reserved. EasyNextionLibrary is licensed under the MIT License
* https://opensource.org/licenses/MIT
*/

#include "EasyNextionLibrary.h" // Include EasyNextionLibrary

EasyNex myNex(Serial); // Create an object of EasyNex class with the name < myNex >
// Set as parameter the Hardware Serial you are going to use

void setup(){
myNex.begin(9600); // Begin the object with a baud rate of 9600
// If no parameter was given in the begin(), the default baud rate of 9600 will be used

pinMode(LED_BUILTIN, OUTPUT); // The built-in LED is initialized as an output
}

void loop(){
myNex.NextionListen(); // This function must be called repeatedly to response touch events
// from Nextion touch panel. Actually, you should place it in your loop function.
}

void trigger0(){
/* Create a button on Nextion
* Write in the Touch Release Event of the button
* this command: printh 23 02 54 00
* Every time the button is pressed, the trigger0() function will run
* and the code inside will be executed once
*/

digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); //If LED_BUILTIN is ON, turn it OFF, or the opposite
if(digitalRead(LED_BUILTIN) == HIGH){
myNex.writeNum("b0.bco", 2016); // Set button b0 background color to GREEN (color code: 2016)
myNex.writeStr("b0.txt", "ON"); // Set button b0 text to "ON"

}else if(digitalRead(LED_BUILTIN) == LOW){
myNex.writeNum("b0.bco", 63488); // Set button b0 background color to RED (color code: 63488)
myNex.writeStr("b0.txt", "OFF"); // Set button b0 text to "ON"
}
}

Function documentation


The various combinations of attribute choices provide a wide range of expected behaviors with many combinations.

This combined with the Nextion Instruction Set creates the opportunity for very powerful HMIs.


NOTE:

As these commands are using the Serial port to read and write, it is more preferred not to run them in the loop() without delay(); or some other method of not running them with the frequency of the loop and use them only when it is needed.

Using them in a loop, a delay in the loop can be noticed, especially when reading from the Serial. A Serial buffer overflow can also be caused.

Also NOTE: (from the Nextion Editor Guide)



In an HMI project a page is a localized unit. When changing pages, the existing page is removed from memory and the > > requested page is then loaded into memory. As such components with a variable scope of local are only accessible while the page they are in is currently loaded. Components within a page that have a variable scope of global are accessible by prefixing the page name to the global component .objname.

As an Example:

A global Number component n0 on page1 is accessed by page1.n0 .

A local Number component n0 on page1 can be accessed by page1.n0 or n0, but there is little sense to try access a local component if the page is not loaded. Only the component attributes of a global component are kept in memory. Event code is never global in nature.



Function trigger();


Associated Library's Code Example: Trigger and FourStepExample


Description:

This is the most important function of the library.

And this is because, it gives you the ability to use the predefined functions and run your code from there.

These predefined functions are named trigger0(), trigger1(), trigger2()… up to trigger50().

You can use them as a simple void function out of the loop, in which you will have written a block of code to run every time it is called.

You can call those trigger() functions and run the code they contain anytime by simply writing in a Nextion Event the command: printh 23 02 54 XX , where XX the id for the triggerXX() in HEX.

For example in a button’s Touch Release Event, write:




































CommandFunction
printh 23 02 54 00trigger0()
printh 23 02 54 01trigger1()
printh 23 02 54 0Atrigger10()
… up to… up to
printh 23 02 54 32trigger50()

In Arduino code, declare a void trigger() function with the predefined name you want to use and put your code there.

Declare the void function by simply writing:


void trigger0(){
[ put your code here !!!!]
}

Example:


#include "EasyNextionLibrary.h"

EasyNex myObject(Serial);
void setup(){
myObject.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
myObject.NextionListen();
}
void trigger0(){
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}

1st NOTE: To change the predefined names of the trigger() functions, there are details inside the trigger.cpp file and you can add up to 255 functions of this kind.

2nd NOTE: You can send the same printh command, to call the same function, from more than one component from any page, depending on your needs


See Appendix at the end of the document for numbers in HEX table


Function begin();


Parameters:

begin(unsigned long)

unsigned long: unsigned long baud = 9600 (default) if nothing is written in the begin() function


Description:

The begin() method of the class in which we pass the initialization data to the objects.


Syntax:


myObject.begin(115200); // for baud rate 115200

Function writeNum();


Associated Library's Code Example: ReadAndWriteNumber


Parameters:

writeNum(String, uint32_t)



  • String = objectname.numericAttribute (example: “n0.val” or “n0.bco”…etc)

  • uint32_t = value (example: 84)(number from 0 to 4,294,967,295)


Description:

For writing numbers in numeric attributes in components of any kind (variables, textboxes, etc.).



  • We can change the shown value of a number box

  • We can change the value of a numeric attribute of the design editing commands. Those commands are used to change the attribute of the components (button, text box, timer, numeric etc.) while Nextion is running.











































CommandResult on n0 comp.Syntax
n0.val=30Sets n0 component’s shown value to 30myObject.writeNum("n0.val", 30);
va0.val=30Sets va0 variable’s value to 30myObject.writeNum("va0.val", 30);
n0.bco=63488Sets background color to redmyObject.writeNum("n0.bco", 63488);
n0.font=0Sets font to font style with Id = 0myObject.writeNum("n0.font", 0);
n0.pco=1055Sets font color to bluemyObject.writeNum("n0.pco", 1055);
n0.format=0Sets value format to decimalmyObject.writeNum("n0.format", 0);

With the same way you can change the xcen, ycen, length and isbr


TIP: In a timer component, at the attribute < en >, you can start or stop the timer by writing 0 or 1.

Also, at the attribute < tim >, you can set the time the timer is going to repeat the commands written in timer’s User-code event.


myObject.writeNum("tm0.en", 0);     // 0 = stop, 1 = start
myObject.writeNum("tm0.tim", 1000); // repeat code every 1000ms

Syntax:


myObject.writeNum("n0.val", 30);    // Set the value of numeric n0 to 30
myObject.writeNum("n0.bco", 63488); // Set background color of n0 to 63488(red)
myObject.writeNum("n0.font", 0); // Set font to font style with ID 0
myObject.writeNum("n0.pco", 1055); // Set font color to blue
myObject.writeNum("n0.format", 0); // Set value format to decimal

NOTE: Only attributes shown in green in the Editor can be both read and changed by user code at runtime.

Attribute panel


Send floating-point numbers, a number that has a decimal point.


Or send a number on a textbox


Description:

Nextion DOES NOT SUPPORT float numbers. Instead, it uses integer math and does not have real or floating support.

The Xfloat component is used for signed 32-bit integer values.

The .vvs0 sets the number of digits shown to the left of the decimal (useful for leading zeros).

The .vvs1 sets the number of digits shown to the right of the decimal.


You can send Floating-point numbers with these two ways:



  • On a Xfloat component after you convert the float to int and multiply it by 10, the Xfloat component will put a comma , (decimal point) automatically after the last digit if attribute vvs1 is set to 1.


Example:


int tempInt = temperature*10;      // Convert the float to int. Multiply it x10                       
myNex.writeNum("x0.val", tempInt); // Write it to x0 Xfloat component on Nextion

it is obvious that if you want 2 decimal places, you will set the attribute vvs1 to 2 and you will multiply by 100



  • On a Textbox component after you convert the float value to String


Example:


String tempString = String(temperature, 1); // Convert the float value to String, with 1 decimal place
myNex.writeStr("t0.txt", tempString); // Write the String value to t0 Textbox component

Function writeStr();


Associated Library's Code Example: WriteTextAndCommands


Parameters:




  • writeStr(String, String). To change the .txt attribute in components

    String No1: objectname.textAttribute (example: “t0.txt” or “b0.txt”)

    String No2: value (example: “Hello World”)




  • writeStr(String). To send Designing and System Commands

    String: The command to send on Nextion




Description:

For writing text in Nextion. The two ways the command can be used:


First Usage of the command:

Use writeStr( String, String ) to change the text in a textbox

Use both parameters to write text in textboxes.



  • In the first parameter, write the objectName.textAttribute example: t0.txt or b0.txt

  • In the second parameter, write the text you want to “print”


1st Syntax:


myObject.writeStr("t0.txt", "Hello World"); // Change t0 text to "Hello World"

Any previous text on the textbox is deleted


Avoid using very big text Strings in the same command, as Nextion will not recognise them. Istead use a second command and in order to add to the existing text, use the + symbol, after the .textAttribute("t0.txt+").


myObject.writeStr("t0.txt", "You are now transferred to page2\\rThank you\\rfor choosing my library!!!");
myObject.writeStr("t0.txt+", "\\rEnjoy the library!!!");
myObject.writeStr("t0.txt+", "\\r\\rAthanasios Seitanis\\rseithagta@gmail.com");
/* By writing \\r, you send Nextion the change line character < \r >
* The second \ is required, in order to print the \ as character
* and not as an escape character.
*/


Second Usage of the command:

Use writeStr( String ) to send Designing and System Commands according to the instructions of Nextion’s Instruction Set.

Use only the first parameter to send a command to Nextion. The commands must be syntaxed according to Nextion’s Instruction Set.


2nd Syntax:

Design Commands Example:


myObject.writeStr("page page0"); // Sending this command to change the page we are on Nextion using pageName
myObject.writeStr("page 1"); // Sending this command to change the page we are on Nextion using pageId

myObject.writeStr("cir 100,100,30,RED"); // Renders a hollow Red circle with circle center at (100,100)

System Commands Example:


myObject.writeStr("dim=50"); // Set the current brightness level to 50%

myObject.writeStr("sleep=1"); // sleep=1 (Enter sleep mode) or sleep=0 (Exit sleep mode)

NOTE: When you decide to exit the sleep mode on Nextion, use a small delay of 50ms, in order to give Nextion some time to Exit sleep mode.

WARNING: DO NOT send commands that causes data return over Serial to MCU, unless you know what you are doing.

Commands that cause data return over serial:

print, prints, printh, sendme, get, rept, rdfile, twfile

TIP: Write in the debug mode the command to check if it is written correctly


Function readNumber();


Associated Library's Code Example: ReadAndWriteNumber


Parameters:

readNumber(String)



  • String: objectname.numericAttribute (example: “va0.val” “n0.val”, “n0.pco”, “n0.bco”…etc)


Description:

We use it to read the value of every components’ numeric attribute from Nextion (value, bco color, pco color…etc)


In case the function fails to read the new value, it will return the number 777777.

The reasons of getting 777777: (from release 1.0.2 and above)



  • Waiting bytes have not come to Serial timeout

  • Command start character is not found in Serial timeout

  • The waiting length of the byte package has not come to Serial

  • Bytes on Serial are not the expected

    The chances of getting a wrong value is one in a million.

    You can use this, fail return value, feature in your code, in case you handle sensitive value data, to confirm that you have the right value.

    You can check it with an if() statement, in which you will ignore the value of 777777 and you can run the readNumber() again or set a safe value or use the last good known value method.


uint32_t number = 0;
uint32_t lastnumber = 0;

number = myNex.readNumber("n0.val"); // We read the value of n0 and store it to number variable

if(number != 777777){ // 777777is the return value if the code fails to read the new value
lastnumber = number;

} else if(number == 777777){
number = lastNumber;
}

Syntax:


unsigned long x = myObject.readNumber("n0.val"); // Store to x the value of numeric box n0
unsigned long x = myObject.readNumber("va0.val"); // Store to x the value of the variable va0
unsigned int y = myObject.readNumber("b0.bco"); // Strore to y the color number of the background of button b0

NOTE: Only attributes shown in green in the Editor can be both read and changed by user code at runtime.

To


Function readStr();


Associated Library's Code Example: ReadString


Parameters:

readStr(String)



  • String: objectname.textAttribute (example: “t0.txt”, “va0.txt”, “b0.txt”…etc)


Description:

We use it to read the value of every components’ text attribute from Nextion (txt etc…)


In case the function fails to read the new value, it will return the text ERROR.

The reasons of getting ERROR: (from release 1.0.4 and above)



  • Serial buffer occupied timeout

  • Waiting bytes have not come to Serial timeout

  • Command start character is not found in Serial timeout

  • The end of the command has not come to Serial


The chances of getting a wrong value is one in a million.

You can use this, fail return value, feature in your code, in case you handle sensitive value data, to confirm that you have the right value.

You can check it with an if() statement, in which you will ignore the value of ERROR and you can run the readStr() again or set a safe value or use the last good known value method.


String text = "";
String lastText = "";

text = myNex.readStr("t0.txt"); // We read the value of t0 and store it

if(text.equals("ERROR") == false){ // ERROR is the return value if the code fails to read the new value
lastText = text;

} else if(text.equals("ERROR") == true){
text = lastText;
}

Syntax:


String x = myObject.readStr("t0.txt"); // Store to x the value of text box t0

Library Public Variables


Associated Library's Code Example: ChangePagesAndSentFloatValues


1st Variable:

currentPageId

A variable that stores the ID number of the current page loaded on Nextion. It is VERY important that Nextion and Arduino are synced and when you send data, the data goes to the right page.


NOTE: In order to update this variable with the current Id of the page, you must write the Preinitialize Event of every page: printh 23 02 50 XX , where XX the id of the page in HEX.

For page0: printh 23 02 50 00

for page9: printh23 02 50 09

for page10: printh 23 02 50 0A


See Appendix at the end of the document for numbers in HEX table


It can be called by writing:


int x = myObject.currentPageId; // Store to x the currentPageId

Example:


if(myObject.currentPageId == 0){
myObject.writeStr("t0.txt", "You are on page0!");
}else if(myObject.currentPageId == 1){
myObject.writeStr("t0.txt", "You are on page1!");
}

2nd Variable:

lastCurrentPageId

This variable stores the last value of currentPageId before currentPageId is changed. We use it to check if the page we are on has changed, in order to send refreshing screen data to the components of the page.


After that, it can be set to equal with the currentPageId, in order not to send unnecessary data for refreshing the components.


if(myObject.currentPageId != myObject.lastCurrentPageId){
if(myObject.currentPageId == 0){
[send the data to refresh the page0]
}else if(myObject.currentPageId == 1){
[send the data to refresh the page1]
}
myObject.lastCurrentPageId = myObject.currentPageId;
}

Find more on the Library’s Example: ChangePagesAndSentFloatValues

TIP: You can read the ID of the current Loaded page at anytime, without the use of the Library’s commands using the dp system command


int x = myObject.readNumber("dp"); // Store to x the ID of the current Loaded page

Function easyNexReadCustomCommand()


easyNexReadCustomCommand() has a weak attribute and will be created only when user

declares this function in the main code.

More for custom protocol and commands https://seithan.com/Easy-Nextion-Library/Custom-Protocol/

Our commands will have this format: # len cmd id id2

and we must send them from Nextion as HEX with the printh command.

For example: printh 23 03 4C 01 01



  • # start marker, declares that a command follows

  • len declares the number of bytes that will be received

  • cmd declares the task of the command or command group

  • id declares the properties of the command

  • id2 a second property for the command


When we send a custom command with the above format, the function NextionListen() will capture the start marker # and the len (first 2 bytes) and it will wait until all the bytes of the command, as we have declared with the len byte, arrive to the Serial buffer and inside the timeout limits.

After that, the function will read the next byte, which is the command group and the function readCommand() takes over and through a switch command tries to match the _cmd variable that holds the command group value with the statements of the cases.

If we do NOT have a match with the predefined, cmd of P for page and T for triggers, it will continue to the default where we store the _cmd and _len to the public variables cmdGroup and cmdLenght as we are going to need access to them from the main code in the next step.

Next we call the the easyNexReadCustomCommand() with the precondition and ONLY if we have declared the function in the main code.

From this point we can handle the assign of cmdGroup and IDs from the easyNexReadCustomCommand() in the user code, where we can go on with a switch case

for the cmdGroup, the one that we have stored the _cmd for public use and we can call it with myObject.cmdGroup. This is why we made cmdGroup a public variable.


As an example, we use 2 arrays (tables) of integers, where we are going to change the value of the position (element) with custom commands.


 int dataL[4] = {0,0,0,0}; //values 0 or 255, because we use only one byte
int dataS[4] = {0,0,0,0}; // values from 0 to 255, because we use only one byte

The format is the known: # len cmd id id2



  • where the id referred to the position (element) of the array we want to write on

  • And id2 carries the value to be written on the element of array.


The custom command from Nextion: printh 23 03 4C 00 0A



  • 4C is the Hex for letter L and we refer to the array dataL[]

  • 00 Hex of Dec number 0 used as the index for each array element

  • 0A Hex of Dec number 10 is the value we are going to write on element 0


After the command is executed by our code, the values on dataL[] array will be



  • dataL[4] = {10,0,0,0}


Same for the dataS[] intead that cmd is the 53 in Hex for letter S


void easyNexReadCustomCommand(){

int arrayPlace; // temp variable
int value; // temp variable

switch(myNex.cmdGroup){

case 'L': // Or <case 0x4C:> If 'L' matches
// we are going to write values in specific places in the dataL[] table
// read the next byte that determines the position on the table
arrayPlace = myNex.readByte();

// read the next byte that keeps the value for the position
value = myNex.readByte();

// update the array with the new values
dataL[arrayPlace] = value;

break;

case 'S': // Or <case 0x53:> If 'S' matches

// we are going to write values in specific places in the dataS[] table
// from Nextion printh 23 03 53 00 00
// read the next byte that determines the position on the table
arrayPlace = myNex.readByte();

// read the next byte that keeps the value for the position
value = myNex.readByte();

// update the array with the new values
dataS[arrayPlace] = value;

break;
}
}

Usefull Tips


Manage Variables

You can read/write the variables as any other component.


Use readNumber() to read the value of a numeric variable.

Example: myNex.readNumber("va0.val");

BUT: myNex.readNumber("sys0");


Use writeNum() to change the value of a numeric variable.

Example: myNex.writeNum("va0.val", 255);

BUT: myNex.readNumber("sys0", 375);


Use readStr() to read the text of a String variable.

Example: myNex.readStr("va0.txt");


Use writeStr() to change the text of a String variable.

Example: myNex.writeStr("va0.txt", "Hello World");

For this to happen, the variables you want to read/write must be at the page you are currently on.

Otherwise, if the variables are of global scope, you will need to use a prefix with the page name that the variables are at.

Example:

myNex.readNumber("page0.va0.val"); // If the variable is at page0

The same goes for the other functions as well.


Compatibility



  • Arduino

  • ESP


Tested MCUs:



  1. Arduino NANO

  2. Arduino MEGA 2560

  3. Arduino UNO

  4. WeMos D1 mini ESP8266


Releases:


Release 1.0.5



  • Updated readNumber() function for faster response and more accurate reading.

  • Added the readByte() function for reading Serial buffer from user code

  • Added easyNexReadCustomCommand() function with a weak attribute and will be created only when user declares this function in the main code. The motivation to move this function out of the library’s files, comes from Ricardo Reis thanks to his issue https://github.com/Seithan/EasyNextionLibrary/issues/15

  • Added public variables cmdGroup and cmdLength ONLY for read custom commands, stores the command group ID and the length of the command


Release 1.0.4



  • Added the readStr() function for reading a String from Nextion


Release 1.0.3


Two more examples were added.



  • The first one demonstrates how to use EasyNextionLibrary with waveforms.

  • The second one demonstrates how to use EasyNextionLibrary with progress bars


Release 1.0.2



  • Remove the private function readCommand() from the main EasyNextionLibrary.cpp file. A new file is created named readCustomCommands.cpp, in order to make easier the modifications for it when using the custom protocol.

  • Return Error code added and to other cases of readNumberFromSerial(). When failing to read a number, we return the number 777777 instead. The cases of having a 777777 return:

    • Waiting bytes have not come to Serial timeout

    • Command start character is not found in Serial timeout

    • The waiting length of the byte package has not come to Serial

    • Bytes on Serial are not the expected



  • The function readNumberFromSerial() is improved, making reading values more accurate, due to hardware or Serial problems.


Licence


This library is licensed under MIT X11 license.

Copyright © <2020> Athanasios Seitanis


Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:


The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.


THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


Except as contained in this notice, the name of Athanasios Seitanis or the name of EasyNextionLibrary shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Athanasios Seitanis.

Also, prior written permission is required if this software or any part of it or any modifications of it, are used for commercial purposes.


By using this software, you agree with the above terms and conditions as they are.

The owner of the software has the right to change the terms of this license at any time without a prior notification.


Appendix


Numbers in HEX:





































































































































































































































DECHEX-DECHEX-DECHEX-DECHEX
000-1610-3220-4830
101-1711-3321-4931
202-1812-3422-5032
303-1913-3523-5133
404-2014-3624-5234
505-2115-3725-5335
606-2216-3826-5436
707-2317-3927-5537
808-2418-4028-5638
909-2519-4129-5739
100A-261A-422A-583A
110B-271B-432B-593B
120C-281C-442C-603C
130D-291D-452D-613D
140E-301E-462E-623E
150F-311F-472F-633F