注:我研究生已经在学习机器学习、深度学习相关知识。
已经不再做任何和本科有关的物联网项目了!
通过使用 ESP8266 模块,使用 Lua 语言编程,实现在局域网下的远程控制。
ESP8266 01 (最便宜的)和 TTL 转 USB
ESP8266 01
烧录 NoteMcu
NoteMcu
开发环境采用 ESPlorer ,到官网下载源码(3MB),运行需要 Java 环境,mac 应该自带。
IDE
其他:LED、杜邦线,接线很简单。下图是我的连接图。一个 LED 用于调试,接到 GPIO2,共地,ESP8266 通过 TTL-USB 连接到电脑。
将安装好 NoteMcu 的 ESP8266 链接到电脑(macOS Catalina 10.15.2)。解压 ESPlorer 源码,在终端中打开。运行如下代码启动开发环境。
java -jar "ESPlorer.jar"
在右侧窗口选择串口(/dev/cu.wchusbserial…
),点击 Open,然后重置 ESP8266 ( 没有 reset 键,可以拔掉 VCC 再重新插入),右侧窗口输入如下截图信息说明 NoteMcu 安装成功,准备工作完成。这里使用普通的串口调试助手也是可以的。
首次启动 NoteMcu
不能打开 init.lua 是正常的,接下来就是要创建 init.lua,并在此文件中编程程序,装载到安装好 NoteMcu 的 ESP8266 中。
现在编程一个简单的 Lua 程序,它使得 ESP8266 上电后,自动连接上一个热点,连接成功后,点亮 LED。
创建一个 init.lua
,内容如下,保存后 IDE 自动上传到 ESP8266 中,如果不自动上传,则点击Save to ESP
即可。
-- init.lua
pin = 4
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.LOW) -- LED Off
print('Setting up WIFI...')
wifi.setmode(wifi.STATION)
wifi.sta.config('Landon', '123456798')
wifi.sta.connect()
tmr.alarm(1, 1000, tmr.ALARM_AUTO, function()
if wifi.sta.getip() == nil then
print('Waiting for IP ...')
else
print('IP is ' .. wifi.sta.getip())
-- LED ON
gpio.write(pin, gpio.HIGH)
print("LED On")
tmr.stop(1)
end
end)
重置 ESP8266 (拔 VCC 重插),可以在右侧窗口中看到如下截图的输出。
此时用手机开一个热点,重启 ESP8266,可以在手机端看到有设备连接,ESP8266 点亮了 LED。
手机端检测到有设备连接。
接下来使用 Lua 编写一个远程控制页面,电脑只需要访问这个页面,就可以进行 LED 的远程控制。
这里的示例采用 AP 模式,即 ESP8266 创建一个热点,电脑连接后,访问特定的页面,可以进行 LED 控制。
在 init.lua 中输入以下代码(还加了点 CSS :) ):
wifi.setmode(wifi.SOFTAP) -- set AP parameter
config = {}
config.ssid = "NodeMCU"
config.pwd = "123456798"
wifi.ap.config(config)
config_ip = {} -- set IP,netmask, gateway
config_ip.ip = "192.168.2.1"
config_ip.netmask = "255.255.255.0"
config_ip.gateway = "192.168.2.1"
wifi.ap.setip(config_ip)
LEDpin = 4 -- declare LED pin
gpio.mode(LEDpin, gpio.OUTPUT)
server = net.createServer(net.TCP)-- create TCP server
function SendHTML(sck, led) -- Send LED on/off HTML page
htmlstring = "\r\n"
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring.."LED Control \r\n"
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring..""
htmlstring = htmlstring.."LED DEMO
\r\n"
htmlstring = htmlstring.."Click to switch LED on and off.
\r\n"
if (led) then
htmlstring = htmlstring.."LED status: ON\r\n"
else
htmlstring = htmlstring.."LED status: OFF\r\n"
end
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring..""
htmlstring = htmlstring.."\r\n"
htmlstring = htmlstring.."\r\n"
sck:send(htmlstring)
end
function receiver(sck, data)-- process callback on recive data from client
if string.find(data, "GET /ledon") then
SendHTML(sck, true)
gpio.write(LEDpin, gpio.HIGH)
elseif string.find(data, "GET / ") or string.find(data, "GET /ledoff") then
SendHTML(sck, false)
gpio.write(LEDpin, gpio.LOW)
else
sck:send("Not found...!!
")
sck:on("sent", function(conn) conn:close() end)
end
end
if server then
server:listen(80, function(conn)-- listen to the port 80
conn:on("receive", receiver)
end)
end
重置后,可以发现 ESP8266 创建了一个热点。
使用代码中的配置信息进行连接:
config.ssid = "NodeMCU"
config.pwd = "123456798"
LED 控制页面。
Chrome
Safari
手机- 夸克浏览器
点击绿色按钮,即可实现 LED 的亮灭控制。
推荐使用 Chrome 浏览器。
每次调试前 ESP8266 要重置。ESP8266-01 是最小模块(便宜),没有 reset 按键,可以通过拔 VCC 重插的方式 reset。