Hallo forumers,
Een poosje geleden ben ik begonnen met de Arduino UNO starterset te experimenteren.
Na het doorworstelen van een aantal experimenten vond ik dat het wel aardig zou zijn om iets te maken wat voor mij wel handig is. Hieruit is het snelheidsmeter idee ontstaan.
Deze meter gaat als het gaat lukken gemonteerd worden op een kart.
Als het allemaal mogelijk is zou ik als uitbreiding in de toekomst ook graag de koelwater temperatuur, rondetijd en de omwentelingen van de tweetakt motor meten...
Maar eerst maar eens de snelheidsmeter met kilometerteller en dit levert al genoeg problemen voor mij op...
Het idee is om met een HALL effect sensor en een magneet ergens op draaiend onderdeel van mijn kart een puls op te wekken. Deze pulsen dan tellen en aan de hand van de wielomtrek de snelheid en kilometers uit te rekenen.
De HALL sensor heb ik nog niet, dus heb ik in plaats daarvan een drukknopje gebruikt om toch wat te kunnen proberen.
De volgende code heb ik met behulp van diverse voorbeelden in elkaar gezet.
Achter de code heb ik in NL geschreven wat ik begrepen heb van wat welke functie doet.
// Opent de bibliotheek voor de display.
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,7,6,5,4); // was 12,11,5,4,3,2
int snelheid=0;
int maxsnelheid=0;
int puls=0;
int rpm=0;
unsigned long lastmillis=0; // unsigned long kan geen negatieve getallen bevatten.
long wielomtrek=0; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
long afstand=0;
long maxafstand=0;
void setup(){ // Start het setup gedeelte, wordt slechts 1 x gelezen met het aanzetten.
//Serial.begin(9600); // Opent een seriële verbindingspoort.
lcd.begin(16, 2); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING);
} // Stopt het setup gedeelte.
void loop(){ // Start het loop gedeelte.
if (millis() - lastmillis == 1000){ // Update every one second, this will be equal to reading frecuency (Hz).
detachInterrupt(0); // Disable interrupt when calculating.
rpm = puls * 60; // Zet frequentie om naar RPM,dit werkt voor 1 puls per rotatie.
// Voor 2 pulsen per rotatie doe puls * 30.
wielomtrek=(1000); // Vul de variabele "wielomtrek" met een waarde in mm.
snelheid=((wielomtrek*rpm*60)/(1000000)); // Reken de snelheid uit.
afstand=(wielomtrek*puls); // Reken de afgelegde afstand uit.
maxafstand=(afstand+maxafstand);
//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if(snelheid > maxsnelheid)maxsnelheid = snelheid;
if(snelheid < maxsnelheid)maxsnelheid = maxsnelheid;
lcd.clear(); // Maak de display leeg.
lcd.setCursor(4, 0); // Zet de cursor op de gewenste plaats, kolom4(5) en rij1(0).
lcd.print("Km/h, Rpm"); // Schrijf de tekst tussen de "".
lcd.setCursor(0, 0);
lcd.print(snelheid); // Schrijf de variabele "snelheid".
lcd.setCursor(10, 0);
lcd.print(rpm);
lcd.setCursor(0, 1);
lcd.print ("Snelste Km/h");
lcd.setCursor(8, 1);
lcd.print(maxsnelheid);
/*
Serial.print("RPM = "); // print het woord "RPM".
Serial.print(rpm); // print de rpm waarde.
Serial.println();
Serial.print("Hz = "); // print het woord "Hz".
Serial.print(puls); // print omwentelingen per seconde of Hz.
Serial.println();
Serial.print("Snelheid = ");
Serial.print(snelheid);
Serial.println(); // print een nieuwe lege () regel.
Serial.print("Maxsnelheid = ");
Serial.print(maxsnelheid);
Serial.println();
Serial.print("Afstand = ");
Serial.println(maxafstand/1000000);
Serial.println();
Serial.println();
*/
puls = 0; // Herstart de RPM teller, zet op 0.
lastmillis = millis(); // Update de variabele "lastmillis".
attachInterrupt(0, rpm_as, FALLING); //Enable interrupt.
}
}
//Deze code wordt gestart iedere keer als de interupt 0 (pin2) laag wordt.
void rpm_as(){
puls++;
//afstand=0;
}
Deze code lijkt redelijk te werken alleen is het maar voor even... de UNO loopt helaas vast, soms doet ie het maar kort en soms wat langer. Heeft iemand een idee waarom dat zo is en waar ik dat dan eventueel in kan zoeken?
Ik dacht eerst dat het zat in de seriële verbindingspoort,dat bleek niet het geval.
Het sluiten en het opnieuw starten van dat seriële scherm doet de UNO wel weer starten.
Als ik Serial.begin(9600); echter d.m.v. // ervoor uitzet dan loopt de UNO na verloop tijd vast en is ie alleen maar met de resetknop aan te zetten.
Ook lijkt het er op dat als er met de drukknop gepulst wordt de UNO later vastloopt dan wanneer er niet gepulst wordt.
De volgende setup heb in nu, zie attachement voor een plaatje. De afbeelding in dit topic toevoegen werd wel heel groot.
Directe link naar de afbeelding is http://nl.tinypic.com/r/2zizbd1/8
Met vriendelijk groet,
Roel