rpm problem... konstant 55000?

Hallo liebes Forum,

irgendwas ist sehr seltsam, und ich bin in der Lage den Fehler kontinuierlich zu übersehen :wink:

Ich bekomme als Ausgabe auf dem Lcd 55000… Konstant und unveränderlich egal welche Frequenz ich auf Pin2 gebe…

Kann mir mal bitte jemand eine Asperin und einen Tipp geben?
Komme mir vor wie vor 20 Jahren 3te Basicstunde…

Lieber Gruß
ChrisS

#include <LiquidCrystal.h>


int ups;

int downs;

int startzeit;

int endzeit;

int dauer;

int zaehler;

int zustand=0;

int encoderpin=2;

int rpm;
LiquidCrystal lcd(0, 1, 4, 5, 6, 7);


void setup(){
lcd.begin(16, 2);

  pinMode(encoderpin,INPUT);

}



void loop() {

startzeit=millis();



for (zaehler=0;zaehler<=100;zaehler++){

zustand=digitalRead(encoderpin);


if (zustand=1) {

ups++;

}

 

}



endzeit=millis();



dauer=endzeit-startzeit;



rpm=(ups/dauer)*60000;
lcd.setCursor(0,0);

lcd.print(rpm);

delay(100);

ups=0;



}

Ohne den Code ganz gelesen und nachvollzogen zu haben, ist mir erst mal eins aufgefallen:

