Why do you write: #define INTERVAL 500UL what is the difference with int interval=500;
DIe heb ik gemist, ik lees (te) veel threads.
OK, we gaan je een stap verder helpen.
Een #define alloceert geen geheugen waar een int dat wel doet.
500UL betekent dat het type een Unsigned long met bereik van 0..2^32; een int heeft bereik van - (2^16) .. 2^16 (+- 1)
Het voordeel van een unsigned long is dat deze veel vaker opgehoogd kan worden voordat er een overflow situatie optreedt.
Voldoende uitleg over dit verschil?
Alle verbetercodes die in detail anders waren dan mijn huidige broncode heb ik toegepast maar allemaal gaven ze geen ander resultaat.
In welke thread heb je de output gepost, zodat ik die output kan verifieren? NB dit geeft voor de lezer op het forum inzicht in het gedrag van de sketch.
In mijn post in de andere thread heb ik niet geen complete code gezet, ik heb dat uit het vuistje ingetypt omdat ik geen arduino bij de hand heb.
Ik zal het hier nog eens overdoen opdat het beter werkt.
Je merkte ergens op dat de interrupt variablen niet op nul gezet werden. Dat klopt omdat dit mogelijk een concurrency race conditie veroorzaakt,
Het was mijn doel om met deltas te werken, Ik zal dat in de onderstaande code proberen correct te doen.
Ik heb de code nog steeds niet getest maar deze zou bij benadering de RPM moeten geven, maar afhankelijk van de actuele toerental werkt deze oplossingsmethode meer of minder goed. Interrupt gebaseerde RPM meters worden onnauwkeuriger bij lage toerentallen. Als er te weinig interrupts komen tussen twee display events is geen berekening te maken omdat de RPM dan 0 aangeeft.
Niet getest geen Arduino bij de hand. (er kunnen typos inzitten)
//
// FILE: RPM DEMO.pde
// AUTHOR: Rob Tillaart
// DATE: 2012-NOV-04
//
// PUPROSE: demonstrate the use of interrupts to build an RPM measure tool
//
// initialize vars while declaring
volatile unsigned long rpmHV = 0;
volatile unsigned long flowHV = 0;
unsigned long lastRPM = 0;
unsigned long lastFLOW = 0;
unsigned long lastTime = 0;
#define INTERVAL 500UL // unsigned long as all timing math is done in UL.
void setup()
{
attachInterrupt(1, rpm_fun, RISING);
attachInterrupt(0, flow_fun, RISING);
Serial.begin(9600);
Serial.println("start...");
}
void loop()
{
unsigned long now = millis(); // to prevent that the next read of millis jumps a few millisecs
if (now - lastTime >= INTERVAL) // every 500 milliseconds
{
lastTime = now; // remember last time we displayed something
// how many pulses since last display action
unsigned long deltaRPM = rpmHV - lastRPM;
unsigned long deltaFLOW = flowHV - lastFLOW;
// display the current values
Serial.print("time: ");
Serial.println(now);
Serial.print("rpmcount: ");
Serial.println((deltaRPM * 60000UL) /INTERVAL);
Serial.print("flowcount: ");
Serial.println(deltaFLOW ); // needs probably some math to
// adjust the last values
lastRPM += deltaRPM;
lastFLOW += deltaFLOW;
}
}
void rpm_fun()
{
rpmHV++;
}
void flow_fun()
{
flowHV++;
}
De sensoren moeten verbonden zijn met pin 2 en pin 3 (assuming you have UNO) en deze lijnen moeten voorzien zijn van een pullup danwel een pulldown weerstand om het signaal goed tussen 0 en +5V te laten schakelen.
Kun je de output van deze sketch posten?
Als er vragen zijn over de werking van de sketch hoor ik ze wel. NB de NL sectie hou ik redelijk in de gaten.