problème gestion 2 oscilateurs

bonsoir,

Je suis sur un projet pour gerer l’éclairage et le brassage (flux + oscillateur)de mon aquarium.
La partie éclairage est ok
La partie gestion du flux brassage est ok
Par contre j’ai un probleme dans le gestion de mes oscillateurs.

Quand mon code ne gère qu’un seul oscillateur, pas de problème.
Dans que je rajoute le deuxième, les moteur fonctionne a tour de role.
J’ai passer ma soiré, et nuit vu l’heure :slight_smile: , a tester, lire des forum … en vain …

Partie du code ok quand utilisé seul :

// oscilo 1 ///////////

for(pososcilo1 = angle1oscilo1; pososcilo1 < angle2oscilo1; pososcilo1 += 1)
{                                
  oscilo1.write(pososcilo1);            
  delay(delaismouvementoscilo);                 
} 
for(pososcilo1 = angle2oscilo1; pososcilo1>=(angle1oscilo1+1); pososcilo1-=1)   
{                                
  oscilo1.write(pososcilo1); 
  delay(delaismouvementoscilo);
}

Et des que je rajoute ca, le probleme arive, le moteur 1 reste figer jusque a se que le moteur 2 est fait son “tour” :

for(pososcilo2 = angle1oscilo2; pososcilo2 < angle2oscilo2; pososcilo2 += 1)
{                                
  oscilo2.write(pososcilo2);            
  delay(delaismouvementoscilo);                 
} 
for(pososcilo2 = angle2oscilo2; pososcilo2>=(angle1oscilo2+1); pososcilo2-=1)   
{                                
  oscilo2.write(pososcilo2); 
  delay(delaismouvementoscilo);
}

Avez vous une idée d’ou vient le problème et comment le solutionner ???

MERCI

Je met le code en entier si besoin:

#include <Wire.h>
#include <RTClib.h>
#include <Servo.h> 

RTC_DS1307 RTC;


/// PIN SORTIE ///
int blanc1 = 2; 
int blanc2 = 3;
int bleu1 = 4;             
int bleu2 = 5;            
int jebao1 = 6;
int jebao2 = 7;
int pinoscilo1 = 8;
int pinoscilo2 = 9;
Servo oscilo1;
Servo oscilo2;



int pwmblanc1=0;
int pwmblanc2=0;
int pwmbleu1=0;
int pwmbleu2=0;
int pwmjebao1=0;
int pwmjebao2=0;
int pososcilo1=0;
int pososcilo2=0;


int time;


//////////////////// reglage puissance eclarage + brassage + oscilo ////////////
////////////////////////////////// MODIFIABLE ///////////////////////////////////////////
int puissanceblanc = 100*2.55; // puissance blanc
int puissancebleu = 100*2.55; // puissance bleu
int puissancejebao1 = 100*2.55; // puissance jebao rw 15
int puissancejebao2 = 100*2.55; // puissance jebao rw 8
int angle1oscilo1 = 0; // angle oscilo entre 0 et 180
int angle2oscilo1 = 5; // angle oscilo entre 0 et 180
int angle1oscilo2 = 0; // angle oscilo entre 0 et 180
int angle2oscilo2 = 5; // angle oscilo entre 0 et 180
int delaismouvementoscilo = 250; // delais mouvement oscilo 

//////////////////// paramettre eclairage ////////////////////////////////
////////////////////////////////// MODIFIABLE ///////////////////////////////////////////
int LEVER = 1000; // heure debut levé
int COUCHER = 2200; // heure fin couché

int progression = 0120; // temps de levé/couché


///////////////////////////////// NE PAS MODIFIER ///////////////////////////////////////////
int LEVERbleu1 = LEVER;                  /// debut lever
int LEVERbleu2 = (LEVER + 0020);         /// debut lever +20 min
int LEVERblanc1 = (LEVER + 0040);        /// debut lever +40min 
int LEVERblanc2 = (LEVER + 0100);        /// debut lever +60min

int finLEVERbleu1 = (LEVER + progression);                  /// fin lever + progression
int finLEVERbleu2 = (LEVER + 0020 + progression);         /// fin lever +20 min + progression
int finLEVERblanc1 = (LEVER + 0040 + progression);        /// fin lever +40min + progression
int finLEVERblanc2 = (LEVER + 0100 + progression);        /// fin lever +60min + progression

