You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
5.0 KiB
73 lines
5.0 KiB
5 years ago
|
const http = require('http'),//τυπικες μεταβλητες για να τρεξει ενας node express server
|
||
|
express = require('express'),
|
||
|
app = express(),
|
||
|
server = require('http').Server(app),
|
||
|
bodyParser = require('body-parser'),
|
||
|
webpagePort = 8080,//port που θα τρεχει ο web server
|
||
|
WebSocketServer = require('ws').Server,//ws library και wss object
|
||
|
wss = new WebSocketServer({server: server}),
|
||
|
Gpio = require('pigpio').Gpio, //χρειαζομαστε αυτη τη μεταβλητη για να βλεπουμε τι μας επιστρεφει ο υπερηχος σενσορας. Για να διαβασουμε τα δεδομενα χρησιμοοπιουμε την βιβλιοθηκη pigpio Node. Αυτη η βιβλιοθηκη μας επιτρεπει να εχουμε προσβαση στα GPIO πινακια (general-purpose input/output pins) στην ακρη του raspberry pi.
|
||
|
MICROSECONDS_PER_CM = 1e6/34321, // αριθμος μικροδευτερολεπτων που ταξιδευει ο ηχος αποσταση 1cm σε 20 βαθμους κελσιου. Χρησιμοποιουμε αυτη την μεταβλητη για να μετρησουμε την αποσταση απο το αντικειμενο απεναντι απο τον σενσορα. Ο σενσορας στελνει υπερηχητικα σηματα τα οποια αντανακλουν και επιστρεφουν στον ιδιο. Με βαση τον χρονο του ταξιδιου του ηχου και της μεταβλητης, καταλαβαινουμε την αποσταση του απεναντι αντικειμενου.
|
||
|
trigger = new Gpio(23, {mode: Gpio.OUTPUT}),//Το πινακι 23 θα ειναι εκεινο που θα στελνει το σημα και το πινακι 24 αυτο που θα λαμβανει το επιστρεφομενο σημα.
|
||
|
echo = new Gpio(24, {mode: Gpio.INPUT, alert: true});
|
||
|
|
||
|
let lastScoreTime = new Date();
|
||
|
|
||
|
app.use(bodyParser.json());//μας επιτρεπει να στελνουμε και να δεχομαστε json strings
|
||
|
|
||
|
app.use(express.static(__dirname + '/public'));//δειχνουμε στον express server σε ποιο directory θα βρει τα css,html και js αρχεια.
|
||
|
|
||
|
app.use(function(err, req, res, next) {//if error occurs
|
||
|
console.error(err.stack);
|
||
|
res.status(500).send('Error came ');
|
||
|
});
|
||
|
|
||
|
server.listen(webpagePort, function() {//τρεχουμε τον web server
|
||
|
console.log('Smart Hoop Server is running on ' + webpagePort);
|
||
|
});
|
||
|
|
||
|
wss.on('connection', function connection(ws) {//Ο node server που ειναι ο web socket server στελνει μηνυματα στους clients (επομενως και τον localhost στο raspberry pi μας. Ο web server ειναι ετοιμος οταν το “connection” event ειναι triggered. Οταν ειναι ετοιμος στελνει ενα μηνυμα στο console.log. Αν δεν σταλει τοτε κατι πηγε λαθος.
|
||
|
console.log('WebSockets are ready!');
|
||
|
});
|
||
|
|
||
|
function broadcast(message) {//αποστολη μηνυματος σε ολους του clients
|
||
|
if (message) {
|
||
|
console.log('Broadcasting ' + message);
|
||
|
wss.clients.forEach(function each(client) {
|
||
|
client.send(message);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Οπως βρισκεται και στην σελιδα της βιβλιοθηκης pigpio στο GitHub οριζουμε αρχικα την τιμη 0 . Μετα θα την ορισουμε 1 για να αρχισει να μετραει.
|
||
|
trigger.digitalWrite(0); // Make sure trigger is low
|
||
|
|
||
|
|
||
|
const watchHCSR04 = () => {//function που κοιταει για τις επιστρεφομενες τιμες απο τα gpio πινακια.
|
||
|
let startTick;
|
||
|
|
||
|
echo.on('alert', (level, tick) => {
|
||
|
if (level == 1) {
|
||
|
startTick = tick;
|
||
|
} else {
|
||
|
const endTick = tick;
|
||
|
const diff = (endTick >> 0) - (startTick >> 0);
|
||
|
let distance = diff / 2 / MICROSECONDS_PER_CM;
|
||
|
let currentScoreTime = new Date();
|
||
|
console.log(distance);
|
||
|
if (distance < 20 && (currentScoreTime - lastScoreTime > 1000)) {
|
||
|
//αν η αποσταση του αντικειμενου απεναντι ειναι <20εκατοστα και η διαφορα τωρινου χρονου με την στιγμη του τελευταιου καλαθιου ειναι μεγαλυτερη των 1000 milliseconds τοτε στελνει μηνυμα score στους clients
|
||
|
//η τιμη 1000 βγηκε μετα απο πειραματισμο με τη μπαλα να "παιζει" στην στεφανη ωστε να μην μετρανε εξτρα ποντοι
|
||
|
lastScoreTime = currentScoreTime;
|
||
|
broadcast('SCORE:' + (diff / 2 / MICROSECONDS_PER_CM));
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
watchHCSR04();
|
||
|
|
||
|
setInterval(() => {
|
||
|
trigger.trigger(10, 1); // ορισε trigger high για 10 microseconds
|
||
|
}, 20); // καθε 20 milliseconds
|