把遇到錯誤的、學習到的前端筆記在這邊

總網頁瀏覽量

Copyright © Tzeng Ying-chi. 技術提供:Blogger.

2019/09/25

[2019鐵人賽] - 13.筆記IoT初練習- 網頁也可以控制Arduino?透過 Socket.io 操控 Arduino 吧!


學了 JavaScript 之後,軟體、硬體我全都要!ლ(́◕◞౪◟◕‵ლ)

> 本篇基礎建立在
[2019鐵人賽] - 11.筆記IoT初練習- 急!在线等!用 Socket.io 建立即時連線~簡介篇
[2019鐵人賽] - 12.筆記IoT初練習- 急!在线等!用 Socket.io 建立即時連線~實作篇
若沒有看過可以先看一下~

上篇我們用 socket 純軟體的讓前後端連線,
這是我們的目標是軟體到硬體、程式到實體,讓User可以直接透過網頁來操控Arduino!

程式架構一樣我們會有一個 HTML 的網頁和 Server 伺服器,但我們要在後端加上 Johnny-Five 的程式 ;讓 User 在前端操控時,透過 Socket.io 傳遞到 Server 端,進而操控 Arduino的 I/O。

一開始我們目標小一點,先控制一顆 LED 的開關就好~

那麼就開始吧!(ง๑ •̀_•́)ง

這次我們先構想前端頁面,因為功能很簡單就是控制一個LED,那就需要一個Button!
為了求快速開發這邊也一樣,CSS 引用 Bootstrap 框架,JS 引用 jQuery 來撰寫~

翻了一下 Bootstrap 的開關,看到這個~
> Bootstrap - Switches
  


恩~很符合我要的開關樣子!就是你啦!我們就用下去吧~(๑•̀ㅂ•́)و

前端部分



網頁長得非常簡單~就是一個Switch來作切換開關~ヽ(・×・´)ゞ

前端的程式碼~
> HTML部分

<!DOCTYPE html>
<html lang="">

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
    <meta name="description" content="" />
    <meta name="author" content="Tzeng,Ying-Chi" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" />
    <title>Socket-io connect IoT</title>
</head>

<body>
    <div class="container pt-4">
        <h3>Socket.io - LED On/Off</h3>
        <div class="custom-control custom-switch switch pt-4">
            <input type="checkbox" class="custom-control-input" id="switch" />
            <label class="custom-control-label" for="switch">切換 LED 開關</label>
        </div>
    </div>
    <nav class="navbar navbar-light bg-light fixed-bottom">
        Socket-io connect IoT
        IoT沒那麼難!新手用JavaScript入門做自己的玩具 Tzeng,Ying-Chi
    </nav>
</body>

</html>



前端的程式碼~
> JavaScript 部分

//初始化狀態
var sw = false;
var socket = io.connect();

//當網頁上的開關被按下時,觸發事件
$('#switch').click(function() {
  sw = true;
  sendToServer();
});

function sendToServer() {
  //傳送swEvent事件給Server端
  socket.emit('swEvent', {
    sw: sw,
  });
}

完成一半囉~繼續加油!(ง๑ •̀_•́)ง


後端部分

var io = require('socket.io');
var express = require('express');
var five = require('johnny-five');

var board = new five.Board();
var app = express();

app.use(express.static('socket-conn'));
var server = app.listen(3000, function() {
  console.log('connected!');
});

var sio = io(server);

// johnny-five event when johnny init ready
board.on('ready', function() {
  // 指定LED output 為 Arduino 第13腳
  var led = new five.Led(13);
  // led 初始化狀態
  led.off();
  // socket連線成功時,開始偵聽前端的 swEvent 事件
  sio.on('connection', function(socket) {
    socket.on('swEvent', function(data) {
      //如果前端有動作則呼叫 johnny-five led.toggle() 切換led狀態
      console.log(data);
      if (data != false) {
        led.toggle();
      }
    });
  });
});


後端前半部的code相關解釋可以參照上篇,這次要來解釋的是加入 Johnny-Five 的部分~
在socket建立起連線之後,我們使用 Johnny-Five 的 board方法,當板子也初始化ready好後,Socket.io也隨之準備連線前端!

前端若觸發`swEvent`事件時,呼叫Johnny-Five led.toggle() 切換led狀態。

OK 之後~ 測試看看開啟 node ! (ง๑ •̀_•́)ง
`$ node socket-iot.js `


是不是很好玩啊~(*´∀`)~♥
就和我們開頭放的圖一樣,User 使用網頁,透過 socket.io 傳輸到 Server 就可以操控實體的物件了~

只要是在同一個網段下,手機連上後也可以操控喔~d(d'∀')


今天只是展示簡單的 LED 亮/滅,在同樣的架構下還可以創造各種可能性,像是使用不同的感測器做出智慧家居、智慧家庭應用、寵物管理這些應用~

想像力就是你的超能力!就等大家來和我一起分享你們的成果了~(*´∀`)~♥

本文到這邊先下台一鞠躬了~
有錯敬請留言改正,感謝您的閱讀 <(_ _)>

0 留言:

張貼留言