Turbine Drehzahl und Temperatur

Hallo zusammen!

Ich bin blutiger Anfänger was Arduino angeht.. zur Zeit wälze ich mich durch Bücher und vorhande Sketche um mein Problem zu beheben!

Ich habe eine Modellturbine gebaut und möchte dort zwei Merkmale ermitteln. TEMPERATUR und DREHZAHL!

TEMPERATUR war einfach mittels Max6675. Die DREHZAHL zu ermitteln hingegen etwas schwieriger!

Hier verwende ich eine Ir lichtschranke die aus zwei breakouts besteht diode und empfänger..

Das Board ist ein Arduino UNO!! Und ich gebe es aus an ein Lcd 16x2 mit i2c !!!!

Hier mein sketch ..

#define PIN_LED 9
#define PIN_LED_DETECTOR A0

// [0..1023] = [dark..bright]
const unsigned int SENSOR_SENSITIVITY  = 1000;  //500

// e.g. number of blades in a fan
const byte INTERUPTIONS_PER_REVOLUTION = 2;  //2

// in ms
const unsigned long CALCULATE_INVERVAL = 1000; //2500

bool sensorStatus = false;
unsigned int brightness = 0, rpm = 0;
unsigned long interruptions, revolutions = 0, lastCalculateTime;


//LCD config
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>    
LiquidCrystal_I2C lcd(0x27,16,2);

//MAX6675 config
#include <max6675.h>

int soPin = 4;// SO=Serial Out
int csPin = 5;// CS = chip select CS pin
int sckPin = 6;// SCK = Serial Clock pin

MAX6675 thermocouple(sckPin, csPin, soPin);

void setup()
{

 lcd.init(); 
 lcd.backlight();
 
   Serial.begin(9600);
   lastCalculateTime = millis();
   pinMode(PIN_LED, OUTPUT);
   digitalWrite(PIN_LED, HIGH);    
}

void loop()
{
   if (millis() - lastCalculateTime > CALCULATE_INVERVAL) {
       revolutions = interruptions / INTERUPTIONS_PER_REVOLUTION;
       rpm = revolutions / (CALCULATE_INVERVAL / 1000) * 60;
       revolutions = 0;
       interruptions = 0;
       lastCalculateTime = millis();

       // show sensor brightness
       Serial.print("B = " + (String)+brightness);

       // show amount of interruptions of the sensor
       Serial.print("; I = " + (String)interruptions);

       // show amount of revolutions
       Serial.print("; R = " + (String)revolutions);

       // show rpm = "revolutions per minute"
       Serial.println("; " + String(rpm) + " RPM");

   
       
         
        Serial.println(thermocouple.readCelsius());

       

   
       
lcd.clear(); 
     lcd.setCursor(0,0);       
     lcd.print("Temperatur C");

     lcd.setCursor(14,0);
     lcd.print(thermocouple.readCelsius());

    

   lcd.setCursor(0,1);
     lcd.print("U/Min");
   lcd.setCursor(10,1);
     lcd.print(String(rpm));


   
   }

   

 

       brightness = analogRead(PIN_LED_DETECTOR);
   if (sensorStatus == false && brightness >= SENSOR_SENSITIVITY) {
       interruptions++;
       sensorStatus = true;
   }
   if (sensorStatus == true && brightness < SENSOR_SENSITIVITY) {
       sensorStatus = false;
   }

   

   
}

Ich habe mir einen Teststand gebaut für die Lichtschranke!! Problem ist folgendes ...

Bei steigender Drehzahl sinkt der Wert auf dem Lcd!! Ich Messe die Unterbrechungen durch eine Welle hindurch.. also die Welle hat eine Querbohrung, durch die der Ir empfangen werden kann.. Bitte denkt daran ich habe wenig Erfahrung hier !!! :slight_smile:

Vielleicht kann mir hierzu jemand die nötigen Infos geben...

Hat's heute beim Aldi !!!!! im Sonderangebot gegeben?

Zu deinem Problem: Deine Sampligrate ist zu niedrig - Nynquist läßt grüßen. Zähl' über einen pinchageinterrupt die Zahl der fallenden Flanken pro Sekunde, das ist deutlich genauer.

Timer1 des UNO hat einen Zählereingang an T1/PD5/Pin5
Damit kann man dem Nynquist ein ordentliches Schnippchen schlagen.
Auch ohne schnellen Interrupt.

Sonderangebot verstehe ich nicht ganz sorry!! Erklärst du mir was du mit samplingrate meinst ? Wie könnte ein pinchangeinterrupt aussehen? Vielen Dank im voraus

Mit welche Drehzahlen erwartest du?

@Combie 30000-50000 u/min

Unter 2000 Pulse/s, das sollte mit einer ISR zu schaffen sein.

Muss ich was ändern? Pinbelegung ? Sketch? Kannst du helfen? Brauchst weitere Infos Bilder etc.? Danke im voraus

Ich?
Fange mal an zu lesen!
z.B. hier anfangen
(die andere, von mir angedeutete "bessere" Möglichkeit hast du leider ausgeblendet)

Ok, das bekomme ich glaube ich hin!! Welche war die andere Methode? Entschuldige wenn ich etwas langsam bin ...

Timer1 des UNO hat einen Zählereingang an T1/PD5/Pin5
Das Datenblatt des ATMega328P gibt gerne Auskunft.

Hallo,

eigendlich willst Du die Frequenz messen , dazu gibt es 2 Varianten.

  1. Tormessung - Du misst in einer ISR die Anzahl der positiven oder negativen Flanken die innerhalb einer bestimmten Zeit erkannt wurden.

  2. Periodendauer- Du misst in der ISR die Zeitdifferenz micros() zwischen zwei ( oder auch mehreren ) Aufrufen der ISR (trigger wieder eine Flanke )

zudem solltest Du dich mit dem Variablen Zusatz "volatile" und mit ATOMIC_BLOCK beschäftigen link

Heinz

  1. Tormessung - Du misst in einer ISR die Anzahl der positiven oder negativen Flanken die innerhalb einer bestimmten Zeit erkannt wurden.

Wie schon gesagt:
Die Tormessung geht auch ohne ISR, dank Timer1