Pages: 1 [2] 3   Go Down
Author Topic: realisation porte automatique  (Read 4365 times)
0 Members and 1 Guest are viewing this topic.
Pays de la betise
Offline Offline
Sr. Member
****
Karma: 3
Posts: 417
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

salut,

je ne comprend pas l'utilité du switch case, puisque la variable switch1 vaut 1 dans tous les cas ?
Si tu ne dois exécuter une partie du code qu'une fois au démarrage, alors place-le à la fin du setup()

Dans le code actuel, tu lis l'état des verrous une seule fois dans le setup(). Si tu attendais un changement d'état d'une entrée pour pouvoir faire évoluer le comportement du programme, c'est loupé. Ton programme passe à chaque cycle dans le case 1 et fait changer d'état le la sortie relaypc. Il ne se passera rien de plus.

N'oublies pas également les résistances de pull-up ou pull-down sur les entrées et que ton programme est en pause pendant toute la durée du delay()

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

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

Ce qui est dommage (arduino ou pas), c'est les mauvais réflexes de programmation. Le nombre de variables ou constantes définies est assez énorme pour l'utilisation que tu en fais.

il faut préférer un
Code:
#define relayopen A0
qu'un
Code:
const int relayopen = A0;

L'intérêt du #define est de ne pas occuper de mémoire dans le micro-contrôleur, car il remplace (ici) automatiquement relayopen par A0 à la compilation.
même astuce pour ton "width1"... Je suppose que tu ne compte pas le changer pendant l'exécution du programme !

Et en effet, ton switch (sans parler des confusions dans la syntaxe et les accolades) ne sert à rien et les lignes suivantes doivent être placés dans loop() pour être exécutées chaque fois avant les tests.

Code:
  fdcverrouEtat = digitalRead (fdcverrou);
  fdcporteEtat = digitalRead (fdcporte);
  bpescalierEtat = digitalRead (bpescalier);
  bpporteEtat = digitalRead (bpporte);

Sinon, ça n'est pas recommandé par Arduino, mais j'ai toujours programmé mes micro-contrôleurs comme ça : on peut utiliser les registres DDRD, DDRC, ... pour initialiser l'état de plusieurs pattes en une ligne de code très rapide (cf http://www.arduino.cc/en/Reference/PortManipulation)
par exemple :

Code:
DDRC = 63; // B00111111 en binaire (1 pour sorties 0 pour entrées)

remplace les lignes de codes suivantes :

Code:
  pinMode(relayopen, OUTPUT);
  pinMode(relayclose, OUTPUT);
  pinMode(relaylight, OUTPUT);
  pinMode(relaypc, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledrouge, OUTPUT);


En conclusion, tu pourrais réduire la taille de ton code d'environ 70% avec un fonctionnement meilleur, moins lourd et plus rapide.
Logged

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

avant de réduire et optimiser le code, essayons déjà de le faire fonctionner  smiley-lol

parfois, il faut aussi prendre le temps d'écrire sur le papier ce qu'on veut faire pour mieux structurer ses idées... et son code.
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

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

Oui justement je me sentais un peu perdu dans toutes ces lignes smiley-kitty.
De mon point de vue, ça peut aider à trouver ses erreurs.

C'est pas un cahier des charges très compliqué, il devrait pouvoir s'en sortir en lui donnant quelques tuyaux !
Logged

france
Offline Offline
Full Member
***
Karma: 0
Posts: 178
Everybody can do that !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir
Alors :
-
Quote
je ne comprend pas l'utilité du switch case, puisque la variable switch1 vaut 1 dans tous les cas ?
: justement j'ai du mal avec les variables : comment les utiliser pour que le switch/case essai tout les cas?


-
Quote
Si tu ne dois exécuter une partie du code qu'une fois au démarrage, alors place-le à la fin du setup()
: je voudrai execute le switch/case 1 seule fois mais le but est aussi de ne pas executer le reste du programme (a venir par la suite) tant qu'aucune conditions valable n'a été trouver ?


