• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Python to Javascript

Check: Ausgabe:

pi@carcam:~/forumjs $ node test.js

Code:
0
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1052.6315789473683
1764.7058823529412
1764.7058823529412
1764.7058823529412
1764.7058823529412
1764.7058823529412
1764.7058823529412
1764.7058823529412
33.0760749724366
1818.1818181818182

Es wird :)
 
dann ist noch die frage, was das LEVEL_TO_POWER eigentlich sein soll.
das sind doch nicht werte für jeden rpm wert? so sieht es im script jedenfalls aus, dann sind es aber viel zu wenig (und viel zu hohe werte)

- - - Aktualisiert - - -

1052 sind ca. eine flanke alle 60 ms, da stimmt was mit deinem schalter nicht
 
Also in Level 5 bei 60 U/Min = Wert aus der Tabelle.
deine tabelle hat aber keine 60 spalten

kuck ich mir später mal an

Interpolieren zwischen den Werten wäre natürlich der Held vom Erdbeerfeld :)
also stützpunke für ausgewählte rpm, ok

mal was anderes, weil du von nem reed schalter sprichst, wie wird denn das schwungrad gebremst? ich vermute durch ein mangnetfeld?
 
Die RPM (U/Min) wählen ja den Power Wert.

Stufe = Level (Level 5, 20 RPM = 13 Watt) (Level 5, 30 RPM = 27 Watt) (Level 5, 40 RPM = 45 Watt)

Jetzt drücke ich Level + bin dann also in Level 6
(Level 6, 20 RPM = 15 Watt) (Level 6, 30 RPM = 31 Watt) (Level 6, 40 RPM = 52 Watt)

Die RPM Tabelle s so unterteilt: Stufe ⁄ U/min 20 30 40 50 60 70 80 90 100 110 120
1
2
3
...


Ja, aber die Magnetbremse ist unten, die löst den reed Kontakt nicht aus Versehen aus.

der GPIO muss noch software entprellt werden so 200ms (bouncetime)
 
Die RPM Tabelle s so unterteilt: Stufe ⁄ U/min 20 30 40 50 60 70 80 90 100 110 120
1
2
3
...
ach ok, // 10 ist in pyhton kein kommentar sonder durch 10 mit cast auf int

Ja, aber die Magnetbremse ist unten, die löst den reed Kontakt nicht aus Versehen aus.
mach mal deinen mangneten ab, was kommen dann für werte?

der GPIO muss noch software entprellt werden so 200ms (bouncetime)
kann sein
 
mal mit level speed und power, bin mir auf die schnelle nicht sicher, ob ich die level+- vertauscht habe

200ms sind meiner meinung nach viel zuviel, ich hab mal 100ms genommen, wobei mir das immer noch viel vorkommt

Code:
var SpeedMeter = function(pin, levelUpPin, levelDownPin, weighting, pulsesPerRev, timeOut, bounceTime)
{
  var rpm = 0;
  var level = 1;
  var timeAct = 0;
  var timeOld = 0;
  var timeDiff = 0;
  var watchdog = null;
  var gpio = require('rpi-gpio');
  var power = [
    [6,12,20,29,40,53,69,79,92,106,121],
    [8,16,26,38,53,68,88,103,120,138,152],
    [9,20,32,47,66,84,107,125,148,172,186],
    [11,23,39,56,79,101,126,150,173,206,219],
    [13,27,45,65,92,117,145,175,202,238,254],
    [15,31,52,75,105,135,166,202,231,275,289],
    [16,35,58,85,118,152,185,226,260,305,332],
    [18,39,65,96,131,169,208,249,289,333,375],
    [19,42,71,104,144,184,227,272,318,361,408],
    [21,46,77,113,157,199,245,295,345,386,442],
    [23,50,84,123,170,216,262,318,372,413,480],
    [24,53,89,131,183,230,279,342,398,441,512],
    [26,56,94,139,196,245,296,365,424,468,548],
    [28,60,101,148,209,261,318,389,449,494,585],
    [30,64,108,158,222,277,337,415,476,518,620],
    [32,68,115,168,235,296,355,439,503,548,658],
    [33,72,122,177,248,312,373,463,530,576,694],
    [35,76,129,187,261,328,390,484,556,606,727],
    [37,79,134,195,274,342,407,507,572,632,763],
    [39,83,140,204,287,354,424,528,598,659,790],
    [40,87,146,213,300,368,442,551,616,689,812],
    [42,91,153,223,313,385,461,574,645,720,840],
    [44,95,160,234,326,401,479,598,673,752,872],
    [47,101,171,246,340,418,501,625,706,788,908]
  ];
  
  
  weighting = weighting || 0;
  pulsesPerRev = pulsesPerRev || 1;
  timeOut = timeOut || 10000;
  bounceTime = bounceTime || 100;
  
  gpio.on('change', function(channel, value)
  {
    if (channel == pin)
    {
      var timeAct = new Date();
      if ((timeAct - timeOld) > bounceTime)
      {
        if (watchdog)
        {
          clearTimeout(watchdog);
        }
        if (timeOld)
        {
          timeDiff *= weighting;
          timeDiff += (1 - weighting) * (timeAct - timeOld);
          rpm = 60000 / (timeDiff * pulsesPerRev);
        }
        timeOld = timeAct;
        watchdog = setTimeout(function()
        {
          timeOld = 0;
          rpm = 0;
        }, timeOut);
      }
    }
    else if (channel == levelUpPin)
    {
      if (level < 23)
      {
        ++level;
      }
    }
    else if (channel == levelDownPin)
    {
      if (level > 1)
      {
        --level;
      }
    }
  });
  
  gpio.setup(pin, gpio.DIR_IN, gpio.EDGE_RISING);
  
  this.getSpeed = function()
  {
    return rpm;
  };
  this.getLevel = function()
  {
    return level;
  };
  this.getPower = function()
  {
    var lowerVal = 0;
    var upperVal = 0;
    var idxLower = Math.floor(rpm / 10);
    var idxUpper = Math.ceil(rpm / 10);
    if (idxLower > 0)
    {
      lowerVal = power[level - 1][idxLower - 1];
    }
    if (idxUpper > 0 && idxUpper <= 11)
    {
      upperVal = power[level - 1][idxUpper - 1];
    }
    else if (idxUpper > 11)
    {
      console.log("RPM(", rpm, ") out of range");
      return power[level - 1][10];
    }
    return (upperVal - lowerVal) / (idxUpper * 10 - idxLower * 10) * (rpm - idxLower * 10) + lowerVal;
  };
};

module.exports.SpeedMeter = SpeedMeter;

Code:
var SpeedMeter = require('./SpeedMeter');
var speedmeter = new SpeedMeter.SpeedMeter(4, 38, 40);
setInterval(function()
{
  console.log("level: ", speedmeter.getLevel(), " speed: ", speedmeter.getSpeed(), " power: ", speedmeter.getPower());
}, 250);
 
Habe 4 gegen 7 getauscht

Sieht auch schon mal gut aus:
level werden noch nicht gewechselt (Müssen wir da auch entprellen)?
Und noch ein wenig index out of range :)

Wobei wir aber sagen können. Wenn RPM < 20 Power = 0, Wenn RPM > 120 Power = 0

Code:
level:  1  speed:  483.8709677419355  power:  121
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
level:  1  speed:  21.747009786154404  power:  13.397607828923523
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
RPM( 495.8677685950413 ) out of range
level:  1  speed:  495.8677685950413  power:  121
level:  1  speed:  12.695725772323318  power:  7.61743546339399
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
RPM( 550.4587155963303 ) out of range
level:  1  speed:  550.4587155963303  power:  121
level:  1  speed:  28.625954198473284  power:  18.900763358778626
level:  1  speed:  28.625954198473284  power:  18.900763358778626
level:  1  speed:  28.625954198473284  power:  18.900763358778626

