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ả

Các lệnh Linux cần biết khi chơi với máy tính nhúng Orange Pi hay bất kì máy tính nhúng nào dùng nhân Debian

Thấy bài viết của Tâm rất hay, mình chia sẻ thêm cho các bạn về các lệnh khi chơi với Orange Pi hay Raspberry Pi. Chúc các bạn vui vẻ với 40 lệnh bỏ túi này.

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

File PDF cho dự án này

Bài viết của bạn rát tuyệt, mình thấy có yêu cầu chuyển file này sang PDF nên mình giúp bạn một tay smiley.

Bản PDF của dự án này các bạn có thể tải về tại đây.

http://k3.arduino.vn/img/2016/03/24/0/2251_812450-1458813451-0-arduinobox-cad7-model-1.pdf

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