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

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 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ả

Sử dụng WinSCP, Notepad++ để chỉnh sửa file cho Orange Pi, Raspberry Pi, Intel Galileo, Intel Edison hay bất kỳ máy tính nào

WinSCP là một tiện ích SFTP, FTP client miễn phí, mã nguồn mở dành cho hệ điều hành Windows. Nó sẽ giúp bạn truyền tải file một cách an toàn giữa máy tính nhúng của bạn và máy tính từ xa. Dựa vào đó, WinSCP cũng cung cấp các chức năng quản lí file. Chương trình có hỗ trợ cả SSH để bảo mật, cũng như hỗ trợ phương thức SCP.

lên
3 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: