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!

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ả

Hoodloader2 - Sức mạnh của 2 vi điều khiển trên một board mạch Arduino - USB Host với Arduino UNO / Mega2560

Trước đây, bạn đã từng đặt câu hỏi, cái con Atmega16U2 trên mạch Arduino Uno / Mega2560 của mình làm nhiệm vụ gì chưa? Nếu bạn đã từng đọc bài giới thiệu về Arduino Uno hay Arduino Mega 2560 thì có thể sẽ biết con Atmega16U2 đó sẽ làm nhiệm vụ USB-to-Serial, hay nói cách khác là tạo cổng COM ảo từ đó lập trình cho con vi điều khiển Atmega328p (UNO) hoặc Atmega1280 (Mega 2560). Nhưng khi mình tra datasheet con Atmega16U2 thì thấy rằng, chúng ta đang có một sự lãng phí lớn (12KB flash, 512byte ram) nhưng chỉ nạp bootloader DFU để biến nó thành một mạch USB-to-Serial. Đem vấn đề này đi hỏi ksp, thì mình đã được khai sáng bằng một bootloader với cho con Atmega16U2 này, nó có tên là Hoodloader2 và nó sẽ giúp ta biến con Atmega16U2 này thành một mạch Arduino hoàn chỉnh! Nói cách khác, với Hoodloader2, ta có thể làm việc với 2 con vi điều khiển trên mạch Arduino Uno / Mega2560. HACK NÃO chưa nào?

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

Cách sử dụng cảm biến rung với Arduino

Hôm nay, mình sẽ hướng dẫn các bạn sử dụng cảm biến rung, một cảm biến đơn giản mà mình thấy có rất nhiều ứng dụng như: rung để mở, rung để chơi nhạc, rung để ... làm gì đó mà bạn thích devildevildevil. Cảm biến rung rất dễ sử dụng, mình viết bài này là để giúp các bạn mới bắt đầu với Arduino có sẵn một bài viết bỏ túi để có thể lấy ra dùng rất cứ khi nào cần yes.

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