Pages: 1 [2]   Go Down
Author Topic: Commande de volet (manuel, horaire, detection de lumiere)  (Read 2878 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello tous
On se retrouve avec une incohérence qui pourrait mettre en danger le moteur ???
Vui , jai eu a gérer ça il y a pas long, un relais supplémentaire (R/T) qui coupe l'alim (phase) avant les boutons, commandé par l'alim des autres relais : 2 diodes pour que dès qu'un des relais est en service => pas de jus sur les boutons. c'est priorité à l'Arduino dans ce cas.  Ne pas oublier de prendre aussi des relais 2R/T pour pouvoir verrouiller la montée ou la descente (erreur de prog. possible)

Esperant que ça te serve
A plus tard
Logged

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 3
Posts: 417
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

à mon sens, il faut que l'arduino gère tout, ou bien rien.
En clair, il faut supprimer la commande actuelle par bouton à accrochage, et la remplacer par 2 BP (ou même un seul) connecté à l'arduino, et les contacts de 2 relais pour commander la montée/descente du volet.

voir PJ pour un exemple de câblage.

Gromain


* Controllingashutter.png (27.73 KB, 945x422 - viewed 28 times.)
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
il faut supprimer la commande actuelle par bouton à accrochage, et la remplacer par 2 BP
oui c'est bien ce que je comptais faire juste mes 2 bp mon arduino 2 relais la photoresistance et basta ( ou peut-etre un moyen de communiquer avec mon phone par bluetooth ou wifi mais ça c'est pour une autres fois ..
Logged

arduino uno
debian squeeze
eee 1000H
arduino 1.0.5

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voici les derniere PETITE modif apporter

Code:
//commande de volet

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down)

//definition des variables
int buttonState1 = 0;       
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
if (buttonState1 == HIGH){ //determine le type de pression et sur quelle boutton
  action = monté_court;
}
else if (buttonState1 == HIGH){
  action = monté_long;
}
else if(buttonState2 == HIGH){
  action = descente_court;
}
else if (buttonState2 == HIGH){
  action = descent_long;
}
switch (action){
  case montécourt:
  digitalWrite(ledPin1, High);//le volet monte
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

case monté_long:
digitalWrite(ledPin2, High);//le volet descent
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la descente)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }   
digitalWrite(ledPin2, LOW);//le volet s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint
default:
//si il est X heure
digitalWrite(ledPin1, HIGH);//le volet monte
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec (durée de la montée)
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
digitalWrite(ledPin2, LOW);        //le moteur s'arrete
}
}

je ne suis pas tres au point niveau programation!  smiley-roll-blue
« Last Edit: May 29, 2011, 05:36:37 pm by supperdd » Logged

arduino uno
debian squeeze
eee 1000H
arduino 1.0.5

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Code:
//commande de volet

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down)

//definition des variables
int buttonState1 = 0;        
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);      
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
//si bp1 est presser et que led d'etat est off
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

//si bp2 est presser et que led d'etat est on
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);//le volet s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint

//si il est X heure
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);        //le moteur s'arrete

}

void Temporisation()
{
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
}

@+

Zoroastre.
« Last Edit: May 29, 2011, 04:56:59 pm by zoroastre » Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voila j'ai aporter tes modifs et j'ai rajouter quelques trucs je ne suis pas sùr que ça soit mieux mais je fait comme je crois !!! on verra bien  smiley-roll-sweat  smiley-roll-blue

Code:
//commande de volet

//definition des constantes
const int buttonPin1 = 2;     //boutton "montée"
const int buttonPin2 = 3;    //boutton "descente"
const int ledPin1 =  13;      // relay "Montéé"
const int ledPin2 =  12;      // relay "Descente"
const int ledPin3 =  11;      // led etat volet (on= up) (off= down)

//definition des variables
int buttonState1 = 0;       
int buttonState2 = 0;

//definition des entree et sorties
void setup(){
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop(){
if (buttonState1 == HIGH){ //determine le type de pression et sur quelle boutton
  action = monté_court;
}
else if (buttonState1 == HIGH){
  action = monté_long;
}
else if(buttonState2 == HIGH){
  action = descente_court;
}
else if (buttonState2 == HIGH){
  action = descent_long;
}
switch (action){
  case montécourt:
  digitalWrite(ledPin1, High);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);//le moteur s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat rest alumé

case monté_long:
digitalWrite(ledPin2, High);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);//le volet s'arrete
digitalWrite(ledPin3, LOW);//la led d'etat s'eteint
default:
//si il est X heure
digitalWrite(ledPin1, HIGH);//le volet monte
Temporisation();
digitalWrite(ledPin1, LOW);  //le moteur s'arrete

//si il est X heure
digitalWrite(ledPin2, HIGH);//le volet descent
Temporisation();
digitalWrite(ledPin2, LOW);        //le moteur s'arrete
}
}
void Temporisation()
{
for (int i=0; i <= 23; i++){   //la led clignotte pendant 25 sec
        digitalWrite(ledPin3, HIGH); // set the LED on
        delay(500);                  // wait for 0,5 second
        digitalWrite(ledPin3, LOW);  // set the LED off
        delay(500);                  // wait for 0,5 second
      }
}
Logged

arduino uno
debian squeeze
eee 1000H
arduino 1.0.5

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai une question, comme il n'y a qu'une boucle (void loop) puis-je demander au µc de faire 2 chose a la fois ??
je m'explique pour l'ouverture/fermeture a heure donné il me faut une horloge ou un compteur de temps mais peut-il compter le temps et tester l'etat des entrée en meme temps ???
j'ai encore du mal avec ce genre de programation
merci de votre patience
Logged

arduino uno
debian squeeze
eee 1000H
arduino 1.0.5

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Le loop est la partie du programme qui sera séquentiellement scruté par le controlleur. On ne peut pas vraiment appeler cela une boucle, par contre le sous-programme "Temporisation" est une boucle, rien d'autre ne peut s'effectuer tant que l'itération du for n'est pas terminée (25 secondes). A part cela, tu peux implémenter d'autres fonctions sans problème.
Il faudra cependant faire attention à la synthaxe, quelques erreurs ici et là.

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 3
Posts: 417
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

la boucle for pour faire une tempo est à proscrire: ton programme est figé pendant l'éxécution de la boucle. Et ton volet incontrôlable (comment l'arrêter en cours ?)

Ce que je te conseille:
1. fais une routine qui te générera des impulsions tous les x millisecondes (ex: 100ms, 500ms, 1000s...) sous la forme de bit à 1 pour un cycle (utilises millis()).
2. lorsque que le bit_100_ms sera à 1, exécute une routine qui lira l'état des entrées et décidera s'il faut faire quelquechose (ouvrir/fermer)
3. lorsque que le bit_100_ms sera à 1, éxécute une routine qui contrôlera s'il est l'heure de faire quelquechose (ouvrir/fermer)
4. à chaque cycle (loop), execute une routine qui actionnera tel ou tel relais en fonction des actions à réaliser.
5. lorsque que le bit_500_ms sera à 1, exécute une routine qui contrôlera s'il faut allumer ou éteindre la led

etc.
ainsi, tu exécuteras des taches séquentiellement, en évitant de monopoliser le µC pour rien.

Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

0
Offline Offline
God Member
*****
Karma: 0
Posts: 798
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Quelle est l'impacte d'une telle modification en terme de sécurité, pour les enfants par exemple ?

On remplace les interrupteurs par des boutons poussoirs, et on pilote le moteur via l'arduino et des relais. Si un obstacle vient à gener la fermeture, quelle est la garantie ou le phénomène qui stoppera le moteur et le mettera en sécurité ?

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 3
Posts: 417
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Si un obstacle vient à gener la fermeture, quelle est la garantie ou le phénomène qui stoppera le moteur et le mettera en sécurité ?

et bien si tu as bien programmé, tu n'as qu'à réappuyer sur un des boutons pour stopper la course du volet  smiley-wink
Il n'y a pas plus ou moins de sécurité qu'avant.
Chez moi, l'appui sur un des boutons pendant le mouvement du volet le stoppe instantanément.

Gromain
« Last Edit: May 30, 2011, 03:22:48 pm by Gromain59 » Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut tout le monde desolé de n'avoir pu repondre plus tôt (fort occuper)
j'ai lu pas mal de tuto mais j'ai tjs du mal

je ne vois pas comment je peux faire ce que tu decrit la quelle commande me conseille tu ??

Quote
Ce que je te conseille:
1. fais une routine qui te générera des impulsions tous les x millisecondes (ex: 100ms, 500ms, 1000s...) sous la forme de bit à 1 pour un cycle (utilises millis()).
2. lorsque que le bit_100_ms sera à 1, exécute une routine qui lira l'état des entrées et décidera s'il faut faire quelquechose (ouvrir/fermer)
3. lorsque que le bit_100_ms sera à 1, éxécute une routine qui contrôlera s'il est l'heure de faire quelquechose (ouvrir/fermer)
4. à chaque cycle (loop), execute une routine qui actionnera tel ou tel relais en fonction des actions à réaliser.
5. lorsque que le bit_500_ms sera à 1, exécute une routine qui contrôlera s'il faut allumer ou éteindre la led

merci pour votre interet
Logged

arduino uno
debian squeeze
eee 1000H
arduino 1.0.5

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 24
Posts: 3171
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu fais comme décris ici :

http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html


Mais avec la fonction millis()
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pays de la betise
Offline Offline
Sr. Member
****
Karma: 3
Posts: 417
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

aller, c'est mon soir de bontés  smiley-twist

ci-dessous un exemple de code qui t'aidera sans doute à bien structurer ton code. C'est la structure type que j'emploie dans mes projets domotiques.

Code:
/*
 * Gromain59
 * xPLDuino
 *
 * Structure type:
 * - bit de cadencement
 *
 * - pre (màj des entrées)
 * - calcul
 * - post (màj des sorties)
 *
 */



//############################### GESTION PULSE ##################################
long prevMillis1000=0;
boolean pulse_1000=0;
long prevMillis100=0;
boolean pulse_100=0;
long prevMillis500=0;
boolean pulse_500=0;


void setup()
{
  // initialize the serial communication:
Serial.begin(115200);

Serial.println("exemple de gestion pulse");

}


// acquition de l'état des entrées, pre-calcul
void pre() {

pulse(); // call pulse generation.

}


void scenario() {


// ici les calculs à réaliser

}


// mis à jour des memoires de sorties
void post() {

if(pulse_1000){
Serial.println("déjà 1 seconde !");
}

if(pulse_500){
Serial.println("plus vite !");
}

if(pulse_100){
Serial.println("trop vite !");
}

}

void loop() {

pre(); // Call pre-traitement

scenario();

post(); // Call post-traitment


}

void pulse(){

  pulse_1000=0;

  if ((millis() - prevMillis1000) >= 1000 || (millis() - prevMillis1000) < 0){
    prevMillis1000 = millis();
    pulse_1000=1;
  }

    pulse_100=0;

  if ((millis() - prevMillis100) >= 100 || (millis() - prevMillis100) < 0){
    prevMillis100 = millis();
    pulse_100=1;
  }
 
    pulse_500=0;

  if ((millis() - prevMillis500) >= 500 || (millis() - prevMillis500) < 0){
    prevMillis500 = millis();
    pulse_500=1;
  }
 
}



Gromain
Logged

"pour résoudre un gros problème, il est souvent plus facile de le diviser en petits problèmes élémentaires..."

projet domotique xPLDuino
IRC: freenode #xplduino

Pages: 1 [2]   Go Up
Jump to: