esp8266之红外报警

主机程序思路

建立数组  存储热点信息(账号 密码)   存储热点的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)

esp8266之红外报警_第1张图片
esp8266之红外报警_第2张图片
esp8266之红外报警_第3张图片
esp8266之红外报警_第4张图片
esp8266之红外报警_第5张图片
esp8266之红外报警_第6张图片
esp8266之红外报警_第7张图片
esp8266之红外报警_第8张图片

硬件部分
有源蜂鸣器:“源”在这里所指不是电源之类而是内部所带振荡源,蜂鸣器内部有无振荡源的区别就是,无振荡源的直流信号不能直接令其发生,但是其音频可控,有源的直接I/O口给高电平就会发生
工作电压3.3~5V
红外传感器:采用E18-D80NK光电传感器漫反射式红外光电开关(NPN常开) 避障传感器模块。接线方式棕色正极蓝色负极黑色接信号输出。它集接收发射于一体
输入电压5VDC(直流)
负载电流 100mA
距离 80cm之内可调
esp8266之红外报警_第9张图片
ESP8266:
最小系统
esp8266之红外报警_第10张图片
引脚图
esp8266之红外报警_第11张图片

蜂鸣器电压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

你可能感兴趣的:(ESP8266)