Professional Documents
Culture Documents
com
Copyright
www.circuitmix.com
Table of Contents
Copyright
Preface
1. Preparing Development Environment
1.1 NodeMCU
1.2 Electronics Components
1.2.1 Arduino Starter Kit
1.2.2 Fritzing
1.2.3 Cooking-Hacks: Arduino Starter Kit
1.2.4 Arduino Sidekick Basic kit v2
1.2.5 Grove - Starter Kit for Arduino
1.2.6 DFRobot - Arduino Kit for Beginner v3
1.3 Development Tools
1.4 Testing
2. Setting Up NodeMCU
2.1 Getting Started
2.2 Connecting NodeMCU board to Computer
2.3 Flashing The Latest NodeMCU Firmware
2.3.1 Windows Platform
2.3.2 Linux and OS X Platforms
2.4 Development Tools
2.4.1 Serial/UART Tool
www.circuitmix.com
2.4.2 Arduino IDE
2.4.3 NodeMCU Studio
2.5 Hello NodeMCU: Blinking LED
2.5.1 Wiring
2.5.2 Writing Program Using Serial/UART Tool
2.5.3 Uploading Lua Script File to NodeMCU Board
3. Lua Programming Language
3.1 Preparing Development Environment
3.2 Common Rule
3.3 Variables
3.3.1 Declaring Variable
3.3.2 Assigning Variables
3.3.3 Demo
3.4 Comment
3.5 Arithmetic Operations
3.6 Mathematical Functions
3.7 Increment and Decrement
3.8 Comparison Operators
3.9 Logical Operators
3.10 Decision - if..then
3.11 Iteration - for
3.12 Iteration - while
3.13 Iteration - repeat
www.circuitmix.com
3.14 break and do
3.15 Array
3.16 Functions
3.17 Lua Modules
4. GPIO Programming
4.1 Getting Started
4.2 Wiring
4.3 Writing a Program
4.4 Testing
5. PWM and Analog Input
5.1 Getting Started
5.2 Demo Analog Output (PWM) : RGB LED
5.2.1 Wiring
5.2.2 Writing Program
5.2.3 Testing
5.3 Demo Analog Input: Working with Potentiometer
5.3.1 Wiring
5.3.2 Writing Program
5.3.3 Testing
6. Working with I2C
6.1 Getting Started
6.2 Writing Program
6.3 Writing Program
www.circuitmix.com
6.4 Testing
7. UART
7.1 Getting Started
7.2 Wiring
7.3 Writing a Program
7.4 Testing
8. SPI
8.1 Getting Started
8.2 Wiring
8.3 Writing a Program
8.4 Testing
9. Working with OLED Display
9.1 Getting Started
9.2 Wiring
9.3 Writing a Program
9.4 Testing
10. Connecting to a Network
10.1 Connecting to a WiFi Hotspot
10.2 Building a Simple Web Server
Source Code
Contact
www.circuitmix.com
Preface
This book was written to help anyone want to get started with NodeMCU v2 board development. It describes the
basic elements of NodeMCU development starting with Lua programming.
Agus Kurniawan
Depok, July 2015
www.circuitmix.com
1. Preparing Development Environment
www.circuitmix.com
1.1 NodeMCU
NodeMCU is an open source IoT platform. It uses the Lua scripting language. NodeMCU
was created shortly after the ESP8266 came out. Further information, you can read it
on http://nodemcu.com/index_en.html . The following is a form of NodeMCU v2.
You can buy this product on your local electronic store. The following is the list of
Arduino store you can buy
SeeedStudio, http://www.seeedstudio.com/
Amazon, http://www.amazon.com
eBay, http://www.ebay.com
Banggood, http://www.banggood.com/
DX, http://www.dx.com/
www.circuitmix.com
1.2 Electronics Components
We need electronic components to build our testing, for instance, Resistor, LED, sensor
devices and etc. I recommend you can buy electronic component kit. We can use
electronics kit from Arduino to be developed on NodeMCU. The following is a list of
electronics kit which can be used in our case.
1.2.2 Fritzing
Store website: http://shop.fritzing.org/ .
You can buy Fritzing Starter Kit with Arduino UNO or Fritzing Starter Kit with Arduino
Mega.
www.circuitmix.com
1.2.3 Cooking-Hacks: Arduino Starter Kit
Store website: http://www.cooking-hacks.com/index.php/shop/arduino/starter-
kits/arduino-starter-kit.html
www.circuitmix.com
1.2.4 Arduino Sidekick Basic kit v2
Store website: http://www.seeedstudio.com/depot/Sidekick-Basic-Kit-for-Arduino-V2-p-
1858.html
You also can find this kit on this online store.
http://www.exp-tech.de/seeed-studio-sidekick-basic-kit-for-arduino-v2
www.circuitmix.com
1.2.5 Grove - Starter Kit for Arduino
Another option, you can buy this kit on Seeedstudio,
http://www.seeedstudio.com/depot/Grove-Starter-Kit-for-Arduino-p-1855.html .
www.circuitmix.com
www.circuitmix.com
1.3 Development Tools
To develop app with NodeMCU target, we can use any editor. In this book, I use Arduino
IDE for text editor. You can learn how to install it on chapter 2.
www.circuitmix.com
1.4 Testing
For testing, I used NodeMCU v2 on Windows 8.1.
www.circuitmix.com
2. Setting Up NodeMCU
www.circuitmix.com
2.1 Getting Started
In this chapter, we learn how to get started with NodeMCU board. We try to reflash the
latest NodeMCU firmware and then test some basic scripts.
www.circuitmix.com
2.2 Connecting NodeMCU board to Computer
Firstly, you connect NodeMCU board to PC via microUSB cable. After connected, you
may get lighting on blue LED.
If you are working on Windows platform, open Device Manager, you should see
NodeMCU board detected on Ports (COM & LPT).
www.circuitmix.com
However, if you get a problem about NodeMCU hardware driver, you update that driver.
You also can install a driver from Silicon Labs because NodeMCU v2 uses this chip,
from https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx .
Please download it based on your platform.
For instance, you download the driver for mac. Just follow instructions.
www.circuitmix.com
After installed, you verify it. For instance, on my OS X it has detected. Type this
command.
ls /dev/cu*
www.circuitmix.com
Next up, on your computer, use a serial console program such as CoolTerm (Mac) or Putty
(Windows) or screen (linux) to connect to NodeMCU board. For instance, I used PuTTY
on Windows.
www.circuitmix.com
If success, you should get NodeMCU shell in Lua script. You may get a problem, shown
in Figure below.
In this case, we must flash the latest NodeMCU firmware. I will explain it on the next
section.
www.circuitmix.com
2.3 Flashing The Latest NodeMCU Firmware
In this section, we try to flash the latest NodeMCU firmware. You can get the latest
NodeMCU firmware on https://github.com/nodemcu/nodemcu-firmware . Download *.bin
file.
In this scenario, I try to flash NodeMCU firmware on Windows, OSX and Linux.
www.circuitmix.com
Click Config tab and select firmware file.
www.circuitmix.com
If done, you will get a notification.
To test, you can use serial/UART tool and connect to NodeMCU board. Set NodeMCU
serial port and set baudrate 9600.
Then, connect to the board. If success, you should see NodeMCU shell.
www.circuitmix.com
Try to write a simple script print(“Hello NodeMCU”) so you will get a response.
www.circuitmix.com
Ubuntu Linux.
$ sudo add-apt-repository ppa:ubuntu-wine/ppa
$ sudo apt-get update
$ sudo apt-get install wine1.7
After running, wine directory has created. Navigate to dosdevices folder and create a
symlink to your NodeMCU tty device. For instance, on OS X my NodeMCU has detected
on /dev/tty.SLAB_USBtoUART so I map it to com1 .
$ cd ~/.wine/dosdevices
$ ln -s /dev/tty.SLAB_USBtoUART com1
www.circuitmix.com
If done, click START button. It will flash firmware to the board.
www.circuitmix.com
If done, you can test it using Serial/UART tool.
Select serial port of NodeMCU and set baudrate 9600. Then, try to connect. If success,
you should see Lua shell.
www.circuitmix.com
You can write simple program using print().
> print("Hello NodeMCU")
www.circuitmix.com
www.circuitmix.com
2.4 Development Tools
In this case, I show you several development tools you can use it in NodeMCU
development.
www.circuitmix.com
Then, click menu File -> Prefernces (Windows/Linux) or Arduino -> Preferences (OS X)
so you should see Preferences dialog.
Add http://arduino.esp8266.com/package_esp8266com_index.json on Additional Boards
Manager URLs . If you have the list on there, just add ; for new list item,
www.circuitmix.com
If done, click OK button.
Click menu Tools -> Board -> Boards Managers.
www.circuitmix.com
Then, you should see Boards Manager dialog. Find esp8266 board and install it.
After installed, you can see a list of ESP8266 Modules target on Arduino IDE.
www.circuitmix.com
Now you can write the program for NodeMCU.
www.circuitmix.com
www.circuitmix.com
2.5 Hello NodeMCU: Blinking LED
In this section, we build a blinking LED program via Lua shell. We use serial tool to write
a program.
Firstly, you must know NodeMCU GPIO. The following is NodeMCU v2 GPIO.
2.5.1 Wiring
Connect LED on NodeMCU D1. Other LED pin is be connected to NodeMCU GND.
Now you connect NodeMCU board to Computer via USB cable.
www.circuitmix.com
2.5.2 Writing Program Using Serial/UART Tool
The first demo is to blink a LED. Type this script per lin on Serial/UART tool.
-- hello.lua
pin = 1
gpio.mode(pin,gpio.OUTPUT)
gpio.write(pin,gpio.HIGH)
print(gpio.read(pin))
gpio.write(pin,gpio.LOW)
This script will turn on a LED on D1 and then turn off it.
www.circuitmix.com
If you should see lighting LED after executed gpio.write(pin, gpio.HIGH).
www.circuitmix.com
pin = 1
gpio.mode(pin,gpio.OUTPUT)
while 1 do
gpio.write(pin,gpio.HIGH)
tmr.delay(1000000)
gpio.write(pin,gpio.LOW)
tmr.delay(1000000)
end
You should see a blinking LED. If you want to stop, you can press RST button on
NodeMCU board.
Remove “sudo” if you’re working on Windows platform. Just run Command Prompt with
Administrator level.
www.circuitmix.com
Now you can download this tool using wget or download it directly on Github website.
$ wget https://raw.githubusercontent.com/4refr0nt/luatool/master/luatool/luato
$ wget https://raw.githubusercontent.com/4refr0nt/luatool/master/luatool/init.
$ wget https://raw.githubusercontent.com/4refr0nt/luatool/master/luatool/main.
If your installed Python is python, then change code on the top of script, from this script.
#!/usr/bin/env python2
For testing, I use blinking led from section 2.5.2. Save that script into a file, called
blinking_led.lua.
Type this command to upload to NodeMCU board.
$ ./luatool.py --port /dev/cu.SLAB_USBtoUART --src blinking_led.lua --dest bli
Change —port parameter based on your attached NodeMCU board, for instance, COM5,
/dev/ttyAM0.
www.circuitmix.com
If done, this file will be available on NodeMCU.
To execute this file, connect to NodeMCU via serial tool and type this command.
> dofile("blinking_led.lua")
www.circuitmix.com
If you want to upload and execute Lua script file, you can add —dofile parameter on your
command.
Type this command.
$ ./luatool.py --port /dev/cu.SLAB_USBtoUART --src blinking_led.lua --dest bli
This command will upload Lua file and then execute it.
If you modified codes and upload the file again, you must press RST to make sure
NodeMCU doesn’t keep your file.
Sometimes you want your program run after NodeMCU restarts, you can write Lua file
with named main.lua. This file will be executed by NodeMCU. Warning!! if your main.lua
is error, you will get problem on NodeMCU.
www.circuitmix.com
3. Lua Programming Language
This chapter explains the basic of Lua programming language. If you already know about
Lua programming, you can skip this chapter.
www.circuitmix.com
3.1 Preparing Development Environment
To work with Lua development, we must install Lua compiler and its runtime. You can
download it on http://www.lua.org based your platform. For OS X user, you can install it
via brew.
$ brew install lua
After installed, you can execute Lua and run some Lua syntax.
$ lua
> print("Hello Lua")
> a = 5 + 8
> print(a)
If you want to quit from Lua shell, you can press CTRL+D keys.
www.circuitmix.com
3.2 Common Rule
You can write Lua script without ending “;” at the end of syntax. Here is the syntax rule:
syntax_code1
syntax_code2
syntax_code3
www.circuitmix.com
3.3 Variables
In this section, we explore how to define a variable and assign its value.
Once declared, these variables can be used to store any type data.
3.3.3 Demo
For illustration for declaring variables using Lua, create a file, called basic.lua.
Write the following script for basic.lua.
-- this a simple script for Lua
-- declare variables
local city
local m, n
-- assignment
city = "Berlin"
m = 2
n = 5
www.circuitmix.com
a = 6
str = "Hello world"
local p,q = 10, 12
print(city)
print(m)
print(n)
print(a)
print(str)
print(p)
print(q)
www.circuitmix.com
3.4 Comment
You may explain how to work on your code with writing comments. To do it, you can use
— syntax. Here is sample code:
-- this a simple script for Lua
-- declare variables
local city
local m, n
www.circuitmix.com
3.5 Arithmetic Operations
Lua supports the same four basic arithmetic operations such as addition, subtraction,
multiplication, and division. For testing, create a folder arithdemo. Then, create a file,
called arithdemo.lua.
The following is the code illustration for basic arithmetic in arithdemo.lua:
-- basic arithmetic
a = 3
b = 2.4
c = a + b
d = a - b
e = a / b
f = a * b
print(c)
print(d)
print(e)
print(f)
www.circuitmix.com
3.6 Mathematical Functions
We try to work with math library. Create a file, called mathdemo.lua, and write this
script.
-- math demo
a = 2.5
b = 1.6
c = math.pow(a,2)
d = math.sin(a)
e = math.cos(b)
f = math.sqrt(a * b)
g = math.pi
print(c)
print(d)
print(e)
print(f)
print(g)
www.circuitmix.com
3.7 Increment and Decrement
We can write a script for increment and decrement using Lua.
increment a = a + 1
decrement. a = a - 1
a = 4
print(a)
-- increment
a = a + 1
print(a)
-- decrement
a = a - 3
print(a)
www.circuitmix.com
3.8 Comparison Operators
You may determine equality or difference among variables or values. Here is the list of
comparison operators:
== is equal to
~= is not equal
> is greater than
< is less than
>= is greater than or equal to
<= is less than or equal to
a = 3
b = 10
print(a < b)
print(a > b)
print(a <= b)
print(a >= b)
print(a == b)
print(a ~= b)
www.circuitmix.com
3.9 Logical Operators
These operators can be used to determine the logic between variables or values.
and and
or or
not not
Sample code:
-- logical operators
a = 3
b = 4
Save this script into a file, called logical.lua. Build and run it.
A sample output of the program can be seen in Figure below.
www.circuitmix.com
3.10 Decision - if..then
Syntax model for if..then can be formulated as below:
if conditional then
-- do something
else
-- do something
end
a = 3
if a>1 then
print("a>1")
b = 3
print(b)
else
print("a<1")
b = 10
print(b)
end
www.circuitmix.com
3.11 Iteration - for
Iteration operation is useful when we do repetitive activities. The following is for syntax.
for initialization,end number,step do
end
www.circuitmix.com
3.12 Iteration - while
Lua provides while syntax to do a looping.
Write this script for testing.
i = 1
while i < 10 do
print(i)
i = i + 1
end
Save this code into a file, called whiledemo.lua. Build and run it.
A sample output of the program can be seen in Figure below.
www.circuitmix.com
3.13 Iteration - repeat
Lua also provides repeat syntax to do looping. For a sample demo, type these scripts.
n = 5
repeat
print(n)
n = n + 1
until n > 12
www.circuitmix.com
3.14 break and do
break can be used to stop on the code point. We can use “do break end” to stop our
looping.
Write these scripts for testing.
print("--break demo---")
n = 1
while n < 10 do
print(n)
n = n + 1
if n == 7 then
do break end
end
end
www.circuitmix.com
3.15 Array
Like other programming language, Lua provides array called Tables. We can define an
array using {}. To get a length of array, we can use #variable_name.
For testing, type these scripts.
cities = {"tokyo", "new york", "london", "berlin"}
numbers = {2, 4, 6, 8, 10,12}
print(cities)
print("length:",#cities)
print(cities[3])
print("length numbers:",#numbers)
print(numbers[5])
www.circuitmix.com
3.16 Functions
A function can be used to save your redundant activities. We can define a function using
(). It can attach parameters and return a value.
Let’s write these scripts for testing.
function foo()
print("calling from foo()")
end
function add(a,b)
return a + b
end
print("---function demo---")
foo()
c = add(10, 5)
print(c)
www.circuitmix.com
3.17 Lua Modules
A module may consists of functions. It can save your development time due to reusable
API. To build a module in Lua, we just create a Lua file and called it.
For illustration, create a file, called simplemodule.lua and write these scripts.
function add(a, b)
return a + b
end
function compute(a, b, c)
return a + b - c
end
Then, we call simplemodule.lua on our code. Create a file, called loadmodule.lua and
write these scripts.
require("simplemodule")
print("--load module--")
res = add(10, 4)
print(res)
c = compute(5, 6, 8)
print(c)
www.circuitmix.com
4. GPIO Programming
In this chapter I’m going to explain how to work with GPIO on NodeMCU and write a
program.
www.circuitmix.com
4.1 Getting Started
In general, GPIO can be used to control digital I/O on NodeMCU. We can use gpio.read()
to read GPIO value and gpio.write() to write HIGH/LOW to GPIO pins. Firstly, we define
our GPIO mode using gpio.mode(). It can be either GPIO output or GPIO input. A list of
NodeMCU API can be read on this site, https://github.com/nodemcu/nodemcu-
firmware/wiki/nodemcu_api_en .
In this chapter, we build a program to illustrate how NodeMCU GPIO work. We need a
LED and a pushbutton.
Let’s start!.
www.circuitmix.com
4.2 Wiring
Connect LED to D1 on Arduino and pushbutton to D2. The following is a sample of
wiring.
www.circuitmix.com
4.3 Writing a Program
To create a program, we just create a new Lua file, called gpiodemo.lua. Then, write these
scripts.
led = 1
pushbutton = 2
gpio.mode(led,gpio.OUTPUT)
gpio.mode(pushbutton,gpio.INPUT)
while 1 do
state = gpio.read(pushbutton)
if state==0 then
gpio.write(led,gpio.LOW)
else
gpio.write(led,gpio.HIGH)
end
print(state)
tmr.delay(1000000)
end
www.circuitmix.com
4.4 Testing
Now you can upload and run this program to NodeMCU board. For testing, try to press
pushbutton. You should see a lighting LED.
You also see the program output if you connect to NodeMCU board via Serial app.
www.circuitmix.com
www.circuitmix.com
5. PWM and Analog Input
www.circuitmix.com
5.1 Getting Started
NodeMCU board provides Analog I/O which can be connected to sensor or actuator
devices. See the following of NodeMCU GPIO.
In this chapter, we try to access NodeMCU Analog I/O using Lua program. There are two
scenarios for our cases:
Let’s start.
www.circuitmix.com
5.2 Demo Analog Output (PWM) : RGB LED
In this scenario we build a Lua program to control RGB LED color using NodeMCU
Analog output (PWM). RGB LED has 4 pins that you can see it on Figure below.
Note:
Pin 1: Red
Pin 2: Common pin
www.circuitmix.com
Pin 3: Green
Pin 4: Blue
5.2.1 Wiring
For our testing, we configure the following PWM pins.
www.circuitmix.com
green = 2
blue = 3
function set_rgb(r, g, b)
print(r,g,b)
pwm.setup(red, 100, r)
pwm.setup(green, 100, g)
pwm.setup(blue, 100, b)
pwm.start(red)
pwm.start(green)
pwm.start(blue)
end
function stop_all_pwm()
pwm.stop(red)
pwm.stop(green)
pwm.stop(blue)
end
while 1 do
print("red")
set_rgb(0, 1023, 1023)
tmr.delay(1000000)
stop_all_pwm()
print("green")
set_rgb(1023, 0, 1023)
tmr.delay(1000000)
print("blue")
set_rgb(1023, 1023, 0)
tmr.delay(1000000)
print("yellow")
set_rgb(0, 0, 1023)
tmr.delay(1000000)
print("purple")
set_rgb(700, 1023, 700)
tmr.delay(1000000)
print("aqua")
set_rgb(1023, 0, 0)
tmr.delay(1000000)
end
This program will generate six colors: red, green, blue, yellow, purple, and aqua.
Save this file.
5.2.3 Testing
www.circuitmix.com
Upload and run the program. You should see several color on RGB LED.
The following is a sample demo on RGB LED.
If you connect to NodeMCU board via Serial app, you should get program output, shown
in Figure below.
www.circuitmix.com
www.circuitmix.com
5.3 Demo Analog Input: Working with Potentiometer
In this section, we learn how to read analog input on NodeMCU board. For illustration, I
use Potentiometer as analog input source. Our scenario is to read analog value from
Potentiometer. Then, display it on Lua shell.
NodeMCU v2 only has one ADC on A0. If you want to work with many analog input, you
must expand it using ICs based ADC. In this section, we are working on NodeMCU ADC
on A0.
Let’s start!.
5.3.1 Wiring
To understand Potentiometer, you see its scheme in Figure below.
You can connect VCC to NodeMCU board on 3V3 pin (VCC +3.3V). Vout to NodeMCU
board Analog input A0. In addition, GND to NodeMCU board GND. The following is
hardware implementation. I use slide potentiometer.
www.circuitmix.com
5.3.2 Writing Program
Firstly, create a file, called adcdemo.lua. To read analog input, we can use adc.read()
function. Ok, Let’s write these scripts.
print("ADC demo")
while 1 do
print("reading…")
val = adc.read(0)
print("Analog: ",val)
tmr.delay(1000000)
end
5.3.3 Testing
Upload and run this program. If success, you can see analog value on Serial app.
www.circuitmix.com
www.circuitmix.com
6. Working with I2C
In this chapter we learn how to work with I2C on NodeMCU board using Lua script.
www.circuitmix.com
6.1 Getting Started
The I2C (Inter-Integrated Circuit) bus was designed by Philips in the early ’80s to allow
easy communication between components which reside on the same circuit board. TWI
stands for Two Wire Interface and for most marts this bus is identical to I²C. The name
TWI was introduced by Atmel and other companies to avoid conflicts with trademark
issues related to I²C.
I2C bus consists of two wires, SDA (Serial Data Line) and SCL (Serial Clock Line).
NodeMCU v2 has I2C/TWI on SD0 (SDA), SD1 (SDA), SD2 (SDA), SD3 (SDA) and
CLK (SCL).
For testing, I used PCF8591 AD/DA Converter module with sensor and actuator devices.
You can find it on the following online store:
Amazon, http://www.amazon.com/PCF8591-Converter-Module-Digital-
Conversion/dp/B00BXX4UWC/
eBay, http://www.ebay.com
Dealextreme, http://www.dx.com/p/pcf8591-ad-da-analog-to-digital-digital-to-
analog-converter-module-w-dupont-cable-deep-blue-336384
Aliexpress, http://www.aliexpress.com/
www.circuitmix.com
In addition, you can find this device on your local electronics store/online store.
This module has mini form model too, for instance, you can find it on Amazon,
http://www.amazon.com/WaveShare-PCF8591T-Converter-Evaluation-
Development/dp/B00KM6X2OI/ .
This module use PCF8591 IC and you can read the datasheet on the following URLs.
http://www.electrodragon.com/w/images/e/ed/PCF8591.pdf
http://www.nxp.com/documents/data_sheet/PCF8591.pdf
www.circuitmix.com
I usually use this module to test I2C but NodeMCU v2 firmware doesn’t support with I2C
address 0x90. Basically you can modify firmware code and then built it.
In this chapter, we build a program to access sensor via I2C using Lua script and use
Arduino as I2C slave. We can use any pin on NodeMCU GPIO for I2C using I2c library
from NodeMCU firmware.
www.circuitmix.com
6.2 Writing Program
We use Arduino Uno as I2C source. You can connect Arduino Uno to NodeMCU board
directly.
The following is our wiring lab:
www.circuitmix.com
6.3 Writing Program
The first step is to write Arduino program. We can use Wire library to interact with I2C. In
this case, our Arduino acts as I2C slave and sends random byte.
Open Arduino IDE and write this code.
#include <Wire.h>
void sendData(){
byte data = randomDigit();
data = data + 30;
Wire.write(data);
Serial.println(data);
}
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
Wire.begin(SLAVE_ADDRESS);
TWBR = 152; // 50 kHz speed
Wire.onRequest(sendData);
}
void loop() {
delay(500);
}
www.circuitmix.com
Save this code. Compile and upload this program to Arduino board.
Now you can start to write a Lua program for NodeMCU. Create a file, called i2cdemo.lua
and write these scripts.
id=0
sda=1
scl=2
ARDUINO_I2C = 0x15
i2c.setup(id,sda,scl,i2c.SLOW)
function read_data(id,dev_addr)
www.circuitmix.com
i2c.start(id)
i2c.address(id, dev_addr,i2c.RECEIVER)
c = i2c.read(id,1)
c = i2c.read(id,1)
i2c.stop(id)
return c
end
print("I2C demo")
while 1 do
val = read_data(id, ARDUINO_I2C)
print("RCV: ",string.byte(val))
tmr.delay(1000000)
end
www.circuitmix.com
6.4 Testing
Now you can upload and run the Lua program to NodeMCU board.
If success, open Serial app and connect to NodeMCU to see the program output from Lua
shell. The following is a sample output.
You also can see the Arduino output using Serial Monitor.
www.circuitmix.com
www.circuitmix.com
7. UART
In this chapter I’m going to explain how to access UART on NodeMCU board.
www.circuitmix.com
7.1 Getting Started
NodeMCU v2 provides two UART but we only able to use one UART.
In this chapter, I use Arduino board as UART source. We read incoming message from
UART.
Let’s start!.
www.circuitmix.com
7.2 Wiring
In this scenario, I use Arduino Uno which is connected to NodeMCU board. The
following is our wiring.
www.circuitmix.com
7.3 Writing a Program
Firstly, we write a program for Arduino using Arduino IDE. We use SoftwareSerial to
access Serial on Digital 10 and 11. This program will wait incoming UART data and then
send to Arduino UART on 0 and 1 pins.
Write this program.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void loop()
{
if (mySerial.available() > 0) {
Serial.write(mySerial.read());
}
}
www.circuitmix.com
Save this program. Then, upload it to Arduino board. Before uploading, please make sure
Arduino UART (digital 0, 1, 10, and 11 pins) doesn’t connect to any board.
The next step is to write a program for NodeMCU board. Create a file, called
uartdemo.lua. Write these scripts.
uart.setup(0, 9600, 8, 0, 1, 0)
val = 65
-- looping
while 1 do
uart.write(0,string.char(val),"\r\n")
val = val + 1
www.circuitmix.com
if val>90 then
val = 65
end
tmr.delay(1000000)
end
www.circuitmix.com
7.4 Testing
Now you can upload and run Lua program. Don’t connect NodeMCU UART to Arduino
while uploading a program. If done, connect NodeMCU UART to Arduino UART (Digital
pins: 10 and 11).
To see the UART output, open Serial Monitor tool from Arduino IDE. Set baud 9600 and
No line ending. You should see the UART output.
www.circuitmix.com
8. SPI
In this chapter I’m going to explain how to work with SPI on NodeMCU board.
www.circuitmix.com
8.1 Getting Started
The Serial Peripheral Interface (SPI) is a communication bus that is used to interface one
or more slave peripheral integrated circuits (ICs) to a single master SPI device; usually a
microcontroller or microprocessor of some sort.
SPI in NodeMCU board can be defined on the following pins:
MOSI
MISO
SCK
You can see these pins on S NodeMCU board, shown in Figure below.
We can only use one SPI on NodeMCU board with SPI master mode. If we’re working on
SPI, we can’t access UART on the board. In this chapter, I use Arduino board as SPI slave.
Let’s start!.
www.circuitmix.com
8.2 Wiring
To work both SPI and UART/USB, we don’t connect MISO pin. For testing, I use Arduino
board. Do wiring as follows.
NodeMCU MOSI (SD1) pin is connected to Arduino MOSI (Digital 11) pin
NodeMCU SCLK (CLK) pin is connected to Arduino SCK (Digital 13) pin
NodeMCU GND pin is connected to Arduino GND pin
NodeMCU CS (CMD) pin is connected to Arduino SS (Digital 10) pin
www.circuitmix.com
8.3 Writing a Program
Firstly, we write a program for Arduino. Write these codes on Arduino IDE.
#include <SPI.h>
char buf;
volatile byte pos;
volatile boolean isAvailable;
void setup() {
Serial.begin (9600); // for debugging
// SPI slave mode
SPCR |= bit (SPE);
SPCR |= _BV(SPIE);
isAvailable = false;
pos = 0;
pinMode(MISO, OUTPUT);
SPI.attachInterrupt();
}
ISR (SPI_STC_vect)
{
byte c = SPDR;
if(c>64 && c<91){
buf = c;
isAvailable = true;
}
}
void loop() {
if(isAvailable){
Serial.println (buf);
isAvailable = false;
}
}
This program does wait incoming data from SPI master and then display the received data
to Arduino Serial so we can see it on Serial Monitor.
www.circuitmix.com
Save this program as Arduino_spi. Build and upload the program to Arduino board.
The next step is to write a program for NodeMCU. Create a file, called spidemo.lua, and
write these scripts.
spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, spi.DATABITS_8, 0)
val = 65
while 1 do
spi.send(1,string.char(val))
print(string.char(val))
val = val + 1
if val>90 then
val = 65
end
www.circuitmix.com
tmr.delay(1000000)
end
www.circuitmix.com
8.4 Testing
Now you can upload Lua program to NodeMCU board. If done, open Serial Monitor tool
from Arduino. You should see received data from SPI.
If you connect to NodeMCU board via Serial tool, you should see the program output too.
www.circuitmix.com
9. Working with OLED Display
In this chapter I’m going to explain how to work with OLED display
www.circuitmix.com
9.1 Getting Started
We can display characters, numbers or symbols using an OLED graphic display module.
An organic light-emitting diode (OLED) is a light-emitting diode (LED) in which the
emissive electroluminescent layer is a film of organic compound which emits light in
response to an electric current [source: http://en.wikipedia.org/wiki/OLED].
In this chapter, we work with OLED display 128x64 with I2C interface which display
characters.
Let’s start!.
www.circuitmix.com
9.2 Wiring
The following is our wiring:
www.circuitmix.com
9.3 Writing a Program
For testing, we use a sample program from https://github.com/nodemcu/nodemcu-
firmware/blob/master/lua_examples/u8glib/u8g_graphics_test.lua . With activating OLED
with I2C interface.
Create a file, called oleddemo.lua, and write this code.
function init_i2c_display()
-- SDA and SCL can be assigned freely to available GPIOs
local sda = 1 -- GPIO05 (D1)
local scl = 2 -- GPIO04 (D2)
local sla = 0x3c
i2c.setup(0, sda, scl, i2c.SLOW)
disp = u8g.ssd1306_128x64_i2c(sla)
end
function box_frame(a)
disp:drawStr(0, 0, "drawBox")
disp:drawBox(5, 10, 20, 10)
disp:drawBox(10+a, 15, 30, 7)
disp:drawStr(0, 30, "drawFrame")
disp:drawFrame(5, 10+30, 20, 10)
disp:drawFrame(10+a, 15+30, 30, 7)
end
function disc_circle(a)
disp:drawStr(0, 0, "drawDisc")
disp:drawDisc(10, 18, 9)
disp:drawDisc(24+a, 16, 7)
disp:drawStr(0, 30, "drawCircle")
disp:drawCircle(10, 18+30, 9)
disp:drawCircle(24+a, 16+30, 7)
end
function r_frame(a)
disp:drawStr(0, 0, "drawRFrame/Box")
disp:drawRFrame(5, 10, 40, 30, a+1)
disp:drawRBox(50, 10, 25, 40, a+1)
end
function stringtest(a)
disp:drawStr(30+a, 31, " 0")
disp:drawStr90(30, 31+a, " 90")
www.circuitmix.com
disp:drawStr180(30-a, 31, " 180")
disp:drawStr270(30, 31-a, " 270")
end
function line(a)
disp:drawStr(0, 0, "drawLine")
disp:drawLine(7+a, 10, 40, 55)
disp:drawLine(7+a*2, 10, 60, 55)
disp:drawLine(7+a*3, 10, 80, 55)
disp:drawLine(7+a*4, 10, 100, 55)
end
function triangle(a)
local offset = a
disp:drawStr(0, 0, "drawTriangle")
disp:drawTriangle(14,7, 45,30, 10,40)
disp:drawTriangle(14+offset,7-offset, 45+offset,30-offset, 57+offset,
disp:drawTriangle(57+offset*2,10, 45+offset*2,30, 86+offset*2,53)
disp:drawTriangle(10+offset,40+offset, 45+offset,30+offset, 86+offset,
end
function ascii_1()
local x, y, s
disp:drawStr(0, 0, "ASCII page 1")
for y = 0, 5, 1 do
for x = 0, 15, 1 do
s = y*16 + x + 32
disp:drawStr(x*7, y*10+10, string.char(s))
end
end
end
function extra_page(a)
disp:drawStr(0, 12, "setScale2x2")
disp:setScale2x2()
disp:drawStr(0, 6+a, "setScale2x2")
disp:undoScale()
end
prepare()
if (component == 0) then
box_frame(bit.band(draw_state, 7))
elseif (component == 1) then
disc_circle(bit.band(draw_state, 7))
elseif (component == 2) then
r_frame(bit.band(draw_state, 7))
elseif (component == 3) then
www.circuitmix.com
stringtest(bit.band(draw_state, 7))
elseif (component == 4) then
line(bit.band(draw_state, 7))
elseif (component == 5) then
triangle(bit.band(draw_state, 7))
elseif (component == 6) then
ascii_1()
elseif (component == 7) then
extra_page(bit.band(draw_state, 7))
end
end
function graphics_test(delay)
print("--- Starting Graphics Test ---")
init_i2c_display()
graphics_test(50000)
www.circuitmix.com
9.4 Testing
Now you can compile and run this program into NodeMCU board. You should see OLED
displays some characters, symbols and graphics.
www.circuitmix.com
10. Connecting to a Network
In this chapter I’m going to explain how to connect a network from NodeMCU.
www.circuitmix.com
10.1 Connecting to a WiFi Hotspot
We can wifi object to work with WiFi module on NodeMCU. For instance, we connect a
SSID with a pin password.
Write this code.
-- connect a WIFI network
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","password")
print("connecting…")
wifi.sta.connect()
ip = wifi.sta.getip()
print("IP: ",ip)
Change SSID and password values. Save this code into a file called network.lua.
Upload this program. Then, run it via Serial program so you can see NodeMCU’s IP
Address.
www.circuitmix.com
10.2 Building a Simple Web Server
The second demo is to build a simple web server. Write this code.
wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","password")
print("connecting…")
wifi.sta.connect()
ip = wifi.sta.getip()
print("IP: ",ip)
srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
conn:on("receive",function(conn,payload)
print(payload)
conn:send("HTTP/1.1 200/OK\r\nServer: NodeMCU\r\nContent-Type: text/html
conn:send("<html><head><title>NodeMCU</title></head><body><p>Hello, NodeMc
end)
conn:on("sent",function(conn) conn:close() end)
end)
Change SSID and password values. Save this code into a file called webserver.lua.
Upload this program. Then, run it via Serial program so you can see NodeMCU’s IP
Address.
Open a browser and navigate to IP address of NodeMCU.
www.circuitmix.com
www.circuitmix.com
Source Code
www.circuitmix.com
Contact
www.circuitmix.com