Widora-AIR新玩法,借助ruff来写JavaScript程序


  • administrators

    0_1493372290738_ruff.png
    ruff官网:ruff.io
    文档:https://ruff.io/zh-cn/docs/
    官网的标准ruff是RT5350平台,而针对ESP32的则是Ruff Lite,见这个页面:https://ruff.io/zh-cn/docs/download.html

    来点好玩的吧。用ESP32实现远程点灯教程

    该文转自:http://community.ruff.io/t/ruff-lite-esp-32/1049
    ESP32 第一个发布版本(v0.1.0)虽然提供的功能比较少,但无论是网络模块还是硬件控制,都已经涵盖,可谓是麻雀虽小五脏俱全,既提供了基本的 WiFi 配置的功能,又支持 JavaScript 的 Net 模块,还可以进行 GPIO 的输入输出操作。本文就基于此,为大家介绍一个简单的案例 -- 通过无线网络实现远程点灯。

    前提条件

    本文假设读者已经阅读完 Ruff Lite (esp32)的起步走文档,并且已经成功地点亮板载上的蓝色 LED。如果没有经历这一步,请移至 ESP32 开发环境准备6和Ruff Lite 起步走8进行学习。

    原理

    本案例建立在 TCP 通信的基础上,让 ESP32 作为 TCP server,等待 PC 端的 TCP client 发来的控制命令,如果控制命令为 on,则点亮板载 LED,若控制命令为 off,则关闭板载的 LED。

    步骤

    本案例共分为以下四个步骤:

    • 创建 Ruff 应用,并编写 TCP server 逻辑代码
    • 部署 Ruff 应用,执行 TCP server
    • 编写 TCP client 逻辑代码
    • 执行 TCP client 控制 LED 开关
      具体实现过程

    以下过程是在 MacOS 上完成,查看系统日志的方式和 Windows 稍有不同

    1 创建 Ruff 应用,并编写 TCP server 逻辑代码

    1.1 创建 Ruff 应用

    $ mkdir esp32-wifi-led
    $ cd esp32-wifi-led
    $ rap init --board esp32-air-v40
    

    1.2 编写 WiFi 配置逻辑代码

    vim src/index.js
    
    $.ready(function (error) {
        if (error) {
            console.log('error', error);
            return;
        }
    
        var wifi = require('esp32-wifi');
        var net = require('net');
    
        wifi.start({
            'ssid': 'your-ssid',
            'password': 'your-password'
        });
    
        wifi.on('connect', function (ip) {
            console.log('ip address: ' + ip.ip); // 显示 ESP32 连接到 AP 后获得的 IP 地址
        });
    });
    

    1.3 编写 TCP server 代码

    wifi.on('connect', function (ip) {
    	console.log('ip address: ' + ip.ip);
    		
        var server = net.createServer();
        server.listen(8888);
    
        server.on('connection', function (sock) {
            sock.on('data', function (buffer) {
                var command = buffer.toString();
                
                // 如果 TCP client 发送来的命令为 on,则点亮 LED
                if (command === 'on') {
                    console.log('turn on LED');
                    $('#led').turnOn();
                // 如果 TCP client 发送来的命令为 off,则关闭 LED
                } else if (command === 'off') {
                    console.log('turn off LED');
                    $('#led').turnOff();
                } else {
                    console.log('Invalid command: ' + command);
                }
                
                // 发送给 TCP client OK 表示成功响应此次命令
                sock.write('OK');
            });
        });
    
        server.on('listening', function () {
            console.log('TCP server starts to listen port 8888');
        });
    });
    

    2 部署 Ruff 应用,执行 TCP server

    rap deploy
    screen /dev/cu.SLAB_USBtoUART 115200,cs8
    

    可以看到日志中显示 IP 地址
    0_1493372716412_a68055b6e6f143cb1278663edad6f90515c61810.png
    ip address: xxx.xxx.xxx.xxx
    TCP server starts to listen port 8888
    xxx.xxx.xxx.xxx 为 ESP32 获得的 IP 地址

    退出 screen 方式:先按 CTRL + A,再按 k ,最后按 y退出

    3 编写 TCP client 逻辑代码

    再打开一个终端

    vim client.js
    
    var net = require('net');
    var command = process.argv[2]; // 命令行中执行此文件时的第三个参数作为 command
    
    var HOST = 'xxx.xxx.xxx.xxx'; // 这里填写第2步中显示的 IP 地址
    var PORT = 8888;
    
    var client = net.createConnection({port: PORT, host: HOST});
    
    client.on('connect', function () {
        if (command !== undefined) {
            client.write(command);
        }
    });
    
    client.on('data', function (buffer) {
        var ack = buffer.toString();
        if (ack === 'OK') {
            client.destroy();
        }
    });
    

    4 执行 TCP client 控制 LED 开关

    4.1 点亮 LED

    ruff client.js on
    可以看到 ESP32 开发板蓝色 LED 灯点亮,同时日志中显示 turn on LED
    0_1493372765590_21f7fee27dce2b4719946a3d9f09cfa3f5fafea4.jpg
    4.2 关闭 LED

    ruff client.js off
    可以看到 ESP32 开发板蓝色 LED 灯熄灭,同时日志中显示 turn off LED
    0_1493372782757_00c10d0152c4da7bc9cca519d2156e2637c9952e.jpg
    关于 Net 模块,node 和 ruff 是兼容的,因此也可用 node 来执行 client.js 的代码

    结束语

    LED 的驱动 led-gpio 和继电器的驱动 relay-1c 原理相同,都是通过向一个 GPIO 管脚写高电平或低电平,控制其开关。如果读者感兴趣的话,可以加入一个继电器,从而远程控制一个正常的电灯开关。

    欢迎更多开发者来尝试新的开发

    Let's Ruff on!