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

!1493372283331-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 地址
!


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
!


4.2 关闭 LED

ruff client.js off
可以看到 ESP32 开发板蓝色 LED 灯熄灭,同时日志中显示 turn off LED
!


关于 Net 模块,node 和 ruff 是兼容的,因此也可用 node 来执行 client.js 的代码

结束语

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

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

Let’s Ruff on!