Anfängerfragen

Hallo allerseits,

ich hab mir vor kurzem einen Nano zugelegt. Da ich weder von Elektronik noch vom Programmieren groß Ahnung habe, hab ich Startschwierigkeiten.

So, nun zu den Fragen:

  1. 5V an A0, Werte per seriellen Monitor ausgeben.
    Beim einstöppeln wird sofort 1023 angezeigt, beim ausstöppel wird der Wert langsam kleiner, bis auf ca 20. Dauert ungefähr 3sek. Die ca. 20 statt 0 habe ich so verstanden das Irgendetwas immer reinstört. Das mit dem langsam runterzählen hab ich so verstanden das am A0 ein Kondensator hängt. Zusätzlich 10k Ohm von A0 nach GND hat das Problem gelöst. Stimmt das so?

  2. Ball tilt sensor & Interrupt
    Ich wollte mir das Prellen eines Schalters mal anschauen. Dazu habe ich folgende Schaltung:
    A0 mit 10k Ohm nach GND
    Sensor eine Seite nach 5V, die andere nach A0 + D2

volatile int werte[10];

void setup() {
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(2), test, RISING);
}

void loop() {}

void test() {
 for (byte i = 0; i < 10; i++) { werte[i] = analogRead(A0); }
 for (byte i = 0; i < 10; i++) { Serial.print(werte[i]); Serial.print( " : "); Serial.println(i) ; }
}

Falls der Schalter nicht prellen würde, würde ich 10x die 1023 bekommen.
Da der Schalter prellt, wird die ISR mehrfach ausgeführt. Ich bekomm oft ca. 1023 selten ca. 900. Sollten dann nicht willkürliche Werte kommen?
Andersrum bekomm ich hin und wieder 10x eine Null. Warum wird da der Interrupt ausgelöst?

zu 1. die 5V nicht nur abstöpseln, sondern A0 auf GND legen, sonst bekommst du irgendwelche Werte
zu 2. die ISR sollte möglichst kurz sein und keine Serial.print enthalten.
Mach in der ISR einfach werte++; und außerhalb der ISR Serial.print(werte);

Schalterprellen ist besser mit digitalRead zu erfassen. Du liest A0, willst aber 2 erfassen.

Du zählst einfach in der ISR eine Variable hoch. (ungetestet)

volatile unsigned int count;
const byte tasterPin = 2;
unsigned int altCount;

void setup() {
  Serial.begin(115200);  // im Seriellen Monitor auch einstellen
  Serial.println("Start");
  pinMode(tasterPin,INPUT_PULLUP); // Taster nach GND klemmen
  attachInterrupt(digitalPinToInterrupt(tasterPin), test, FALLING);
}

void loop() {
   cli();  // interrupt sperren
   unsigned int tmpCount = count; // count holen
   sei(); // interrupt freigeben

   if (altCount != tmpCount) {
     unsigned int diff = tmpCount - altCount;  
     altCount = tmpCount;
     Seriel.println(diff);
   }
    delay(20); // damit der Taster Zeit zum Prellen hat 
}

void test() {
  count++;
}

Gruß Tommy

Hallo,

in einer ISR eine for Schleife und noch einen Serialprint einzubauen da muss man erst mal drauf kommen. Warum machst Du das überhaupt mit einem Interrupt.

lese die Werte im loop in ein Array ein un lass dir anschliessend die Werte anzeigen. Als Trigger nimmst Du einen Analogwert der > 2 ist und setzt einen Merker.

Gruß Heinz

Vielen Dank erst mal, werde das mal ausprobieren.