if (zustand=1) {

Das ist keine Abfrage, sondern eine Zuweisung. Müsste “if(zustand == 1)” heißen.

Werd morgen aber mal genau rübergucken.

Gute Nacht, Otacon2k

Jup, dank Dir, wäre sehr nett....

Gute Nacht!!!!

Lieber Gruß
ChrisS

Also erstmal hab ich ein bisschen umformatiert, damit man es auch hier im Forum ohne Augenkrebs zu kriegen lesen kann :wink:

#include <LiquidCrystal.h>

int ups;
int downs;
int startzeit;
int endzeit;
int dauer;
int zaehler;
int zustand=0;
int encoderpin=2;
int rpm;
LiquidCrystal lcd(0, 1, 4, 5, 6, 7);

void setup()
{
  lcd.begin(16, 2);
  pinMode(encoderpin,INPUT);
}

void loop() 
{
  startzeit=millis();
  for (zaehler=0;zaehler<=100;zaehler++)
  {
    zustand=digitalRead(encoderpin);
    if (zustand==1)
    {
      ups++;
    }
  }
  endzeit=millis();
  dauer=endzeit-startzeit;
  rpm=(ups/dauer)*60000;
  lcd.setCursor(0,0);
  lcd.print(rpm);
  delay(100);
  ups=0;
}

Das mit dem “if(zustand==1)” hab ich schon mal korrigiert.
Deine Art rpm auszurechnen ist ein wenig gewagt. “rpm” ist als Integer deklariert und kann somit per defintionem nur Werte von -32768 bis +32767 annehmen. Das ist auf jeden Fall schonmal zu wenig für deine Zwecke, denn da (ups/dauer)*60000 entweder 0 oder mindestens 60000 ergibt, ist die Variable damit schon am Überlaufen. Werte zwischen 0 und 60000 sind nicht möglich, da Integer immer ganzzahlig sind und somit (ups/dauer) 0, 1 oder mehr (aber nie mit Kommastellen) ist.

Versuch mal, in die Richtung ein wenig rumzuprobieren und andere Variablentypen zu benutzen (float wenn du unbedingt mit Komma arbeiten willst, ist aber laaaangsam).
Falls es dann immer noch nicht geht, immer her damit…

Otacon2k

Hey, das ist sehr nett...

komischerweise bekomme ich bei float ebenfalls konstante Werte.
Habe mich jetzt auf ein Snippet eingelassen, was das ganze vernümftig erledigt. Man muß ja nicht unbedingt immer das Rad neu erfinden...
Auch wenns frustet, wenn man nicht versteht was am eigenen Code falsch ist... obwohl das mit den Integers mal glasklar ist.

Das es trotzdem nicht funktioniert... naja, nun tuts das... halt mit dem Code eines anderen... und im großen und ganzen ist es mir recht so...
man greift ja auch auf Librarys zurück, die man nicht selbst programmiert hat.

Ich danke Dir jedenfalls für die Mühe!!!!!!

Lieber Gruß
ChrisS

…also um den letzten Beitrag von ChrisS noch schnell zu vervollständigen, hier noch schnell der funktionierende Code für ein 16x2 LCD Display.
Die Drehzahlanzeige soll an einer Drehbank angeschlossen und mit einem Induktivschalter gemessen werden. Als zuzätzliche Option soll noch ein Betriebsstundenzähler integriert werden, der immer nach 1std. Betrieb an der Spindel, eine Meldung ausgibt.
In der Meldung soll dann stehen, dass die Maschine gefettet bzw. geschmiert werden muss.
Wer zu dem Betriebsstundenzähler noch eine Idee hat, wie man diesen umsetzten und intergrieren kann, ist herzlich eingeladen um zu berichten.

Der Versuchsaufbau beinhaltet einen ATmega8 für die Rpm Messung und einen ATmega8 als Frequenzgeber (dient als Platzhalter für den Induktivschalter)

Hier der Code:

#include <LiquidCrystal.h>
LiquidCrystal lcd(0, 1, 4, 5, 6, 7);
         
volatile byte rpmcount;
volatile int status;

unsigned int rpm;

unsigned long timeold;
void rpm_fun()
 {
   rpmcount++;
    
     if (status == LOW) {
     status = HIGH;
   } else {
     status = LOW;
  }
   //digitalWrite(statusPin, status);
 }

void setup()
 {
   //Interrupt 0 is digital pin 2, so that is where the IR detector is connected
   //Triggers on FALLING (change from HIGH to LOW)
   attachInterrupt(0, rpm_fun, FALLING);
   
   rpmcount = 0;
   rpm = 0;
   timeold = 0;
   status = LOW;
   lcd.begin(16, 2);
  
   lcd.setCursor(0,0);
   lcd.print("Spindeldrehzahl"); 
 }
 void loop()
 {
   //Update RPM every second
   delay(1000);
   detachInterrupt(0);
   rpm = 31*1000/(millis() - timeold)*rpmcount;
   timeold = millis();
   rpmcount = 0;
   
   lcd.setCursor(0,1);
   lcd.print(rpm,DEC);
   lcd.print(" =U/min-1");
   attachInterrupt(0, rpm_fun, FALLING);
  }

Liebe Grüße
Mike

...und hier die Bilder vom Versuchsaufbau.

Liebe Grüße
Mike

U/min^-1?

:wink:

Ist vielleicht nicht ganz verkehrt :wink: hab aber mal die verkürzte Variante für das Display vorgezogen. So steht es auch im Hersteller Katalog siehe Technische Daten : http://www.optimum-maschinen.de/produkte/drehmaschinen/d-240/index.html
::slight_smile:

Ist vielleicht nicht ganz verkehrt

Doch... :wink:

"U/min" ist dasselbe wie "U x min^-1".

"U/min-1" (verkürzt) oder "U/min^-1" wäre "U x 1/min^-1", also "U x min" statt "U/min".

Ach whatever :wink:

Hey mike,

ich glaub die Jungs wollen Dich nen bissel aufziehen ;D ...

Dann mach halt das ^ rein, und dann will ich hier aber ein APPLAUS hören, finde das für ein erstes Projekt eigentlich ganz nett was der Mike da gemacht hat....

Also, bitte mal ein bisschen produktiver hier... :wink:

Lieber Gruß
ChrisS

Dann mach halt das ^ rein, und dann will ich hier aber ein APPLAUS hören

Dann klatschts zwar, aber keinen Beifall :wink:

Für mich kann ich sagen dass ich niemanden direkt aufziehen wollte, auch mit dem Exponentenzeichen wäre es immer noch genauso falsch wie vorher, da U/min vollkommen ausreicht. "U/min" ist dasselbe wie "U x min^-1", "U**/**min^-1" ist hingegen doppelt gemoppelt und wäre im Umkehrschluss wieder "U x min", was sich mit U/min ziemlich diametral gegenübersteht...
also entweder U/min oder aber Umin^-1 (im Klartext, das die Lesbarkeit hier doch sehr leidet: U mal Minuten hoch minus eins), alles andere ist was anderes :slight_smile:

Hehe... ich weiß, und ich hab Dich schon verstanden...

wirkt aber wirklich wie ein typisch deutscher Bereich, wenn man
kein Wort über das Projekt verliert aber bereit ist 4 mal zu posten wegen nem Häkchen auf nem Display... :o

Ich finds albern, auch wenn Du mathematisch total recht hast.... :sunglasses:
sich daran hochzuziehen... da gibts andere Probleme die im deutschen Bereich zu lösen sind. :cry:

Ich denke trotzdem nen Wort zum Projekt im Allgemeinen (damit meine ich jetzt nicht nen Häkchen) wäre zu erwarten gewesen... >:(

Ist aber nicht passiert... gut... dann fange ich mal an... :smiley:

"Hey Mike... ich finds cool!!! Keine Ahnung wie Du das mit dem Taktgeber realisiert hast, ... aber für Dein erstes Arduino-Projekt
eine klasse Arbeit....!!!!!! Mein erstes Projekt war eine Led zum blinken zu bringen.... also Respekt!"

;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D ;D

Ist ja aber hier der Software-Problembereich, und nicht Projektvorstellung, insofern auch vom Mike hier vielleicht ein falsches Plätzchen gewählt unm gelobt zu werden....

Lieber Gruß
ChrisS

Hey ho Ihr Lieben, bin für jede Richtigkeit offen und freu mich ja über korrekte Sachverhalte. Otacon2k & Pumbaa Ihr habt ja recht! Werde das mal ändern und ich hatte ehrlich gesagt hierzu auch keinen Applaus erwartet ;)... Aber Danke ChrisS... das ist sehr nett von Dir. Schön zu hören das ich nicht ganz auf dem falschem Weg bin und recht hast Du, dass das ganze etwas produktiver sein dürfte;)

Hätte den jemand noch Interesse, mir bei einem Betriebsstundenzähler zu helfen? Vielleicht mache ich hierzu mal einen neuen Post auf.

@ChrisS, bei dem Frequenzgeber, habe ich es mir recht einfach gemacht und auf einen anderen Code von Arne Groh zurückgegriffen. Den Code musste ich im Init lediglich nur noch auf ein 8x2 LCD umschreiben.
Also ( 16x1 )
Hierzu der Link:
http://www.mikrocontroller.net/topic/152966#1438488
Funktioniert richtig gut! Daher auch die zwei ATmega8 IC´s :slight_smile:

Wünsche Euch allen ein entspanntes Wochenende und freu mich über weiteres Feedback :sunglasses:
Grüßle Mike

Ich hab's nur konstruktiv gemeint. Wenn er das für irgendwas abgibt, isses nicht egal. Nun gut, ansonsten natürlich feines erstes Dingen!

(Jetzt haste den Salat, jetzt loben dich alle, bis du dich doof fühlst!)

Och menno :slight_smile:
lg