Problème de séquence avec Sensor

Bonjour,

Le code que j'essai de faire fonctionner consiste à créer une séquence de "toucher" avec le doigt d'une PIN, lorsque que la séquence est correcte, un aimant se désactive.
Mais j'ai l'impression que lorsque je touche une pin elle ne se détecte pas, hors les led fonctionnent bien lors du touché (elle s'allume lorsque je touche la PIN et s'éteint quand je ne touche plus la PIN)

Voici le code :

#include <CapacitiveSensor.h>
#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>

#define DEBUG
#define NUMPIXELS 24
#define ledPins 8
#define bouton1 2
#define bouton2 6


const byte numInputs = 2;
const byte inputPins[numInputs] = {2, 6};
const byte numSteps = 5;
const byte steps[numSteps] = {0, 1, 0, 0, 1};
const byte lockPin = A5;

bool lastInputState[] = {HIGH, HIGH, HIGH, HIGH};
int currentStep = 0;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

CapacitiveSensor capSensor = CapacitiveSensor(4, 2);

int threshold = 300;
int threshold2 = 300;

Adafruit_NeoPixel pixels(NUMPIXELS, ledPins, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  pinMode(ledPins, OUTPUT);
  pinMode(bouton1, INPUT_PULLUP);
  pinMode(bouton2, INPUT_PULLUP);
  for(int i=0; i< numInputs; i++){
    pinMode(inputPins[i], INPUT_PULLUP);
  }
  
  pinMode(lockPin, OUTPUT);
  digitalWrite(lockPin, LOW);

  #ifdef DEBUG
    Serial.begin(9600);
    Serial.println(F("Serial communication started"));
  #endif
}


void loop() {
  long sensorValue = capSensor.capacitiveSensor(30);

  Serial.println(sensorValue);

  if (sensorValue > threshold) {
    for (int i = 0; i <= NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(255, 165, 0));
    pixels.show();
   }
  }
  else {
   for (int i = 0; i <= NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));
    pixels.show();
  }
  if (sensorValue > threshold2) {
    digitalWrite(ledPins, HIGH);
  }
  else {
    digitalWrite(ledPins, LOW);
  }
  delay(10);
 }

  if ( (millis() - lastDebounceTime) > debounceDelay) {
  
    for(int i=0; i<numInputs; i++){
      int currentInputState = digitalRead(inputPins[i]);

      if(currentInputState != lastInputState[i]) {
        lastDebounceTime = millis();    
      }
      if(currentInputState == LOW && lastInputState[i] == HIGH) {
        if(steps[currentStep] == i) {
          currentStep++;
          
          #ifdef DEBUG
            Serial.print(F("Correct input! Onto step #"));
            Serial.println(currentStep);
          #endif
        }
        else {
          currentStep = 0;
          Serial.println(F("Incorrect input! Back to the beginning!"));
        }
      }
      
      lastInputState[i] = currentInputState;
    }
  }

  if(currentStep == numSteps){
    onSolve();
  }
}
void onSolve(){

  #ifdef DEBUG
    Serial.println(F("Puzzle Solved!"));
  #endif 

  digitalWrite(lockPin, HIGH);
  delay(300);
  digitalWrite(lockPin, LOW);
  

 }


Merci pour votre aide !

Que voulez vous dire par "toucher une pin" ? vous avez des boutons sur ces pins?

PS:

  • vous avez deux fois Serial.begin(9600); si vous avez défini DEBUG

  • vos boucles for (int i = 0; i <= NUMPIXELS; i++) vont 1 cran trop loin, heureusement pour vous la bibliothèque adafruit vérifie qu'on n'écrit pas en dehors des pixels existants. Mais il faut mettre for (int i = 0; i < NUMPIXELS; i++)

Toucher avec le doigt le bout d'un jumper (celui-ci relié à un arduino), à terme ce sera une pièce de monnaie.

Okay merci pour les autres informations

il faut donc traiter cela comme des pins "capacitive" aussi

regardez l'exemple de la bibliothèque, ils déclarent 3 pins

notez le câblage

Bonjour,

Pour l'avoir testé il y a quelques années avec une stagiaire qui voulait faire un petit clavier capacitif, ça marche relativement bien, avec ou sans bibliothéque, si vous utilisez le montage préconisé.

L'idée étant de jouer sur le temps de charge de la capacité de votre corps entre le bout de votre doigt qui touche la "pin" et la "terre"...

C'est pour cela qu'il faut que votre Arduino soit mis à la "terre" (c'est préconisé dans le lien suggèré par J-M-L

C'est cette partie la plus délicate (la mise à la terre).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.