About NodeMCU
NodeMCU is a very popular Micro controller with wifi access. It is based on ESP8266 - a cheap but powerful chip  and fully
support Arduino IDE. If you familiar with Arduino IDE, you can program NodeMCU in no time.
In this project, we will use NodeMCU to subscribe IOT message from MQTT broker and display the message on 1602 I2C LCD display.
MQTT is a Machine to Machine IOT  protocol.  This protocol allows one device(sender) to publish data to a MQTT  broker with
specified Topic, another device(receiver) which subscribes the same topic can easily get message from sending device.
Parts and Devices
NodeMCU board
I2C LiquidCrystal Display(16x2 LCD )
jumper wires
Circuit Connection Graph
Programming Prerequisite
Before running the project, we need set up the  Arduino IDE as per following procedures:
Library Installation:
In Arduino IDE, we need install MQTT client library to communicate with MQTT broker,  please download
the library from following link:
You also need to install LiquidCrystal_I2C library ,download link:
Unzip above file, move the unzipped folder to Arduino IDE library folder
(you can also import these two zip files to Arduino library from IDE).
Download sample code from following link
esp8266_i2c_1602.txt , copy the code into Arduino IDE. Before running the code,
please do following changes to fit your wifi and MQTT setting:
1)Line 19 and 20:
const char* ssid = "your_hotspot_ssid";
const char* password = "your_hotspot_password";
You need change these 2 lines to match your wifi SSID and password
2)Line 21
const char* mqtt_server = "broker.mqtt-dashboard.com";
You can use your own MQTT broker URL or IP address to set above mqtt_server value.
You can also use some famous free MQTT server to test the project such as
"broker.mqtt-dashboard.com",  "iot.eclipse.org" etc
If you want to install your own MQTT broker in Ubuntu Linux, please read this article
3)if your MQTT server require username and password authentication,  you need change line 86
Running the code
Before running the code, you need know the I2C address of your LCD display. normally
 it should be 0x27 or 0x3f. You can use test the address by running following program in
http://osoyoo.com/2014/12/07/16x2-i2c-liquidcrystal-displaylcd/,After you get correct I2C address,
update the I2C value  in the Arduino code(download link: esp8266_i2c_1602.txt )
After you running the code, please open the serial terminal window in upright corner of Arduino IDE.
If wifi hotspot name and password setting is ok and MQTT broker is connected, you will see following result:
After the NodeMCU connected to wifi and MQTT broker,  it will subscribe to a MQTT broker and waiting
for message. Let us publish a message from a MQTT client and test if NodeMCU can get this message.
You can select any MQTT client tool to send message to MQTT broker. simply use google to search
 MQTT client in internet, or search MQTT in Apple store or Google Play, you can find many free MQTT
client software. In  my case, I uses MQTTBox for Windows and did following configuration:
After click Save button, enter into Topic to publish screen,do configuration as following picture:
Make sure the topic your NodeMCU code client.subscribe("OsoyooCommand") 
fuction mush match MQTTBOX Topic to publish value
After you publish a "Hello World" message from payload text field, you i2c LCD
will display the "Hello World".