LED fade với NodeJS

Thấy bài viết của Tôi yêu Arduino rất hay, mình quyết định thử và thành công. Sẵn tiện demo cho các bạn một ví dụ hay về nó luôn, đó là fade led 11. Sẽ có 2 vấn đề bạn học được: một là, hàm fade led và delay; hai là ứng dụng của .bind(this) trong javascript.

I. Chuẩn bị

II. Lắp mạch

III. Code ví dụ của Johnny-five về fade led

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {

  var led = new five.Led(11); //khởi tạo chân số 11 là một con LED

  led.fadeIn();//bật nó từ từ

  //chờ 5s
  this.wait(5000, function() {
    led.fadeOut();//tắt nó từ từ
    //sau đó nó tắt lun ko lên lại đâu ha
  });
});

Với code trên từ http://johnny-five.io/examples/led-fade/, bạn sẽ thấy con LED sẽ sáng từ từ rồi tắt đi sau 5s. Nhưng bạn có để ý rằng, nó sẽ ko sáng lại như cách lập trình truyền thống? Vì sao?

Vì javascript là một ngôn ngữ hướng sự kiện nó không có khái niệm vòng lặp loop như Arduino, vì vậy, bạn cần phải tự làm một vòng for rồi chơi hàm sleep (npm install -g sleep). Nhưng như thế cùi bắp làm thế nào ý, trong khi javascript hoàn toàn có thể song song hóa vấn đề một cách dễ dàng.

Vì vậy, mình sẽ đi theo hướng xử lý bất đồng bộ của Javascript để làm cái example fade 1000ms như Arduino.

IV. Fade led bất đồng bộ 1000ms

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {

  var led = new five.Led(11);

  //khai báo hàm
  var func = function() {
      led.fadeIn();// Cho led nó fadeIn ra
        
      //rồi chờ 1000ms 
      this.wait(1000, function() {
        led.fadeOut(); //để cho nó tắt đi
        this.wait(1000, func); //chờ tiếp 1s để bắt đầu lại
      }.bind(this));//.bind(this) để đưa toàn bộ đối tượng ngoài vào bên trong hàm. (nôm na truyền toàn bộ các tham số của biến this vào biến this trong hàm con)
  }.bind(this);
  
  //
  func();
  
});

Với việc chia ra các sự kiện, cụ thể kịch bản như sau:

  • Khởi tạo LED
  • gọi hàm func()
  • led fade in
  • chờ 1000ms trong thời gian này các hàm khác sẽ được thực hiện (nếu có) chứ ko delay chương trình
  • đủ 1000ms =>
    • led fade out 
    • chờ 1000ms trong thời gian này các hàm khác sẽ được thực hiện (nếu có) chứ ko delay chương trình
      • func
      • led fade in
      • ... tiếp tục

Nhìn có vẻ đệ quy :), nhưng xin thưa, ko phải thế bạn nhé! Thực sự khi thực thi nó là một chuỗi các sự kiện liên tục nhau và được xếp thành một hàng - cùng 1 cấp! Nói một cách nôm na, nó như cái thư viện xử lý bất đồng bộ của bạn ksp viết đấy. Hay mình đoán ksp dựa vào nguyên lý bất đồng bộ của javascript để viết thư viện bất đồng bộ trên Arduino.

Javascript nó hay ở chỗ, bạn hoàn toàn có thể phân rã công việc theo hướng sự kiện ngay trong quá trình viết code như thế này, chứ không cần phải thiết đặt phức tạp như C++. Điều đó giúp bạn song song hóa đươc nhiều vấn đề (thực ra không song song mà là bất đồng bộ), thành ra với các ứng dụng giao tiếp thời gian thực thì javascript là số 1.

Trong ví dụ này mình chỉ muốn truyền đạt bấy nhiêu đó thôi, các bạn vọc thêm sẽ ok!

Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
8 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

ST7565 và ESP8266 - Màn hình LCD bự chà bá chưa đến 100k cho thế giới IoT

Mình rất thích LCD ST7565 này, và đã đặt liền 4 con mà mỗi con quá rẻ có 20k. Nhưng khổ một điều, điện áp hoạt động và IO của LCD ST7565 có 3.3V. Bản thân mình lại không thích việc chơi điện trở để chơi LCD này với Arduino. Lý do đơn giản là phải hàn quá nhiều, mình lại lười crying. Hổm nay, mình đang làm loạt bài về ESP8266 và cũng phải gặp vấn đề điện trở để làm cầu phân áp khi giao tiếp giữa ESP8266 và Arduino.

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Thư viện ST7565 trên Arduino Create - Thử nghiệm đầu tiên: Hoàn hảo!

Mình rất tự hào và hãnh diện, khi thư viện made in Việt Nam đầu tiên của Thái Sơn (Nick Chung) được mình tải lên tại Arduino Create với mục đích thử nghiệm việc biên dịch code online trên Arduino Create đã hoàn thành công việc của nó ngay trong lần thử đầu tiên. Qua bài viết này, mình xin hướng dẫn các bạn lập trình Arduino với Arduino Create thông qua việc làm một ví dụ mẫu về việc cài thư viện và sử dụng nó trên Arduino Create.

lên
7 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Cách sử dụng trình biên soạn Vi / VIM - Trình sửa file cho máy tính nhúng dành cho pro

Vim là một trong những trình biên soạn dòng lệnh mạnh và phổ biến nhất. Nó chỉ sẵn có trên nền của Linux và Unix, những sau đó nó cũng xuất hiện cả trên Windows. Giao diện của nó thì gọn gàng và đơn giản, và bạn có thể kết hợp các phím để thực hiện các công việc như copy-paste, tìm kiếm và thay thế, xóa một số dòng, và nhiều chức năng khác nữa. Hôm nay, chúng ta sẽ cùng nhau học cách dùng vim trên Raspberry Pi.

lên
3 thành viên đã đánh giá bài viết này hữu ích.