first commit

This commit is contained in:
pandacraft 2025-03-21 16:04:17 +01:00
commit a5a0434432
1126 changed files with 439481 additions and 0 deletions

View file

@ -0,0 +1,74 @@
var AnalogSensor = require('./base/analogSensor')
var helpers = require('./helpers')
const FULL_ANGLE = 300
//RotaryAngleSensor
//returns a value from 0 to 100
//implemented a basic noise filtering algorithm, as in our experiments
//the rotary sensor was throwing random values at random times
function RotaryAngleAnalogSensor(pin, watchDelay, samplesize) {
AnalogSensor.apply(this, Array.prototype.slice.call(arguments))
this.watchDelay = watchDelay || 10
this.samplesize = samplesize || 40
//watchDelay * samplesize equals the miliseconds interval that the sensor will report data
}
RotaryAngleAnalogSensor.prototype = new AnalogSensor()
RotaryAngleAnalogSensor.prototype.read = function () {
let value = AnalogSensor.prototype.read.call(this)
let degrees = convertDHTToDegrees(value)
//Calculate result (0 to 100) from degrees(0 to 300)
let result = Math.floor(degrees / FULL_ANGLE * 100)
return result
}
const convertDHTToDegrees = function (value) {
//http://wiki.seeed.cc/Grove-Rotary_Angle_Sensor/
let adc_ref = 5
let grove_vcc = 5
let voltage = helpers.round((value) * adc_ref / 1023, 2)
//Calculate rotation in degrees(0 to 300)
return helpers.round((voltage * FULL_ANGLE) / grove_vcc, 2)
}
RotaryAngleAnalogSensor.prototype.start = function () {
setInterval(loop.bind(this), this.watchDelay)
}
RotaryAngleAnalogSensor.prototype.stop = function () {
clearInterval(loop)
}
//new array initialized to zero
let temp = Array.apply(null, Array(101)).map(Number.prototype.valueOf, 0) //0..100
let timesRun = 0
let previousData = null
function loop() {
const reading = this.read()
if (reading < 0 || reading > 100) throw new Error('improper reading')
temp[reading]++
if (++timesRun === this.samplesize) {
//find the index of the biggest integer
const result = temp.indexOf(Math.max(...temp))
timesRun = 0
//reset the array
temp = Array.apply(null, Array(101)).map(Number.prototype.valueOf, 0)
//compare current data to previous data
if (previousData === null || Math.abs(result - previousData) != 0) {
//there is a new value
this.emit('data', result)
previousData = result
}
}
}
module.exports = RotaryAngleAnalogSensor