Skip to content

Instantly share code, notes, and snippets.

@pimpelsang
Last active April 30, 2021 09:50
Show Gist options
  • Select an option

  • Save pimpelsang/770aab53250fc5dca37473f5f45bf363 to your computer and use it in GitHub Desktop.

Select an option

Save pimpelsang/770aab53250fc5dca37473f5f45bf363 to your computer and use it in GitHub Desktop.
<html>
<head>
<title>wedo2 - distance sensor => speed camera</title>
<script src="https://cdn.jsdelivr.net/npm/node-poweredup@latest/dist/browser/poweredup.js"></script>
<style type="text/css">
#speed {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 60px;
font-family: arial;
font-weight: bold;
}
</style>
</head>
<body>
<button id="connect" onclick="connect()">connect</button>
<div id="speed"></div>
<script>
if (!PoweredUP.isWebBluetooth) {
alert("Your browser does not support the Web Bluetooth.");
}
const poweredUP = new PoweredUP.PoweredUP();
poweredUP.on("discover", onDiscover);
let hub, speaker, led, sensor, timeoutId;
let speedDiv = document.getElementById("speed");
const SPEED_LIMIT = 50;
function connect() {
poweredUP.scan();
document.getElementById('connect').style.display='none';
}
async function onDiscover(newHub) {
hub = newHub;
console.log(`Discovered ${hub.name}!`);
await hub.connect();
sensor = await hub.waitForDeviceByType(PoweredUP.Consts.DeviceType.MOTION_SENSOR);
console.log(`Got distance sensor!`);
speaker = await hub.waitForDeviceByType(PoweredUP.Consts.DeviceType.PIEZO_BUZZER);
console.log(`Got speaker!`);
led = await hub.waitForDeviceByType(PoweredUP.Consts.DeviceType.HUB_LED);
led.setColor(PoweredUP.Consts.ColorNames.NONE);
hub.on("distance", onDistanceChange);
console.log('all ready')
}
let session = [];
function onDistanceChange(device, { distance }) {
const time = Date.now();
let current = {distance, time};
if (!session.length || session[session.length-1].distance > current.distance) {
session.push(current);
clearTimeout(timeoutId);
timeoutId = setTimeout(analyze, 500);
}
}
async function analyze() {
if (session.length < 2) {
reset();
return;
}
const start = session[0];
const last = session[session.length-1];
let distDiff = start.distance - last.distance;
let timeDiff = last.time - start.time;
let speed = Math.round(500 * distDiff / timeDiff);
console.log({distDiff, timeDiff, speed})
speedDiv.innerText = speed;
if (speed > SPEED_LIMIT * 2) {
speedDiv.style.color = 'red'
await police()
} else if (speed > SPEED_LIMIT) {
speedDiv.style.color = 'orange'
led.setColor(PoweredUP.Consts.ColorNames.ORANGE);
await speaker.playTone(1800, 1000)
} else {
speedDiv.style.color = 'green'
led.setColor(PoweredUP.Consts.ColorNames.GREEN);
await speaker.playTone(500, 1000)
}
reset()
}
function reset() {
session = [];
speedDiv.innerText = '';
led.setColor(PoweredUP.Consts.ColorNames.NONE);
}
async function police() {
for(i=0; i<4; i++) {
led.setColor(PoweredUP.Consts.ColorNames.BLUE);
await speaker.playTone(750, 500)
led.setColor(PoweredUP.Consts.ColorNames.RED);
await speaker.playTone(850, 500)
}
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment