Advertise with Googlier.com Cộng đồng Arduino Việt Nam - nodejs http://arduino.vn/tags/nodejs vi NRA - Phần 1: Bật tắt led đơn giản trên Web http://arduino.vn/tutorial/5433-nra-phan-1-bat-tat-led-don-gian-tren-web <div class="field field-name-field-description field-type-text-long field-label-above"><div class="field-label">Mô tả dự án:&nbsp;</div><div class="field-items"><div class="field-item even"><p>Lâu rồi mới có thời gian nghịch với Raspi và Arduino. Hôm nay mình sẽ giới thiệu các bạn những sức mạnh của sự kết hợp giữa Nodejs (N), Raspberry Pi (R), Arduino (A). Ở đây các bạn sẽ điều khiển, thu thập dữ liệu, làm được rất nhiều thứ với arduino và raspberry pi trên website một cách đơn giản và chuyên nghiệp. Đã có nhiều bài viết trên Arduino.vn nói về việc điều khiển bằng Nodejs nhưng hôm nay tôi sẽ giới thiệu các bạn thư viện khác để sử dụng đa dạng hơn.</p> <p>Bài đầu tiên này, mình sẽ hướng dẫn các bạn một số cơ bản, và một ví dụ bài điều khiển led cổ điển. Tiếp tục xem nhé!!! <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" /></p> </div></div></div><div class="field-collection-container clearfix"><div class="field field-name-field-step field-type-field-collection field-label-hidden"><div class="field-items"><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/1221" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Bước 1: Thiết lập môi trường</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Chúng ta sẽ làm việc trên môi trường nodejs trong Raspi. Để cài đặt nodejs các bạn tham khảo bài viết của anh <a href="http://arduino.vn/tutorial/1446-huong-dan-lap-trinh-arduino-bang-javascript-trong-moi-truong-nodejs">KSP</a>.</p> <p>Hoặc có thể làm theo mình:</p> <pre class="prettyprint linenums lang-c_pp"> sudo apt-get update</pre><pre class="prettyprint linenums lang-c_pp"> sudo apt-get upgrade</pre><p>- Tải  Nodejs mới nhất:</p> <pre class="prettyprint linenums lang-c_pp"> curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -</pre><p>- Install nó nhé</p> <pre class="prettyprint linenums lang-c_pp"> sudo apt-get install -y nodejs</pre><p>- Xem phiên bản:</p> <pre class="prettyprint linenums lang-c_pp"> node -v</pre><p>- Tiếp theo bạn sẽ cài thêm một số module để làm web cũng như giao tiếp Serial</p> <pre class="prettyprint linenums lang-c_pp"> npm install express socket.io ejs serialport</pre><blockquote> <p>express, ejs : giúp chúng ta tạo được một trang web</p> <p>socket.io: dùng để tạo  web realtime </p> <p>serialport: module dùng để giao tiếp với cổng serial </p> </blockquote> <p>Dĩ nhiên các bạn cũng có thể làm những điều này trên máy windown hay MacOS mà không cần phải raspberry pi, nhưng ở đây mình hướng dẫn bạn làm trên Pi vì sẽ ứng dụng tiện, tốt hơn ở những chức năng khác.</p> <p> </p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/1225" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Bước 2: Lắp mạch</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Đơn giản: các bạn chỉ cần cắm Arduino vào Raspi qua cổng USB thôi <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" style="height:23px; width:23px" title="cool" /></p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/1229" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Bước 3: Giải thích </span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Nguyên lí của bài vi dụ này:</p> <ul><li>Người dùng sẽ truy cập vào trang web client và click vào nút bật đèn, nhờ socketio nên sự kiện được cập nhật ngay lập tức phát về phía server.</li> <li>Phía server sẽ nhận được và gửi dữ liệu điều khiển cho công Serial mà ở đây là arduino.</li> <li>Cùng lúc đó phía server cũng gửi lại trạng thái bật đèn cho các client, nên khi chũng ta mở một tab khác thì sẽ cập nhật được trạng thái đèn đang bật.</li> <li>Raspberry có nhiệp vụ chạy file server.js để tạo server.</li> </ul></div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full field-collection-view-final"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/1233" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Bươc 4: Code Code</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>1. Server</p> <p>- Các bạn tạo thư mục test</p> <pre class="prettyprint linenums lang-c_pp"> mkdir test</pre><pre class="prettyprint linenums lang-csharp"> cd test</pre><p>-  Tạo project nodejs</p> <pre class="prettyprint linenums lang-c_pp"> npm init -y</pre><p>- Install các module như  trên</p> <pre class="prettyprint linenums lang-c_pp"> npm install express socket.io ejs serialport</pre><p>- tạo file server.js (mình sẽ hướng dẫn kĩ trong code nha <img alt="wink" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/wink_smile.png" style="height:23px; width:23px" title="wink" />)</p> <pre class="prettyprint linenums lang-c_pp"> //**********Thiet lap server can ban***********// const express = require("express"); const app = express(); const io = require("socket.io")(server); app.use(express.static("./public")); //noi dat cac file css, script.js app.set("view engine","ejs"); //File html cua minh se la ejs app.set("views","./views"); //dat vao tong thu muc views const server = require("http").Server(app); server.listen(3000); //cong port 3000 //*********su dung module serialport*******?// var SerialPort = require("serialport").SerialPort var serialPort = new SerialPort("/dev/ttyACM0", { baudrate: 115200 }); var status = 0; //trang thai ban dau la tat den app.get('/',(req, res) =&gt; { res.render("home"); }); io.sockets.on('connection', function (socket) { //khi cac client ket noi socket.on('led', function (data) { if(status){ status = 0; serialPort.write(status); //gui du lieu cho serrial port io.sockets.emit('led', {value: status}); //phat cho tat cac cac client }else{ status = 1; serialPort.write(status); io.sockets.emit('led', {value: status}); } }); }); console.log("running");</pre><p>2. Client</p> <p>- Các bạn tạo một thư mục views trong test</p> <p>- tạo file home.ejs:</p> <pre class="prettyprint linenums lang-html"> &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Tudc&lt;/title&gt; &lt;meta name="viewport" content="width=400px" /&gt; &lt;script src="socket.io/socket.io.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;button id="btn" value="Bat Den"&gt;&lt;/button&gt; &lt;script type="text/javascript"&gt; var socket = io("http://localhost:3000"); socket.on('led', function (data) { if(data){ document.getElementById("btn").value = "Tat den"; } else { document.getElementById("btn").value = "Bat den"; } }); $(#btn).click(function(){ socket.emit('led'); }) &lt;/script&gt; &lt;/body&gt; &lt;/html&gt;</pre><p>3. Arduino</p> <pre class="prettyprint linenums lang-c_pp"> void setup() { Serial.begin(115200); } void loop() { while(!Serial.available()); //wait until a byte was received digitalWrite(13,Serial.read()); }</pre><p>Vậy là xong rồi đó!! Test nào <img alt="laugh" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/teeth_smile.png" style="height:23px; width:23px" title="laugh" /></p> </div></div></div> </div> </div> </div></div></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/raspberry-pi" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Raspberry Pi</a></div><div class="field-item odd"><a href="/nao-cung-lam" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Nào cùng làm!</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item odd"><a href="/tags/socketio-0" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">socketio</a></div><div class="field-item even"><a href="/tags/led" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">led</a></div><div class="field-item odd"><a href="/tags/serialport" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">serialport</a></div></div></div> Sun, 17 Dec 2017 01:30:58 +0000 tu787878 5433 at http://arduino.vn ESP8266 kết nối Internet - Phần 4: Kết nối Internet cho dự án không cần NAT Port, không cần mua server, không cần Blynk http://arduino.vn/bai-viet/1523-esp8266-ket-noi-internet-phan-4-ket-noi-internet-cho-du-khong-can-nat-port-khong-can <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><blockquote><p>Để hiểu và sử dụng được code trong bài này, các bạn vui lòng đọc 3 phần trước:</p> <ul><li><a href="http://arduino.vn/bai-viet/1496-esp8266-ket-noi-internet-phan-1-cai-dat-esp8266-lam-mot-socket-client-ket-noi-toi">ESP8266 kết nối Internet - Phần 1: Cài đặt ESP8266 làm một socket client kết nối tới socket server trong mạng LAN</a></li> <li><a href="http://arduino.vn/bai-viet/1497-esp8266-ket-noi-internet-phan-2-arduino-gap-esp8266-hai-dua-noi-chuyen-bang-json">ESP8266 kết nối Internet - Phần 2: Arduino gặp ESP8266, hai đứa nói chuyện bằng JSON</a></li> <li> <div><a href="http://arduino.vn/bai-viet/1511-esp8266-ket-noi-internet-phan-3-arduino-gap-smartphone-hai-dua-noi-chuyen-bang-json">ESP8266 kết nối Internet - Phần 3: Arduino gặp Smartphone, hai đứa nói chuyện bằng JSON thông qua Socket</a></div> </li> </ul></blockquote> <h2><span style="color:#FF8C00"><strong>IX. Nhắc lại mô hình, tìm cách đưa mô hình này hoạt động ở Internet</strong></span></h2> <p class="rtejustify">Cùng xem lại mô hình, chúng ta có thể thấy rằng, toàn bộ các khối hiện đã liên kết với nhau và toàn bộ nằm trong mạng LAN (wifi). Về căn bản lý thuyết, app của chúng ta đã có thể hoạt động ngon lành trong môi trường mạng LAN. Vậy, bây giờ, nếu chúng ta muốn ra ngoài Internet mà vẫn điều khiển được thiết bị ở nhà thì như thế nào nhỉ?</p> <p class="rtecenter"><a href="http://k1.arduino.vn/img/2017/02/26/0/3617_123450-1488096999-0-socket-diagram.png" style="box-sizing: border-box; border-collapse: collapse; text-decoration: none; color: rgb(32, 134, 191); font-family: &quot;Segoe UI&quot;, &quot;Open Sans&quot;, sans-serif, serif; font-size: 17px; text-align: center;"><img alt="" src="http://k1.arduino.vn/img/2017/02/26/0/3617_123450-1488096999-0-socket-diagram.png" style="border-collapse:collapse; border:0px; box-sizing:border-box; height:auto; max-height:100%; max-width:100%; vertical-align:middle" /></a></p> <p class="rtejustify">Trước tiên, chúng ta hãy cùng nhắc lại vị trí của từng khối, xem nhiệm vụ của nó là gì?</p> <ul><li class="rtejustify">Arduino <ul><li class="rtejustify">Arduino đảm nhiệm vai trò đọc các loại cảm biến, điều khiển thiết bị và rất thân thiện với người lập trình.</li> <li class="rtejustify">Nó giao tiếp với ESP8266 để có thể trở thành một thiết bị nối mạng, một thiết bị IoT.</li> </ul></li> <li class="rtejustify">ESP8266 <ul><li class="rtejustify">ESP8266 trong mô hình mạng này dùng để kết nối với mạng Wifi với thông tin SSID và PSK.</li> <li class="rtejustify">ESP8266 sẽ kết nối tới Socket Server, bản thân nó là một Socket Client.</li> <li class="rtejustify"><strong>ESP8266 kết nối Socket Server với các thông tin là địa chỉ IP và port (Cổng) dịch vụ.</strong></li> </ul></li> <li class="rtejustify">Socket Server <ul><li class="rtejustify"><strong>Socket Server được đặt ở một máy tính trong cùng mạng Wifi mà ESP8266 kết nối đến.</strong></li> <li class="rtejustify">Socket Server sẽ là nơi đặt (host) webapp.</li> <li class="rtejustify">Socket Server sẽ có một địa chỉ IP local (IP của cục Wifi access point - cục phát wifi cấp), và chúng ta sẽ mở port 3484 để nhận dữ liệu từ ESP8266 và webapp.</li> </ul></li> <li class="rtejustify">Webapp (trình duyệt web) <ul><li class="rtejustify"><strong>Người dùng truy cập vào địa chỉ IP của Socket server cùng với port 3484 để điều khiển thiết bị</strong></li> </ul></li> </ul><p class="rtejustify">Những phần mình bôi đậm là những phần mà chúng ta sẽ phải có một chúng chỉnh sửa để đưa nó ra ngoài internet. <strong>Vì sao lại cần chỉnh sửa các phần đó và vì sao khi chỉnh sửa nó thì chúng ta lại ra Internet được? </strong></p> <p class="rtejustify">Thứ nhất, ngay từ ban đầu, để đơn giản, mình đã đặt Socket Server tại máy tính Windows của mình, mà máy tính của mình lại kết nối vào cục phát wifi chung ở nhà. Và các thiết bị như điện thoại thông minh hay ESP8266 khi kết vào mạng wifi đó thì có thể <strong>thấy được Socket server đặt </strong><strong>trên máy tính</strong> của mình. Vậy, điều cốt lõi của sự kết nối giữa các thành phần trong mô hình mạng trên, đó là: <strong>các thiết bị, dịch vụ trong mạng (ESP8266 (Socket Client), Máy tính (Socket Server), Điện thoại (Webapp)) phải thấy được nhau</strong>.</p> <p class="rtejustify">Thứ hai, vậy để làm được vụ điều khiển qua internet, ta phải đặt socket server ở ngoài Internet và webapp cũng thế. Câu hỏi đặt ra, là làm thế nào để rước socket server ra ngoài Internet? Trước tiên, ban hãy thử đặt câu hỏi <strong>làm thế nào mà bạn truy cập đươc vào <a href="http://arduino.vn/">Cộng đồng Arduino Việt Nam</a>? </strong>Bởi vì bạn đã kết nối vào một mạng Wifi, hoặc 3G, mạng đó có kết nối Internet. Bạn mở trình duyệt lên, và truy cập vào địa chỉ web <a href="http://arduino.vn/">http://arduino.vn:80</a> (mặc định là port 80, các bạn không cần phải gõ). Thế địa chỉ web (tên miền) có khác gì với địa chỉ IP không? Thực ra, tên miền là một cách để giúp bạn truy cập vào một dịch vụ web mà không cần phải nhớ địa chỉ IP (địa chỉ IP là những con số vô cảm, rất khó nhớ). Vậy chúng ta xem tên miền và địa chỉ IP là một và có thể thay thế lẫn nhau. Để một tên miền có thể trỏ đến một địa chỉ IP, chúng ta cần cấu hình nhiều bước, mà mình thấy rất phức tạp đối với maker chúng ta. Vì vậy, chúng ta sẽ lựa chọn một giải pháp đó là <strong>thuê một server của các dịch vụ cho thuê server </strong>để đặt socket server. Nhưng như thế cũng không hề dễ cho maker <img alt="broken heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/broken_heart.png" style="height:23px; width:23px" title="broken heart" />, vì bạn phải trả một khoảng phí thuê bao hàng tháng nè, chưa kể phải dùng một hệ thống portal vô cùng phức tạp. Vậy, chúng ta sẽ kiếm <strong>một server miễn phí cho miễn phí tên miền </strong>luôn để sử dụng cho nó dễ. Và trong quá trình tìm kiếm, kết hợp với từ khóa nodejs, mình đã tìm ra một dịch vụ khá hay tên là <a href="https://heroku.com/">Heroku</a>. Dịch vụ này là một dịch vụ free cloud server, trong đó có hỗ trợ nodejs free cloud server, phương pháp up code, deploy (triển khai) app rất dễ, nói chung là mình thấy các bạn chỉ cần đăng ký một tải khoản ở heroku rồi gõ vài dòng lệnh là có app chạy trên internet rồi.</p> <p class="rtejustify">Vậy, tóm lại, khi đã dùng Heroku, ta sẽ tải socket server của chúng ta ra ngoài internet một cách dễ dàng. Chúng ta sẽ có một tên miền miễn phí để cho esp8266 kết nối vào, cùng với đó là một port 80 rất đẹp. Không cần nói nhiều, để thử nghiệm, các bạn hãy truy cập vào địa chỉ <a href="http://thawing-chamber-95292.herokuapp.com/">http://thawing-chamber-95292.herokuapp.com/</a> để thử nghiệm tốc độ nhé. Nhớ là cập nhập trường host[] của esp8266 thành <strong><a href="http://thawing-chamber-95292.herokuapp.com/" style="text-align: justify;">thawing-chamber-95292.herokuapp.com</a> </strong>và port thành 80 nha.</p> <h2 class="rtejustify"><span style="color:#FF8C00"><strong>IX. Heroku, nhà cung cấp dịch vụ nodejs free server cho dân maker</strong></span></h2> <h3 class="rtejustify"><span style="color:#008080"><strong>1. Heroku là gì?</strong></span></h3> <p class="rtecenter"><span style="color:#008080"><strong><img alt="" src="http://k1.arduino.vn/img/2017/03/14/0/3670_123450-1489468223-0-herokukafka.png" /></strong></span></p> <p class="rtejustify">Heroku cung cấp dịch vụ máy chủ đám mây giúp dễ dàng trong việc deploy ứng dụng. Điều tuyệt vời ở Heroku là trang này bạn có thể sử dụng dịch vụ hoàn toàn miễn phí với các ứng dụng web không yêu cầu phải có tốc độ truy cập cao hay dung lượng lớn. Các dự án của maker chúng ta thì dùng heroku là số 1 rồi, vì chúng ta có thể tự do edit code của mình, thêm thắt tùy ý.</p> <h3 class="rtejustify"><span style="color:#008080"><strong>2. Đăng ký tài khoản ở Heroku?</strong></span></h3> <p>Đầu tiên, bạn hãy chuyển đến trang <a href="https://signup.heroku.com/login" target="_blank">Đăng ký</a>.</p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/03/14/0/3639_882450-1489468217-0-heroku-sign-up---cc-cc-3.jpg" style="height:537px; width:548px" /></p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2017/03/14/0/3626_812450-1489468220-0-heroku-sign-up---cc-cc.jpg" style="height:599px; width:532px" /></p> <p class="rtejustify">... và nhập các thông tin cần thiết.</p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/03/14/0/3669_123450-1489468215-0-heroku-sign-up---cc-cc-4.jpg" style="height:412px; width:761px" /></p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2017/03/14/0/3625_812450-1489468213-0-inbox---nhnkhanharduino.vn---mozilla-thunderbird.jpg" style="height:386px; width:939px" /></p> <p class="rtejustify">... sau đó bạn vào email để xác nhận tài khoản.</p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/03/14/0/3638_882450-1489468210-0-heroku-welcome---cc-cc.jpg" style="height:669px; width:717px" /></p> <p class="rtejustify">Lúc này, bạn sẽ tiến hành tạo password!</p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/03/14/0/3668_123450-1489468208-0-heroku-welcome-to-heroku---cc-cc.jpg" style="height:357px; width:689px" /></p> <p class="rtejustify">Như vậy là xong rồi.</p> <h3><span style="color:#008080"><strong>3. Tải về Heroku console app và cài đặt tài khoản</strong></span></h3> <blockquote><p class="rtejustify">Sau khi bạn đã tạo tài khoản xong, bạn cần như không cần quan tâm đến phần dashboard của heroku, hãy tin mình, đi theo các bước sau đây để tạo app trước đã rồi sau này quay lại dashboard để khám phá app đã tạo thì vui hơn nhiều.</p> </blockquote> <p class="rtejustify">Ở các bài trước, chúng ta đã dùng git cli để lưu và tải về các project, và ở bài nay, chúng ta sẽ dùng heroku cli. Để bắt đầu với nodejs với heroku, bạn có thể đọc tài liệu ở <a href="https://devcenter.heroku.com/articles/getting-started-with-nodejs#introduction">đây</a>. Mình sẽ lược dịch những phần và ghi chú cần thiết để giúp bạn đi nhanh hơn.</p> <p class="rtejustify">Đầu tiên, các bạn hãy tải về Heroku CLI để có thể đi tiếp.</p> <ul><li class="rtejustify"><a href="https://devcenter.heroku.com/toolbelt-downloads/windows64">Heroku CLI Windows 64bit</a></li> <li class="rtejustify"><a href="https://devcenter.heroku.com/toolbelt-downloads/windows32">Heroku CLI Windows 32bit</a></li> </ul><p class="rtejustify">Sau khi tải về và cài đặt xong, các bạn hãy mở command line lên và đăng nhập vào dịch vụ heroku bằng lệnh</p> <blockquote><p class="rtejustify">heroku login</p> </blockquote> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/03/14/0/3640_882450-1489468861-0-cwindowssystem32cmd.exe-.jpg" /></p> <blockquote><p class="rtejustify">Nhập địa chỉ email và password và đăng nhập hoy!</p> </blockquote> <h3 class="rtejustify"><span style="color:#008080"><strong>4. Đưa app socket server đầu tiên ra ngoài internet</strong></span></h3> <blockquote><p class="rtejustify">Để dễ dàng, mình sẽ lựa chọn <a href="http://arduino.vn/bai-viet/1511-esp8266-ket-noi-internet-phan-3-arduino-gap-smartphone-hai-dua-noi-chuyen-bang-json#index13">ví dụ 2</a> của <a href="http://arduino.vn/bai-viet/1511-esp8266-ket-noi-internet-phan-3-arduino-gap-smartphone-hai-dua-noi-chuyen-bang-json">phần 3</a> để làm project mẫu. Các bạn hãy nối mạch như trong phần đó nhé, còn phần nạp code thì hãy đọc tiếp.</p> </blockquote> <h4 class="rtejustify"><strong>Upload app ra Internet</strong></h4> <p class="rtejustify">Để dễ dàng, các bạn hãy clone project của mình từ github về để upload app ra ngoài Internet, mình sẽ giải thích thêm sự thay đổi ở phần dưới.</p> <blockquote><p class="rtejustify">git clone https://github.com/ngohuynhngockhanh/socketServerHeroku</p> <p class="rtejustify">cd <em>socketServerHeroku</em></p> </blockquote> <p class="rtecenter"><em><img alt="" src="http://k3.arduino.vn/img/2017/03/14/0/3627_812450-1489472800-0-cwindowssystem32cmd.exe-.jpg" /></em></p> <p class="rtejustify">Sau khi đã clone app xong, chúng ta sẽ tạo một project heroku.</p> <blockquote><p class="rtejustify">heroku create</p> </blockquote> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/03/14/0/3671_123450-1489472951-0-cwindowssystem32cmd.exe-.jpg" style="height:91px; width:1052px" /></p> <p class="rtejustify"><span style="font-family:courier new,courier,monospace">floating-sierra-86489</span> là tên project mà heroku tự tạo cho chúng ta, bạn có thể vô <a href="https://dashboard.heroku.com/apps">dashboard</a> của heroku để đổi lại tùy ý. Khi bạn thực hiện lệnh heroku create thì nó sẽ tạo ra một tên khác, bạn hãy ghi nhớ tên đó để thực hiện các phần tiếp theo.</p> <p class="rtejustify">Để upload code lên heroku server chúng ta chạy lệnh</p> <blockquote><p class="rtejustify">git push heroku master</p> </blockquote> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/03/14/0/3641_882450-1489473119-0-cwindowssystem32cmd.exe---git-push-heroku-master.jpg" /></p> <p class="rtejustify">Khi upload code lên thành công, bạn có thể truy cập được ngay vào webapp, và điều đó có nghĩa socket server của bạn cũng đã hoạt động ngon lành.</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2017/03/14/0/3628_812450-1489473514-0-my-app---cc-cc.jpg" style="height:333px; width:750px" /></p> <p class="rtejustify">Để xem logs trên heroku, bạn có thể chạy lệnh</p> <blockquote><p class="rtejustify">heroku logs --tail</p> <p class="rtejustify">Lưu ý: Đây là chế độ chỉ xem mà thôi.</p> </blockquote> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/03/14/0/3672_123450-1489473722-0-cwindowssystem32cmd.exe---heroku-logs--tail.jpg" style="height:385px; width:750px" /></p> <h4 class="rtejustify"><strong>Code Arduino</strong></h4> <p class="rtejustify">Không có sự thay đổi so với phần 3, bạn chỉ việc nạp đoạn code này vào mà thôi.</p> <pre class="prettyprint linenums lang-c_pp"> #include &lt;ArduinoJson.h&gt; #include &lt;Servo.h&gt; #include &lt;LiquidCrystal_I2C.h&gt; #include &lt;SoftwareSerial.h&gt; #include &lt;SerialCommand.h&gt; // Thêm vào sketch thư viện Serial Command const byte RX = 3; // Chân 3 được dùng làm chân RX const byte TX = 2; // Chân 2 được dùng làm chân TX SoftwareSerial mySerial = SoftwareSerial(RX, TX); SerialCommand sCmd(mySerial); // Khai báo biến sử dụng thư viện Serial Command byte red = 4, blue = 5; // led đỏ đối vô digital 4, led xanh đối vô digital 5 byte rainSensor = 6; // Chân tín hiệu cảm biến mưa ở chân digital 6 (arduino) byte buttons[] = {7, 8}; // chơi với mảng cho nó đã! byte servoPin = 9; //Chân servo Servo servo; LiquidCrystal_I2C lcd(0x27,16,2); //Khai báo LCD const unsigned long CHU_KY_1_LA_BAO_NHIEU = 5000UL; //Cứ sau 5000ms = 5s thì chu kỳ lặp lại void setup() { //Khởi tạo Serial ở baudrate 57600 để debug ở serial monitor Serial.begin(57600); //Khởi tạo Serial ở baudrate 57600 cho cổng Serial thứ hai, dùng cho việc kết nối với ESP8266 mySerial.begin(57600); //pinMode 2 đèn LED là OUTPUT pinMode(red,OUTPUT); pinMode(blue,OUTPUT); pinMode(rainSensor,INPUT);// Đặt chân cảm biến mưa là INPUT, vì tín hiệu sẽ được truyền đến cho Arduino servo.attach(servoPin); //cài đặt chân servo //Cài đặt LCD lcd.init(); //Bật đèn màn hình LCD lcd.backlight(); //in ra màn hình chào mừng lcd.print("Xin chao"); //Cài đặt mấy cái nút nhấn theo INPUT PULLUP for (int i = 0; i &lt; sizeof(buttons); i++) { pinMode(buttons[i], INPUT_PULLUP); } // Một số hàm trong thư viện Serial Command sCmd.addCommand("LED", led); //Khi có lệnh LED thì sẽ thực thi hàm led sCmd.addCommand("RAIN", rain_detect);//Khi có lệnh RAIN thì sẽ thực thi hàm rain để kiểm tra trị cảm biến mưa sCmd.addCommand("LCD_PRINT", lcd_print); sCmd.addCommand("SERVO", servo_enjoy); Serial.println("Da san sang nhan lenh"); } unsigned long chuky1 = 0; byte oldButtonsValue[] = {0, 0}; void loop() { //Khởi tạo một chu kỳ lệnh, chu kỳ là 5000ms if (millis() - chuky1 &gt; CHU_KY_1_LA_BAO_NHIEU) { chuky1 = millis(); rain_detect(); } bool willSendButtonInformation = false; //Đặt cờ để kiểm tra có gửi thông tin có trạng thái thay đổi nút nhấn hay không? for (int i = 0; i &lt; sizeof(buttons); i++) { byte value = digitalRead(buttons[i]); //đọc trị nút nhấn if (value != oldButtonsValue[i]) //kiểm tra trị nút nhấn với giá trị trước đó! willSendButtonInformation = true; oldButtonsValue[i] = value; } if (willSendButtonInformation) { sendButtonInformation(); } sCmd.readSerial(); //Bạn không cần phải thêm bất kỳ dòng code nào trong hàm loop này cả } void sendButtonInformation() { StaticJsonBuffer&lt;100&gt; jsonBuffer; JsonObject&amp; root = jsonBuffer.createObject(); JsonArray&amp; data = root.createNestedArray("data"); for (int i = 0; i &lt; sizeof(oldButtonsValue); i++) { data.add(oldButtonsValue[i]); } //in ra cổng software serial để ESP8266 nhận mySerial.print("BUTTON"); //gửi tên lệnh mySerial.print('\r'); // gửi \r root.printTo(mySerial); //gửi chuỗi JSON mySerial.print('\r'); // gửi \r } // hàm led_red sẽ được thực thi khi gửi hàm LED_RED void led() { Serial.println("LED"); char *json = sCmd.next(); //Chỉ cần một dòng này để đọc tham số nhận đươc Serial.println(json); StaticJsonBuffer&lt;200&gt; jsonBuffer; //tạo Buffer json có khả năng chứa tối đa 200 ký tự JsonObject&amp; root = jsonBuffer.parseObject(json);//đặt một biến root mang kiểu json int redStatus = root["led"][0];//json -&gt; tham số root --&gt; phần tử thứ 0. Đừng lo lắng nếu bạn không có phần tử này, không có bị lỗi đâu! int blueStatus = root["led"][1];//json -&gt; tham số root --&gt; phần tử thứ 0. Đừng lo lắng nếu bạn không có phần tử này, không có bị lỗi đâu! //kiểm thử giá trị Serial.print(F("redStatus ")); Serial.println(redStatus); Serial.print(F("blueStatus ")); Serial.println(blueStatus); StaticJsonBuffer&lt;200&gt; jsonBuffer2; JsonObject&amp; root2 = jsonBuffer2.createObject(); root2["redStatus"] = redStatus; root2["blueStatus"] = blueStatus; //Tạo một mảng trong JSON JsonArray&amp; data = root2.createNestedArray("data"); data.add(redStatus); data.add(blueStatus); //in ra cổng software serial để ESP8266 nhận mySerial.print("LED_STATUS"); //gửi tên lệnh mySerial.print('\r'); // gửi \r root2.printTo(mySerial); //gửi chuỗi JSON mySerial.print('\r'); // gửi \r //in ra Serial để debug root2.printTo(Serial); //Xuống dòng //xuất ra màn hình digitalWrite(red, redStatus); digitalWrite(blue, blueStatus); } void rain_detect() { StaticJsonBuffer&lt;200&gt; jsonBuffer; JsonObject&amp; root = jsonBuffer.createObject(); //đọc giá trị cảm biến rồi in ra root root["digital"] = digitalRead(rainSensor); root["message"] = digitalRead(rainSensor) ? "Khong mua" : "Co mua ne ahihi"; //Gửi đi hoy! //in ra cổng software serial để ESP8266 nhận mySerial.print("RAIN"); //gửi tên lệnh mySerial.print('\r'); // gửi \r root.printTo(mySerial); //gửi chuỗi JSON mySerial.print('\r'); } void lcd_print() { Serial.println("LCD_PRINT"); char *json = sCmd.next(); //Chỉ cần một dòng này để đọc tham số nhận đươc Serial.println(json); StaticJsonBuffer&lt;100&gt; jsonBuffer; //tạo Buffer json có khả năng chứa tối đa 100 ký tự JsonObject&amp; root = jsonBuffer.parseObject(json);//đặt một biến root mang kiểu json char *line1 = root["line"][0]; char *line2 = root["line"][1]; lcd.clear(); lcd.setCursor(0, 0); lcd.print(line1); lcd.setCursor(0, 1); lcd.print(line2); Serial.println("ok aihi"); } void servo_enjoy() { Serial.println("SERVO"); char *json = sCmd.next(); //Chỉ cần một dòng này để đọc tham số nhận đươc Serial.println(json); StaticJsonBuffer&lt;50&gt; jsonBuffer; //tạo Buffer json có khả năng chứa tối đa 100 ký tự JsonObject&amp; root = jsonBuffer.parseObject(json);//đặt một biến root mang kiểu json int degree = root["degree"]; const char *message = root["message"]; lcd.clear(); lcd.setCursor(0, 0); lcd.print(message); servo.write(degree); Serial.println(degree); }</pre><h4><strong>Code Socket Server và Webapp</strong></h4> <blockquote><p class="rtejustify">Webapp vẫn không thay đổi gì nha bạn hiền! Code vũ như cẫn.</p> </blockquote> <p class="rtejustify">Về căn bản là không có sự thay đổi gì cả. Nhưng vì heroku là một dịch vụ miễn phí, nên chúng ta có một số tiêu chuẩn phải tuân theo.</p> <ul><li class="rtejustify">Port ra ngoài internet là 80. Nhưng khi từ server heroku ra ngoài internet thì sẽ có một port riêng, từ port này heroku sẽ port forwarding nó ra port 80 theo tên miền miễn phí của chúng ta. Port riêng này sẽ được gửi thành tham số -PORT khi chúng ta chạy chương trình.</li> </ul><p class="rtejustify">Vì vậy trong file <strong>index.js</strong>, chúng ta phải có một thay đổi nhỏ xíu ở dòng</p> <blockquote><p class="rtejustify">server.listen(process.env.PORT || PORT);                                        // Cho socket server (chương trình mạng) lắng nghe ở port 3484</p> </blockquote> <p class="rtejustify">Lúc này, khi bạn test code ở local (mạng LAN), thì bạn vẫn dùng theo port 3484 và địa chỉ IP local để test. Nhưng khi bạn upload code (bao gồm socket server và webapp) lên heroku bằng lệnh</p> <blockquote><p class="rtejustify">git add . &amp;&amp; git commit -m "upload new code" &amp;&amp; git push heroku master</p> <p class="rtejustify"><span style="color:#FF0000">Khi chỉnh sửa webapp thì bạn nhớ chạy dòng lệnh trên đó nó up lên server internet nha</span></p> </blockquote> <p class="rtejustify">thì bạn phải upload lại code ở esp8266 nhằm chỉnh sửa lại host (socket server ip) và port cho phù hợp.</p> <h4 class="rtejustify"><strong>Code ESP8266</strong></h4> <p>Code của ESP8266 về căn bản là không có gì khác so với các bài trước, chúng ta chỉ cần cập nhập lại địa chỉ host ở các biến</p> <pre class="prettyprint linenums lang-c_pp"> const char* ssid = "MACHTUDONG"; //Tên mạng Wifi mà Socket server của bạn đang kết nối const char* password = "smarthome12345"; //Pass mạng wifi ahihi, anh em rãnh thì share pass cho mình với. char host[] = "floating-sierra-86489.herokuapp.com"; //Địa chỉ IP dịch vụ, hãy thay đổi nó theo địa chỉ IP Socket server của bạn. //Nếu bạn đặt host là địa chỉ IP local thì ESP8266 sẽ kết nối vào máy tính local và bạn có thể dễ dàng thử nghiệm code. //Nếu bạn dặt host là địa chỉ tên miền của heroku thì esp8266 sẽ kết nối vào socket serve ở ngoài internet. int port = 80; //Cổng dịch vụ socket server do chúng ta tạo! //Đặt 3484 để test local //Đặt 80 để kết nối với dịch vụ heroku</pre><p>cho phù hợp trong toàn bộ đoạn code là hoàn thiện</p> <pre class="prettyprint linenums lang-c_pp"> #include &lt;SoftwareSerial.h&gt; #include &lt;ESP8266WiFi.h&gt; #include &lt;SocketIOClient.h&gt; #include &lt;SerialCommand.h&gt; //include thư viện để kiểm tra free RAM trên con esp8266 extern "C" { #include "user_interface.h" } const byte RX = D1; const byte TX = D2; SoftwareSerial mySerial(RX, TX, false, 256); SerialCommand sCmd(mySerial); // Khai báo biến sử dụng thư viện Serial Command SocketIOClient client; const char* ssid = "MACHTUDONG"; //Tên mạng Wifi mà Socket server của bạn đang kết nối const char* password = "smarthome12345"; //Pass mạng wifi ahihi, anh em rãnh thì share pass cho mình với. char host[] = "192.168.200.46"; //Địa chỉ IP dịch vụ, hãy thay đổi nó theo địa chỉ IP Socket server của bạn. int port = 3484; //Cổng dịch vụ socket server do chúng ta tạo! char namespace_esp8266[] = "esp8266"; //Thêm Arduino! //từ khóa extern: dùng để #include các biến toàn cục ở một số thư viện khác. Trong thư viện SocketIOClient có hai biến toàn cục // mà chúng ta cần quan tâm đó là // RID: Tên hàm (tên sự kiện // Rfull: Danh sách biến (được đóng gói lại là chuối JSON) extern String RID; extern String Rfull; void setup() { //Bật baudrate ở mức 57600 để giao tiếp với máy tính qua Serial Serial.begin(57600); mySerial.begin(57600); //Bật software serial để giao tiếp với Arduino, nhớ để baudrate trùng với software serial trên mạch arduino delay(10); //Việc đầu tiên cần làm là kết nối vào mạng Wifi Serial.print("Ket noi vao mang "); Serial.println(ssid); //Kết nối vào mạng Wifi WiFi.begin(ssid, password); //Chờ đến khi đã được kết nối while (WiFi.status() != WL_CONNECTED) { //Thoát ra khỏi vòng delay(500); Serial.print('.'); } Serial.println(); Serial.println(F("Da ket noi WiFi")); Serial.println(F("Di chi IP cua ESP8266 (Socket Client ESP8266): ")); Serial.println(WiFi.localIP()); if (!client.connect(host, port, namespace_esp8266)) { Serial.println(F("Ket noi den socket server that bai!")); return; } sCmd.addDefaultHandler(defaultCommand); //Lệnh nào đi qua nó cũng bắt hết, rồi chuyển xuống hàm defaultCommand! Serial.println("Da san sang nhan lenh"); } void loop() { //Khi bắt được bất kỳ sự kiện nào thì chúng ta có hai tham số: // +RID: Tên sự kiện // +RFull: Danh sách tham số được nén thành chuỗi JSON! if (client.monitor()) { //in ra serial cho Arduino mySerial.print(RID); mySerial.print('\r'); mySerial.print(Rfull); mySerial.print('\r'); //in ra serial monitor Serial.print(RID); Serial.print(' '); Serial.println(Rfull); //Kiểm tra xem còn dư bao nhiêu RAM, để debug uint32_t free = system_get_free_heap_size(); Serial.println(free); } //Kết nối lại! if (!client.connected()) { client.reconnect(host, port, namespace_esp8266); } sCmd.readSerial(); } void defaultCommand(String command) { char *json = sCmd.next(); client.send(command, (String) json);//gửi dữ liệu về cho Socket Server //In ra serial monitor để debug Serial.print(command); Serial.print(' '); Serial.println(json); }</pre><p class="rtejustify">Như vậy là bạn đã biến project của mình thành một project ra ngoài internet! Thật tuyệt phải không nào?</p> <h3 class="rtejustify"><span style="color:#008080"><strong>4. Một số lưu ý</strong></span></h3> <ul><li class="rtejustify">Khi bạn cài thêm một package của nodejs, nhớ thêm --save vào nhé. Ví dụ: <span style="font-family:courier new,courier,monospace">npm install ip --save</span></li> <li class="rtejustify">Bạn nên test ở local (như ở 3 phần trước) ngon lành hết rồi khi nào muốn ra internet thì đọc bài này.</li> </ul><h2><span style="color:#FF8C00"><strong>IX. Vì sao chúng ta không nên dùng Blynk?</strong></span></h2> <p class="rtecenter"><span style="color:#FF8C00"><strong><img alt="" src="http://k2.arduino.vn/img/2017/03/14/0/3642_882450-1489475034-0-fcuh91wirt0tcaa.medium.jpg" style="height:250px; width:250px" /></strong></span></p> <p class="rtejustify">Blynk cho phép bạn điều khiển Internet ngay từ ban đầu, chỉ việc nạp code của blynk vào và nối mạch theo hướng dẫn của họ. Nhưng tại sao chúng ta phải trả tiền cho phần dịch vụ trong khi chúng ta hoàn toàn có thể tự build một server intenret miễn phí với heroku?</p> <p class="rtejustify">Vì vậy, nếu bạn muốn phát triển một dự án KHKT thì loạt bài của mình sẽ giúp bạn đi vào mọi ngóc ngách của IoT và phát triển nên những dự án của chính bạn mà không bị hạn chế bởi các ràng buộc của blynk. Hãy làm những gì bạn muốn với dự án này của mình. Miễn đừng dùng nó trong mục đích thương mại, vì nó không đủ ổn định để làm thương mại đâu.</p> <h2 class="rtejustify"><span style="color:#FF8C00"><strong>X. Kết luận</strong></span></h2> <p class="rtejustify">Qua loạt bài viết của mình, các bạn có thể tự build một dự án IoT từ con Arduino cho đến một server ngoài Internet, toàn bộ đều mở và miễn phí. Tài liệu bằng tiếng Việt, hãy ứng dụng những gì mình hướng dẫn để làm nên những dự án prototype IoT bá đạo nhé. Nhất là các bạn trẻ còn ngồi trên ghế nhà trường, hãy sử dụng nó để biến những ý tưởng vạn vật kết nối Internet trở thành sự thật nhé.</p> <p class="rtejustify">Đây là phần 4, chấm dứt loạt bài hướng dẫn xây dựng ESP8266 kết nối Internet. Và ở các phần tiếp theo, mình sẽ sử dụng những gì mình đã viết ở đây để viết nên những dự án mini và mang tính chất IoT để truyền cảm hứng cho các bạn.</p> <p class="rtejustify">Chúc các bạn thành công.</p> </div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even" rel="dc:subject"><a href="/tags/internet" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">internet</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/iot" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">iot</a></div><div class="field-item even" rel="dc:subject"><a href="/tags/heroku" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">heroku</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/no-blynk" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">no blynk</a></div><div class="field-item even" rel="dc:subject"><a href="/tags/diy" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">diy</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item even" rel="dc:subject"><a href="/tags/free-nodejs-server" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">free nodejs server</a></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">NodeJS</a></div></div></div> Thu, 16 Mar 2017 11:30:43 +0000 ksp 1523 at http://arduino.vn Hướng dẫn lập trình Arduino bằng Javascript trong môi trường NodeJS http://arduino.vn/tutorial/1446-huong-dan-lap-trinh-arduino-bang-javascript-trong-moi-truong-nodejs <div class="field field-name-field-description field-type-text-long field-label-above"><div class="field-label">Mô tả dự án:&nbsp;</div><div class="field-items"><div class="field-item even"><p>Hôm nay mình sẽ bắt đầu Series hướng dẫn lập trình Arduino bằng Javascript trong môi trường NodeJS và lập trình với Orange Pi Lite. Ở bài viết này mình sẽ hướng dẫn cách các bạn viết một chuong trình đơn giản là nhấp nháy led. Bắt đầu thôi</p> </div></div></div><div class="field-collection-container clearfix"><div class="field field-name-field-step field-type-field-collection field-label-hidden"><div class="field-items"><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/722" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Chuẩn bị</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><ul><li>Arduino</li> <li>NodeJS</li> <li>Nodepad++</li> </ul></div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/723" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Tiến hành</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Đầu tiên các bạn phải tải NodeJS về máy tính. Để tải về Nodejs, bạn truy cập trang <a href="https://nodejs.org/en/">https://nodejs.org/en/</a> và tải về theo hướng dẫn. Mình khuyên các bạn nên dùng bản phần lớn người dùng lựa chọn (<span style="color:#FF0000"><strong>bôi đỏ</strong></span>). Khi dùng opensource bạn nên chấp nhận một thực tế là bản mới nhất chưa chắc là bản ổn định nhất </p> <p><img alt="image" src="http://k3.arduino.vn/img/2016/04/20/0/2338_812450-1461131463-0-node.js---cc-cc.png" style="border-collapse:collapse; border:0px; box-sizing:border-box; height:auto; max-height:100%; max-width:100%; vertical-align:middle" /></p> <p>Sau đó cứ Next liên tục hoi. Để kiểm tra thì các bạn chạy 2 lệnh trong cmd (nhấn tổ hợp phím Windows + R hoặc vào Run gõ cmd)</p> <pre class="prettyprint linenums lang-c_pp"> node -v npm -v</pre><p>Tiếp, bạn cài đặt thư viện johnny-five</p> <pre class="prettyprint linenums lang-c_pp"> npm install johnny-five</pre><p>Tiếp theo thì các mở Nodepad++ ra và chép đoạn code này vào</p> <pre class="prettyprint linenums lang-c_pp"> var five = require("johnny-five"); //Gọi thư viện Johnny-five var board = new five.Board(); //Tạo board Arduino từ thư viện board.on("ready", function() { //Arduino đã sẵn sàng làm việc rồi(đây là một sự kiện, nó sẽ diễn ra khi board Arduino đã sẵn sàng cho việc lập trình) var led = new five.Led(13); //Khai báo led ở chân số 13 led.blink(500); // Led nhấp nháy theo chu kỳ sáng tắt 0.5s });</pre><p>Lưu lại với tên led. Nhớ save as dưới dạng file JS nhé</p> <p>Mở Arduino IDE lên và cài chương trình Firmata cho Arduino</p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/01/30/0/3539_123450-1485785106-0-tdfongqfudoctdhaingdfuozzzzsdfsdf.jpg" /></p> <p>Sau đó các bạn mở Command Line của NodeJS lên. và chạy lệnh</p> <pre class="prettyprint linenums lang-c_pp"> node led.js</pre><p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/01/27/0/3501_88212675-1485483252-0-16326200-1923309064566379-1422073353-o.png" style="height:311px; width:750px" /></p> <p>Thưởng thức thôi. Sau này mình sẽ tiếp tục series lập trình Arduino bằng Johhny-five và giới thiệu cách lập trình với Orange Pi Lite, nhớ theo dõi mình nhé hihi</p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full field-collection-view-final"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/724" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Hướng phát triển tiếp theo</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Sắp tới mình sẽ hướng dẫn các bạn sử dụng IC <strong>74HC595 để điều khiển 8 led và 16 led :))</strong>, tất nhiên là lập trình bằng NodeJS rồi hehe.</p> </div></div></div> </div> </div> </div></div></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">NodeJS</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div></div></div> Sat, 28 Jan 2017 11:00:00 +0000 Tống Quốc Thái 1446 at http://arduino.vn Orange Pi Lite - Cài Wiring OP + NodeJS và tiếp cận công cụ Node-RED cho dự án Iot http://arduino.vn/video/1262-orange-pi-lite-cai-wiring-op-nodejs-va-tiep-can-cong-cu-node-red-cho-du-iot <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Mục đích: Đây là loạt bài viết A-Z hướng dẫn các bạn cài đặt và sử dụng Orange Pi Lite để phát triển dự án Iot. </p> <p>Chủ đề: Hướng dẫn cài Wiring OP + NodeJS và tiếp cận công cụ Node-RED trên Orange Pi Lite, thử nghiệm một ví dụ cơ bản trên các chân GPIOs bằng cách kéo thả cực thú vị của Node-RED</p> </div></div></div><div class="field field-name-field-youtube field-type-video-embed-field field-label-inline clearfix"><div class="field-label">Youtube:&nbsp;</div><div class="field-items"><div class="field-item even"> <div class="embedded-video"> <div class="player"> <iframe class="" width="640" height="360" src="//www.youtube.com/embed/-KV2P7DHjNo?width%3D640%26amp%3Bheight%3D360%26amp%3Bautoplay%3D0%26amp%3Bvq%3Dlarge%26amp%3Brel%3D0%26amp%3Bcontrols%3D1%26amp%3Bautohide%3D2%26amp%3Bshowinfo%3D1%26amp%3Bmodestbranding%3D0%26amp%3Btheme%3Ddark%26amp%3Biv_load_policy%3D1%26amp%3Bwmode%3Dopaque" frameborder="0" allowfullscreen></iframe> </div> </div> </div></div></div><div class="field field-name-field-avatar field-type-kImageManager field-label-hidden"><div class="field-items"><div class="field-item even"><img src="http://k1.arduino.vn/img/2016/09/25/0/3226_123450-1474774100-0-3105-123105-1471883219-0-123.jpg" style="width:200px;" /> </div></div></div><div class="field field-name-field-cac-bai-viet-lien-quan field-type-node-reference field-label-above"><div class="field-label">Các bài viết liên quan:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/bai-viet/1190-huong-dan-cai-dat-va-su-dung-tu-z-cho-orange-pi-lite-cai-armbian-va-ket-noi-wifi-lan">Hướng dẫn cài đặt và sử dụng từ A-Z cho Orange Pi Lite - Cài Armbian và kết nối wifi lần đầu</a></div><div class="field-item odd"><a href="/bai-viet/1220-huong-dan-cai-dat-va-su-dung-tu-z-cho-orange-pi-lite-cai-wiring-op-nodejs-va-tiep-can">Hướng dẫn cài đặt và sử dụng từ A-Z cho Orange Pi Lite - Cài Wiring OP + NodeJS và tiếp cận công cụ Node-RED cho dự án Iot</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/cai-wiring-op" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Cài Wiring OP</a></div><div class="field-item odd"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item even"><a href="/tags/node-red" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Node RED</a></div><div class="field-item odd"><a href="/tags/orange-pi-lite" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">orange pi lite</a></div></div></div> Sun, 25 Sep 2016 03:32:47 +0000 NDT 1262 at http://arduino.vn Hướng dẫn cài đặt và sử dụng từ A-Z cho Orange Pi Lite - Cài Wiring OP + NodeJS và tiếp cận công cụ Node-RED cho dự án Iot http://arduino.vn/bai-viet/1220-huong-dan-cai-dat-va-su-dung-tu-z-cho-orange-pi-lite-cai-wiring-op-nodejs-va-tiep-can <div class="field field-name-field-description field-type-text-long field-label-above"><div class="field-label">Mô tả dự án:&nbsp;</div><div class="field-items"><div class="field-item even"><p>Mục đích: Đây là loạt bài viết A-Z hướng dẫn các bạn cài đặt và sử dụng Orange Pi Lite để phát triển dự án Iot. </p> <p>Chủ đề: Hướng dẫn cài Wiring OP + NodeJS và tiếp cận công cụ Node-RED trên Orange Pi Lite, thử nghiệm một ví dụ cơ bản trên các chân GPIOs bằng cách kéo thả cực thú vị của Node-RED <img alt="wink" src="http://cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/wink_smile.png" style="border-collapse:collapse; border:0px; box-sizing:border-box; height:auto; max-height:100%; max-width:100%; vertical-align:middle; width:23px" title="wink" /></p> </div></div></div><div class="field-collection-container clearfix"><div class="field field-name-field-step field-type-field-collection field-label-hidden"><div class="field-items"><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/404" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Cài Wiring OP và NodeJS</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Sau khi đăng nhập vào Orange Pi Lite các bạn tiến hành nhập các lệnh sau để cài Wiring OP và NodeJS nhé <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" style="height:23px; width:23px" title="cool" /> thường công đoạn này mất khoảng 15 phút</p> <pre class="prettyprint linenums lang-c_pp"> apt-get update &amp;&amp; apt-get upgrade git clone https://github.com/zhaolei/WiringOP.git -b h3 cd WiringOP chmod +x ./build sudo ./build</pre><pre class="prettyprint linenums lang-c_pp"> # Cài đặt Node.js v0.12 nè curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash - sudo apt-get install -y nodejs</pre><p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/03/0/3115_812105-1472911860-0-untitled.png" style="width:600px" /></p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/405" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Cài đặt thư viện Node-RED</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Vậy Node-RED là gì? và nó có ứng dụng như thế nào đối với việc phát triển các dự án Iot trên Orange Pi Lite? <img alt="angel" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/angel_smile.png" style="height:23px; width:23px" title="angel" /></p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/03/0/3152_123105-1472907613-0-5375661.png" style="height:400px; width:400px" /></p> <p> </p> <p>Node - RED là một công cụ mã nguồn mở mạnh mẽ để xây dựng Internet of Things ( IOT ). Ứng dụng với mục tiêu đơn giản hóa các thành phần lập trình. <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" title="cool" /></p> <p>Nó sử dụng một lập trình trực quan cho phép bạn kết nối các khối mã , được gọi là các nút với nhau để thực hiện một nhiệm vụ. Các nút khi nối với nhau được gọi là dòng chảy.<img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" title="devil" /></p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/03/0/3117_882105-1472908543-0-node-red-pubnub-dashboard.png" style="height:427px; width:800px" /></p> <p>Việc sử dụng Node-RED là một cách thức mới để "code" một chương trình với cách tiếp cận đơn giản là "kéo-thả", nếu bạn nào đã từng sử dụng App Inventor cũng tương tự, đây được xem là một xu hướng cho việc lập trình các dự án Iot trong tương lai. Vì sao? Vì nó cực kì dễ dàng, hiệu quả lại giảm tối đa thời gian xây dựng một dự án cho các bạn. Mình không nói nó hơn cách code truyền thống <img alt="cheeky" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/tongue_smile.png" style="height:23px; width:23px" title="cheeky" /> nhưng không thể phủ nhận sức mạnh của các "dòng chảy" mạng lại <img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" /> cụ thể hơn các cho các bạn về sức mạnh của Node-RED có thể làm được gì nhé:</p> <ul><li>Truy cập đến các GPIOs Orange Pi của bạn.</li> <li>Thiết lập một kết nối với board khác (Arduino, ESP8266, vv) MQTT.</li> <li>Tạo một giao diện người dùng đồ họa đáp ứng cho các dự án của bạn.</li> <li>Giao tiếp với các dịch vụ của bên thứ ba (IFTTT.com, Adafruit.io, Thing Speak, Vv).</li> <li>Lấy dữ liệu từ các trang web (dự báo thời tiết, giá cổ phiếu, email. Vv).</li> <li>Tạo thời gian kích hoạt các sự kiện.</li> <li>Lưu trữ và lấy dữ liệu từ cơ sở dữ liệu.</li> </ul><p>Okey, Les't Go! Tiến hành cài thư viện Node-Red cho Orange Pi Lite nào, tiến hành chạy các lệnh sau <img alt="angel" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/angel_smile.png" style="height:23px; width:23px" title="angel" /></p> <pre class="prettyprint linenums lang-c_pp"> npm install -g node-red #thư viện serial port npm install -g node-pre-gyp npm install -g npm@3.x #install node-red cd /usr/lib/node_modules/node-red npm install node-red-node-serialport@0.0.5 cd /usr/lib/node_modules/node-red/node_modules/node-red-node-serialport #fix serialport npm install serialport@1.7.4 cd /usr/lib/node_modules/node-red #fix gpio npm install node-red-contrib-gpio </pre><pre class="prettyprint linenums lang-c_pp"> sudo npm install -g johnny-five cd /usr/lib/node_modules/johnny-five npm install serialport npm install -g npm@2.x cd /usr/lib &amp;&amp; npm install raspi-i2c chmod 0777 /usr/lib/node_modules</pre><p> </p> <p>Okey tới phầ này nó sẽ yêu cầu bạn đăn nhập vào tài khoản thứ cấp, chính là tài khoản bạn tạo lúc cài Armbian</p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/03/0/3153_123105-1472913844-0-3077-882105-1471922084-0-ok.png" style="width:800px" /> ​    </p> <p><span style="color:#FF0000">  su &lt;vào tên tài khoản user thứ cấp&gt; (ví dụ: su ndt)</span></p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/03/0/3118_882105-1472914111-0-su-ndt.png" style="width:800px" />  </p> <pre class="prettyprint linenums lang-c_pp"> cd / npm install -g raspi-io exit wget https://raw.githubusercontent.com/ngohuynhngockhanh/kLaserCutterOrangePI/master/node_modules/raspi-io/node_modules/raspi-board/lib/index.js -O /usr/lib/node_modules/raspi-io/node_modules/raspi-board/lib/index.js wget https://raw.githubusercontent.com/ngohuynhngockhanh/kLaserCutterOrangePI/master/node_modules/raspi-io/node_modules/raspi-led/lib/index.js -O /usr/lib/node_modules/raspi-io/node_modules/raspi-led/lib/index.js wget https://raw.githubusercontent.com/ngohuynhngockhanh/kLaserCutterOrangePI/master/node_modules/raspi-io/node_modules/raspi-serial/lib/index.js -O /usr/lib/node_modules/raspi-io/node_modules/raspi-serial/lib/index.js</pre></div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full field-collection-view-final"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/406" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Thử nghiệm một ví dụ với Node-RED</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Sau khi cài đặt xong Node-RED, bạn tiến hành chạy lệnh sau để tạo cổng giao tiếp trên trình duyệt web</p> <pre class="prettyprint linenums lang-c_pp"> node-red</pre><p>Để ngắt kết nối</p> <pre class="prettyprint linenums lang-c_pp"> killall node-red</pre><p>Tiếp theo bạn có thể kiểm tra các cài đặt bằng cách nhập địa chỉ IP của Orange Pi trong một trình duyệt web tiếp theo là số cổng 1880:</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/03/0/3116_812105-1472916501-0-ip-cua-ban.png" style="width:700px" /></p> <p>Ví dụ Orange Pi Lite của mình có địa chỉ IP: 192.168.0.100 thì chỉ cần nhập vào địa chỉ.</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3118_812105-1472989134-0-ip.png" style="height:60px; width:600px" /></p> <p>Okey sau khi đăng nhập vào Node-RED sẽ có giao diện như sau: </p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/04/0/3156_123105-1472993446-0-123ip.png" style="width:800px" /></p> <p>Các chỉ mục chính trên giao diện Node-RED các bạn sẽ thấy</p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/04/0/3121_882105-1472995149-0-321ip.png" style="width:800px" /></p> <p>Những mục cụ thể ở các bài sau chúng ta sẽ vọc nát hết :) bây giờ ta thử test một ví dụ cơ bản trên chân GPIOs của Orange Pi Lite nhé , các bạn chuẩn bị các công cụ lặt vặt sau <img alt="wink" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/wink_smile.png" style="height:23px; width:23px" title="wink" /></p> <ul><li><a href="http://k1.arduino.vn/img/2016/08/22/0/3105_123105-1471883219-0-123.jpg">Orange Pi Lite</a></li> <li><a href="http://arduino.vn/bai-viet/563-breadboard-la-gi-vi-sao-khi-dung-arduino-lai-can-breadboard">Breadboard</a></li> <li>Điện trở <a href="http://k1.arduino.vn/img/2014/10/10/0/828_1231-1412945145-0-330ohm.jpg">330 ôm</a></li> <li>Đèn <a href="http://arduino.vn/bai-viet/283-den-led">Led</a></li> <li><a href="http://arduino.vn/reference/day-breadboard-la-gi">Dây cắm</a></li> </ul><p>Đăng nhập vào lại và chạy lệnh sau để xem tất cả các chân trên Orange Pi Lite:</p> <pre class="prettyprint linenums lang-c_pp"> gpio readall</pre><p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/04/0/3157_123105-1473002635-0-gpio-ne.png" style="height:820px; width:800px" /></p> <p>Kết nối như hình sau để tiến hành chơi chân GPIOs 25 <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" style="height:22px; width:22px" title="cool" /></p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3119_812105-1473002016-0-ok-meo.png" style="width:600px" /></p> <p>Okey, ta tiến hành vào lại giao diện Node-RED trên trình duyệt các bạn tiến hành kéo thả các Nodes theo hình bên dưới hoặc xem video nhé <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" style="height:22px; width:22px" title="cool" /></p> <p><strong>Bước 1:</strong> Click chuột vào<strong> inject</strong> và kéo thả vào màn hành <strong>Flow 1</strong>, chúng ta kéo 2 lần nhé để có thể gửi 2 lệnh riêng biêt bật/tắt chân GPIOs.</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3120_812105-1473004551-0-2-node.png" style="height:388px; width:800px" /></p> <p><strong>Bước 2:</strong> Click đúp chuột vào <strong>inject</strong>,  ở <strong>Payload</strong> chọn <strong>number</strong> tiến hành nhập vào số <strong>1</strong> cho inject thứ nhất, nhập<strong> 0</strong> cho inject thứ hai để gửi lệnh đi , <strong>Topic</strong> các bạn đặt một tên bất kì cho chủ đề của node -&gt; kết thúc <strong>Done</strong></p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/04/0/3122_882105-1473004546-0-0-1.png" style="height:378px; width:800px" /></p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/04/0/3159_123105-1473004563-0-dat-ten.png" style="line-height:20.8px; width:800px" /></p> <p><strong>Bước 3:</strong> Kéo thả một <strong>GPIOs </strong>(ở mục OUTPUT) vào Flow, click đấp chuột ta sẽ thấy một tab <strong>edit gpio out node.</strong></p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/04/0/3124_882105-1473004566-0-gpio-in.png" style="line-height:20.8px; width:800px" /></p> <p><strong>Bước 4:</strong> Ở Board chọn vào kí hiệu câu bút để edit, tiến hành chọn board là <strong>Raspberry Pi</strong> (Orange Pi cũng chọn board này), bên dưới là <strong>Name</strong> các bạn đặt tên tùy thích là được, <strong>Done</strong> để kết thúc.</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3121_812105-1473004560-0-dat-ten-opi.png" style="height:374px; line-height:20.8px; width:800px" /></p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/04/0/3125_882105-1473004577-0-luu-la-rasp.png" style="height:400px; width:800px" /></p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/04/0/3158_123105-1473004555-0-dat-ten-opi-2.png" style="width:800px" /></p> <p><strong>Bước 5:</strong> Sau khi chọn Board xong ở mục <strong>Type</strong> các bạn <strong>Digital (0/1),</strong> ở <strong>Pin</strong> các bạn đánh chân GPIOs mà bạn đã kết nối với Led (dùng lệnh gpio readall để xem các chân như đã nêu ở trên) mình sẽ điền vào là<strong> 25</strong>, <strong>Name</strong> thì bạn đặt tên gì cũng được. Done để hoàn thành.</p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2016/09/04/0/3123_882105-1473004557-0-dat-ten-opi-3.png" style="width:800px" /></p> <p><strong>Bước 6:</strong> Các bạn dùng chuột tạo các kết nối dòng chảy giữa các node như hình và chọn vào <strong>Deploy</strong> để triển khai nhé <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:22px; width:22px" title="devil" /></p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3123_812105-1473004579-0-tao-flow.png" style="width:800px" /></p> <p><strong>Bước 7:</strong> Tiến hành click vào phần đầu mỗi <strong>inject</strong> để gửi lệnh và kết quả là đèn đã bật/tắt đèn <img alt="laugh" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/teeth_smile.png" style="height:22px; width:22px" title="laugh" /></p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2016/09/04/0/3122_812105-1473004569-0-ket-thuc.png" style="width:800px" /></p> <p><strong>Bước 8:</strong> Để kết thúc trình Node-RED các bạn tổ hợp <strong>ctrl + z</strong> để về chế độ command và nhập lệnh:</p> <pre class="prettyprint linenums lang-c_pp"> killall node-red</pre><p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/09/04/0/3160_123105-1473004573-0-kill-all.png" style="line-height:20.8px; width:800px" /></p> <blockquote><p><em>Okey vậy là chúng ta đã hoàn thành việc cài đặt Wiring OP + NodeJS + Node-RED và tiến hành chơi thử 1 ví dụ đơn giản là bật/tắt led trên chân GPIOs của Orange Pi Lite <img alt="cool" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/shades_smile.png" style="height:22px; width:22px" title="cool" /> ở các bài viết sau chúng ta sẽ tiến hành xây dựng một mô hình nhà thông minh (Home Automation System) với chi phí cực thấp 100$ nhé <img alt="angel" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/angel_smile.png" style="height:22px; width:22px" title="angel" /> Cảm ơn bạn đã theo dõi!</em></p> </blockquote> <p> </p> </div></div></div> </div> </div> </div></div></div></div></div><div class="field field-name-field-youtube field-type-video-embed-field field-label-inline clearfix"><div class="field-label">Youtube:&nbsp;</div><div class="field-items"><div class="field-item even"> <div class="embedded-video"> <div class="player"> <iframe class="" width="640" height="360" src="//www.youtube.com/embed/-KV2P7DHjNo?width%3D640%26amp%3Bheight%3D360%26amp%3Bautoplay%3D0%26amp%3Bvq%3Dlarge%26amp%3Brel%3D0%26amp%3Bcontrols%3D1%26amp%3Bautohide%3D2%26amp%3Bshowinfo%3D1%26amp%3Bmodestbranding%3D0%26amp%3Btheme%3Ddark%26amp%3Biv_load_policy%3D1%26amp%3Bwmode%3Dopaque" frameborder="0" allowfullscreen></iframe> </div> </div> </div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/raspberry-pi" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Raspberry Pi</a></div><div class="field-item odd"><a href="/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">NodeJS</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/cai-wiring-op" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Cài Wiring OP</a></div><div class="field-item odd"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item even"><a href="/tags/node-red" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Node RED</a></div><div class="field-item odd"><a href="/tags/orange-pi-lite" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">orange pi lite</a></div></div></div> Mon, 05 Sep 2016 04:37:32 +0000 NDT 1220 at http://arduino.vn Lập trình nhúng trên Raspberry Pi bằng ngôn ngữ Javascript trong môi trường NodeJS - chìa khóa thành công http://arduino.vn/bai-viet/888-lap-trinh-nhung-tren-raspberry-pi-bang-ngon-ngu-javascript-trong-moi-truong-nodejs-chia <div class="field field-name-field-description field-type-text-long field-label-above"><div class="field-label">Mô tả dự án:&nbsp;</div><div class="field-items"><div class="field-item even"><p>Với kinh nghiệm của một hardcore developer, đã từng dùng nhiều ngôn ngữ lập trình như C++, python, bash, js,... trên Raspberry Pi. Mình nhận thấy, Javascript trên NodeJS là một trong những ngôn ngữ lập trình &quot;làm việc tốt nhất&quot; trên Raspberry Pi. Vì sao? Vì đơn giản, nó chạy trong môi trường NodeJS mà NodeJS là một hệ sinh thái với hệ thống thư viện mở lớn nhất thế giới. Tuy nhiên, nó không dễ tiếp cận như Python, Ruby. Vì vậy, bạn cần lườm trước mọi thứ trước khi dấn thân vào Javascript. Tuy nhiên, lợi ích của bạn khi biết Javascript đó là có thể lập trình MỌI NỀN TẢNG từ những board mạch nhỏ nhất như (Raspberry Pi, Intel Galileo, Arduino Yún,...) cho đến môi trường Web.</p> </div></div></div><div class="field-collection-container clearfix"><div class="field field-name-field-step field-type-field-collection field-label-hidden"><div class="field-items"><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/68" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Javascript là gì?</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Javascript là một ngôn ngữ lập trình kịch bản <strong>hướng sự kiện</strong> dựa vào đối tượng phát triển có sẵn hoặc tự định nghĩa ra, javascript được sử dụng rộng rãi trong các ứng dụng Website. Javascript được hỗ trợ hầu như trên tất cả các trình duyệt như Firefox, Chrome, ... thậm chí các trình duyệt trên thiết bị di động cũng phải hỗ trợ nó.</p> <p>Và với môi trường <a href="http://arduino.vn/bai-viet/806-cai-dat-nodejs-tren-windows-mo-hinh-moi-truong-iot-chuyen-nghiep">NodeJS</a>, bạn có thể chạy được Javascript trên các thiết bị nhúng hay trên server chạy NodeJS. Để rõ hơn các bạn có thể xem <a href="http://arduino.vn/bai-viet/806-cai-dat-nodejs-tren-windows-mo-hinh-moi-truong-iot-chuyen-nghiep">bài của ksp</a>.</p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/69" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Cài đặt NodeJS trên Raspberry Pi</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><blockquote><p>Đã chơi với Raspberry Pi thì bạn cần phải <a href="http://arduino.vn/bai-viet/688-cai-dat-raspbian-tren-raspberry-pi-he-dieu-hanh-danh-cho-developer-dua-tren-nen-debian">cài Raspbian</a> nhé. Hệ điều hành khác thì thế giới không hỗ trợ để dev nhiều.</p> </blockquote> <p class="rtejustify">Kinh nghiệm của mình là cài bảng 4.0 vì nó rất ổn định và không cần phải nâng cấp GCC và G++ để biên dịch một số gói extension của nodejs.</p> <p class="rtejustify">Đối với bản Raspberry Pi Model A, B, B+</p> <pre class="prettyprint linenums lang-python" data-pbcklang="python" data-pbcktabsize="4"> wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv6l.tar.gz tar -xvf node-v4.0.0-linux-armv6l.tar.gz cd node-v4.0.0-linux-armv6l</pre><p>Đối với bản Raspberry Pi 2 trở lên</p> <pre class="prettyprint linenums lang-python" data-pbcklang="python" data-pbcktabsize="4"> wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz tar -xvf node-v4.0.0-linux-armv7l.tar.gz cd node-v4.0.0-linux-armv7l</pre><p>Sau đó, bản nào cũng phải chạy lệnh sau</p> <pre class="prettyprint linenums lang-python" data-pbcklang="python" data-pbcktabsize="4"> sudo cp -R * /usr/local/</pre><p>Để test mình có cài xong chưa thì bạn chạy lệnh</p> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> node -v npm -v</pre><blockquote> <p>Trong đó:</p> <ul><li>node: chương trình sẽ thực thi các file javascript sau này!</li> <li>npm: chương trình quản lý gói của nodejs, thêm thuộc tính (-g) khi cài đặt gói sẽ biến đó là gói toàn cục, còn không có thuộc tính -g thì nó là gói cục bộ!</li> </ul></blockquote> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/70" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Cài đặt Johnny-Five - &quot;ông trùm&quot; thư viện giúp bạn lập trình Raspberry Pi bằng Javascript trong môi trường NodeJS</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p class="rtecenter"><a href="http://k1.arduino.vn/img/2016/06/10/0/2539_123450-1465546790-0-2085576-o-19u65s1qsk10fi2a6l1ml61a7sh-full.jpg"><img alt="" src="http://k1.arduino.vn/img/2016/06/10/0/2539_123450-1465546790-0-2085576-o-19u65s1qsk10fi2a6l1ml61a7sh-full.jpg" style="height:487px; width:660px" /></a></p> <p>Johnny-five là một thư viện Javascript trong lĩnh vực Robotics &amp; IOT. Nó đa được công bố vào năm 2012 và hiện giờ lực lượng dev của nó rất lớn với hơn 70 thành viên. Cộng đồng IOT thế giới rất yêu thích sử dụng nó vì nó port tất cả các mạch nhúng linux về một dạng lập trình chung và bạn chỉ việc thay đổi gói "interface" cho phù hợp với board mình dùng thì code của bạn có thể chạy ngay.</p> <p>Một cách dễ hiểu nhất, Johnny-five sẽ giúp bạn làm robot cực kỳ nhanh thông qua việc quản lý các file IO với bộ thư viện bá cháy của nó. Qua mình thực nghiệm thì gần như mọi lại cảm biến, thiết bị chạy được trên Arduino đều chạy được trên Raspberry Pi hay các board khác qua thư viện này.</p> <p>Và quan trọng hơn nữa, bạn chỉ cần biết dùng nó thì mọi board khác bạn đều lập trình được, chứ không phải như wiringPi trong Raspberry Pi hay thư viện gì khác cho từng board nhé <img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" />.</p> <blockquote><p>Đã là dev thì phải tìm thư viện và môi trường nào có khả năng "<strong>write once run everywhere</strong>" nhé! Đừng vì mình không biết ngôn ngữ đó mà không dám khám phá sức mạnh của những ngôn ngữ khác. Phải biết vận dụng và tùy cơ ứng biến <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" />.</p> </blockquote> <p><strong>Cài đặt Johnny-Five</strong></p> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> npm install johnny-five -g</pre><blockquote> <p>Đơn giản vậy thôi <img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" /></p> </blockquote> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/71" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Cài đặt Interface Raspberry Pi cho Johnny Five</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p class="rtejustify">Johnny Five giống như là một hệ sinh thái hơn là một thư viện đơn thuần, vì nó giúp bạn lập trình mọi nền tảng mà nó hỗ trợ với một hệ sinh thế lớn hơn thế là NodeJS. </p> <p class="rtejustify">Để JohnnyFive chạy được trên board của bạn, trong trường hợp này là Raspberry Pi, bạn cần cài một interface để Johnny Five hiểu và chạy được một cách ổn định.</p> <p class="rtejustify">Thực ra cái <strong>interface </strong>này là gì? <strong>Cũng không có gì to tát cả, nó đơn thuần có thể hiểu như là một dạng hàm ảnh để ánh xạ (mapping) các cổng GPIO thôi mà.</strong></p> <p class="rtejustify">Cài đặt interface Raspberry Pi cho Johnny Five thì các bạn chạy lệnh</p> <pre class="prettyprint linenums lang-python" data-pbcklang="python" data-pbcktabsize="4"> npm install -g raspi-io</pre><p> </p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/72" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ led Blink</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Vì lý do công việc (dev) nên mình không có sẵn board + led để demo cho các bạn, nên mình sẽ lấy ví dụ ở trang http://johnny-five.io/ để demo cho các bạn nhé.</p> <p>Bạn tạo một file mới tên là blink.js ở đâu cũng được với nội dung như sau:</p> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> var five = require("johnny-five"); var Raspi = require("raspi-io"); var board = new five.Board({ io: new Raspi() }); board.on("ready", function() { var led = new five.Led("P1-13"); led.blink(); }); </pre><p>Sau đó chạy lệnh</p> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> node blink.js</pre><p>... và tận hưởng thành quả.</p> <p class="rtecenter"><a href="http://k2.arduino.vn/img/2016/06/10/0/2516_882450-1465547763-0-led-13-raspberry-pi.png"><img alt="" src="http://k2.arduino.vn/img/2016/06/10/0/2516_882450-1465547763-0-led-13-raspberry-pi.png" style="width:750px" /></a></p> <blockquote><p>Bạn để ý, lúc này ở comment line bạn sẽ bị treo và không thể gõ lệnh mới, đừng lo lắng, nó là như vậy đấy, bạn chỉ việc nhấn Ctrl+C ra là thoát chương trình! Những chương trình cho nodejs có đặc điểm là chạy <strong>forever</strong> theo <strong>cycle life </strong>của javascript. Nên nếu bạn muốn chạy nền (<strong>background</strong>) thì phải tìm thêm trên mạng. Múc đích bài của mình là làm quen trước đã, phức tạp thì cứ từ từ.</p> </blockquote> <p>Để ý đoạn code trên, có những từ khóa <strong>mới </strong>như sau:</p> <ul><li> <pre class="prettyprint linenums lang-python" data-pbcklang="python" data-pbcktabsize="4"> var five = require("johnny-five"); var Raspi = require("raspi-io"); var board = new five.Board({ io: new Raspi() });</pre><p>4 dòng code này bạn buộc phải có khi muốn viết code cho raspi dùng Javascript nhé <img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" />. Trong đó từ khóa <strong><span style="font-family:courier new,courier,monospace">require</span> </strong>giống như <span style="font-family:courier new,courier,monospace">#<strong>include </strong></span>trong Arduino vậy thôi.</p> </li> <li> <p>Trong JS (javascript) cũng có những nhiều cái mới như là:</p> <ul><li> <p>Bạn không cần khai báo kiểu dữ liệu, chỉ cần dùng một từ khóa <strong>var</strong> là được.</p> </li> <li> <p>Nó có 4 kiểu dữ liệu chính (không cần khai báo kiểu dữ liệu cho biến đâu nhé): số nguyên, số thực, chuỗi và object. Trong đó object là một kiểu dữ liệu đặc biệt, nó dùng để viết <strong>class </strong>(đối tượng), <strong>function </strong>(hàm),... nó rất hay và chính nó tạo nên thương hiệu Javascript đó.</p> </li> </ul></li> <li> <p>Khi lập trình mấy cái này, bạn không cần quan tâm đến khái niệm setup hay loop, vì chỉ có một hàm duy nhất là hàm setup mà thôi! Hàm loop các bạn phải tự tạo qua <strong>interval </strong>(nói cụ thể thì hơi phức tạp, đợi ví dụ tiếp mình nói ha)!</p> </li> <li> <p>Như các bạn thấy đoạn code còn lại trong ví dụ trên chính là đoạn "setup".</p> <ul><li> <p>Cái này không cần pinMode vì nó cố tình không code theo API của Arduino vì 2 phong cách ngôn ngữ lập trình là khác nhau không thể code như vậy được. Vì sao? Vì Arduino là dạng ngôn ngữ lập trình khai báo rõ ràng kiểu dữ liệu, còn Javascript là dạng ngôn ngữ khai báo không rõ ràng, không cần quan tâm đến kiểu dữ liệu của nó (nôm na vậy là ok).</p> </li> <li> <p>Có 2 dòng chính, dòng này <span style="font-family:courier new,courier,monospace">var led = new five.Led("P1-13"); </span>giống như là pinMode led tại chân có số thứ tự là 13, bạn xem thêm <a href="https://github.com/nebrius/raspi-io/wiki/Pin-Information">ở đây nhé</a>.</p> </li> <li> <p>Còn hàm dưới là hàm cho led đó nhấp nháy với tốc độ là 500ms. Có thể xem thêm tham khảo của nó <a href="http://johnny-five.io/api/led/">tại đây</a>.</p> </li> </ul></li> </ul></div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/73" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Các ví dụ khác về Johnny five và Raspberry Pi</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Các bạn ở thể vào <a href="http://johnny-five.io/examples/raspi-io/">đây</a> và xem các ví dụ bằng tiếng Anh. Nó khá rõ ràng, từ ngữ dễ chịu và hay, đọc một tí cho lên tay vì Javascript không dễ như C++ (mức căn bản, lên pro thì C++ vẫn khó nhất).</p> <p>Trong các ví dụ đó, chủ yếu là ví dụ trên board Arduino, các bạn theo như quy tắc đặt tên pin như mình nói ở ví dụ blink trên để sửa lại, cùng sửa phần cài đặt board (4 dòng đầu) của mỗi ví dụ nữa là được!</p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full field-collection-view-final"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/74" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Đi xa hơn</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Bài viết này, mình viết chủ yếu là để giới thiệu về thư viện johnny five và môi trường nodejs trên Raspberry Pi, các bạn cần tự học và tự tay dev nhiều cái vào thì mới lên tay.</p> <p>Chúc các bạn may mắn trên con đường của mình.</p> </div></div></div> </div> </div> </div></div></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/raspberry-pi" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Raspberry Pi</a></div><div class="field-item odd"><a href="/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">NodeJS</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/raspberry-pi" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">raspberry pi</a></div><div class="field-item odd"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item even"><a href="/tags/javascript" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">javascript</a></div><div class="field-item odd"><a href="/tags/johnny-five" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">johnny-five</a></div></div></div> Fri, 10 Jun 2016 05:03:15 +0000 raspi 888 at http://arduino.vn Cài đặt NodeJS trên Windows - mô hình môi trường IOT chuyên nghiệp http://arduino.vn/bai-viet/806-cai-dat-nodejs-tren-windows-mo-hinh-moi-truong-iot-chuyen-nghiep <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><h2 class="rtejustify"><span style="color:#FF8C00"><strong>I. Giới thiệu</strong></span></h2> <p class="rtejustify">NodeJS là một hệ sinh thái Javascript mà ở đó bạn có thể lập trình nó như mọi ngôn ngữ lập trình nhúng như C++, python,... nó cũng có thể chạy đa nền tàng như Java vậy đó nhé. Nhưng luôn ghi nhớ Javascript và Java là khác nhau bạn nhé. Nodejs được xây dựng trên bộ Javascript engine V8 của Google. Mình sẽ không nói quá nhiều về chuyên môn trong bài viết này vì nó sẽ đi lệch định hướng của cộng đồng Arduino Việt Nam và cũng có rất nhiều cộng đồng NodeJS ở Việt Nam sẽ giúp bạn am tường hơn về NodeJS. Qua bài viết này, mình mong muốn bạn sẽ biết cách cài đặt NodeJS và giúp bạn thấy được tiềm năng IOT của nó.</p> <h2 class="rtejustify"><span style="color:#FF8C00"><strong>II. Cài đặt</strong></span></h2> <p class="rtejustify">Để tải về Nodejs, bạn truy cập trang https://nodejs.org/en/ và tải về theo hướng dẫn. Mình khuyên các bạn nên dùng bản <strong>phần lớn người dùng lựa chọn (<span style="color:#FF0000">bôi đỏ</span>)</strong>. Khi dùng opensource bạn nên chấp nhận một thực tế là bản mới nhất chưa chắc là bản ổn định nhất <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" />.</p> <p class="rtecenter"><a href="http://k3.arduino.vn/img/2016/04/20/0/2338_812450-1461131463-0-node.js---cc-cc.png"><img alt="" src="http://k3.arduino.vn/img/2016/04/20/0/2338_812450-1461131463-0-node.js---cc-cc.png" style="width:750px" /></a></p> <p class="rtejustify">Sau đó bật file .msi vừa tải về và Next liên tục thôi :)</p> <p class="rtejustify">Sau khi tải về, bạn mở Command line của nodejs lên và thử các lệnh sau đây, nếu nó trả về kết quả tương tự như hình dưới là bạn đã cài nodejs thành công rồi đấy.</p> <blockquote><p class="rtejustify">node -v</p> <p class="rtejustify">npm -v</p> </blockquote> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2016/04/20/0/2372_123450-1461131629-0-cwindowssystem32cmd.exe-.png" /></p> <p class="rtejustify">Để hiểu hơn về NodeJS, bạn cần phải tìm hiểu thêm về nó, sau đây, mình xin gửi một số địa chỉ mà mình nghĩ bạn có thể sử dụng trong quá trình học NodeJS</p> <ul><li class="rtejustify">http://www.nodebeginner.org/index-vi.html - một trang giới thiệu và nodejs và các khái niệm cơ bản nên học</li> <li class="rtejustify">https://nodejs.org/api/index.html - Toàn bộ API của Nodejs (dùng để bí vô tra thôi chứ không phải để học nha, bạn chưa có kiến thức nền tảng mà vô đây học là tẩu hỏa nhập ma ngay đó <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" />)</li> <li class="rtejustify">http://techmaster.vn/posts/33448/nodejs-cho-nguoi-moi-bat-dau - Học NodeJs cần những gì</li> <li class="rtejustify">Vì mình bắt đầu với Nodejs khi đã khá rành về Javascript nên mình đề xuất các bạn học Javascript trước, để học javascript tốt, bạn nên dùng trang này http://www.w3schools.com/js/</li> <li class="rtejustify">Khi đã có kiến thức javascript rồi thì cái gì cũng dễ hết á, cứ theo API của nodejs ở các tài liệu tham khảo mình liệt kê ở trên là ổn. Nếu bí thì bạn cứ google từ khóa "nodejs + vấn đề" là ra thôi à.</li> <li class="rtejustify">Hệ sinh thái các thư viện nodejs là hệ sinh thái nguồn mở lớn nhất hành tinh vì vậy khi gặp vấn đề khó thì bạn có thể vô đây tìm https://www.npmjs.com/</li> </ul><h2><span style="color:#FF8C00"><strong>III. Mô hình IOT với nodejs</strong></span></h2> <p class="rtejustify">NodeJS bản thân nó cũng khá mạnh trong việc lập trình nhúng khi chạy trên Intel Galileo hay Raspberry Pi. Tuy nhiên, chi phí để sở hữu một mạch Intel Galileo hay Raspberry Pi thật sự không phải là rẻ. Bên cạnh đó, mạch Arduino của chúng ta tuy rẻ và khá mạnh mẽ trong các ứng dụng đơn giản, nhưng để nó lên level Internet of Things thì bạn cần phải có nhiều mạch bổ trợ như Ethernet Shield hay ESP8266... Giữa một bên là lập trình bá đạo, đụng đến gần như mọi thứ ở NodeJS và một bên là chi phí siêu rẻ và hoạt động linh hoạt, đó chính là hai mặt của một vấn đề IOT. Vì vậy, để làm được IOT bạn phải giải quyết được vấn đề này, phải kết hợp cả 2 cái và dùng cả 2, dùng javascript trong giao tiếp với thế giới Internet vì khả năng mở rộng và sự linh hoạt thuần khiết, dùng Arduino để làm hệ thống cảm biến và thiết bị điều khiển thiết bị để giá thành cực rẻ và tập trung. </p> <p class="rtejustify">Với kinh nghiệm của mình khi phát triển các hệ thống IOT đó là: hãy sử dụng mô hình micro service, vì mỗi phần trong hệ thống sẽ là một service, mỗi service sẽ có API riêng và chúng sẽ giao tiếp với nhau qua mạng. Từ <strong>mạng</strong>, ở đây không chỉ nói đến mạng Internet mà còn nói đến <strong>mạng cảm biến </strong>sử dụng sóng vô tuyến ở Arduino đấy bạn nhé.</p> <p class="rtejustify">Một số dự án IOT </p> <ul><li class="rtejustify">https://cylonjs.com/</li> <li class="rtejustify">https://ms-iot.github.io/content/en-US/win10/samples/Nodejs.htm</li> <li class="rtejustify">http://nodered.org/</li> </ul><h2><span style="color:#FF8C00"><strong>IV. Tương lai IOT với Cộng đồng Arudino Việt Nam</strong></span></h2> <p class="rtejustify">Hiện tại mình đang xây dựng một mô hình mạng cảm biến cho Arduino với việc mở rộng node lên đến 50 node (tương lai là hàng vạn node - lý thuyết). Và để dùng được nó, bạn cần biết một ít về NodeJS để lập trình mạng cho hệ thống mạng cảm biến này <img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" />. Đây sẽ là một dự án dài hơi mang tính cộng đồng nguồn mở dưới giấy phép GNU GPL v3.0. Sắp tới, mình rất mong nhận được sự hỗ trợ, đóng góp của các bạn <img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" />.</p> </div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even" rel="dc:subject"><a href="/tags/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">nodejs</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/node" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">node</a></div><div class="field-item even" rel="dc:subject"><a href="/tags/npm" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">npm</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/v8" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">v8</a></div><div class="field-item even" rel="dc:subject"><a href="/tags/javascript" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">javascript</a></div><div class="field-item odd" rel="dc:subject"><a href="/tags/engine" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">engine</a></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/nodejs" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">NodeJS</a></div></div></div> Wed, 20 Apr 2016 05:45:16 +0000 ksp 806 at http://arduino.vn