Arduino, geluidssensor vaker/langer meten

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 30-09 20:01
Oke even kort de situatie. Ik ben bezig een apparaat te maken met arduino. Als er veel geluid in de microfoon(sensor) komt dan draait er een spoeltje op een stepper motor naar 500 stappen. Als weinig tot geen geluid meer is blijft de stepper motor staan, of gaat de stepper motor naar 0 stappen.

Nu heb ik in principe alles "werkend". Maar dit komt omdat ik NA het draaien aan de spoel een delay van 10 seconden heb gezet, ik wil namelijk dat de spoel minimaal 10 seconden blijft staan. Dan mag er weer gemeten worden of er veel of weinig geluid is.

Schematisch gaat dit dus fout:

1. spoel gaat OF 10 seconden op 500 staan OF 10 seconden op 0 staan.
2. 1 milliseconde meetmoment
3. spoel gaat OF 10 seconden op 500 staan OF 10 seconden op 0 staan.
4. 1 milliseconde meetmoment

In de code gebruik ik vooral if statements, maar ik kom er niet uit en zou graag een zetje willen..

Waar ik zelf aan zit te denken is het gemiddelde van 10 seconden meten en als het geluidsniveau hoog is optie A en wanneer het geluidsniveau (over 10 sec) laag was optie B

Code ziet er momenteel zo uit:

Arduino:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void loop()
{
  int micValue1 = analogRead(micPin = A0);
  Serial.println(micValue1);
  delay(1);
  int micValue2 = analogRead(micPin = A0);
  Serial.println(micValue1);

  if(micValue2-micValue1>1){
    digitalWrite(ledPin, HIGH);
    functieStepperLaag();

  }
  else {
    digitalWrite(ledPin,LOW);
    functieStepperHoog();
    }

}

//Met hieronder dus de losse functies met Stepper naar 0 en 500 stappen

Alle reacties


Acties:
  • +1 Henk 'm!

  • wwwFan
  • Registratie: Januari 2012
  • Laatst online: 03-10 20:39
In je tekst zeg je dat de stepper naar 500 moet als er veel geluid is en naar 0 bij wienig geluid. Echter in je programma vergelijk je twee metingen kort naar elkaar en als de tweede meting harder is dan de eerste dan gaat de stepper naar 0.

Een gemiddelde waarde kan je krijgen door een paar keer achter elkaar te meten (met een bepaald tiijdsinterval) en de waarde op te tellen en door het aantal meting te delen. 10 keer meten met 1 seconde interval. Je krijgt dan iets als:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void loop()
{
    int micValue;
    int i;

    micValue = 0;
    for( i=0; i < 10 ; i++ )
    {
        micValue += analogRead(A0);
        delay(1000);
    }
    micValue = micValue / 10;
 
    if ( micValue < grensWaarde )
    {
        digitalWrite(ledPin, HIGH);
        functieStepperLaag();

    }
    else
    {
        digitalWrite(ledPin,LOW);
        functieStepperHoog();
    }
}

Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 30-09 20:01
wwwFan schreef op donderdag 8 juni 2017 @ 19:16:

Een gemiddelde waarde kan je krijgen door een paar keer achter elkaar te meten (met een bepaald tiijdsinterval) en de waarde op te tellen en door het aantal meting te delen. 10 keer meten met 1 seconde interval.
Oke kijk, dit helpt mij enorm.

Nu zit ik verder te kijken naar het inbouwen van een ldr, hiermee wil ik de neopixel aansturen. Door het delay in de for loop wordt de ldr echter niet constant gemeten. Zou dit met arduino mogelijk zijn?

Ik heb de tutorial blink without delay example doorlopen, en ik snap in principe de gedachtegang maar krijg het niet omgebouwd binnen dit voorbeeld. Weet ook niet of dat hier van toepassing is

Acties:
  • +1 Henk 'm!

  • Lennyz
  • Registratie: Januari 2010
  • Laatst online: 25-09 09:49
Ambianz schreef op donderdag 8 juni 2017 @ 19:59:
[...]


Oke kijk, dit helpt mij enorm.

Nu zit ik verder te kijken naar het inbouwen van een ldr, hiermee wil ik de neopixel aansturen. Door het delay in de for loop wordt de ldr echter niet constant gemeten. Zou dit met arduino mogelijk zijn?

Ik heb de tutorial blink without delay example doorlopen, en ik snap in principe de gedachtegang maar krijg het niet omgebouwd binnen dit voorbeeld. Weet ook niet of dat hier van toepassing is
Ja je moet eigenlijk delay vermijden. Je zit inderdaad in de goede richting met het blink without delay example. Millis is in het begin even lastig, maar verdiep je erin. Het maakt alles zoveel makkelijker als je het snapt.

Probeer gewoon nog even verder te oefenen met millis. Als je er dan nog niet uitkomt helpen wij hier wel. Maar je leert er het meeste van als je het zelf probeert.

Hier heb je ook nog wel een goede tutorial.

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview

Acties:
  • 0 Henk 'm!

  • Ambianz
  • Registratie: December 2009
  • Laatst online: 30-09 20:01
Thanks, ik ga er mee aan de slag! Zal het toch sneller leren door te doen.