nodemcu随笔(esp8266 wifi)

Posted 何亚红

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodemcu随笔(esp8266 wifi)相关的知识,希望对你有一定的参考价值。

nodemcu

by HYH | 2017 年 6 月 16 日 下午 8:11

一.固件刷写

http://www.cnblogs.com/yangfengwu/p/6247048.html

官方网站:http://www.nodemcu.com

参考资料:https://github.com/wangzexi/NodeMCU-Tutorial

硬件资料(相关USB转串口驱动在divers/下):

https://github.com/nodemcu/nodemcu-devkit

https://github.com/nodemcu/nodemcu-devkit-v1.0

二.串口调试

下载串口调试工具(百度),打开连接nodemcu的串口。就可以像操作终端一样操作nodemcu了。

注意事项:

1.每一句lua语句要以回车或者英文分号结束,否则不会执行。

2.除打印的字符(双引号内的字符)外,其他的均为英文字符,由于博客限制,所有的英文符号在显示时均变为了中文符号,需要手动修改所有的符号。

三.脚本编写。

1.sdk(用于查看api)

https://nodemcu.readthedocs.io/en/master/en/support/

2.创建wifi并测试http。

lua脚本(wifi名:nodemcu wifi密码:12345678):

wifi.setmode(wifi.SOFTAP)

 cfg={}

 cfg.ssid=”nodemcu”

 cfg.pwd=”12345678″

 wifi.ap.config(cfg)

srv=net.createServer(net.TCP) srv:listen(80,function(conn) conn:on(“receive”,function(conn,payload) print(payload) conn:send(“<h1> Hello, NodeMcu.</h1>”)endend)

测试结果:

连上wifi后:

2.GPIO测试

lua脚本(低电平有效):

wifi.setmode(wifi.SOFTAP)
cfg={}
cfg.ssid=”nodemcu”
cfg.pwd=”12345678″
wifi.ap.config(cfg)
led1 = 1
led2 = 2
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on(“receive”, function(client,request)
local buf = “”;
local _, _, method, path, vars = string.find(request, “([A-Z]+) (.+)?(.+) HTTP”);
if(method == nil)then
_, _, method, path = string.find(request, “([A-Z]+) (.+) HTTP”);
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, “(%w+)=(%w+)&*”) do
_GET[k] = v
end
end
buf = buf..”<center> <h1> ESP8266 Web Control GPIO(GPIO1,GPIO2)</h1> </center>”;
buf = buf..”<p>D1:<a href=\\”?pin1=ON\\”>ON</a> <a href=\\”?pin1=OFF\\”>OFF</a></p>”;
buf = buf..”<p>D2:<a href=\\”?pin2=ON\\”>ON</a> <a href=\\”?pin2=OFF\\”>OFF</a></p>”;
local _on,_off = “”,””
if(_GET.pin1 == “ON”)then
gpio.write(led1, gpio.LOW);
elseif(_GET.pin1 == “OFF”)then
gpio.write(led1, gpio.HIGH);
elseif(_GET.pin2 == “ON”)then
gpio.write(led2, gpio.LOW);
elseif(_GET.pin2 == “OFF”)then
gpio.write(led2, gpio.HIGH);
end
client:send(buf);
client:close();
collectgarbage();
end)
end)

3.定时器测试

lua代码(每五秒打印字符):

tmr.register(0,5000,tmr.ALARM_AUTO,function(t) print(“timer0 reached”) end)
tmr.start(0)

停止定时器:

tmr.stop(0)

4.串口操作(uart)

直接写串口(使用默认串口配置,如需改变使用uart.config()):

uart.write(0,”hello world\\n”)

–写字符串

 

uart.write(0,102)

–写数字

使用回调处理串口(会使调试串口异常,断电或输入quit即可恢复):

— when ‘\\r’ is received.
uart.on(“data”, “\\r”,
function(data)
print(“receive from uart:”, data)
if data==”quit\\r” then
uart.on(“data”) — unregister callback function
end
end, 0)

Linux下,USB转串口的设备通常是 /dev/ttyUSBN(N为整数)。使用cat命令和echo命令即可做到简单的使用。

首先打开两个终端(一个用于读,另一个用于写):

读终端:

cat  设备

写终端(echo的内容用单(双)引号括起来):

echo 发送到串口的内容   > 设备

也可以在一个终端上用,只需要在cat命令后加一个&,使其在后台运行即可,只是这样Shell的输出将和串口输出混在一起。为了分清,可在串口输出结束后按enter使提示符出现。

 

 

5.adc(模数转换)

注意事项:

1.基准电压是3.3V而不是5V,引脚是A0

2.固件必须有adc这个模块(本文中2016没有这个模块)。

打印adc转换结果:

print(adc.read(0));

网页显示结果脚本:

wifi.setmode(wifi.SOFTAP)
cfg={}
cfg.ssid=”nodemcu”
cfg.pwd=”12345678″
wifi.ap.config(cfg)
led1 = 1
led2 = 2
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on(“receive”, function(client,request)
local buf = “”;
local _, _, method, path, vars = string.find(request, “([A-Z]+) (.+)?(.+) HTTP”);
if(method == nil)then
_, _, method, path = string.find(request, “([A-Z]+) (.+) HTTP”);
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, “(%w+)=(%w+)&*”) do
_GET[k] = v
end
end
A0  = string.format(“<p>A0=%d </p>”,adc.read(0))
buf = buf..”<center> <h1> ESP8266 Web Control GPIO(GPIO1,GPIO2)</h1> </center>”;
buf = buf..”<p>D1:<a href=\\”?pin1=ON\\”>ON</a> <a href=\\”?pin1=OFF\\”>OFF</a></p>”;
buf = buf..”<p>D2:<a href=\\”?pin2=ON\\”>ON</a> <a href=\\”?pin2=OFF\\”>OFF</a></p>”;
buf = buf..A0
local _on,_off = “”,””
if(_GET.pin1 == “ON”)then
gpio.write(led1, gpio.LOW);
elseif(_GET.pin1 == “OFF”)then
gpio.write(led1, gpio.HIGH);
elseif(_GET.pin2 == “ON”)then
gpio.write(led2, gpio.LOW);
elseif(_GET.pin2 == “OFF”)then
gpio.write(led2, gpio.HIGH);
end
client:send(buf);
client:close();
collectgarbage();
end)
end)

6.nodemcu实现telnet服务器(实现远程控制)

1)注意事项

由于固件限制,不能多开tcp服务器(即使用telnet服务时不能使用http服务)。

文件名保存为init.lua时才会自动加载,否则需要手动启动(dofile(“文件名”))。

原官方脚本兼容linux下的telnet,如果本脚本要在linux下使用,命令输入完成后,需要多按一下Enter。

2)代码:

wifi.setmode(wifi.SOFTAP)
cfg={}
cfg.ssid=”nodemcu”
cfg.pwd=”12345678″
wifi.ap.config(cfg)
s=net.createServer(net.TCP,180)
cmd=””
s:listen(23,function(c)
function s_output(str)
if(c~=nil)
then c:send(str)
end
end
node.output(s_output, 0)
— re-direct output to function s_ouput.
c:on(“receive”,function(c,l)
cmd=cmd..l
if(l==’;’ or l==”\\r\\n”)
then
node.input(cmd)
cmd=””
end
–like pcall(loadstring(l)), support multiple separate lines
end)
c:on(“disconnection”,function(c)
node.output(nil)
–unregist redirect output function, output goes to serial
end)
print(“Welcome to NodeMcu world.”)
end)

文件下载:inittelnet

3)测试

连上nodemcu的wifi热点后,在windows的cmd窗口中输入(使用本页所使用的固件的命令)

telnet  192.168.4.1

然后按回车即可开始输入命令(不具有退格功能,输入只能重输。出现>即可输下一条命令)

4)telnet客户端C源码(用于二次开发)

编译命令(MSYS2):

gcc -static libtelnet.c telnet.c  -o telnet

文件简介:

libtelnet.c libtelnet.h:libtelnet库

telnet.c:主程序所在文件

telnet

使用方法:

telnet程序路径 ip地址 端口

7.I2C使用

使用的是nodemcu-flasher自带的固件,下载nodemcu-flasher直接点flash烧录即可。

1)简单配置

使用I2C需要先配置I2c的gpio口(可自定义变量名,不过需要同时修改后面的指令)

id=0; (一般是0);

sda=1 ; (可根据实际情况修改)

scl=2; (可根据实际情况修改)

初始化i2c

i2c.setup(id, sda, scl, i2c.SLOW);

测试写(以PCF8591的DA为例,A0=A1=A2=0):

i2c.start(id);  //发起起始信号

i2c.address(id,地址, i2c.TRANSMITTER); //写设备地址(注意是高7位,比如PCF8591本来是0x90/0x91,但这里要写0x48)

i2c.write(id, 值);//写第一个值,按pcf8591用法,此次写的是片内控制寄存器

i2c.write(id, 值);//写第二个值,此时才是DA转换的数值

i2c.stop(id);//停止信号

测试读(以PCF8591的AD为例,A0=A1=A2=0):

i2c.start(id); //开始信号

i2c.address(id, 地址, i2c.TRANSMITTER);//设置地址

i2c.write(id, 值);//写控制寄存器

i2c.stop(id);//停止信号

i2c.start(id);//开始信号

i2c.address(id, 地址, i2c.RECEIVER);//设置地址

c=i2c.read(id, 1);//读一个字节并保存到C这个变量

i2c.stop(id);//停止信号

print(string.byte(c));//打印C的值

下面是一个用网页控制pcf8591的示例。

由init.lua与prf8591.lua组成,需要同时写到板子上。

prf8591封有3个函数。

分别是

init()

read()

write()

参数中addr为地址,con为控制寄存器内容,val为输出值。

prf8591

备用地址:https://github.com/HEYAHONG/nodemcu-firmware/tree/old-master/lua_modules/pcf8591

8.利用redis模块实现远程指令推送

1)条件

有一台redis数据库服务器,且有客户端使用redis的publish指令。

下载redis模块并下到nodemcu里:https://github.com/nodemcu/nodemcu-firmware/tree/master/lua_modules/redis

备用下载:https://github.com/HEYAHONG/nodemcu-firmware/tree/old-master/lua_modules/redis

2)lua编写

连接wifi

wifi.setmode(wifi.STATION)
wifi.sta.config(“SSID”,”密码”)

while(wifi.sta.getip() ==nil)
do
end
print(wifi.sta.getip()) //打印信息,可删除

连接redis

local redis = dofile(“redis.lua”).connect(‘服务器ip地址’,端口)

注册subscribe响应函数:

redis:subscribe(“频道”, function(channel, msg)
print(channel, msg) //打印信息,可删除
node.input(msg) //将获取到的信息执行
end)

redis

3)使用

启动nodemcu确认已连上热点(可连接到服务器)

登入redis:

publish 频道 ‘推送的命令’

redis测试版:

redis for windows

4)使用redis发送数据:

注意同一个连接只能使用一个功能,如果已经使用接收功能,需要新建一个连接(简单来说,就是新定义一个redis变量(以redis1为例))。

变量名=dofile(“redis.lua”).connect(‘IP地址’,端口);

变量名:publish(“频道”,”内容”);

发送的内容可在另一客户端接收。

注意由于redis库的bug,有很小可能无法发送带空格的字符串(会被截断)。

采用以下代码可把串口输出发送出去:

node.output(function(res) 变量名:publish(“频道”,res) end,X);

其中当X为1时,打开串口输出,为0时,关闭串口输出。

 

https://hyhsystem.cn/wordpress


以上是关于nodemcu随笔(esp8266 wifi)的主要内容,如果未能解决你的问题,请参考以下文章

NodeMCU连接wifi快速调用

ESP8266 nodemcu

ESP8266 / NodeMCU RESTful HTTP发布

ESP8266 WIFI模块可以直接链接arduino吗

ESP8266 NodeMcu机智云SOC方案开发经验分享

谁玩过ESP8266 WIFI模块和1117 3.3V稳压块