Raspberry Pi NodeJS Server Sensor Application

Raspberry Pi NodeJS Server Sensor Application

nodejs_led_server_ws.zip

Server Side ( RPI ) :

$ node webserver.js

Client Side :

192.168.0.2:8080 in a web browser.

www/index.html

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>RPI Node Js Sensor App </title>
</head>
<body>
<!--=================================================================-->
<!--				DISPLAYS										 -->
<!--=================================================================-->
<script>
display_log=function(msg)
{
	  var logArea = 0;		
	  
	  if(!logArea)
	  { logArea=document.getElementById("log"); }
	  if(msg==null)
	  { logArea.textContent='';}
	  else { logArea.textContent+=msg+'\n'; }
};
</script> 
<script src="gauge.js"></script>
<!--=================================================================-->
<!--				WEBSOCKET SCRIPT								 -->
<!--=================================================================-->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
	   	    
    var socket=io();
    socket = io.connect('http://' + document.domain + ':' + location.port);
	<!----------------------------------------------------------------->    
    socket.on('connect', function() {
        console.log('Websocket connected!');
    });
	<!----------------------------------------------------------------->    
    // listen to the event
    socket.on('mess_from_server', function(msg) {
        console.log(msg);
        display_log("pressure = "+msg.pressure + " temperature = "+msg.temperature) ;
		var gauge=new Gauge('gauge'); 
		gauge.draw(msg.pressure);
		
       });
	<!----------------------------------------------------------------->
    function start() {
      console.log('start...');
      nbr_meas = document.getElementById("nbr_meas");
      socket.emit('create', {iterations:  parseInt(nbr_meas.value)});
    }    
</script>
<!--=================================================================-->
<!--				AJAX REQUEST FOR LED CONTROL					 -->
<!--=================================================================--> 
<script>
	function do_onclick(led, label)
	{
		  var xmlhttp=new XMLHttpRequest();
		  
		  // register callback : function to be called when we receive the response
		  xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4 && xmlhttp.status==200) {
			  label.innerHTML=xmlhttp.responseText;
			}
		  }
		  
		  // send request and poll for asynchronous response
		  xmlhttp.open("GET","switch_led/?gpio4="+led.checked,true)
		  xmlhttp.send();
	}
</script>	
<!--=================================================================-->
<!--				INIT					 						 -->
<!--=================================================================--> 
<script>
	window.onload = function() {
			var led=document.getElementById("tLed");
			var label=document.getElementById("tLedLabel");
			led.checked=false;
			do_onclick(led, label);
	};
</script>
<!--=================================================================-->
<!--				HTML											 -->
<!--=================================================================-->

<p>[<a href="/">home</a>]</p>

<hr> <!---------------------------------------------------------------->

<h2>Control GPIO4 LED</h2>

<table>
	<tr>
	<td > 
			<h3>Static Part :</h3>
			Control GPIO4 led <input type="checkbox" id="tLed" onclick="do_onclick(this, document.getElementById('tLedLabel'))">
	</td>
	<td>	
			<span id="tLedLabel"> GPIO4 led turned off</span>		
	</td>
	</tr>
</table>

<hr> <!---------------------------------------------------------------->

<h2>Get Measured Datas through Websocket</h2>  
<table>
	<tr>
	<td > 
			<strong> Number of Measurements :  </strong><br/>   
			<input type="text" id="nbr_meas"/>     <br/>   
			<button onclick="start()">Start</button>
	</td>
	<td>	
			<h3> Pressure Measurement </h3>
			<div >
			<canvas id="gauge" width="170" height="170"></canvas>
			</div>			
	</td>
	</tr>
</table>

<p><b>Log:</b></p>
<p></p><pre id="log"></pre><p></p>	

<hr> <!---------------------------------------------------------------->
  
</body>
</html>
<!--=================================================================-->
webserver.js
express = require('express');
var app = express();
var http = require('http').Server(app);
var fs = require('fs'); 
var io = require('socket.io')(http) 
var Gpio = require('onoff').Gpio; 
var LED = new Gpio(4, 'out'); 
var url = require('url'); 
const imu = require("node-sense-hat").Imu;
const IMU = new imu.IMU();

//======================================================================
app.set('views', __dirname + '/views')
app.set('view engine', 'jade')
app.use(express.static(__dirname + '/www'))
//======================================================================
http.listen(8080); //listen to port 8080
//======================================================================
//					SERVE INDEX
//======================================================================
app.get("/", function(req, res) {
	res.setHeader('Content-type', 'text/xml');
    res.sendFile('index.html');
})
//======================================================================
app.get('/index.html', function (req, res) {
   res.sendFile( __dirname + "/" + "index.html" );
})
//======================================================================
//						SWITCH LED
//======================================================================
app.get("/switch_led/", function(req, res) {
    var q = url.parse(req.url, true);
	var query = q.query;
	var ledS="OFF";
	
    if( query.gpio4 == 'true' ) 
		{
			console.log("query true");
			LED.writeSync(1);
			ledS="ON";
		}	
		else	
		{
			LED.writeSync(0);
			console.log("query false");
			ledS="OFF";
			
		}	
	var date = new Date();      
   	res.setHeader('Content-type', 'text/xml');
    res.render('ajax_led_response', {ledS: ledS, time: date});
})


//======================================================================
// 		Get Pressure and Temperature Measurements with Websocket
//======================================================================
io.sockets.on('connect', function (socket) {// WebSocket Connection
  var it = 0; 
  socket.on('create', function(data) { 
    it =data['iterations'];
    if (it) {
      console.log(it); 
      var sleep = require('system-sleep');
      for(var i=0 ; i < it ; i++)
      {
			
							IMU.getValue((err, data) => {
							  if (err !== null) {
								console.error("Could not read sensor data: ", err);
								return;
							  }

							  console.log("Accelleration is: ", JSON.stringify(data.accel, null, "  "));
							  console.log("Gyroscope is: ", JSON.stringify(data.gyro, null, "  "));
							  console.log("Compass is: ", JSON.stringify(data.compass, null, "  "));
							  console.log("Fusion data is: ", JSON.stringify(data.fusionPose, null, "  "));

							  console.log("Temp is: ", data.temperature);
							  console.log("Pressure is: ", data.pressure);
							  console.log("Humidity is: ", data.humidity);
							  
							  socket.emit('mess_from_server', {'pressure': Number(data.pressure.toFixed(2)), 'temperature' : Number( data.temperature.toFixed(2))});
							  
							});

			sleep(1000); // 1 second
	   }
		
    }
  });
}); 

//======================================================================

process.on('SIGINT', function () { //on ctrl+c
  LED.writeSync(0); // Turn LED off
  LED.unexport(); // Unexport LED GPIO to free resources
  process.exit(); //exit completely
}); 

//======================================================================