Autoprofis > Blog > Geschwindigskeitswarner für Spezialumbauten bei Kraftfahrzeugen

Geschwindigskeitswarner für Spezialumbauten bei Kraftfahrzeugen

/*
 * Geschwindigkeitswarner für ausklappbare Boxen eines Ford Co
 */



/* Pin-Definitionen */
const int hallPin = 2;  // Der Hall-Sensor ist mit Pin 2 des Arduino verbunden
const int outPin1 = 13; // Pin 13 als Ausgang
const int outPin2 = 12; // Ein zusätzlicher Pin zum Aktivieren
const int outPin3 = 11; // Ein zusätzlicher Pin zum Aktivieren
//const int powerPin = 5V;  // Der Hall-Sensor wird mit 5V versorgt (schwarzes Kabel am Hallgeber)
//const int groundPin = GND; // Der GND-Pin des Hall-Sensors wird mit GND des Arduino verbunden (braunes Kabel am Hallgeber)

/* ToDo:
 1. Angleich an Fahrgeschwindigkeit (eichen)
 2. Nach x Sekunden über y km/h soll Ausgang eingeschaltet werden
*/

const int timeToActivate = 5; // Zeit (in Sekunden) für die Aktivierung
const int speedThreshold = 8; // Geschwindigkeitsschwelle (in km/h)
const float speedMulti = 0.01; // Multiplikator, um von Drehzahl (U/min) auf Geschwindigkeit (km/h) zu kommen

/* Variablen zur Berechnung der Drehzahl */
volatile unsigned int pulseCount = 0;
unsigned long lastTime = 0;
float rpm = 0;
float speed = 0;
unsigned long overSpeedStartTime = 0; // Startzeit, wenn die Geschwindigkeit den Schwellenwert überschreitet
bool isOutputActive = false; // Status des Ausgangs (aktiviert oder nicht)

void setup() {
  // Initialisieren der seriellen Kommunikation zur Ausgabe von Informationen
  Serial.begin(9600);
  
  // Einstellen der Pins
  pinMode(hallPin, INPUT);
  pinMode(outPin1, OUTPUT);
  pinMode(outPin2, OUTPUT);
  pinMode(outPin3, OUTPUT);
  digitalWrite(outPin1, LOW);
  digitalWrite(outPin2, LOW);
  digitalWrite(outPin3, LOW);
  
  attachInterrupt(digitalPinToInterrupt(hallPin), countPulse, RISING); // Interrupt beim Anstieg des Signals
}

void loop() {
  unsigned long currentTime = millis();
  
  // Drehzahl und Geschwindigkeit jede Sekunde berechnen
  if (currentTime - lastTime >= 1000) { 
    noInterrupts(); // Unterbrechungen deaktivieren, um sicherzustellen, dass die Berechnung nicht gestört wird
    rpm = (pulseCount / 2.0) * 60.0; // Pulsanzahl wird durch 2 geteilt, da der Hall-Sensor zwei Pulse pro Umdrehung liefert
    pulseCount = 0; // Zähler zurücksetzen
    interrupts(); // Unterbrechungen wieder aktivieren
    
    // Geschwindigkeit berechnen
    speed = rpm * speedMulti;
    
    Serial.print("Drehzahl: ");
    Serial.print(rpm);
    Serial.print(" U/min, Geschwindigkeit: ");
    Serial.print(speed);
    Serial.println(" km/h");
    
    lastTime = currentTime; // Zeitstempel aktualisieren
    
    // Überprüfen, ob die Geschwindigkeit den Schwellenwert überschreitet
    if (speed >= speedThreshold) {
      if (overSpeedStartTime == 0) {
        overSpeedStartTime = currentTime; // Startzeit speichern, wenn die Geschwindigkeit zum ersten Mal den Schwellenwert überschreitet
      }
      
      // Überprüfen, ob die Geschwindigkeit über die Verzögerungszeit konstant bleibt
      if ((currentTime - overSpeedStartTime) >= (timeToActivate * 1000)) {
        if (!isOutputActive) {
          activateOutputs();
          isOutputActive = true;
        }
      }
    } else {
      // Geschwindigkeit ist unter der Schwelle, zurücksetzen
      overSpeedStartTime = 0;
      if (isOutputActive) {
        deactivateOutputs();
        isOutputActive = false;
      }
    }
  }
}

void countPulse() {
  pulseCount++;
}

void activateOutputs() {
  digitalWrite(outPin1, HIGH);
  digitalWrite(outPin2, HIGH);
  digitalWrite(outPin3, HIGH);
  Serial.println("Ausgänge aktiviert!");
}

void deactivateOutputs() {
  digitalWrite(outPin1, LOW);
  digitalWrite(outPin2, LOW);
  digitalWrite(outPin3, LOW);
  Serial.println("Ausgänge deaktiviert!");
}