dxaxhxix:
Ich habe den obenstehenden Codeteil in meinen Code eingefügt, aber es funktioniert nicht, kann mir wer sagen, warum nicht?
Ohne deinen neuen Sketch zu sehen oder ohne Kristallkugel, kann dir das wohl keiner sagen.
dxaxhxix:
Ich habe den obenstehenden Codeteil in meinen Code eingefügt, aber es funktioniert nicht, kann mir wer sagen, warum nicht?
Ohne deinen neuen Sketch zu sehen oder ohne Kristallkugel, kann dir das wohl keiner sagen.
if (Sensor==HIGH){
if (millis()-merkzeit>prellzeit){
//neue Umdrehung
zeitproumdrehung=millis()-letzteerkennung;
letzteerkennung=millis();
}
merkzeit=millis();
}
prellzeit =0;
Ich weiß nicht, was ich falsch eingegeben habe
Was kriegst du denn für Werte angezeigt? Mal probeweise nach und nach die Variablen und Berechnungen in Serial ausgegeben? Zeig bitte auch mal die Deklaration (Datentypen) der Variablen.
double merkzeit=0.0,prellzeit=0.0, zeitproumdrehung, letzteerkennung=0.0;
für zeitproumdrehung bekomme ich immer 0.00 heraus
dxaxhxix:
double merkzeit=0.0,prellzeit=0.0, zeitproumdrehung, letzteerkennung=0.0;
für zeitproumdrehung bekomme ich immer 0.00 heraus
Klar, du mischst in deinen Berechnungen Ganzzahlen und Kommazahlen, das funktioniert nicht (Edit: funktioniert schon, ist aber nicht schön). millis() gibt immer eine Ganzzahl raus, ich sehe keinen Sinn die Zeiten als Kommazahlen auszugeben.
Schau dir doch mal die Tabelle an und überleg dir welche Datentypen die besseren sind. Wenn du um Kommazahlen gar nicht rum kommst, müssen die Ganzzahlen in float/double umgewandelt werden.
Hi
Da die gemerkten Zeiten von millis() stammen, sollten diese Variablen uint32_t (oder int unsigned) sein.
Die Prellzeit wird wohl schon etwas größer als NULL sein müssel, wenn Du kein Prellen hast, brauchen wir den ganzen Quatsch nämlich nicht.
MfG
PS: Post überarbeitet und 'etwas' Härte raus genommen.
Eigentlich ging Es darin um Mitdenken ...
uint32_t merkzeit=0,prellzeit=10, zeitproumdrehung, letzteerkennung=0;
double f,c=0, t;
if (2==HIGH){
if (millis()-merkzeit>prellzeit){
//neue Umdrehung
zeitproumdrehung =millis()-letzteerkennung;
letzteerkennung=millis();
}
merkzeit=millis();
}
f=60000.0/(zeitproumdrehung);
Ich habe es so umgeschrieben, bekomme für zeitproumdrehung trotzdem 0 heraus
Hi
Was macht Das:
if (2==HIGH){
Kompiliert Das So überhaupt?
Du darfst auch gerne kompletten Code zeigen - also Etwas, womit WIR auch 'spielen' können.
Alleine die IF-Zeile verdirbt mir den Spaß, Da auch nur eine Sekunde über Funktionalität nachzudenken.
Vll. möchtest Du aber die 2 als Pin-Nummer am Anfang vom Sketch als
const byte sensorpin=2;
einbinden und unten Das in
if(digitalRead(sensorpin)){ // Das entspricht digitalRead(sensorpin)==high
abändern.
Zeigt der Sketch dann etwas mehr Funktion?
MfG
Ich muss mich für meinen Link ins Dual-Board entschuldigen.
Ich hatte ganz vergessen das man gewisse Sparten gar nicht sieht wenn man nicht angemeldet ist.
Das sollte aber kein Problem sein.
Ulli
postmaster-ino:
HiWas macht Das:
if (2==HIGH){Kompiliert Das So überhaupt?
Du darfst auch gerne kompletten Code zeigen - also Etwas, womit WIR auch 'spielen' können.
Alleine die IF-Zeile verdirbt mir den Spaß, Da auch nur eine Sekunde über Funktionalität nachzudenken.Vll. möchtest Du aber die 2 als Pin-Nummer am Anfang vom Sketch als
const byte sensorpin=2;
einbinden und unten Das in
if(digitalRead(sensorpin)){ // Das entspricht digitalRead(sensorpin)==high
abändern.Zeigt der Sketch dann etwas mehr Funktion?
MfG
sorry, das war mein Fehler
jetzt zeigt er eine Zeit an, aber die Drehzahl kann nicht stimmen, ich glaube da fehlt noch einiges an dem Programm
Hier das komplette programm:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
uint32_t merkzeit=0,prellzeit=10, zeitproumdrehung, letzteerkennung=0;
void setup(){
lcd.begin(16, 2);
lcd.clear();
pinMode(2, INPUT);
Serial.begin(9600);
pinMode(6, INPUT);
pinMode(7, INPUT);
}
void loop()
{
delay(500);
Drehzahl();
}
void textDrehzahl()
{
lcd.setCursor(0,0);
lcd.print("Drehzahl:");
}
void Drehzahl()
{
textDrehzahl();
double f,c=0, t;
if (digitalRead(2)){
if (millis()-merkzeit>prellzeit){
//neue Umdrehung
zeitproumdrehung =millis()-letzteerkennung;
letzteerkennung=millis();
}
merkzeit=millis();
}
f=60.0/(zeitproumdrehung*0.001);
Serial.println(zeitproumdrehung);
Serial.println(f);
if(f==INFINITY)
{
lcd.clear();
textDrehzahl();
lcd.setCursor(0,1);
lcd.print("0");
lcd.setCursor(13,1);
lcd.print("rpm");
}
else
{
if(c>f || c<f)
{
lcd.clear();
textDrehzahl();
lcd.setCursor(0,1);
lcd.print(f);
lcd.setCursor(13,1);
lcd.print("rpm");
Serial.println(f);
}
}
c=f;
Serial.println("------------");
}
Ich muss mich korrigieren (Denkfehler), die gemischte Rechnung mit int und Float/double funktioniert schon, ist aber nicht schön und bei 600 U/min nicht nötig. Eine Umdrehung ist dann 100 ms und ms ist die Basis der Berechnung.
Hi
Warum hast Du ein delay(500); in loop()?
So kannst Du MAXIMAL alle 500ms eine neue Erkennung haben - wenn dann gerade kein Magnet am Sensor steht, hast Du halt gelitten.
Was machen die Eingänge 6 und 7?
Mache Es Dir nicht unnötig schwer und definiere am Anfang, welche Pins was machen sollen.
Im Sketch selber benutzt Du dann diese sprechenden Namen.
Wie ich oben schon andeutete
const byte sensorpin=2;
const byte pinnummer6=6;
const byte pinnummer7=7;
So kannst Du die verschiedenen Pins nicht durcheinander werfen und SIEHST in der Abfrage, Was Du Da eigentlich gerade machst.
Zumindest empfinde ich
if (digitalRead(sensorpin)){
als aussagekräftiger, als Deine Variante mit
if (digitalRead(2)){
Auch kann der Kompiler bei const Angaben Diese fest im Code einbauen, braucht dafür also keinen zusätzlichen Speicher.
Bei einer Variable MUSS der Kompiler Diese im Speicher vorhalten und Diese von dort auch auslesen.
Bei einer festen (konstanten) Zahl kann der Kompiler diese 2 ohne Speicherzugriff im Code einpflegen - macht die Sache schlanker und durch die eingesparten Speicherzugriffe auch schneller.
jetzt zeigt er eine Zeit an, aber die Drehzahl kann nicht stimmen, ich glaube da fehlt noch einiges an dem Programm
... bestimmt ... aber Da muß ich Dir einfach glauben - Du zeigt weder, was der Sketch ausgegeben hat, noch sagst Du, was Du als Ausgabe erwartet hättest.
Auch ist nicht klar, wie Du dem Arduino den Sensor stimuliert hast, also, ob Du z.B. ungefähr im Sekundentakt den Sensor ausgelöst hast, um auf eine ca. 60 zu kommen, Du aber eine 127 oder eine 13 bekamst.
MfG
Ich habe das Programm folgendermaßen umgeschrieben:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
uint32_t ende, start, zeitproumdrehung;
int vorher=LOW, jetzt=LOW;
const int sensorpin=2;
void setup(){
lcd.begin(16, 2);
lcd.clear();
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop()
{
//delay(500);
Drehzahl();
}
void textDrehzahl()
{
lcd.setCursor(0,0);
lcd.print("Drehzahl:");
}
void Drehzahl()
{
textDrehzahl();
double f,c=0, t;
if(digitalRead(sensorpin)==HIGH)
{
jetzt=HIGH;
if(vorher==LOW&&jetzt==HIGH)
{
if(g==1)
{
ende=millis();
vorher=HIGH;
g--;
}
else
{
start=millis();
vorher=HIGH;
g++;
}
}
}
else
{
jetzt=LOW;
vorher=LOW;
}
zeitproumdrehung=ende-start;
f=60.0/(zeitproumdrehung*0.001);
Serial.println(zeitproumdrehung);
Serial.println(f);
if(f==INFINITY)
{
lcd.clear();
textDrehzahl();
lcd.setCursor(0,1);
lcd.print("0");
lcd.setCursor(13,1);
lcd.print("rpm");
}
else
{
if(c>f || c<f)
{
lcd.clear();
textDrehzahl();
lcd.setCursor(0,1);
lcd.print(f);
lcd.setCursor(13,1);
lcd.print("rpm");
Serial.println(f);
}
}
c=f;
Serial.println("------------");
}
Die 500 ms delay habe ich wegen dem LCD modul gehabt, da die Ausgabefrequenz sonst zu hoch ist und man am LCD nichts mehr erkennen kann.
bei dem oberen Programm funktioniert alles, außer:
Ich bekomme 14 richtige Messwerte, und darauf folgen 14 Messwerte, wobei die zeitproumdrehung den Wert 4294966750 hat.
zur Drehzahlsimulierung habe ich mir einen Fidget spinner genommen und darauf schätze ich die Drehzahl und nehme sie mit dem Sensor ab. Das hört sich zwar komisch an, aber ich habe keine Möglichkeit, mir ein Signal in den Arduino einzuspeisen.
Mfg
4294966750 ist das gleiche wie -546 , da ist sicher was mit deiner ende oder start Zeit durcheinander.
Warum misst du die Zeit nicht einfach zwischen zwei gleichen Flanken?
(oder habe ich deine Programmlogik nicht verstanden?)
unsigned long prev; // voriger millis() Wert
bool vorher; // Signalzustand
int drehzahl() {
bool jetzt = digitalRead(2);
if (jetzt != vorher) {
vorher = jetzt;
if (jetzt) {
// Signalwechsel +
unsigned long now = millis();
unsigned long t = now - prev;
prev = now;
if (t) return 60000UL / t; // evtl. t > Prellzeit
else return 0;
}
}
return -1; // kein bzw. nicht der richtige Signal-Wechsel
}
Hat evtl. den Schönheitsfehler, dass bei plötzlichem Stillstand nie 0 rauskommt.