建立数组 存储热点信息(账号 密码) 存储热点的ip 子网掩码 默认网关信息
设置esp8266模式( wifi 和热点(AP) 连接wifi 并开启热点配置(初始化) )
定义IO引脚 并设置引脚模式
开启定时器并设置定时器中断函数(如果wifi连上 检测到ip 就执行贝壳(beike.lua))
创建一个服务器 (设置调用子模块 超时时间 )
定义一个模块 (定义模块rec(c,pl),pl为下面服务器接收到的字符串 判断接收的字符串来决定变量值 即标志位值)
创建监听端口 (监听80端口 并设置回调函数 顺带创建对象c
有消息就执行定义模块
给客户端发送信息和将已经接受的客户端信息覆盖 用继承)
主机程序
apcfg = {} --定义空的数组
apcfg.ssid = "myssid" --建立热点账号
apcfg.pwd = "123456789" --建议热点密码
cfg = {} --定义空的数组
cfg.ip = "192.168.4.1" --设置热点的ip地址
cfg.netmask = "255.255.255.0" --设置热点的子网掩码
cfg.gateway = "196.168.4.1" --设置默认网关
wifi.setmode(wifi.STATIONAP) --wifi的模式为STATION +AP模式
wifi.sta.config("ESP","123456789") --station模式下连接wifi,参数为密码 账号
wifi.ap.setip(cfg) --设置AP热点
wifi.ap.config(apcfg) --开启AP热点
_m=0 --全局变量
led = 4 --定义esp8266第4脚
gpio.mode(led,gpio.OUTPUT) --设置IO模式
buzzer = 1 --定义esp8266第4脚 led1为蜂鸣器
gpio.mode(buzzer,gpio.OUTPUT) --设置led
tmr.alarm(1, 1000, tmr.ALARM_AUTO, function() --开启定时器1s 计时器间隔为1秒 自动报警 使用function()作为对象
if wifi.sta.getip() == nil then --如果没有连上wif,打印字符串,等待连接
print("IP unavaiable, Waiting...")
else
print("Config done, IP is "..wifi.sta.getip()) --连上打印ip地址和ap地址,关闭定时器
dofile("beike.lua") --打开并执行文件(贝壳.c)
print("Config done, AP is "..wifi.ap.getip())
tmr.stop(1) --
end
end)
sv = net.createServer(net.TCP, 30) --创建一个服务器 调用子模块 超时时间(默认单位秒)
function rec(c,pl) --定义模块rec(c,pl),pl为下面服务器接收到的字符串
print(pl) --打印pl
local m=string.find(pl,"no")--解析pl,string.find()如果pl中有“no”字符,将位置给局部变量m,没有则为nil
if m == nil then --m为nil,_m=2,打印“this is ok”
_m=2
print("this is ok")
else --否则 _m=1
_m=1
end
c:close() --关闭服务器
end
if sv then
sv:listen(80,function(c) --监听80端口 回调函数
c:on("receive",rec)
local ip, port = c:getpeer(); --获取从机IP
print("port:"..port.." ip:"..ip); --打印连接服务器的端口和ip
c:send("OK") --给客户端发送“ok”
c:unhold() --将已经接受的客户端信息覆盖
end)
end
定义led 蜂鸣器 红外 IO 并设置各自模式
设置wifi模式并配置账号密码连接wifi
启动定时器检测是否连上wifi 有ip并打印相关信息
创建一个模块 作用在检测引脚中断
模块内容为(创建客户端并接受主机消息 如果高电平就触发中断发送有信号 点亮led 蜂鸣器响 反之亦然)
并且只要检测到客户端创建 就开始接收 连接指定的服务器端口和ip
从机
led=4 --定义esp8266端口led
buzzer=1 --定义esp8266端口蜂鸣器
hongwai=5 --定义esp8266端口红外
gpio.mode(led, gpio.OUTPUT) --设置led端口模式
gpio.mode(hongwai,gpio.INT) --设置红外端口模式
gpio.mode(buzzer, gpio.OUTPUT) --设置蜂鸣器端口模式
wifi.setmode(wifi.STATION) --设置wifi模式
wifi.sta.config("myssid","123456789") --设置连接wifi的密码账号配置并连接
tmr.alarm(1, 1000, tmr.ALARM_AUTO, function() --开启定时器1s 计时器间隔为1秒 自动报警 使用function()作为对象
if wifi.sta.getip() == nil then --检测是否有IP地址 即是否连上WIFI 并打印相关信息
print("IP unavaiable, Waiting...")
else
print("Config done, IP is "..wifi.sta.getip())
tmr.stop(1)
end
end)
function check(level) --创建一个模块
if wifi.sta.getip()~=nil then ~=符号为不等于
sk=net.createConnection(net.TCP, 0) --创建一个客户端(tcp/udp 1加密0不加密)
function receiver(sv, c) --接受主机的消息
if level == gpio.HIGH then --如果高电平触发中断
sv:send("have") --发送have
gpio.write(led,gpio.HIGH) --点亮led
gpio.write(buzzer,gpio.HIGH) --蜂鸣器响
else
sv:send("no") --发送no
gpio.write(led,gpio.LOW) --关闭led
gpio.write(buzzer,gpio.LOW) --蜂鸣器静音
end
print(c) --打印接受主机的消息
end
if sk then
sk:on("receive",receiver) --如果创建客户端 就开始接收
sk:connect(80,"192.168.4.1") --连接服务器 80端口 ip为192.168.4.1
end
--end)
end
end
gpio.trig(hongwai,"down",check) ----检测中断,高低电平触发,执行check
定义贝壳的三元组 并和贝壳的一样 设置贝壳设备ID 贝壳平台的ip 端口
设置红外引脚模式
建立tcp客户端 并连接到云平台端口 接受服务器消息 打印消息
将lua中的字符转换成json编码并包装进行检错(检测完毕正确向云平台发送json字符 设置定时器,每40s发送一次)
读取红外引脚电平 设置标准位s
贝壳
local DEVICEID1 = "9968" --云平台的设备id
local INPUTID="8765" --上传接口id
local APIKEY = "398daac0b" --云平台用户的APIKEY
local DEVICEID2 = "1351" --邮箱设备id
local HONGWAI = 5 --红外接口
local host = host or "www.bigiot.net" --贝壳云平台的ip
local port = port or 8181 --贝壳云平台的端口
s=0 --全局变量s
gpio.mode(HONGWAI,gpio.INPUT,PULLUP) --红外为输入上拉模式
cu = net.createConnection(net.TCP) --建立tcp客户端
cu:connect(port, host) -连接到云平台端口
cu:on("receive", function(cu, c) --接受到服务器的消息
print(c) --打印接受到服务器的消息
end)
ok1, s1 = pcall(cjson.encode, {M="checkin",ID=DEVICEID1,K=APIKEY})--将lua中的字符转换成json编码并包装进行检错 checkinok —— 固定,设备登录成功指令
if ok1 then --如果正确,打印编码的lua字符并打印
print(s1)
cu:send( s1.."\n" ) --向云平台发送json字符
else
print("failed to encode1!")
end
tmr.alarm(2,50000,1,function() --设置定时器,每40s发送一次
cu:send( s1.."\n" )
end)
function sendmessage() --发送消息模块
if s==1 or _m==1 then
gpio.write(buzzer,gpio.LOW) --蜂鸣器响
gpio.write(led,gpio.LOW) --点亮led
local v = {[INPUTID]="1"} --0或者1 云平台使用判断
ok3, s3 = pcall(cjson.encode, {M="update",ID=DEVICEID1,V=v}) --将lua中的字符转换成json编码并包装进行检错 一次上传单个接口数据示例:
ok2, s2 = pcall(cjson.encode, {M="alert", ID=DEVICEID2,C="1"})--将lua中的字符转换成json编码并包装进行检错 alert —— 固定,设备主动发送报警指令
if ok2 and ok3 then
print(s3)
print(s2)
cu:send(s2.."\n".. s3.."\n" )
else
print("failed to encode2.3!")
end
elseif s==0 or _m==2 then
gpio.write(buzzer,gpio.HIGH)
gpio.write(led,gpio.HIGH)
local v = {[INPUTID]="0"}
ok5, s5 = pcall(cjson.encode, {M="update",ID=DEVICEID1,V=v})--将lua中的字符转换成json编码并包装进行检错
if ok5 then
print(s5)
cu:send(s5.."\n" )
else
print("failed to encode4.5!")
end
end
end
tmr.alarm(3,1000,1,function() --读取红外引脚,如果为高电平,s=0,否则s=1
if gpio.read(HONGWAI) == 1 then
s=0
else
s=1
end
end)
tmr.alarm(0,5000,1,function()
sendmessage()
print(s.._m)
end)
硬件部分
有源蜂鸣器:“源”在这里所指不是电源之类而是内部所带振荡源,蜂鸣器内部有无振荡源的区别就是,无振荡源的直流信号不能直接令其发生,但是其音频可控,有源的直接I/O口给高电平就会发生
工作电压3.3~5V
红外传感器:采用E18-D80NK光电传感器漫反射式红外光电开关(NPN常开) 避障传感器模块。接线方式棕色正极蓝色负极黑色接信号输出。它集接收发射于一体
输入电压5VDC(直流)
负载电流 100mA
距离 80cm之内可调
ESP8266:
最小系统
引脚图
蜂鸣器电压5v需要额外供电,旁边排针黑色外接5v白色接负极。
D1蜂鸣器 D5红外传感器
参考链接:https://www.bigiot.net/help/1.html
https://www.bigiot.net/
底层代码:https://github.com/nodemcu/nodemcu-firmware/tree/1.5.4.1-final/app/modules
用到了gpio,cjson,wifi,net