Probleme lecture d'une boucle dans arduino pour une condition IF

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, j'ai déja posté une demande d'aide sur le même programme mais ici le soucis est tout different Apres des heures d'arrachage de cheveux je ne comprend toujours pas pourquoi quand je compile il n'y as aucun soucis et quand je verifie mes branchements etc electronqiues tout me parait bon apres 3 révisions mais j'ai toujours un soucis a la fin de mon programme dans ma double condition IF , il est sensé faire tourner un moteur DC de base et le soucis c'est qu'en réalité le moteur tourne sans discontinuer sur une période de 2 sec / pause / 2 sec etc … sauriez vous d'ou vien le probleme ? merci d'avance

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
#include <Servo.h>
Servo myservo;  
int posfermer = 0;    // variable du servo moteur
int posouvert = 110;
int putPin = A3; // humidity
int tempc = 0,tempf=0; // temperature variables
int samples[8]; // variables to make a better precision
int maxi = -100,mini = 100; // to start max/min temperature
int i;

int thermoPinint = A5; // là où est branché le LM35
int tempCint;  // température en degrés celcius
int tempKint;  // conversion en Kelvin
int readingint;  // lecture brute de l'entrée analogique (0 à 1024)

int thermoPinext = A1; // là où est branché le LM35
int tempCext;  // température en degrés celcius
int tempKext;  // conversion en Kelvin
int readingext;  // lecture brute de l'entrée analogique (0 à 1024)

byte sens1 = 1;
byte sens2 = 2;
float humi = 0;
float prehum = 0;
float humconst = 0;
float truehum = 0;
float pretruehum = 0; 
long pretruehumconst = 0; 
long valb = 0;
int posvolet = 0;

void setup()
{
Serial.begin(9600); // start serial communication
myservo.attach(7);  
pinMode(13,OUTPUT);
digitalWrite (13,LOW);
}

void loop()
{
pinMode(sens1, OUTPUT);
pinMode(sens2, OUTPUT);

if (tempCint > 36)
{
    // in steps of 1 degree
    myservo.write(posouvert);              // ordonne au servo d'atteindre la position "pos"
    delay(15);                       // attendre 15 ms que le servo atteigne la position
}
else
{
    myservo.write(posfermer);              // ordonne au servo d'atteindre la position "pos"
    delay(15);                       // attendre 15 ms que le servo atteigne la position
}

// mesure intérieur
  readingint = analogRead(thermoPinint);

 // conversion en celcius
  tempCint = round(readingint/2);

 // conversion en Kelvin
  tempKint = tempCint + 273;

 // mesure extérieur
  readingext = analogRead(thermoPinext);

  // conversion en celcius
  tempCext = round(readingext/2);

  // conversion en Kelvin
  tempKext = tempCext + 273;
Serial.print("   Temp int  "); 
Serial.print(tempCint); 
Serial.print("   Celsius           "); 
Serial.print(tempKint); 
Serial.println("  Kelvin");
Serial.print("   Temp ext  "); 
Serial.print(tempCext); 
Serial.print("   Celsius           "); 
Serial.print(tempKext); 
Serial.println("  Kelvin");

//le soucis est ici
if ((tempCint < 6) && (posvolet = 0)){
  digitalWrite(sens1, HIGH);  
  digitalWrite(sens2, LOW);   
  delay(2000);   
  digitalWrite(sens1, LOW);    
  digitalWrite(sens2, LOW);
  posvolet = 1    ;
}
if ((tempCint > 8) &&  (posvolet = 1)){
  digitalWrite(sens1, LOW);   
  digitalWrite(sens2, HIGH);    
  delay(2000);
  digitalWrite(sens1, LOW);   
  digitalWrite(sens2, LOW); 
  posvolet = 0    ;
}
tempc = 0;
delay(2000); // delay before loop
}

Édité par artragis

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

J'ai reformatté ton code afin de le rendre un poil plus lisible,

Personnellement ce que je vois dans ce bout de code

1
2
3
4
5
6
7
  digitalWrite(sens1, HIGH);  
  digitalWrite(sens2, LOW);   
  delay(2000);   
  digitalWrite(sens1, LOW);    
  digitalWrite(sens2, LOW);

   posvolet = 1    ;

c'est : faire tourner le moteur dans le sens 1 pendant deux secondes puis l'éteindre. Affecter une nouvelle valeur à posvolet.

Je pense que c'est exactement ce que tu veux faire.

Le problème vient de (tempCint < 6) && (posvolet = 0) en effet posvolet = 0 signifie "mettre 0 dans posvolet et retourner 0 (i.e false). Du coup tu n'entreras jamais dans cette condition.

A l'opposé, tant que tempCint vaudra plusque 8 (posvolet = 1) affectera 1 à posvolet et retournera 1 (i.e true). Du coup tu rentreras toujours dans cette condition.

Donné que tu es dans le loop, tu as donc "je tourne pendant deux secondes, et je fais une pause pendant deux secondes".

PS: je me suis rendu compte que j'ai complètement oublié d'écrire la réponse à la question : il suffit de remplacer le = dans la condition par ==.

Édité par artragis

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte