16-Mar-2024, 08:37 PM
(Dit bericht is het laatst bewerkt op 16-Mar-2024, 10:02 PM door HugoW1975.)
@LigfietsWilsum; dank voor je reactie. Ik heb weer wat aangepast, zie hieronder. Ik heb geen idee wat 'casten naar float' betekent, en google helpt me niet heel veel. Kan jij het uitleggen? Ik heb nu torqueFactor maar een float genoemd. Leek me leuk...
@Hardloper; dank voor je reactie. Ik heb het aangepast, snap ook een beetje waarom. Ik lees dat de millistimer 52 dagen blijft tellen, als ik 52 dagen nonstop fiets dan kijk ik tegen die tijd wel naar een oplossing. Tot dan denk ik dat ik vaker dan eens in de 52 dagen het ding herstart.
@JanBurp; dank voor je reactie. Ik snap wat je bedoelt, heb de code aangepast. Ik snap nog niet waarom ik iets in een buffer moet plaatsen, en ook niet hoe. Wel valt me op dat jij in je eigen voorbeeld in je eerste post in dit topic wel Millis() gebruikt in je interrupt (eerste link, regel 516). Waarom mag jij dat wel en ik dat niet?
Code:
Helaas reageert triggerState nu helemaal niet op de trigger. Iets met Jans buffer, gok ik.
Hugo
@Hardloper; dank voor je reactie. Ik heb het aangepast, snap ook een beetje waarom. Ik lees dat de millistimer 52 dagen blijft tellen, als ik 52 dagen nonstop fiets dan kijk ik tegen die tijd wel naar een oplossing. Tot dan denk ik dat ik vaker dan eens in de 52 dagen het ding herstart.
@JanBurp; dank voor je reactie. Ik snap wat je bedoelt, heb de code aangepast. Ik snap nog niet waarom ik iets in een buffer moet plaatsen, en ook niet hoe. Wel valt me op dat jij in je eigen voorbeeld in je eerste post in dit topic wel Millis() gebruikt in je interrupt (eerste link, regel 516). Waarom mag jij dat wel en ik dat niet?
Code:
Citaat:/*
16-03-2024 HugoW
This is the sketch for my Arduino based bicyle power gauge.
It uses an Arduino Nano, a TM1637 display, an inductive sensor on the bike's main sprocket
and a load cell with a wheel pressing on the power-part of the chain.
The harder you push on the pedal, the bigger the chain tension.
The sketch records the load cell value at each passing of a tooth and adds those numbers together.
After one full revolution, the accumulated number is devided by the number of teeth, is the average torque (with a bit of
calculating to get from load cell amplifier signal to real torque in Nm). The average torque multiplied by RPS(revolutions per second) is Watts.
*/
// Include libraries:
#include <Arduino.h>
#include <TM1637Display.h>
#include <HX711.h>
// Declare variables and pins:
// For torque measurement and power calculation:
const int LOADCELL_DOUT_PIN = 5;
const int LOADCELL_SCK_PIN = 6;
long torque;
HX711 scale;
int torqueSum;
int torqueTare;
float torqueFactor;
int wattage;
// For TM1637 display:
#define CLK 9
#define DIO 10
TM1637Display display = TM1637Display(CLK, DIO);
// For tooth pulse input:
volatile int trigger = 2;
volatile int triggerState;
int triggerCount;
int numberOfTriggers;
int mainGearTeeth;
int sprocketTeeth;
int sprocketSpokes;
// For cycle time:
unsigned long startTimer;
unsigned long stopTimer;
unsigned long cycleDuration;
void triggered()
{
triggerState = 1; // Set triggerState high, so the loop knows what to do
}
void setup()
{
// Declare pins and such:
Serial.begin(9600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
pinMode(trigger, INPUT);
// Setup display:
display.clear();
display.setBrightness(7);
// Set changing values to zero
torqueSum = 0;
startTimer = 0;
stopTimer = 0;
triggerState = 0;
triggerCount = 0;
display.showNumberDec(0, false);
// Set fixed values:
mainGearTeeth = 52;
sprocketTeeth = 13;
sprocketSpokes = 6;
numberOfTriggers = (mainGearTeeth / sprocketTeeth * sprocketSpokes);
torqueTare = 0;
torqueFactor = -0.001;
attachInterrupt (digitalPinToInterrupt(trigger), triggered, RISING);
}
void loop()
{
if ((triggerState == 1) && (triggerCount < numberOfTriggers))
{
torque = scale.read(); // Read torque sensor.
torqueSum = (torqueSum + torque); // Add torque to sum.
triggerCount = (triggerCount + 1); // Raise counter by one.
triggerState = 0; // Reset trigger state.
}
if ((triggerState == 1) && (triggerCount >= numberOfTriggers))
{
torque = scale.read(); // Read torque sensor.
torqueSum = (torqueSum + torque); // Add torque to sum.
triggerCount = (triggerCount + 1); // Raise counter by one.
triggerState = 0; // Reset trigger state.
triggerCount = 0; // Reset trigger count to zero.
stopTimer = millis(); // Read millis at stop of cycle, determine duraton of cycle.
cycleDuration = ((stopTimer - startTimer) / 1000);// Subtract starting value of millis to determine duraton of cycle.
startTimer = millis(); // Reset cycle.
wattage = (((torqueSum / numberOfTriggers) - torqueTare) * torqueFactor / cycleDuration);// calculate wattage by dividing the torquesum by the triggerCount, subtracting the tare value and multiplying a factor to get real Newton meters, divide by cycle duration.
torqueSum = 0; // reset torque sum to zero.
}
display.showNumberDec(wattage, false);
Serial.println(triggerState);
delay(250);
}
Helaas reageert triggerState nu helemaal niet op de trigger. Iets met Jans buffer, gok ik.
Hugo