Arduino et phototransistor

Vu que l'Arduino est opérationnel (voir l'article précédent), je réalise un petit montage de détection et chronométrage. Je vais utiliser une diode infrarouge et un phototransistor.

Sur le schéma suivant :

Le schéma électrique

Pourquoi ces valeurs de résistances ?

Pour le code, le but est de détecter s'il y a quelque chose ou rien devant le phototransistor et pendant combien de temps. J'ai trouvé deux solutions.

Pour la première, à chaque boucle je compare l'état de l'entrée à son état à la boucle précédente. Si ça a changé je l'indique sur le port série. En plus, je calcule la durée de chaque état.

const byte lecture = 3;

bool etat = 0;
bool etat_precedent = 0;

unsigned long temps = 0;
unsigned long instant = 0;
unsigned long instant_precedent = 0;
unsigned long duree = 0;

void setup() {
    Serial.begin(9600);
    pinMode(lecture, INPUT);
}

void loop() {
    if ( millis() > temps ) {
        temps += 5000;
        Serial.println(temps/1000);
    }
    etat_precedent = etat;
    etat = digitalRead(lecture);
    if ( etat != etat_precedent ) {
        instant_precedent = instant;
        instant = millis();
        duree = (instant - instant_precedent);
        if ( etat == 0 ) {
            Serial.println("Quelque chose");
            Serial.println(duree);
        } else {
            Serial.println("Rien");
            Serial.println(duree);
        }
    }
}

Pour le second, j'utilise des interruptions pour détecter les changements d'état du phototransistor.

const byte lecture = 3;

volatile byte tour = 0;
volatile byte detour = 0;

unsigned long temps = 0;
volatile byte evenement = 0;
volatile unsigned long instant_precedent = 0;
volatile unsigned long instant = 0;
unsigned long duree = 0;

void setup() {
    Serial.begin(9600);
    pinMode(lecture, INPUT);
    attachInterrupt(digitalPinToInterrupt(3), es, CHANGE);
}

void loop() {
    delay(500);

    if ( evenement != 0 ) {
        if ( evenement == 1 ) {
            Serial.println("Quelque chose");
        } else {
            Serial.println("Rien");
        }
    evenement = 0;
    duree = (instant - instant_precedent);
    Serial.println(duree);
    }
}

void es() {
    instant_precedent = instant;
    instant = millis();
    if ( digitalRead(lecture) == 0 ) {
        evenement = 1;
    } else {
        evenement = 2;
    }
}

Voila les deux programmes fonctionnent. Je verrais par la suite si l'un des deux est préférable à l'autre.

Commentaires

Pas encore de commentaire.

Ajouter un commentaire

Vous pouvez utiliser la syntaxe Markdown dans votre commentaire.

Fil Atom des commentaires