geht voran :)

- - - Aktualisiert - - -

Die hohen Fehlwerte habe ich mit bounce 200 ausgemerzt

5 Umdrehungen in der Sekunde schafft ja auch keiner. :)

Wird ja immer besser!
 
Habe 4 gegen 7 getauscht
ja

level werden noch nicht gewechselt
wo hängen die denn drann? auf pin 20 oder gpio20?

(Müssen wir da auch entprellen)?
die sind doch vom gerät? keine ahnung ob die gute hardware verbaut haben, mal sehen was kommt

Und noch ein wenig index out of range :)
dann ersetze
Code:
bounceTime = bounceTime || 100;
mal doch durch
Code:
bounceTime = bounceTime || 200;
wenn das nicht reicht, ist es was anderes

Wobei wir aber sagen können. Wenn RPM < 20 Power = 0,
ach bei 20 beginnt die tabelle? bin von 10 ausgegangen
aber warum willst du das dann auf 0 setzen?

Wenn RPM > 120 Power = 0
> 120 sollte überhaupt nicht vorkommen, und selbst wenn, ist der max. wert besser als 0
 
Ja bei 20 beginnt die Tabelle. Wenn ich 20 rpm mache, dann ist das mehr als wenn ich stehe :) also da brauch kein Powerwert mehr kommen.

Die Taster sind an GPIO 20 und GPIO 21 das ist korrekt, dann mit 38 und 40 in der test.js passt dann ja auch

Wird das vielleicht nur nicht angezeigt?
 
"Wird das vielleicht nur nicht angezeigt"
nee, setup vergessen
Code:
var SpeedMeter = function(pin, levelUpPin, levelDownPin, weighting, pulsesPerRev, timeOut, bounceTime)
{
  var rpm = 0;
  var level = 1;
  var timeAct = 0;
  var timeOld = 0;
  var timeDiff = 0;
  var watchdog = null;
  var gpio = require('rpi-gpio');
  var power = [
    [6,12,20,29,40,53,69,79,92,106,121],
    [8,16,26,38,53,68,88,103,120,138,152],
    [9,20,32,47,66,84,107,125,148,172,186],
    [11,23,39,56,79,101,126,150,173,206,219],
    [13,27,45,65,92,117,145,175,202,238,254],
    [15,31,52,75,105,135,166,202,231,275,289],
    [16,35,58,85,118,152,185,226,260,305,332],
    [18,39,65,96,131,169,208,249,289,333,375],
    [19,42,71,104,144,184,227,272,318,361,408],
    [21,46,77,113,157,199,245,295,345,386,442],
    [23,50,84,123,170,216,262,318,372,413,480],
    [24,53,89,131,183,230,279,342,398,441,512],
    [26,56,94,139,196,245,296,365,424,468,548],
    [28,60,101,148,209,261,318,389,449,494,585],
    [30,64,108,158,222,277,337,415,476,518,620],
    [32,68,115,168,235,296,355,439,503,548,658],
    [33,72,122,177,248,312,373,463,530,576,694],
    [35,76,129,187,261,328,390,484,556,606,727],
    [37,79,134,195,274,342,407,507,572,632,763],
    [39,83,140,204,287,354,424,528,598,659,790],
    [40,87,146,213,300,368,442,551,616,689,812],
    [42,91,153,223,313,385,461,574,645,720,840],
    [44,95,160,234,326,401,479,598,673,752,872],
    [47,101,171,246,340,418,501,625,706,788,908]
  ];
  
  
  weighting = weighting || 0;
  pulsesPerRev = pulsesPerRev || 1;
  timeOut = timeOut || 10000;
  bounceTime = bounceTime || 200;
  
  gpio.on('change', function(channel, value)
  {
    if (channel == pin)
    {
      var timeAct = new Date();
      if ((timeAct - timeOld) > bounceTime)
      {
        if (watchdog)
        {
          clearTimeout(watchdog);
        }
        if (timeOld)
        {
          timeDiff *= weighting;
          timeDiff += (1 - weighting) * (timeAct - timeOld);
          rpm = 60000 / (timeDiff * pulsesPerRev);
        }
        timeOld = timeAct;
        watchdog = setTimeout(function()
        {
          timeOld = 0;
          rpm = 0;
        }, timeOut);
      }
    }
    else if (channel == levelUpPin)
    {
      if (level < 23)
      {
        ++level;
      }
    }
    else if (channel == levelDownPin)
    {
      if (level > 1)
      {
        --level;
      }
    }
  });
  
  gpio.setup(pin, gpio.DIR_IN, gpio.EDGE_RISING);
  gpio.setup(levelUpPin, gpio.DIR_IN, gpio.EDGE_RISING);
  gpio.setup(levelDownPin, gpio.DIR_IN, gpio.EDGE_RISING);
  
  this.getSpeed = function()
  {
    return rpm;
  };
  this.getLevel = function()
  {
    return level;
  };
  this.getPower = function()
  {
    var lowerVal = 0;
    var upperVal = 0;
    var idxLower = Math.floor(rpm / 10);
    var idxUpper = Math.ceil(rpm / 10);
    if (idxLower > 1)
    {
      lowerVal = power[level - 1][idxLower - 2];
    }
    else
    {
      idxLower = 0;
    }
    if (idxUpper > 1 && idxUpper <= 12)
    {
      upperVal = power[level - 1][idxUpper - 2];
    }
    else if (idxUpper > 12)
    {
      console.log("RPM(", rpm, ") out of range");
      return power[level - 1][10];
    }
    else if (idxUpper <= 1)
    {
      idxUpper = 0;
    }
    return (upperVal - lowerVal) / (idxUpper * 10 - idxLower * 10) * (rpm - idxLower * 10) + lowerVal;
  };
};

module.exports.SpeedMeter = SpeedMeter;
 
Zuletzt bearbeitet:
Level bleibt auf 1
hab auch das geänderte von 15:15 genommen.

Komisch gerade hat er kurz getan. Ich hab einfach mal var level = 1; auf 5 gesetzt.

Dann ging er runter auf 3, aber nicht wieder hoch. Weiter runter aber auch nicht.
Um einen Hardwarefehler auszuschliessen habe ich das Kabel auch gewechselt und mal mit Brücken versucht.

komisch
 
Zuletzt bearbeitet:
Ausgabe nach 15:15 + Level var auf 5:

Code:
level:  5  speed:  0  power:  NaN
level:  5  speed:  0  power:  NaN
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  29.25402242808386  power:  25.955631399317404
level:  5  speed:  38.510911424903725  power:  42.319640564826706
level:  5  speed:  38.510911424903725  power:  42.319640564826706
level:  5  speed:  38.510911424903725  power:  42.319640564826706
level:  5  speed:  38.510911424903725  power:  42.319640564826706
level:  5  speed:  38.510911424903725  power:  42.319640564826706
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  41.49377593360996  power:  47.98755186721992
level:  5  speed:  42.918454935622314  power:  50.83690987124463

Wenn ich auf Level 22 einsteige:
Code:
level:  22  speed:  0  power:  NaN
level:  22  speed:  33.11258278145695  power:  110.29801324503309
level:  22  speed:  33.11258278145695  power:  110.29801324503309
level:  22  speed:  33.11258278145695  power:  110.29801324503309

also das macht es schon super! :)
 
Zuletzt bearbeitet:
dein PowerMeter-script noch dazu gebastelt bekommst du alleine hin?!

- - - Aktualisiert - - -

das nan ist nicht schön,
füge mal vor
return (upperVal - lowerVal) / (idxUpper * 10 - idxLower * 10) * (rpm - idxLower * 10) + lowerVal;
das ein
Code:
if (idxUpper == 0 && idxLower == 0)
{
  return 0;
}
 
Zurück
Oben