Liebe Arduino-Gemeinde, ich brauche eure Hilfe:
Ich beschäftige mich mit der Interaktion zwischen Mensch und Maschine und möchte eine Installation für Tänzer bauen. Es ist im Grunde "nur" ein Licht, welches heller wird, wenn sich jemand auf das Licht zubewegt; bei einem Klatschen ändert sich die Farbe des Lichtes. Mein Aufbau funktioniert, nur leider ist alles zu langsam und läuft nicht gleichzeitig ab.
-
Ich nutze ein Arduino Uno**.**
- Ultrasonic Sensor HC-SR04 um die Distanz zu messen.
Da dieser Sensor arg ungenau ist, muss ich die Werte mit der Bibliothek "MyUltrasoundSensor" mehrfach messen und mit dem Codeschnipsel "runningAverage" den neuen Wert mit dem vorherigen gegenrechnen. -
LM35 misst die Temperatur für den HC-SR04. Wird aber im aktuellen Aufbau ignoriert.
- KY-038 Microphone Sound Sensor soll das Klatschen ermitteln. -
LED RGB Stripe mit 3 N-Channel MOSFET
1. Problem
Mit diesem Tutorial Link funktioniert der Sensor recht gut; mit meinem Aufbau aber nur wenn man permanent am Mikrofon reibt.
Ist es, weil zwei Loops parallel ablaufende müssten? Schafft das ein ArduionDuo? Oder ist mein Code nicht "smart" genug?
2. Problem
Der ganze Prozess läuft sehr stockend.
Zuerst dachte ich es liegt daran, weil der Arduino zu langsam für die LED´s ist.
Ich nutzte zuerst ein "LED VCC"-Stripe, was mithilfe der "FastLight"-Library jedes einzelne LED anspricht Link. Und nahm stattdessen einem LED RGB Stripe mit 3 N-Channel MOSFET Link = Richtig schneller ist es aber dadurch auch nicht geworden.
Jetzt glaube ich, dass Ultraschall nicht die beste Lösung ist, weil es ab 1m zu ungenau und zu langsam wird. Könnt ihr mir eine bessere und schnellere Methode empfehlen? Infrarot? Laser?
Ich habe dazu das hier gefunden: Aber das scheint auch nicht schnell genug zu sein: Link
lg
fm
#include <MyUltrasoundSensor.h> // MyUltrasoundSensor - Version: Latest
#define TrigPin 7 // HC-SR04
#define EchoPin 6 // HC-SR04
float Distance; // HC-SR04: to narrow the Distance
int tempRohWert; //Rohwert von LM35
float tempWert; //air temperature
MyUltrasoundSensor MyUsS(TrigPin, EchoPin); // HC-SR04: to prevent erroneous measurements
#define RedPin 5 // LED RGB Stripe
#define GreenPin 4 // LED RGB Stripe
#define BluePin 3 // LED RGB Stripe
#define SoundPin 2 // KY-038 Microphone Sound Sensor
int counter = 0;
void setup() {
Serial.begin(9600);
analogReference(INTERNAL); //Referenzspannung für LM35 auf 1,1 V stellen
MyUsS.medianNumber = 5; //Anzahl der Messungen für Median-Wert (Standardeinstellung = 5)
//Mindestzeit in ms zwischen 2 Messungen (Standardeinstellung = 50)
//Die kürzeste Zeit darf 20 ms sein (max. 50 Messungen/s) beim HC-SR04
//bzw. 50 ms (max. 20 Messungen/s) beim HY-SRF05
//Wird ein kleinerer Wert als 20 angegeben, wird der Wert in der
//Library auf 20 ms begrenzt.
MyUsS.measureDelay = 50;
pinMode(RedPin, OUTPUT); // LED RGB Stripe
pinMode(GreenPin, OUTPUT); // LED RGB Stripe
pinMode(BluePin, OUTPUT); // LED RGB Stripe
pinMode(SoundPin, INPUT); // KY-038 Microphone Sound Sensor
}
void loop() {
// ++++++++++++++++++++++++++++++++++++++++++++ Distance measurement
Distance = MyUsS.distanceTempCompMedian(tempWert); // HC-SR04: The correct distance
int DistanceArea = constrain(Distance, 0, 100); // HC-SR04: The DistanceArea here 1m
DistanceArea = runningAverage(DistanceArea); // HC-SR04: the mix between the last and the current value to prevent big light difference
int Brightness = map(DistanceArea, 100, 0, 0, 255); // HC-SR04: the correlation between distance and light
// ++++++++++++++++++++++++++++++++++++++++++++ Clap measurement
int Sound = !digitalRead(SoundPin); // KY-038: if a clap ->
if (Sound == 1) {
counter = counter + 1;
} // KY-038: count 1
if (counter == 4) {
counter = 0;
}
// ++++++++++++++++++++++++++++++++++++++++++++ LED brightness
switch (counter) {
case 1:
analogWrite(RedPin, Brightness);
Serial.print("Case"); Serial.println(1);
break;
case 2:
analogWrite(GreenPin, Brightness);
Serial.print("Case"); Serial.println(2);
break;
case 3:
analogWrite(BluePin, Brightness);
Serial.print("Case"); Serial.println(3);
break;
default:
analogWrite(BluePin, Brightness);
analogWrite(GreenPin, Brightness);
analogWrite(RedPin, Brightness);
Serial.print("Case"); Serial.println(4);
break;
}
}
// ++++++++++++++++++++++++++++++++++++++++++++ runningAverage
long runningAverage(int M) {
#define LM_SIZE 3
static int LM[LM_SIZE]; // LastMeasurements
static byte index = 0;
static long sum = 0;
static byte count = 0;
// keep sum updated to improve speed.
sum -= LM[index];
LM[index] = M;
sum += LM[index];
index++;
index = index % LM_SIZE;
if (count < LM_SIZE) count++;
return sum / count;
}