Si tu regardes juste si la valeur renvoyée est supérieure à 0 ? en gros, si tu as une valeur en entrée, c'est que le capteur est branché. Sinon je comprend pas trop.
Tu peux aussi utiliser les pull-in et pull-out du port analogique : si le port réponds en entrée aux pull-in que tu fais (digitalWrite(14,LOW) puis analogRead(0) et digitalWrite(14,HIGH) suivi de analogRead(0)), c'est qu'il n'y a rien de branché, right ?
Je vais essayer ce soir, je dis ça juste comme ça.
En tout cas je pense que c'est possible, puisque j'utilise les ports de l'Arduino en capteur capacitif en mesurant le temps avant que le port ne soit complètement chargé : je pense que ce temps varie selon ce qui y est branché.
Tu peux m'en dire plus sur le capteur que tu utilises ? Je testerai en conditions similaires.
digital 14 = analog 0
digital 15 = analog 1
etc...
Sur un port en sortie, effectivement digitalWrite met le port à HIGH ou le port à LOW mais sur un port en entrée, cela revient à positionner des résistances de tirage haut ou bas (en anglais, des "pull-up" et des "pull-down").
Si un capteur est connecté et applique une tension nulle, alors la pull-up n'aura pas d'effet sur lui (le capteur est "plus fort" que la résistance de tirage). Si un capteur est connecté et applique une tension maximum, alors la pull-down n'aura pas d'effet sur lui. On aura ainsi détecté qu'il y a un capteur connecté.
Bon, ça c'est la théorie, je passe à la pratique après le diner
Hey ! on est déjà demain, donc j'ai une solution
Juste une dernière tentative avant d'aller me coucher et ça a marché.
En rouge le signal, et en vert la connection. Lecture de droite à gauche. J'ai débranché le capteur et je l'ai rebranché, d'où le creux.
Le capteur utilisé est un softpot linéaire (tout ce que j'avais sous la main en fait).
Donc le code :
void setup()
{
// liaison série pour le debug
Serial.begin(115200);
// patte analogique 0 (= digital 14) en entrée
pinMode(14,INPUT);
// résistance de tirage haut (pull-up) adapté au capteur analogique Softpot
digitalWrite(14,HIGH);
}
void loop()
{
// première ligne (en rouge), la valeur du capteur
Serial.print(analogRead(0));
Serial.print(" ");
// seconde ligne (en vert), le test de connection
Serial.print(isConnected()?500:0);
Serial.print(" ");
// troisième valeur non signifiante, pour garder l'oscillo 3D en fonction
Serial.print(0);
Serial.print(" ");
Serial.println();
delay(50);
}
/**
* Test de connection d'un capteur sur l'entrée analogique 0
* à adapter selon votre capteur (risque de boucle infinie dans le while)
*/
boolean isConnected(void)
{
int count = 0;
// mettre à zéro volts la patte analog 0
pinMode(14,OUTPUT);
digitalWrite(14,LOW);
// puis repasser en entrée avec pull-up
pinMode(14,INPUT);
digitalWrite(14,HIGH);
// et plus qu'à compter la "charge" de la patte 0
// comme avec un capteur capacitif
while (digitalRead(14) != HIGH) {
count++;
// ici, rajouter une sortie lorsque le compteur est supérieur à ... selon vos tests
if (count > 10) return true;
}
// on remarque que lorsque le capteur est débranché, c'est immédiat,
// donc count = 0 mais si le capteur est branché, on a une valeur non nulle
// on ne test le compteur que lorsqu'il y a un doute sur la connection
return analogRead(0) != 1023 || count != 0;
}
Voilà, donnez vos résultats et vos idées pour améliorer.