/*
Author: Gregor Mausser
Title: Stoppuhr_1.1
Technische Daten:
RGB funtioniert
Button und Flankenerkennung (Tastenprellen) funtioniert
Buzzer funktioniert (Piepst während der Startfrequenz)
OLED Display funktioniert (ausgabe der Zeiten; schreibt "START")
Umrechnung von ms auf min:sec funktioniert
Zahlenformatierung funkioniert
microSD card?
*/
//Bibliothek für den Display einfügen
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//Bibliothek für die microSD card einfügen
#include <SD.h>
#include <SPI.h>
//Pins definieren
const int RGBred = 6;
const int RGBgreen = 5;
const int RGBblue = 3;
const int ButtonPin = 4;
const int BuzzerPin = 2;
const int ChipSelectPin = 10; //CS bei microSD card
//Breite und Höhe vom OLED-Display festlegen
const int ScreenHeight = 32;
const int ScreenWidth = 128;
Adafruit_SSD1306 display(ScreenWidth, ScreenHeight, &Wire, - 1);
//Variablen defieren
int buttoncount = 0; //zählt wie oft der Button gedrückt wurde
int buzzercount = 0; //zählt wie oft der Buzzer in der Startsequenz ausgelöst wurde
int minute;
int times = 1; //Zählt die gespeicherten Zeiten
//Variablen für die Flankenerkennung
bool lastButtonState = HIGH;
//Variablen für den Timer mit millis()
unsigned long starttime = 0; //Wann der Timer anfängt zu zählen
unsigned long endtime = 0; //Wann der Timer stoppt
void setup() {
Serial.begin(9600);
//Pins eine Funktion zuweisen
pinMode(RGBred, OUTPUT);
pinMode(RGBgreen, OUTPUT);
pinMode(RGBblue, OUTPUT);
pinMode(ButtonPin, INPUT_PULLUP);
pinMode(BuzzerPin, OUTPUT);
pinMode (ChipSelectPin, OUTPUT);
//RGB ausschalten
digitalWrite(RGBred, LOW);
digitalWrite(RGBgreen, LOW);
digitalWrite(RGBblue, LOW);
Wire.begin(); //wichtig für den Display start
//Display starten
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Display Fehler!"));
while(true);
}
display.clearDisplay();
display.display();
//microSD card starten
if (!SD.begin(ChipSelectPin)) {
Serial.println("SD Karte Fehler!");
while (true);
}
//Datei erstellen
File file = SD.open("times.csv", FILE_WRITE);
if (file) {
file.println("Versuch, Zeiten_ms"); //Überschrift in die CSV Datei schreiben
file.close();
}
else {
Serial.println("Fehler bei der Erstellung der Datei");
}
}
//Funktion zum einstellen der RGB-Led und der Dauer/delay()
void RGBsetting(int red, int green, int blue, int time){
analogWrite(RGBred, red);
analogWrite(RGBgreen, green);
analogWrite(RGBblue, blue);
delay(time);
}
// Funktion für das Blinken der RGB-Led und das Piepsen des Buzzers
void Startsequenz(int red, int green, int blue, int time){
RGBsetting(0, 0, 0, time);
tone(BuzzerPin, 215, time);
RGBsetting(red, green, blue, time);
buzzercount++;
if (buzzercount >= 4) {
RGBsetting(0, 0, 0, time);
tone(BuzzerPin, 215, 1500);
RGBsetting(red, green, blue, time);
buzzercount = 0;
}
}
void loop() {
bool reading = digitalRead(ButtonPin);
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(0, 10);
if (reading == LOW && lastButtonState == HIGH) {
buttoncount++;
display.clearDisplay();
display.display();
switch (buttoncount){
case 1:
RGBsetting(255, 0, 0, 5000);
for (int i = 1; i <= 4; i++){
Startsequenz(255, 0, 0, 500);
}
//Timer Starten millis
starttime = millis();
display.println("START");
display.display();
RGBsetting(0, 255, 0, 3000);
RGBsetting(0, 0, 0, 0);
display.clearDisplay();
display.display();
break;
case 2:
endtime = millis();
float time = endtime - starttime;
time = time/1000;
minute = time / 60;
time = time - minute*60;
display.print(minute);
display.print(":");
if (time <= 9) {
display.print("0");
}
display.println(time, 0);
display.display();
RGBsetting(255, 255, 0, 250);
//Zeit in die CSV Datei schreiben und auf der microSD card speichern
File file = SD.open("times.csv", FILE_WRITE);
if (file) {
file.print(times);
file.print(",");
file.print(minute);
file.print(":");
file.println(time);
file.close();
times++;
}
else {
Serial.println("Fehler beim Schreiben");
}
buttoncount = 0;
break;
default:
RGBsetting(0, 0, 0, 0);
display.clearDisplay();
display.println("Fehler!");
display.display();
}
}
lastButtonState = reading;
}