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