#include #include #include #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) int X = 0; unsigned long Zeitgesamt; unsigned long Zeitabschnitt; unsigned long Zeitausgabe; unsigned long Zahlzeit; float Gesamtzeit; float Durchschnittzeit; float Durchschnittrpm; float rpm; unsigned long rpmzahl; float Sekunden; float Prozent; float Absoluteabweichung; float Strich; int Einmalflag = 0; int Einmalflag1 = 0; int Led = 13 ;// Deklaration des LED-Ausgangspin int Sensor = 10; // Deklaration des Sensor-Eingangspin int val; // Temporaere Variable int flag; //Flag Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); void setup() { //Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); oled.setCursor(0,0); display.clearDisplay(); //display.display(); Zeitgesamt = 0; Zeitabschnitt = 0; Zeitausgabe = 0; Zahlzeit = 0; Sekunden = 0; rpm = 0; Durchschnittzeit = 0; Durchschnittrpm = 0; Prozent = 0; rpmzahl = 0; Absoluteabweichung = 0; Strich = 0; Einmalflag = 0; Einmalflag1 = 0; Gesamtzeit = 0; pinMode (Led, OUTPUT) ; // Initialisierung Ausgangspin pinMode (Sensor, INPUT) ; // Initialisierung Sensorpin flag = 0; display.setTextWrap(false); } void loop() { // display.setTextWrap(false); Zeitgesamt = millis(); //if (Einmalflag == 0) { // Zeitabschnitt = Zeitgesamt; // X = (-5); //} val = digitalRead (Sensor) ; // Das gegenwärtige Signal am Sensor wird ausgelesen if (val == LOW) {flag = 0;} if (val == HIGH && flag == 0) // Falls ein Signal erkannt werden konnte { X = X+1; flag = 1; Zeitausgabe = (Zeitgesamt - Zeitabschnitt); Zeitabschnitt = Zeitgesamt; // Einmalflag = 1; display.drawFastVLine(Strich, 30, 5, BLACK);// Die variable, mittlere Linie wird überschrieben/ gelöscht if (Einmalflag1 == 0){ Zahlzeit = millis(); Einmalflag1 = 1; } // } //Löschen Runde oben links Zeile 0 display.setTextSize(1);display.setTextColor(WHITE,BLACK);display.setCursor(0,0);display.print(" "); //Schreiben Runde oben links display.setCursor(0,0);display.setTextColor(WHITE);display.print(X-1); if (X < 2){Durchschnittrpm = 0; } else { Durchschnittrpm =(60/(((Zeitabschnitt - Zahlzeit)/ (X-1))/1000.000));} //Serial.println("X"); //Serial.println(X); //Serial.println("Millis"); //Serial.println(Zeitgesamt); //Serial.println("Zahlzeit"); //Serial.println(Zahlzeit); //Serial.println("Zeitabschnitt"); //Serial.println(Zeitabschnitt); //Serial.println("Durchschnittrpm"); //Serial.println(Durchschnittrpm); //Löschen Zeile 10 Durschnitts-RPM display.setTextSize(1);display.setTextColor(WHITE,BLACK);display.setCursor(0,10);display.print(" "); //Schreiben Zeile 10 Durchschnitts-RPM display.setCursor(0,10);display.setTextColor(WHITE);display.print(Durchschnittrpm,3); Sekunden = (Zeitausgabe/1000.000); //Millisekungen in Sekunden umrechnen if (X < 2){(Sekunden = 0);} Gesamtzeit = ((Zeitabschnitt - Zahlzeit)/1000.000); display.setTextSize(1);display.setTextColor(WHITE, BLACK);display.setCursor(95,10);display.print(" "); display.setTextSize(1);display.setTextColor(WHITE);display.setCursor(95,10);display.print(Sekunden,3); //display.display(); display.setTextSize(1);display.setTextColor(WHITE, BLACK);display.setCursor(95,00);display.print(" "); display.setTextSize(1);display.setTextColor(WHITE);display.setCursor(95,00);display.print(Gesamtzeit); //display.display(); //Löschen Zeile 50 RPM display.setTextSize(2);display.setTextColor(WHITE, BLACK);display.setCursor(27,50);display.print(" "); //Schreiben Zeile 50 RPM display.setTextColor(WHITE);display.setCursor(27,50); if (X < 2) //if (Sekunden == 0) //Verhindern, dass durch NULL geteilt wird bei der rpm-Berechnung {rpm = 0; display.setCursor(27,50); display.setTextColor(WHITE); display.print("0"); } //rpm wird auf NUll gesetzt und angezeigt else { rpm = (60.0/Sekunden);} //rpm wird berechnet display.print(rpm,3); // rpm wird angezeigt // display.display(); //Löschen Zeile 20 prozentuale Abweichung display.setTextSize(1);display.setTextColor(WHITE, BLACK);display.setCursor(00,20);display.print(" "); display.setTextColor(WHITE); display.setCursor(00,20); if (X < 2) //if (Sekunden == 0) {Prozent = 0;} else { Prozent = (100/ 33.333)*(rpm - 33.333); //Prozent ausrechnen } if (Prozent > 0) //einem positiven Prozentwert ein Plus-Zeichen voransetzen {display.setCursor(0,20);display.print("+");display.setCursor(5,20);display.print(Prozent,2); } else{ display.print(Prozent); //negative Prozentwerte erhalten automatisch ein Minuszeichen vorangestellt //display.display(); } Strich = (63+(Prozent * 6.3)); //Mittellinienposition berechnen (keine Abweichung = 63, also Mitte, zehn Prozent zu gering ganz links, zehn Prozent zu hoch ganz rechts display.drawFastVLine(63, 20, 5, WHITE); //obere, senkrechte Linie als Skala der Mitte display.drawFastVLine(Strich, 30, 5, WHITE); //Linie in der Mitte mit variabler Position display.drawFastVLine(63, 40, 5, WHITE); // untere, senkrechte Linie als Skala der Mitte display.display(); } //Serial.println(X); //Serial.println("Millis"); //Serial.println(Zeitgesamt); while (Einmalflag == 0){ display.setCursor(0,0); display.setTextColor(WHITE); display.print("-"); display.setCursor(0,10); display.print("0.000"); display.setCursor(0,20); display.print("0.00"); display.setCursor(95,00); display.print("0.00"); display.setCursor(95,10); display.print("0.000"); display.setTextColor(WHITE);display.setCursor(27,50);display.setTextSize(2); display.print("00.000"); display.drawFastVLine(63, 20, 5, WHITE); //obere, senkrechte Linie als Skala der Mitte display.drawFastVLine(63, 30, 5, WHITE); //Linie in der Mitte mit variabler Position display.drawFastVLine(63, 40, 5, WHITE); // untere, senkrechte Linie als Skala der Mitte display.display(); Einmalflag =1; } }