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

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Remote Raspberry Pi từ máy tính khác

Nếu bạn muốn truy cập và hiển thị Raspberry Pi mà không cần màn hình thì việc remote Pi qua network (LAN-trong trường hợp này) là việc cần phải nghĩ đến. Có khá nhiều phương pháp để thực hiện việc này, bài viết chỉ đề cập phương pháp được tác giả cho là đơn giản và thuận tiện nhất.

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

Hướng dẫn sử dụng mạch nguồn cho breadboard - BREADBOARD XD-42

Mạch nguồn cho breadboard XD-42 là một sản phẩm được thiết kế đơn giản dễ dàng sử dụng, cung cấp nguồn cho breadboard thích hợp cho nhiều loại thiết bị với hai loại nguồn ngõ ra chuẩn 5V và 3.3V Mạch có hỗ trợ thêm các header... Các bạn chơi breadboard thì nên chơi thêm con này như mình nhé.

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