aprés mon "cahier des charges" est bien établit mais dans ma téte (faut juste que je trouve le temps de tout poster sur le forum . Merci aussi pour les conseils de programmation (je vais essayer d'en tenir compte (je suis debutant)).
Logged

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

je crois qu'il y a méprise sur l'utilisation de switch/case. C'est surtout fait pour tester des variables numériques, pas résoudre des équations logiques.
Ce que tu veux, toi, c'est simplement exécuter un bout de code en fonction d'états logiques.
Ca doit ressembler plutôt à ça:

Code:
void loop(){

// partie sécuritée au demarrage
 
  if (fdcverrouEtat == LOW && fdcporteEtat == HIGH){
digitalWrite (relayclose,LOW);
delay (800);
digitalWrite (relayclose,HIGH);
digitalWrite (ledrouge,HIGH);
delay(500);
  }
  else if(fdcverrouEtat == HIGH && fdcporteEtat == HIGH){
digitalWrite (ledrouge,HIGH);
delay(500);
  }
  else if (fdcverrouEtat == LOW || fdcporteEtat == LOW){
    digitalWrite (ledverte,HIGH);
  }

}

tout simplement...

pour t'aider dans la compréhension des instructions: http://arduino.cc/en/Reference/HomePage ou sa (version française)

et si tu découvre la programmation C, un petit tour sur le siteduzero te fera pas de mal.

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

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

un petit tour sur le siteduzero te fera pas de mal.

Tous à la même école  smiley
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 11
Posts: 1304
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

un petit tour sur le siteduzero te fera pas de mal.
Tous à la même école  smiley
Heu... oui... dommage, car le C a été relativement maltraité, car entre le PHP, langage Arduino, et toutes les variantes qu'on lui trouve aujourd'hui, il y a de quoi s'arracher les cheveux...
Logged

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

Quote
langage Arduino
ne nous y trompons pas, le langage arduino n'est jamais qu'un ensemble de macros en C. Ce n'est pas véritablement un langage.
Tu peux coder ton arduino en te passant complétement des bibliothèques arduino. Il suffit d'être compatible avec les fonctions d'avr-lib.
Tu peux même coder en assembleur si tu le souhaites !  smiley-lol

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

france
Offline Offline
Full Member
***
Karma: 0
Posts: 178
Everybody can do that !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

héhé ya du progres :
Quote
#include <SPI.h>

const int relayopen = A0; //Relais 1 connecter au pin A0
const int relayclose = A1; //Relais 2 connecter au pin A1
const int relaylight = A2; //Relais 3 connecter au pin A2
const int relaypc = A3; //Relais 4 connecter au pin A3
const int ledverte = A4; //Led1 connecter au pin A4
const int ledrouge = A5; //Led2 connecter au pin A5
const int bpescalier = 4; //Bouton poussoir 1 (dans l'escalier) connecter au pin 4
const int bpporte = 5; //Bouton poussoir 2 (sur la porte) connecter au pin 5
const int fdcporte = 2; //Fin de course 1 (porte ouverte ou fermer) connecter au pin 2
const int fdcverrou = 3; //Fin de course 2 (verrou) connecter au pin 3

int partieprogramme = 0;


int bpescalierEtat = 0;
int bpporteEtat = 0;
int fdcporteEtat = 0;
int fdcverrouEtat = 0;
int switch1 =  2;
int width1 = 20; // configuration du nombre de repetition de l'animation de demarrage

void setup() {
   
  // configuration des relais et des led
  pinMode(relayopen, OUTPUT);
  pinMode(relayclose, OUTPUT);
  pinMode(relaylight, OUTPUT);
  pinMode(relaypc, OUTPUT);
  pinMode(ledverte, OUTPUT);
  pinMode(ledrouge, OUTPUT);
  // configuration des bp et de fdc
  pinMode(bpescalier, INPUT);
  digitalWrite(bpescalier, HIGH) ;
  pinMode(bpporte, INPUT);
  digitalWrite(bpporte,HIGH);
  pinMode(fdcporte, INPUT);
  digitalWrite(fdcporte, HIGH) ;
  pinMode(fdcverrou, INPUT);
  digitalWrite(fdcverrou, HIGH) ;
  // initialisation de la connection SPI
  Serial.begin(9600);
  // initialisation de l'état des relais et des led
  digitalWrite(relayopen,HIGH);
  digitalWrite(relayclose,HIGH);
  digitalWrite(relaylight,HIGH);
  digitalWrite(relaypc,HIGH);
 
 
  fdcverrouEtat = digitalRead (fdcverrou);
  fdcporteEtat = digitalRead (fdcporte);
  bpescalierEtat = digitalRead (bpescalier);
  bpporteEtat = digitalRead (bpporte);
 
  // animation de demarrage (a placer toujours a la fin)
  for (int i=1;i<width1;i++){
  digitalWrite(ledverte,HIGH);
  delay(30);
  digitalWrite(ledverte,LOW);
  delay(30);
 }
 

}
 
void loop(){

// partie sécuritée au demarrage
  if (partieprogramme == 0) { 
  fdcverrouEtat = digitalRead (fdcverrou);
  fdcporteEtat = digitalRead (fdcporte);
    if (fdcverrouEtat == LOW && fdcporteEtat == HIGH){
        Serial.println("case1");
   digitalWrite (relayclose,LOW);
   delay (800);
   digitalWrite (relayclose,HIGH);
   digitalWrite (ledrouge,HIGH);
   delay(500);
        partieprogramme=1;
  }
  else if(fdcverrouEtat == HIGH && fdcporteEtat == HIGH){
      Serial.println("case2");
      digitalWrite (ledrouge,HIGH);
      delay(500);
      partieprogramme=1;
  }
  else if (fdcverrouEtat == LOW && fdcporteEtat == LOW){
      Serial.println("case3");
      partieprogramme=0;
  }
  else if (fdcverrouEtat == HIGH && fdcporteEtat == LOW){
      Serial.println("case4");
      partieprogramme=0;
  }
}

else if (partieprogramme == 1) {
 
  Serial.println("programme1");
  digitalWrite (relaypc,LOW);
  delay (1000);
  digitalWrite (relaypc,HIGH);
  delay (1000);
}
}

partie0: verification au demarrage
partie1: programme
partie2: partie erreurs
Logged

france
Offline Offline
Full Member
***
Karma: 0
Posts: 178
Everybody can do that !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est bien beau tout sa mais aujourd'hui j'ai enfin reçu mon ethernet shield.
En gros je dispose de mon arduino + du module ethernet et d'un ftp chez free .
Mon souci est de pouvoir contrôler les relais par internet sur mon portable (android) et d'envoyer un email a une certaine adresse (gmail) en cas de défaut.

Logged

france
Offline Offline
Full Member
***
Karma: 0
Posts: 178
Everybody can do that !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Logged

france
Offline Offline
Full Member
***
Karma: 0
Posts: 178
Everybody can do that !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Donc si j'ai bien compris le fonctionnement est le suivant :
arduino + ethernet ------> site en php ------> navigateur .
quelqu'un pourrait mieux m'expliquer comment intégrer le module ethernet dans le programme de l'arduino en fonction du serveur php ? et aussi comment faire le site ?
je m'en sort un peu mieux avec la programmation simple de l'arduino mais la je bloque
Logged

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

Il y a quelques sujets sur le forum qui traitent de la partie php coté serveur.
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

il y a au moins 3 solutions possibles, avec avantage et inconvénients. Rapidement:

arduino (client) <-> serveur <-> navigateur (client)
(+) le serveur est plus robuste et plus facile à mettre en place qu'un web server embarqué dans l'arduino
(-) le client arduino doit régulièrement faire des requêtes au serveur pour l'informer de son état et récupérer les ordres -> trafic permanent entre arduino et serveur

arduino (serveur) <-> navigateur (client)
(+) pas besoin de serveur web externe
(-) plus sensible aux attaques DOS, mise au point plus délicate (mais pas impossible), peu de sécurité

arduino (serveur) <-> client php|serveur php<-> navigateur (client)
(+) idem solution 1, tout en limitant le traffic entre arduino et client php
(-) mise en place.

La première solution semble être la plus adaptée, mais attention au trafic si tu héberges à l'extérieur (free...). Il est fort probable que le trafic soit limités en nombre de requêtes sur une période donnée. A vérifier.

Pour la mise en place, part d'un exemple client web arduino, et comme le dit JF, lis les topics en rapport avec ce sujet sur le forum, ce n'est pas ce qui manque.

Et comme d'habitude, direction le site du zéro pour des cours de php si tu es un peu juste sur le sujet smiley-wink

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] 3   Go Up
Jump to: