Code Flowmeter(puls)

Arduino specifieke Software
Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Code Flowmeter(puls)

Berichtdoor Nald » 05 Okt 2012, 22:53

Hallo,

Ik wil met behulp van de arduino een brandstofverbruikmeter maken.
Ik loop nu alleen vast met hoe ik de flowmeter moet uitlezen.

Kan iemand mij een zetje geven met welke richting ik in moet gaan?
de code van deze link geeft me niet het gewenste resultaat en bovendien snap ik hem niet.
http://www.arduino.cc/playground/Main/ReadingRPM

De flowmeter is een meter die meet met behulp van een Hall-sensor.
hij kan max 3,0L/min aan. En hij geeft 2500 pulsen per liter.

Bij voorbaat dank voor de reacties.

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Code Flowmeter(puls)

Berichtdoor pjh » 06 Okt 2012, 11:10

Om te begrijpen hoe de sketch werkt, moet je begrijpen hoe een interrupt werkt.
Het belangrijkste is dat naast je sketch, de ATMega328 microcontroller MEER doet.
Zo houdt het tellers (counters) bij, waar je dankbaar gebruik van maakt wanneer je de millis() functie gebruikt.
Andere taak betreft de interrupts. De ATMega heeft 2 interrupts die verbonden zijn met pinnetje 2 en 3 op de arduino. Dus geheel los van je arduinosketch, bekijkt de ATMega328 microcontroller steeds de status van deze twee pinnetjes.
Zodra de status verandert, bijvoorbeeld van 0 naar 5 volt (rising) of van 5V naar 0 (falling), zal de ATMega je Sketch onderbreken en een andere functie uitvoeren. Je moet dan wel in de void setup() aangeven welke interrupt je wil gebruiken.
In de sketch van je link (zie ook hieronder) wordt de void rpm_fun() aangeroepen die niets anders doet dan een teller verhogen.

Dus: met attachInterrupt(0, rpm_fun, RISING); zeg je tegen je arduino dat wanneer op pinnetje 2 (=interrupt 0), de status van 0 volt naar 5 volt is gegaan, alles wordt stilgelegd om de functie rpm_fun uit te voeren. Omdat in deze functie rpmcount met 1 ophoogd, zal elke puls op pin 2 automatisch leiden tot een verhoging van rpmcount.
In de loop worden 20 pulsen geteld en dan gekeken hoe lang daar over gedaan is. Dan heb je tijd en aantal, dus frequentie (=rpm).

Wat je ook in de sketch kan doen is zoiets als:
if (millis()-millisOud > 1000){
Serial.println(rpmcount);
rpmcount = 0;
)

Want na een seconde te tellen ( 1000 milliseconden) is het aantal gemaakte 'toeren' precies gelijk aan de frequentie in Hz.

En omdat een variabele die in een interrupt wordt gebruikt, "los" staat van je sketch, krijgt hij het kenmerk VOLATILE mee,wat zoiets betekent dat de variabele door alles en iedereen vanuit elke plek gebruikt kan worden.

Laat maar weten als het niet lukt. Misschien kan iemand anders het beter uitleggen.



Code: Alles selecteren
 volatile byte rpmcount;

 unsigned int rpm;

 unsigned long timeold;

 void setup()
 {
   Serial.begin(9600);
   attachInterrupt(0, rpm_fun, RISING);

   rpmcount = 0;
   rpm = 0;
   timeold = 0;
 }

 void loop()
 {
   if (rpmcount >= 20) {
     //Update RPM every 20 counts, increase this for better RPM resolution,
     //decrease for faster update
     rpm = 30*1000/(millis() - timeold)*rpmcount;
     timeold = millis();
     rpmcount = 0;
     Serial.println(rpm,DEC);
   }
 }

 void rpm_fun()
 {
   rpmcount++;
   //Each rotation, this interrupt function is run twice
 }

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: Code Flowmeter(puls)

Berichtdoor Nald » 06 Okt 2012, 12:48

Hartelijk dank voor de heldere uitleg, jouw rekenwijze vind ik makkelijker dan die van het vorbeeld.

ik heb nu deze code, ik krijg alleen geen goede metingen.

Heb het ding op de vijverpomp aangesloten, alleen ik krijg min waardes.

Code: Alles selecteren
if (millis()-timeold>720) {
               opbrengst=rpmcount*5000;         // (5000= 3.600.000(uur)/ 720)
               literh=opbrengst/2500;             //  (als ik de opbrengst deel door 2500 heb ik het aantal liter per uur, immers 2.500 pulsen per liter)
                timeold=millis();
                rpmcount = 0;



                lcd.setCursor(0,0);
                lcd.print(literh);
                lcd.setCursor(7,0);
                lcd.print("Liter/uur");

Serial.print("literh");
                Serial.println(literh);
                Serial.println(tijd);
                }
              }
  }


  void rpm_fun()
  {
    rpmcount++;
    //Each rotation, this interrupt function is run twice
  }

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: Code Flowmeter(puls)

Berichtdoor Nald » 06 Okt 2012, 13:18

Ik dacht: back to basic.

IK hang dat ding in een aquarium, tel de pulsen en bij 2500 pulsen moet er een liter bij.

Dan kom ik tot de volgende code:

Problemen die verschijnen is dat ding niet verder telt dan om en nabij de 250 en zich dan vervolgens reset.

Code: Alles selecteren
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

int liter=0;


volatile byte rpmcount;
unsigned long timeold;

void setup()
{
  lcd.init();
  lcd.backlight();

  attachInterrupt(0, rpm_fun, RISING);
  rpmcount = 0;
  timeold = 0;


  Serial.begin(9600);
}



void loop(){
 

                lcd.setCursor(0,0);
                lcd.print(rpmcount);
                lcd.setCursor(8,0);
                lcd.print("rpmcount");
                lcd.setCursor(0,1);
                lcd.print(liter);
                lcd.setCursor(11,1);
                lcd.print("Liter");
                Serial.println(rpmcount);
                Serial.println(liter);
               
              if (rpmcount>2500) {
                liter++;
                rpmcount=0;


                Serial.println(rpmcount);
                Serial.println(liter);
                }
              }
 


  void rpm_fun()
  {
    rpmcount++;
   
    //Each rotation, this interrupt function is run twice
  }

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Code Flowmeter(puls)

Berichtdoor pjh » 06 Okt 2012, 17:53

deze twee regels:
int liter=0;
volatile byte rpmcount;

veranderen in
unsigned long liter=0;
volatile unsigned long rpmcount;


Je rpmcounter is een byte in je sketch, dus maximaal 255 groot!
Denk dat je het daarin moet zoeken.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten