void führt ins leere

Hallo zusammen.
Ich habe mir ein Programm erstellt, welches von einer CNC Fräse das Tachosignal, Drehrichtung und Temperatur auf einem Display ausgeben soll. Funktioniert soweit auch.

#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7 /* Digitalport Pin 7 definieren Temperatursensor*/

byte i_buttonState1      = 0;      // In dieser Variablen speichern wir den Status des Eingangs.
byte drehfeld_taster     = 6;     // An den Pin D6 ist der Taster angeschlossen.
byte drehfeld_led         = 13;      // Signal für Drehrichtungserkennnung.
byte tacho_signal        = 5;
byte ledState               = LOW;             //LED Status
 
float T;          //Periodendauer in us
float f;                 //Frequenz in MHz
unsigned int umin;      // Drehzahl pro Minute



LiquidCrystal_I2C lcd(0x27, 20, 4);   
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
  pinMode(drehfeld_taster, INPUT); // Der Pin des Tasters wird als Eingang initialisiert.
  pinMode(drehfeld_led, OUTPUT);  // Der Pin der LED wird als Ausgang initialisiert.
  pinMode(tacho_signal, INPUT);

  lcd.begin();
  sensors.begin();
  Serial.begin(38400);
  //********************* Ausgabe der statischen Zeichen im Display**********
  lcd.setCursor(9, 0);
  lcd.print("|");
  lcd.setCursor(0, 1);
  lcd.print("Spindel  | Steuerung");
}

void loop() {

  //************* Ermiteln und Ausgabe der Drehzahl **********************
  long int time = micros();
  double k;
  long int fsum;
  do {
    T = pulseIn(tacho_signal, HIGH) + pulseIn(tacho_signal, LOW);
    if (T == 0) {
      Serial.println("Timeout.");
      lcd.setCursor(0, 0);
      lcd.print("    0");
    }
    else {
      f = 1 / (double)T;    // f=1/T
      k++;
    }
    fsum += f * 1e6;
  } while ( micros() < (time + 1e6)); // 1 Sekunde mitteln
  f = fsum / k * 0.9925;     // Korrekturwert einrechnen


  umin = f * 30;               // Frequenz in Rpm umrechnen

  lcd.setCursor(0, 0);
  lcd.print("     ");
  lcd.setCursor(0, 0);
  lcd.print(umin);
  lcd.setCursor(5, 0);
  lcd.print(" rpm");
  fsum = 0.0;           // Reset
  time = 0.0;           // Reset
  //************* Erkennung der Drehrichtung und Anzeige auf dem Display *************

  i_buttonState1 = digitalRead(drehfeld_taster);

  if (i_buttonState1 == HIGH) {     // Ist der Taster gedrückt,
    digitalWrite(drehfeld_led, HIGH);    // dann schalte die LED an.

    lcd.setCursor(0, 3);
    lcd.print("<<- GEGENLAUF! links");     // Displayausgabe

  }
  else {                             // Ansonsten
    digitalWrite(drehfeld_led, LOW);     // schalte die LED wieder aus.
    lcd.setCursor(0, 3);
    lcd.print("->>GLEICHLAUF rechts");    // Displayausgabe
  }
  digitalWrite(drehfeld_led, ledState);


  // ********************* Ermitteln und Ausgabe der Temperatur***********

  sensors.requestTemperatures();

  lcd.setCursor(13, 0);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.setCursor(17, 0);
  lcd.print(" \337C");


  // **************** Serielle Ausgabe, falls Display nicht Funktionieren sollte ************
  Serial.println(".");
  Serial.println("....");
  Serial.println("........");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println(" ° C Controler    ");
  Serial.print(f);
  Serial.println(" Hertz - Tachosignal vom BLCD Controler   ");
  Serial.print(umin);
  Serial.println(" U/ Min Spindelmotor    ");
}

Ich möchte das ganze etwas aufteilen. Wegen der Übersichtlichkeit und die Speicherausnutzung
auf dem Atmega ist optimaler.Folgendes Problem: Im folgendem Code, wobei ich gedacht habe, es wäre so richtig, läuft der Compiler ohne Fehler durch, aber das Display zeigt keine Werte an, bleibt quasi leer.

#include <LiquidCrystal_I2C.h>// Vorher hinzugefügte LiquidCrystal_I2C Bibliothek hochladen
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7

