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。
步骤
本案例共分为以下四个步骤:
- 创建 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!