Go Down

Topic: Problème condition, remise à 0 avant prochain essai (Read 80 times) previous topic - next topic

Brasiligun

Bonjour à tous, ça fait un moment que j'ai pas eu l'occasion de poster ici


Je me lance (encore) dans un petit projet, je l'ai quasiment terminé, mais je bute sur une condition

Pour simplifier mon programme, voila je que je souhaite faire pour l'exemple:


Je joue avec un capteur de flexion. Donc en fonction de sa résistance interne, je converti le tout pour savoir son degré d'inclinaison (ça pas de pb ça marche très bien)

Maintenant, la ou ça déconne, je souhaite que passé 10°, donc état initial 0°, passé le cap des 10°, ma led s'allume pendant 2 seconde, puis s'éteint, et que TANT QUE mon flex sensor n'est pas revenu au minimum à 5° (donc entre 0 et 5°), la partie allumage led ne peut se faire

Donc vraiment faire 10° ou plus -> allumage 2s -> extinction et tant que le capteur n'est pas repassé sous la barre des 5°, je ne peux rallumer la led si je passe les 10° à nouveau

Je me suis inspiré d'un exemple que dfgh m'avait fourni à l'époque


Voila la bête:

Code: [Select]

// Déclaration des variables
unsigned long deb =  0;


float angle = 0;          // angle actuel du capteur
const int FLEX_PIN = A0;  // Capteur de flexion sur A0


// Mesure de la tension à 5V et la résistance du capteur (/w multimetre)
// Mettre les vraies valeurs
const float VCC = 4.95; // Mettre valeur mesurer au volmetre sur l'entree 5V de l'arduino
const float R_DIV = 47500.0;         

// Calcul d'angle
const float STRAIGHT_RESISTANCE = 30500.0; // resistance capteur a plat
const float BEND_RESISTANCE = 63200.0; // resistance capteur à 90°



void setup()
{
  //Configuration des Entrées/Sorties
  Serial.begin(9600);

 
  pinMode(FLEX_PIN, INPUT);
 
  pinMode(LED_BUILTIN, OUTPUT); //Led interne, juste pour contrôler le fonctionnement
}

void loop()
{
  flex();
  led();
}


void flex(){
    // Lecture C.A.N, et calcul de la resistance du capteur
  int flexADC = analogRead(FLEX_PIN);
  float flexV = flexADC * VCC / 1023.0;
  float flexR = R_DIV * (VCC / flexV - 1.0);
  Serial.println("Resistance: " + String(flexR) + " ohms");

  // Utilisation de la resistance pour estimer l'angle
  // bend angle:
  angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,
                   0, 90.0);
  Serial.println("Angle: " + String(angle) + " degres");
  Serial.println();
}


void led(){

if (angle > 10){
    deb = millis();
    while ((millis() - deb) < 2000) {
      Serial.println("Led interne ON"); Serial.println();
      digitalWrite(LED_BUILTIN, HIGH);
    }
    digitalWrite(LED_BUILTIN, LOW); //Led interne OFF
    Serial.println("Led interne OFF");
    Serial.println();

    while (angle > 5) {
      ;
    }
  }
}



Ça ne doit vraiment pas être grand chose, mais bon :p


Merci en tout cas!

lesept

Essaye avec ça :

Code: [Select]

// Déclaration des variables
unsigned long deb =  0;


float angle = 0;          // angle actuel du capteur
const int FLEX_PIN = A0;  // Capteur de flexion sur A0


// Mesure de la tension à 5V et la résistance du capteur (/w multimetre)
// Mettre les vraies valeurs
const float VCC = 4.95; // Mettre valeur mesurer au volmetre sur l'entree 5V de l'arduino
const float R_DIV = 47500.0;

// Calcul d'angle
const float STRAIGHT_RESISTANCE = 30500.0; // resistance capteur a plat
const float BEND_RESISTANCE = 63200.0; // resistance capteur à 90°
boolean onPeutAllumerLaLed = true;

void setup()
{
  //Configuration des Entrées/Sorties
  Serial.begin(9600);
  pinMode(FLEX_PIN, INPUT);
  pinMode(LED_BUILTIN, OUTPUT); //Led interne, juste pour contrôler le fonctionnement
}

void loop()
{
  flex();
  led();
}


void flex() {
  // Lecture C.A.N, et calcul de la resistance du capteur
  int flexADC = analogRead(FLEX_PIN);
  float flexV = flexADC * VCC / 1023.0;
  float flexR = R_DIV * (VCC / flexV - 1.0);
  Serial.println("Resistance: " + String(flexR) + " ohms");

  // Utilisation de la resistance pour estimer l'angle
  angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE, 0, 90.0);
  Serial.println("Angle: " + String(angle) + " degres");
  Serial.println();
}


void led() {
  if (angle > 10 && onPeutAllumerLaLed) {
    deb = millis();
    digitalWrite(LED_BUILTIN, HIGH);
    onPeutAllumerLaLed = false;
  }
  if (millis() - deb > 2000) digitalWrite(LED_BUILTIN, LOW);
  if (angle <= 5) onPeutAllumerLaLed = true;
}


A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Brasiligun

C'est parfait! Bien vu pour le booléen, je n'y ai pas pensé du tout  :'(

Merci!

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up