基于ESP8266灯控

 

ESP8266灯控硬件:使用淘宝ESP-01模块,带一个ESP8266插槽和一个5V继电器,220V转5V用拆下的手机充电器

ESP8266代码,开放TCP Server(80)端口,同时作为TCP Client连接远端TCP Server,可读取和配置pin1、pin2,可读取adc

WIFI_NAME = "MERCURY_204"
WIFI_PASSWORD = "Password"
SERVER_IP = "192.168.1.200"
SERVER_PORT = 8081

led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
wifi.setmode(wifi.STATION)
wifi.sta.config(WIFI_NAME, WIFI_PASSWORD)
wifi.sta.connect()
wifi.sta.autoconnect(1)

Watchdog = 0
local function receiveData(data)
    Watchdog = 0
    local _GET = {}
    for k, v in string.gmatch(data, "(%w+)=(%d*)") do
        _GET[k] = v
    end
    
    local buf = "ID="..node.chipid();
    if(_GET.PIN1 == "1")then
        gpio.write(led1, gpio.HIGH);
        print("led1 on")
    elseif(_GET.PIN1 == "0")then
        gpio.write(led1, gpio.LOW);
        print("led1 off")
    end
    if(_GET.PIN1 ~= nil)then
        buf = buf.." PIN1="..gpio.read(led1)
    end
    
    if(_GET.PIN2 == "1")then
        gpio.write(led2, gpio.HIGH);
        print("led2 on")
    elseif(_GET.PIN2 == "0")then
        gpio.write(led2, gpio.LOW);
        print("led2 off")
    end
    if(_GET.PIN2 ~= nil)then
        buf = buf.." PIN2="..gpio.read(led2)
    end
    
    if(_GET.ADC ~= nil)then
        buf = buf.." ADC="..adc.read(0)
    end
    return buf
end

ClientConnectedFlag = 0
i=0
tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip()== nil then
        print("IP unavaiable, Waiting...")
        i=i+1
        if(i>10) then
            print("restart nodeMCU")
            node.restart()
        end
    elseif ClientConnectedFlag == 0 then
        print("Connecting to Server...")
        Client = net.createConnection(net.TCP, 0)
        Client:connect(SERVER_PORT, SERVER_IP)

        Client:on("receive", function(Client, data)
            Client:send(receiveData(data));
            collectgarbage();
        end)
        Client:on("connection", function(sck, c)
            ClientConnectedFlag = 1
        end)
        Client:on("disconnection", function(sck, c)
            ClientConnectedFlag = 0
        end)
    elseif Watchdog >= 120 then
        Watchdog = 0
        ClientConnectedFlag = 0
        Client:close();
    else
        Watchdog = Watchdog + 1
    end
end)

srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,data)
        client:send(receiveData(data));
        client:close();
        collectgarbage();
    end)
end)

PC上使用QT开放两个TCP Server(8080、8081),8081端口用于管理设备,8080端口用于与Android终端通讯

基于ESP8266灯控_第1张图片

打印Log

基于ESP8266灯控_第2张图片

Android终端作为TCP Client连接到PC的TCP 8080端口,通过Server获取和配置已连接的设备信息;

利用百度语音识别SDK,在Android上实现语音识别,将识别的文字发送给PC,实现手机端的语音控制。

基于ESP8266灯控_第3张图片

设备、PC、Android连接方式:

基于ESP8266灯控_第4张图片


方案改进:利用了之前买的nanopi开发版,手掌心大小,通过网线接入到局域网中,配置静态ip为192.168.1.200,将nanopi代替pc

nanopi上运行ubuntu系统,在pc上建立ubuntux64虚拟机,安装好arm交叉编译器,在pc上完成程序移植,因为下载qt太慢,直接用c重新写了一遍,相比之下c代码对字符串的处理真是麻烦,全部当数组操作。调试ok后编译拷贝到nanopi上,赋予可执行权限,就可以通过nanopi控制esp8266了

基于ESP8266灯控_第5张图片

编写设备属性文件,编写读写配置文件接口

devices.txt
#id:name:description
12063707:人检测传感器:传感器
4437787:插座:灯、风扇
12345:测试:测试

使用小米USB WIFI代替网线,可让nano pi插电即可用,原先的nano pi系统中不包含mt7601驱动,下载最新镜像,即插即用,配置正确wifi名称和密码即可。

su root
nmcli dev
nmcli r wifi on
nmcli dev wifi
nmcli dev wifi connect "TP-LINK_102" password "88888888" ifname wlan0

NanoPI镜像下载地址及列表:http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M1#Get_Image_Files

目前使用的是nanopi-m1_sd_friendlycore-xenial_4.14_armhf_20190823.img.zip,系统镜像更新加载方式请参看NanoPI官方说明。


加入LUA脚本接口,在控制器中解析并执行LUA脚本,脚本中实现简单的逻辑判断,例如加入人体热释电传感器后,如果检测到信号为1,则打开电灯。

LUA源码,官方网站:http://www.lua.org/ftp/

C和LUA互相调用方法可以参看博客:https://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html

伪代码:
onDeviceChange:
    如果pin1变化,pin1值为1,名称是"IRA"
        如果时间在晚上5点以后,名称是"LIGHT"的pin1值为0 {
            名称是"LIGHT"的pin1值设置为1
            播放MP3文件
            //汇报当天家中情况: 红外传感器捕捉几次,
        }

下载安装注册蒲公英VPN,只要安装蒲公英VPN即可在外网环境下以同一局域网方式互相访问,实现远程监看和控制家中设备。


利用nano pi麦克风,拾取环境音,利用百度语音识别API完成指令识别,响应诸如”开灯“、”关灯“之类指令,实现插座语音控制。

百度语音转文字API接口:vop.baidu.com/server_api,并根据指令进行智能应答

百度文字转语音API接口:tsn.baidu.com/text2audio

增加查询天气接口:http://wthrcdn.etouch.cn/weather_mini?city=上海,可查询最近5日天气,响应诸如”今天天气“、”明天天气“之类指令。使用gzip解压后得到json数据:

基于ESP8266灯控_第6张图片

 


由于程序不断更改,经常运行几天后出现异常退出,不方便gdb调试,为不影响自己使用体验,使用了linux中cron服务,定期开启。启动脚本start.sh:

#!/bin/bash
work_path=$(dirname $(readlink -f $0))
cd ${work_path}
PROCESS=`ps -e|grep MasterControl| wc -l` 
#echo $PROCESS
if [ $PROCESS -eq 0 ]
then
    nohup ./MasterController &
fi
//cron常用指令
sudo apt-get install cron
service cron start
service cron stop
service cron restart
crontab -e
ls -l /etc/init.d //查看本机上所有cron服务

echo "*/2 * * * * /home/user/start.sh" >> davecron
crontab davecron //davecron为cron配置脚本

 

你可能感兴趣的:(Linux)