Go Down

Topic: Utiliser valeur du potentiomètre pour décaler une action (Read 8 times) previous topic - next topic

gunsman76

Il y a quelque chose qui bloque.

Potentiomètre à 0 ça marche mais seulement quelques secondes, si je déclenche l'infrarouge j'ai bien ma led verte qui s'allume. Mais la led rouge ne s'allume pas longtemps, au bout d'une trentaine de seconde malgré l'allumage de la led verte, la rouge ne s'allume plus.

Et ce quelque soit la position du potard

infobarquee

si tu multiplie un nombre par 1, ca donne quoi à ton avis?  :smiley-mr-green:
Quote
timerledrouge = timerledverte +(potard*1);//nouveau prog


tu travaille en millisecondes donc il faut multiplier par XXXX
1 ms = 0.001 sec
donc si je calcule bien, tu dois multiplier par 1000 potar pour être bon
si ton décalage doit être de 5s, ca te donne sauf erreur 5000ms

donc on schématise
1- declenchement de la led verte
2- on récup l'instant T en miilis => timerledverte = millis();
3- on récup la valeur du potar =>mesureBrute=analogRead(RVar);  mesure=map(mesureBrute,0,1023,0.0,1000.0);
4- on calcule le temps d'allumage de la led rouge => timerledrouge = timerledverte +(potard*1000);
5- on regarde si tout est bon pour allumer la led,
6 en imaginant que la rouge doit s'allumer de suite
if(etat==HIGH & timerledrouge < millis()){
    digitalWrite(Ledrouge, HIGH);
  }else{
          digitalWrite(Ledrouge, LOW);
           }

le mieux serait quand même un papier et crayon
tu marque ce qu'il doit se passer
------------détection-----------------
         /                    \
oui-------------------------------------non
  |                                          |
led verte                            rien a faire
temps potar                       donc on boucle
etc...

gunsman76

Je te remercie pour tes explications, j'avance petit à petit.

J'ai donc suivi tes explications à la lettre, en essayant de comprendre, c'est beaucoup plus clair mais ça ne fonctionne pas.

La led verte s'allume sans problème lorsque je coupe l'IR mais la led rouge s'allume uniquement quand le potard est à 0, si je le tourne pour qu'il affiche 2 ça ne marche plus, même si j'attends un bon moment.

Je pense qu'il y a un bug dans mon programme, j'ai dû raté quelque chose.

Code: [Select]

// include the library code:
#include <LiquidCrystal.h>

// initialisation librairie LCD
const int RS=2;
const int E=3;
const int D4=4;
const int D5=5;
const int D6=6;
const int D7=7;

const int RVar=0; //potentiomètre 1 "col"
const int RVar1=1; //potentiomètre 2 "fond"
const int RVar2=2; // potentiomètre 3 "Travers"

const int photoIR=3; //cellule mesure de lumière ARCHE

const int Ledverte=8;
const int Ledrouge=9;

int timerledverte=0;
int timerledrouge=0;

int sensorValue=0;
long time=0;
int timeHasCome=0;

int mesureIR=0; //Infrarouge initialisation
int mesureBrute=0; // Potard initialisation

int seuil=500; //Infrarouge seuil sensiblité passage pièce

float mesure;
float potard;
float potard1;
float potard2;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;

LiquidCrystal lcd(RS,E,D4,D5,D6,D7);

void setup() {
  // set up LCD indication nb colonne et case:
  lcd.begin(16, 2);
  lcd.clear();
  delay(10);
  // Print a message to the LCD.
  lcd.print("Piochel 2013");
  delay(1000);
  lcd.clear();
  delay (10);
   lcd.print("Initialisation...");
  delay(2000);
  lcd.clear();
  delay (10);
 
  pinMode (Ledverte, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
 
  Serial.begin(115200);
 
}

void loop() {

 
// initialisation LCD 
 
 
  lcd.home();
  lcd.print("Col");
  lcd.setCursor(6,0);
  lcd.print("Fond");
  lcd.setCursor(13,0);
  lcd.print("Tra");
 
 
// Passage pièce devant InfraRouge 

 
   mesureIR=analogRead(photoIR);
  if (mesureIR<seuil) {//Serial.println("Piece detecte");
  digitalWrite (Ledverte, HIGH);
  }
   
  else {
    digitalWrite(Ledverte,LOW);
  }
 
do {
    mesureIR = analogRead(photoIR);
  } while(mesureIR < seuil);
 
 
 
// Mesure et décalage temps et inscription sur LCD

 
// Initialisation 1er potard
  etat=digitalRead(Ledverte);
  timerledverte=millis();
   
  mesureBrute=analogRead(RVar);
  mesure=map(mesureBrute,0,1023,0.0,100.0);
 
  potard=mesure;
  lcd.setCursor(0,1);
  lcd.print(potard,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");


  timerledrouge = timerledverte + (potard*1000);//nouveau prog
  if(etat==HIGH & timerledrouge < millis()){//nouveau prog
  digitalWrite(Ledrouge, HIGH);//nouveau prog
  }//nouveau prog
 
  else//nouveau prog
  {//nouveau prog
  digitalWrite(Ledrouge,LOW);//nouveau prog
  }//nouveau prog
 
 
// nouveau programme test

//int temps;
//int test=0;

//if(millis()+(potard)) {
// test=0;
// }else{
//  digitalWrite(Ledrouge,HIGH);
 
//}
   
// Initialisation 2e potard
 
  mesureBrute=analogRead(RVar1);
  mesure=map(mesureBrute,0,1023,0.0,100.0);
 
  potard1=mesure/10.0;
  lcd.setCursor(7,1);
  lcd.print(potard1,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");
 
 
// Initialisation 3e potard

 
  mesureBrute=analogRead(RVar2);
  mesure=map(mesureBrute,0,1023,0.0,100.0);
 
  potard2=mesure;
  lcd.setCursor(13,1);
  lcd.print(potard2,0);
  if (mesure < 1000) lcd.print(" ");
  if (mesure < 100) lcd.print(" ");
  if (mesure < 10) lcd.print(" ");

 
// Decalage des ouvertures electrovanne

//int etat;

//etat=digitalRead(Ledverte);

//if(etat==HIGH){
//  time1=millis();
//  if (time2=time1++(potard));
 
//  digitalWrite(Ledrouge, HIGH);
//}
//else (millis() + (potard1))

//  digitalWrite(Ledrouge, LOW);
//}
 
  }


 






gunsman76

Ou alors on fait fausse route et au lieu de s'occuper de la led verte on reste indépendant de la led verte mais ont déclenche une action (allume led rouge)  lorsque la barrière Infrarouge est déclenché avec comme délai le potard.


Parce que là (bon je suis pas non plus trop calé) mais j'ai passé l'après midi à faire des essais sans que ce soit concluant.

infobarquee

allez avec un truc de ce genre ca devrait le faire.
j'ai viré pas mal de truc comme lcd, la flemme d'en monter un.
j'ai pris un PIR pour le test

Quote
const int RVar = A0; //potentiomètre 1 "col"
const int RVar1 = A1; //potentiomètre 2 "fond"
const int RVar2 = A2; // potentiomètre 3 "Travers"
const int photoIR = A3; //cellule mesure de lumière ARCHE
const int Ledverte = 8;
const int Ledrouge = 9;


int timerledverte = 0;
int timerledrouge = 0;

int sensorValue = 0;
long time =0;
int timeHasCome = 0;

int mesureIR = 0; //Infrarouge initialisation
int mesureBrute = 0; // Potard initialisation
int mesureBrute1 = 0; // Potard initialisation
int mesureBrute2 = 0; // Potard initialisation

int seuil = 500; //Infrarouge seuil sensiblité passage pièce

float mesure;
float mesure1;
float mesure2;

//float potard;
//float potard1;
//float potard2;
int potard = 0;
int potard1 = 0;
int potard2 = 0;

unsigned long time1;
unsigned long time2;
int etat;

int val=0;


void setup() {
  pinMode (Ledverte, OUTPUT);
  pinMode (Ledrouge, OUTPUT);
  pinMode (RVar, INPUT);
  pinMode (RVar1, INPUT);
  pinMode (RVar2, INPUT);
  pinMode (photoIR, INPUT);
  digitalWrite(Ledverte,LOW); 
  digitalWrite(Ledrouge,LOW); 
  Serial.begin(9600);
  Serial.println("initialisation PIR");
  delay(3000);
}

void loop() {
  //mesureBrute=analogRead(RVar);
  //mesure=map(mesureBrute,0,1023,0.0,100.0);
  mesure = 1;
  potard=mesure*10000;
  Serial.print("Lecture mesure1 : ");
  Serial.print(mesure);
  Serial.print("Lecture potar1 : "); 
  Serial.println(potard);
 

// Passage pièce devant InfraRouge 

 
   mesureIR = digitalRead(photoIR);
   if (mesureIR == HIGH) {
  //if (mesureIR < seuil) {
    Serial.println("Piece detecte");
    digitalWrite (Ledverte, HIGH);
    timerledverte=millis();
    testledrouge();
  }
   
  else {
    digitalWrite(Ledverte,LOW);
  }
 
}
 
  void testledrouge()

  Serial.println("Testled rouge");
// Mesure et décalage temps et inscription sur LCD
 
// Initialisation 1er potard
  etat=digitalRead(Ledverte);
  Serial.println(etat);
  timerledrouge = timerledverte + potard;
  Serial.println(timerledrouge);
 
  if(etat==HIGH && timerledrouge > millis()){
    digitalWrite(Ledrouge, 1);
  }
  else
  {
    digitalWrite(Ledrouge,0);
  }


  }


 




Go Up