Last active
April 30, 2021 09:50
-
-
Save pimpelsang/770aab53250fc5dca37473f5f45bf363 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <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