Go Down

Topic: Alternative zu bounce.h bei analogen Eingänge (Read 620 times) previous topic - next topic

Rickor

Ich habe bei meinem Projekt die bounce.h eingesetzt und funktioniert gut. Diese möchte aber einen PIN als Definition.
Ich möchte aber jetzt einen Analogwert abfragen der bei einem definierten Wert und wenn dieser Wert mindestens 200 ms bleibt ein High liefert.
Jemand eine Idee?
Danke,

uwefed

Für Analogwerte ist normalerweise keine Entprellung nötig.
Wenn Du sowas brauchst mußt Du es Dir selbst schreiben.
grüße Uwe

mkl0815

Um grobe Messfehler ein wenig auszugleichen, kann man einfach mehrmals messen und einen Mittelwert bilden.

Code: [Select]

int data =0;
for (int i=0; i<8;i++) {
    data = data + analogRead(A0);
}
data = data / 8;

Mario.

pylon

Diese Routine macht das, was Du nachfragst. Wenn Du uns etwas mehr Information lieferst, können wir Dir vielleicht eine bessere Alternative aufzeigen.

Code: [Select]
#define THRESHOLD 400
#define WAITTIME 200

uint32_t startMillis = 0;

void loop() {
  if (analogRead(A0) > THRESHOLD) {
    if (startMillis && millis() - startMillis > WAITTIME) {
      // do action
    } else if (! startMillis) {
      startMillis = millis();
    }
  } else {
    startMillis = 0;
  }
}

Rickor

Vielen Dank. so wie von pylon wollte ich es haben. Hab mir jetzt noch ein Zähler eingebaut der immer dann hochzählt wenn der Wert kleiner 400 wird. Jetzt möchte ich das ganze mit 10 Fotodioden auswerten, ich denke da muss ich mich wohl mal mit dem schreiben einer eigenen Libary befassen oder gibt es noch eine andere Alternative ohne viel Codezeilen.

Mein Code falls jemand mal braucht.
Code: [Select]
int sensorPin = A0;  
int sensorValue=0;
int THRESHOLD=400;
int WAITTIME=500;
int State=0;
long startMillis = 0;
int count=0;
int countset=0;

void setup() {
Serial.begin(9600);
 }

 
 void loop() {
 sensorValue = analogRead(sensorPin);    
 
 Serial.print("Sensorwert: ");
 Serial.println(sensorValue);
 
  if (analogRead(A0) < THRESHOLD) {
   if (startMillis && millis() - startMillis > WAITTIME) {
   Status();  
   } else if (! startMillis) {
     startMillis = millis();
   }
 } else {
   startMillis = 0;
   State=0;
   Serial.print("State:");
   Serial.println(State);  
   Serial.println(count);
}
if (count > 10)
{count=1;}

if ((State==1)&&(countset==0))
{
count++;
countset=1;
}

if (State==0)
{countset=0;}
}

void Status()
{State=1;

     Serial.print("State:");
     Serial.println(State);
     Serial.println(count);
}

mkl0815

Du kannst Du Auswertung in eine Funktion packen, der Du den jeweiligen Pin übergibst. Rückgabe ist dann das entsprechende Ergebnis. Intern verwendest Du ein Array um die zum entsprechenden Pin gespeicherten millis() Werte zu verwalten.
Allerdings wirst Du bei 10 Fotodioden um einen Multipexer (CMOS4051) nicht herum kommen, denn Dein Arduino hat nur 6 analoge Eingänge, außer Du hast einen Mega, der hat 16 analoge Eingänge.

Rickor

hab ein Mega für das Projekt. Mit dem array und Funktion hab ich mir auch schon fast so gedacht. Ich werd mich mal in arrays mehr ein arbeiten. Danke.

Go Up