在web瀏覽器上顯示室內溫度(nodeJs+arduino+socket.io)

上次的nodejs操做arduino入門篇中實現瞭如何鏈接arduino。此次咱們來實現經過arduino測量室內溫度並在瀏覽器上顯示出來。css

【所需材料】html

硬件:LM35溫度傳感器,arduino uno板,麪包板,若干導線。前端

軟件:socket.io , cylonJs , express等node

【準備-硬件部分】jquery

1、首先固然是鏈接電路板:express

 

注意這個ANALOG IN是傳感器的輸入,就是讀取溫度的入口。npm

看看我連的:json

二、而後按照 nodejs操做arduino入門篇先鏈接上arduino試試吧。api

【準備-軟件部分】瀏覽器

一、安裝socket.io,express,package.json中這樣寫:

{
  "name": "robot",
  "version": "1.0.0",
  "description": "robot",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "yourname",
  "license": "ISC",
  "devDependencies": {
    "cheerio": "^0.22.0",
    "cylon-firmata": "*"
  },
  "dependencies": {
    "cylon-firmata": "^0.24.0",
    "cylon-gpio": "^0.29.0",
    "cylon-i2c": "^0.26.1",
    "express": "^4.14.0",
    "socket.io": "^1.5.0"
  }
}

執行npm install安裝依賴包

二、編寫主文件,就是讀取溫度,在main.js中寫入:

var Cylon = require('cylon');
var express = require('express');
var http = require('http');
var app = express();
var server = http.Server(app);
var io = require('socket.io')(server);
var port = 3000;  
app.use(express.static(__dirname+'/'));//設置靜態文件目錄

app.get('/',function(req,res){
      res.sendFile('index.html');//渲染一個html文件,在這個html文件中來展現溫度
});


server.listen(port,function(){
  console.log("正在監聽%d端口...",port);
});

Cylon.api('http');
Cylon.robot({
  connections: {
    arduino: { adaptor: 'firmata', port: '/dev/cu.wchusbserial1420' }
  },

  devices: {
    sensor: { driver: 'analog-sensor', pin: 2, lowerLimit: 100, upperLimit: 900 }//2號analog in口,後面是最低和最高讀取值
  },

  work: function(my) {
      var analogValue = 0;
      io.on('connection', function(socket){
        every((1).second(), function() {//頻率是1Hz,就是1秒讀取一次溫度
          analogValue = my.sensor.analogRead();//讀取傳感器數值
          io.emit('news', (analogValue*500/1023).toFixed(1));//analogValue*500/1023是將傳感器數值轉換成攝氏度。取一位小數
          //用socket.io把數值綁定在news這個名字上,前端也會用這個名字來讀取這個值
        });
        console.log('a user connected');
        socket.on('disconnect', function(){
          console.log('user disconnected');
        });
    });
  }
}).start();

三、前端代碼--index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>溫度</title>
    <script src="http://cdn.bootcss.com/jquery/2.2.2/jquery.min.js"></script>
    <link rel="stylesheet" href="./css/index.css">
</head>
<body>
    <div class="temperature">
        <div class="t-val">
            當前溫度是:<span id="t">--</span>
        </div>
    </div>
</body>
<script src="./lib/socket.io.js"></script>
<script>
  var socket = io();
  socket.on('news',function(msg){
      $('#t').text(msg+'\'C');
  });
</script>
</html>

抱歉上面花屏了:

var socket = io();
  socket.on('news',function(msg){
      $('#t').text(msg+'\'C');
  });

而後執行node main.js,在瀏覽器中輸入localhost:3000應該就能看到效果,再貼上css代碼:

html,body{
    margin: 0;
    padding: 0;
    background-color: #242424;
}
.temperature{
    color: white;
    width: 400px;
    height: 400px;
    position: absolute;
    margin: auto;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    text-align: center;
    line-height: 400px;
}
.t-val {
    font-size: 40px;
    font-family: KaiTi;
}

 

而後看執行效果:頁面刷新以後我就用手指捏住傳感器,因此溫度上升,鬆開又降低了。

而後我去看了看公司的空調設置溫度是25.5(傳感器一開始顯示的是25.4),有圖爲證:

 

目前只是實現了在本地,以後我再研究研究怎麼鏈接到服務器,初步的思路有:

一、使用樹莓派,將arduino鏈接樹莓派,再在樹莓派上搭建服務器,再用花生棒或者其餘端口映射的方法鏈接到公網,這樣就能在公網上看到數據。

二、經過Ethernet擴展板實現網絡遠程訪問

三、使用 wifi模塊,再鏈接路由器實現網絡訪問(網上說的是推薦 esp8266模塊,經濟實惠)

四、GPRS模塊,這個可讓arduino移動到任何地方,可是感受若是要作到一直測的話,電話卡的流量得不少啊,這個我也只是瞎猜,沒用過。

恩,差很少就這些了,過程很簡單,目前我須要作的就是慢慢上手,爭取用作一些有意思的東西出來。

最後說一下硬件的大概價格吧(沒仔細記價格):

arduino30多塊,麪包板好像5塊吧,線2塊錢足夠了,LM35傳感器2塊5好像,也就是說加起來一共不到50塊,感興趣的能夠買來玩玩。

有問題或建議歡迎留言。

相關文章
相關標籤/搜索