Ruff Lite | 用 ESP 32 实现远程点灯教程

案例

(jing) #1

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

前提条件

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

原理

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

步骤

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

  1. 创建 Ruff 应用,并编写 TCP server 逻辑代码
  2. 部署 Ruff 应用,执行 TCP server
  3. 编写 TCP client 逻辑代码
  4. 执行 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!


怎样利用移动端去控制主板
请教关于Ruff开发板网络连接的第4种使用场景?
(abdurahmanosman) #2

你好。这个例子太给力了。我真的兴趣。我想实现远程控制LED灯泡RGB颜色。如何实现逻辑步骤?用那些硬件?


(Young) #3

你好,RGB LED 需要的是 PWM 接口,PWM 接口暂时还没有在 ESP32 上支持。


(abdurahmanosman) #4

谢谢您的回复。那Ruff主板暂时不支持PWM接口吗?我想用手机H5 页面 属性来远程控制 LED 灯泡。那我如何实现?有没其他主板?小米LED灯泡用那个主板与语言?


(Young) #5

Ruff 开发板是支持 PWM 接口的。H5 也一样啊,发一个 http 请求就可以了,开发板这边起一个 http server。关于小米的 LED 灯泡,我不太清楚,不好意思~


(abdurahmanosman) #6

明白了,您的意思是ESP32上还没有暂时支持PWM接口是吧?那 那个Net 模块 支持 PWM 接口?你知道吗?谢谢。


(Young) #7

PWM 接口是指 PWM 硬件接口驱动,需要 OS 提供支持。目前 ESP32 的 OS 还没有支持 PWM 硬件接口驱动。Net 模块网络通讯模块,用的是 WiFi 功能,和 PWM 没有关系。


(abdurahmanosman) #8

:slight_smile: