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!");
}