byte i_buttonState1     = 0;
byte drehfeld_taster     = 6;
byte drehfeld_led         = 13;
byte tacho_signal         = 5;
byte ledState               = LOW;
float T;
float f;
unsigned int umin;

LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
  pinMode(drehfeld_taster, INPUT);
  pinMode(drehfeld_led, OUTPUT);
  pinMode(tacho_signal, INPUT);

  lcd.begin();
  sensors.begin();
  Serial.begin(38400);

  lcd.setCursor(9, 0);
  lcd.print("|");
  lcd.setCursor(0, 1);
  lcd.print("Spindel  | Steuerung");
}

//******************************** Ermiteln und Ausgabe der Drehzahl **********************
void drehzahl () {
  long int time = micros();
  double k;
  long int fsum;
  do {
    T = pulseIn(tacho_signal, HIGH) + pulseIn(tacho_signal, LOW);
    if (T == 0) {
      Serial.println("Timeout.");
      lcd.setCursor(0, 0);
      lcd.print("    0");
    }
    else {
      f = 1 / (double)T;    // f=1/T
      k++;
    }
    fsum += f * 1e6;
  } while ( micros() < (time + 1e6)); // 1 Sekunde mitteln
  f = fsum / k * 0.9925;     // Korrekturwert einrechnen
  umin = f * 30;


  lcd.setCursor(0, 0);
  lcd.print("     ");
  lcd.setCursor(0, 0);
  lcd.print(umin);
  lcd.setCursor(5, 0);
  lcd.print(" rpm");
  fsum = 0.0;
  time = 0.0;
  return;
}
//***************************************************** Erkennung der Drehrichtung*************
void drehrichtung() {
  i_buttonState1 = digitalRead(drehfeld_taster);

  if (i_buttonState1 == HIGH) {     // Ist der Taster gedrückt,
    digitalWrite(drehfeld_led, HIGH);    // dann schalte die LED an.

    lcd.setCursor(0, 3);
    lcd.print("<<- GEGENLAUF! links");

  }
  else {                             // Ansonsten
    digitalWrite(drehfeld_led, LOW);     // schalte die LED wieder aus.
    lcd.setCursor(0, 3);
    lcd.print("->>GLEICHLAUF rechts");
  }
  digitalWrite(drehfeld_led, ledState);
  return;
}

// ************************************************* Ermitteln und Ausgabe der Temperatur***********
void temperatur() {
  sensors.requestTemperatures();

  lcd.setCursor(13, 0);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.setCursor(17, 0);
  lcd.print(" \337C");
  return;
}

// ********************************************* Serielle Ausgabe
void serieller_monitor() {
  Serial.println("    ");
  Serial.println("    ");
  Serial.println("    ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.println(" ° C Steuerung    ");
  Serial.print(f);
  Serial.println(" Hertz BLCD Controller   ");
  Serial.print(umin);
  Serial.println(" U/ Min Spindelmotor    ");
  return;
}

void loop() {
  drehzahl;
  drehrichtung;
  temperatur;
  serieller_monitor;
}

Was mache ich falsch? Vielen dank im voraus

Es muss heißen:

void loop() {
  drehzahl();
  drehrichtung();
  temperatur();
  serieller_monitor();
}

Also jeweils Klammern machen - damit du deine Funktionen auch aufrufst.

Die "returns" am Ende deiner Funktionen kannst du weglassen.

Parax: ... läuft der Compiler ohne Fehler durch, aber das Display zeigt keine Werte an.

Stimmt, der Compiler gibt zwar keinen Fehler aus, aber er gibt eine Warnung aus, in wunderschön auffälliger oranger Schrift nämlich so etwas wie:

warning: statement is a reference, not call, to function 'drehzahl' 
     drehzahl;
          ^

Wenn du aufmerksam den unteren Teil des IDE-Fensters beim Kompilieren beobachtest und etwas Oranges durchsprinten siehst, sollte dich das stutzig machen - es könnte eine Warnung sein. :)

Es gibt keine "voids". Void ist ein Datentyp. Die Dinger heißen Funktionen

Der Name einer Funktion alleine ist deren Adresse. Die nimmst also die Adresse der Funktion und machst dann nichts damit. Deshalb die Warnung

Danke, es Funktioniert jetzt einwandfrei. Komischerweise zeigt der Compiler keine Warnung an, nix orangefarbenes. Habe ich an PC und Laptop nochmal nachgeschaut. Aber egal, Hauptsache et läuft jetzt.

Warnungen musst du in den Optionen extra aktivieren