int COUCHERbleu1 = (COUCHER - 0040 - progression);       /// debut coucher -40min - progression 
int COUCHERbleu2 = (COUCHER - 0100 - progression);       /// debut coucher -60min - progression 
int COUCHERblanc1 = (COUCHER - progression);             /// debut coucher - progression 
int COUCHERblanc2 = (COUCHER - 0020 - progression);     /// debut coucher -20min - progression 

int finCOUCHERbleu1 = (COUCHER - 0040);                  /// fin coucher -40min
int finCOUCHERbleu2 = (COUCHER - 0100);                  /// fin coucher -60min
int finCOUCHERblanc1 = COUCHER;                         /// fin coucher 
int finCOUCHERblanc2 = (COUCHER - 0020);                /// fin coucher -20min












void setup() {
  

  Serial.begin(9600);
    Wire.begin();
    RTC.begin();
  pinMode(blanc1, OUTPUT);  
  pinMode(blanc2, OUTPUT);  
  pinMode(bleu1, OUTPUT);  
  pinMode(bleu2, OUTPUT);  
  pinMode(jebao1, OUTPUT);
  pinMode(jebao2, OUTPUT);
  oscilo1.attach(pinoscilo1);
  oscilo2.attach(pinoscilo2);
 oscilo1.write(90);
 oscilo2.write(90);
 delay (500);
} 
  
  
  
  
 
  void loop(){
  
//Récupération de l'heure du DS1307**********************************************************************************************
DateTime now = RTC.now();
time = (now.hour()*100)+(now.minute());

 //********************************************************Controle des sorties eclairage *******************************************************

 /////////////////// bleu 1 ///////////////////

if ((time >= LEVERbleu1) && (time < finLEVERbleu1)){ 
    pwmbleu1 = map(time, LEVERbleu1, finLEVERbleu1, 0, puissancebleu);
    analogWrite (bleu1, pwmbleu1);
  }
 else if ((time >= COUCHERbleu1) && (time < finCOUCHERbleu1)){  
   pwmbleu1 = map(time, COUCHERbleu1, finCOUCHERbleu1, puissancebleu, 0);
    analogWrite (bleu1, pwmbleu1); 
  }   
  else if ((time >= finLEVERbleu1 ) && (time < COUCHERbleu1)) {
    pwmbleu1 = puissancebleu;
    analogWrite(bleu1, puissancebleu);
  }
else {
  pwmbleu1 = 0;
    analogWrite(bleu1, 0);
}



/////////////////// bleu 2 ///////////////////

if ((time >= LEVERbleu2) && (time < finLEVERbleu2)){ 
    pwmbleu2 = map(time, LEVERbleu2, finLEVERbleu2, 0, puissancebleu);
    analogWrite (bleu2, pwmbleu2);
  }
 else if ((time >= COUCHERbleu2) && (time < finCOUCHERbleu2)){  
   pwmbleu2 = map(time, COUCHERbleu2, finCOUCHERbleu2, puissancebleu, 0);
    analogWrite (bleu2, pwmbleu2); 
  }   
  else if ((time >= finLEVERbleu2 ) && (time < COUCHERbleu2)) {
    pwmbleu2 = puissancebleu;
    analogWrite(bleu2, puissancebleu);
  }
else {
  pwmbleu2 = 0;
    analogWrite(bleu2, 0);
}



/////////////////// blanc 1 ///////////////////

if ((time >= LEVERblanc1) && (time < finLEVERblanc1)){ 
    pwmblanc1 = map(time, LEVERblanc1, finLEVERblanc1, 0, puissanceblanc);
    analogWrite (blanc1, pwmblanc1);
  }
 else if ((time >= COUCHERblanc1) && (time < finCOUCHERblanc1)){  
   pwmblanc1 = map(time, COUCHERblanc1, finCOUCHERblanc1, puissanceblanc, 0);
    analogWrite (blanc1, pwmblanc1); 
  }   
  else if ((time >= finLEVERblanc1 ) && (time < COUCHERblanc1)) {
    pwmblanc1 = puissanceblanc;
    analogWrite(blanc1, puissanceblanc);
  }
else {
  pwmblanc1 = 0;
    analogWrite(blanc1, 0);
}



/////////////////// blanc 2 ///////////////////

if ((time >= LEVERblanc2) && (time < finLEVERblanc2)){ 
    pwmblanc2 = map(time, LEVERblanc2, finLEVERblanc2, 0, puissanceblanc);
    analogWrite (blanc2, pwmblanc2);
  }
 else if ((time >= COUCHERblanc2) && (time < finCOUCHERblanc2)){  
   pwmblanc2 = map(time, COUCHERblanc2, finCOUCHERblanc2, puissanceblanc, 0);
    analogWrite (blanc2, pwmblanc2); 
  }   
  else if ((time >= finLEVERblanc2 ) && (time < COUCHERblanc2)) {
    pwmblanc2 = puissanceblanc;
    analogWrite(blanc2, puissanceblanc);
  }
else {
  pwmblanc2 = 0;
    analogWrite(blanc2, 0);
}



/////////////////////////////////////// pwm pompe jebao ///////////////////////////////////////
// jebao rw 15 ////////////

if ((time >= LEVERbleu1) && (time < finLEVERblanc2)){ 
    pwmjebao1 = map(time, LEVERbleu1, finLEVERblanc2, 85, puissancejebao1);
    analogWrite (jebao1, pwmjebao1);
  }
 else if ((time >= COUCHERblanc1) && (time < finCOUCHERbleu2)){  
   pwmjebao1 = map(time, COUCHERblanc1, finCOUCHERbleu2, puissancejebao1, 85);
    analogWrite (jebao1, pwmjebao1); 
  }   
  else if ((time >= finLEVERblanc2) && (time < COUCHERblanc1)) {
    pwmjebao1 = puissancejebao1;
    analogWrite(jebao1, puissancejebao1);
  }
else {
  pwmjebao1 = 85;
    analogWrite(jebao1, 85);
}

// jebao rw 8 ////////////

if ((time >= LEVERbleu1) && (time < finLEVERblanc2)){ 
    pwmjebao2 = map(time, LEVERbleu1, finLEVERblanc2, 85, puissancejebao2);
    analogWrite (jebao2, pwmjebao2);
  }
 else if ((time >= COUCHERblanc1) && (time < finCOUCHERbleu2)){  
   pwmjebao2 = map(time, COUCHERblanc1, finCOUCHERbleu2, puissancejebao2, 85);
    analogWrite (jebao2, pwmjebao2); 
  }   
  else if ((time >= finLEVERblanc2) && (time < COUCHERblanc1)) {
    pwmjebao2 = puissancejebao2;
    analogWrite(jebao2, puissancejebao2);
  }
else {
  pwmjebao2 = 85;
    analogWrite(jebao2, 85);
}



// oscilo 1 ///////////

for(pososcilo1 = angle1oscilo1; pososcilo1 < angle2oscilo1; pososcilo1 += 1)
{                                
  oscilo1.write(pososcilo1);            
  delay(delaismouvementoscilo);                 
} 
for(pososcilo1 = angle2oscilo1; pososcilo1>=(angle1oscilo1+1); pososcilo1-=1)   
{                                
  oscilo1.write(pososcilo1); 
  delay(delaismouvementoscilo);
}
for(pososcilo2 = angle1oscilo2; pososcilo2 < angle2oscilo2; pososcilo2 += 1)
{                                
  oscilo2.write(pososcilo2);            
  delay(delaismouvementoscilo);                 
} 
for(pososcilo2 = angle2oscilo2; pososcilo2>=(angle1oscilo2+1); pososcilo2-=1)   
{                                
  oscilo2.write(pososcilo2); 
  delay(delaismouvementoscilo);
}
    


  }

MERCI

C’est normal, la manière dont ton programme est structuré fait que les actions s’exécutent de manière séquentiel.

Avez vous une idée d’ou vient le problème et comment le solutionner ???

Je ne connais pas la forme de ces signaux mais l’utilisation des timers hardware ou de la fonction millis peut aider.