Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Structure programme pour Arduino



  1. #1
    ecobioelec

    Structure programme pour Arduino


    ------

    Bonjour,

    Je tente de réaliser un chargeur USB manuel à l'aide d'un petit moteur qui fait office de générateur lorsqu'il est actionné via une manivelle.
    Le générateur charge une batterie 12V à l'aide d'un régulateur de charge photovoltaique.
    Les consommateurs sont chargés via des convertisseurs de tension (max 30V => 5V). Les convertisseur de tension sont alimentés par la batterie.
    Dans ce cas de figure, si la batterie est chargée, dès qu'on branche un équipement à charger, il se charge automatiquement.
    Je voudrais que la charge soit rendue possible UNIQUEMENT si le générateur est actionné, autrement dit si quelqu'un fait tourner la manivelle.

    Pour rendre l'utilisation de la manivelle obligatoire, je pensais utiliser un ensemble relais + arduino afin d'ouvrir et de fermer le circuit de charge.
    Le déclencheur serait la tension mesurée aux bornes du générateur : si on detecte une tension on ferme le circuit pour rendre la charge opérationnelle, si pas de tension on ouvre le circuit afin d'interdire la charge.

    Afin d'obliger l'utilisateur à actionner la manivelle , je voudrais temporiser le relais ainsi :

    a - ne pas ouvrir le circuit de charge trop rapidement : il faudrait actionner le générateur au moins 30 sec. pour commencer à charger
    b - ne pas fermer le circuit de charge trop rapidement afin d'éviter les coupures trop fréquentes : si quelqu'un "mouline" trop lentement donc tension en dessous du seuil, si on change de personne pour actionner le générateur, ce délai pourrait être de 10 sec par exemple ...)

    J'arrive aujourd'hui à lire la tension via l'arduino et à afficher les données via le moniteur série grace à ce tutoriel, les valeurs sont cohérentes au regard des résistance utilisées pour le pont diviseur, voici le code fonctionnel :

    Code:
    // Fonction setup(), appelée au démarrage de la carte Arduino
    void setup() {
    
      // Initialise la communication avec le PC
      Serial.begin(9600);
    }
    
    // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
    void loop() {
      
      // Mesure la tension sur la broche A0
      int valeur = analogRead(A0);
      
      // Transforme la mesure (nombre entier) en tension via un produit en croix
      float tension = valeur * (5.0 / 1023.0);
      
      // Envoi la mesure au PC pour affichage et attends 250ms
      Serial.println(tension);
      delay(250);
    }
    Je voudrais maintenant mettre en oeuvre les points a et b pour activer ou fermer une sortie digitale (la 13 par exemple) en fonction de la tension mesurée et d'un délai mais je ne sais pas comment structurer le programme, je m'explique :
    • Par défaut le PIN 13 à l'état bas
    • Le PIN 13 passe à l'état haut SI la tension mesurée est supérieure à un seuil déterminé (disons 0.5) PENDANT plus de 15 secondes.
    • Lle PIN 13 repasse à l'état bas si la tension mesurée est inférieure au seuil (le même 0.5) pendant plus de 10 secondes.


    J'ai modifié le programme existant en ajoutant les constantes et le pinMode mais je coince sur la structure.
    Je présume qu'il faut utiliser un while et un delay, peut-être un case mais ne maîtrisant pas la programmation je suis coincé :

    Code:
    // Constantes
    const int delayOn = 30;       // delai avant d'ouvrir le circuit en cas d'activité - en seconde
    const int delayOff = 10;       // delai avant de fermer le circuit en cas d'inactivité - en seconde
    const int seuil = 0.5;       // valeur du seuil, la je m'arrange en fonction du pont diviseur 
    const int switch = 13;       // le pin attachée au switch
    
    // Fonction setup(), appelée au démarrage de la carte Arduino
    void setup() {
      // Initialise la communication avec le PC
      Serial.begin(9600);
      pinMode(switch, OUTPUT); // le pin attachée au switch en OUTPUT
    }
    
    // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
    void loop() {
      
      // Mesure la tension sur la broche A0
      int valeur = analogRead(A0);
      
      // Transforme la mesure (nombre entier) en tension via un produit en croix
      float tension = valeur * (5.0 / 1023.0);
      
      // Envoi la mesure au PC pour affichage et attends 250ms
      Serial.println(tension);
      delay(250);
    }
    Voici une photo du montage avec le pont diviseur, sans la batterie :



    Merci pour votre aide.

    -----
    Images attachées Images attachées

  2. #2
    ecobioelec

    Re : Structure programme pour Arduino

    J'avance lentement, je n'ose pas ajouter "surement"
    J'arrive désormais à changer l'état de ma sortie en fonction de la tension :
    Code:
    // Fonction setup(), appelée au démarrage de la carte Arduino
    void setup() {
    
      // Initialise la communication avec le PC
      Serial.begin(9600);
      pinMode(13, OUTPUT);           // set pin 13 to output
    }
    
    // Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
    void loop() {
      
      // Mesure la tension sur la broche A0
      int valeur = analogRead(A0);
      
      // Transforme la mesure (nombre entier) en tension via un produit en croix
      float tension = valeur * (5.0 / 1023.0);
    
    if (tension >= 0.1 )
    {   
       // pin 13 on
       digitalWrite(13, HIGH); 
      }
    else
    {   
      // pin 13 off
      digitalWrite(13, LOW);
      // Envoi la mesure au PC pour affichage et attends 250ms
      Serial.println(tension);
      delay(250);  
      }
    }
    Je ne vois en revanche pas comment structurer la boucle relative au temps :
    dès que tension > 0.5 je démarre un timer et j'active la sortie 13 qu'au bout de 15 seconde continue.
    idem pour désactiver la sortie 13.

    En tout cas c'est rude, c'est compliquer le chinois

  3. #3
    ecobioelec

    Re : Structure programme pour Arduino

    Bonjour,

    Le code est enfin fonctionnel :

    Code:
    const byte u_generateur = A0; // on utilise le pin A0 pour lire la tension aux borne du générateur
    const byte interrupteur = 13;    // on utilise le pin 13 pour commander l'interrupteur
    unsigned long dateDernierChangement = 0;
    const int seuil = 10;    // seuil de tension à partir duquel on autorise ou coupe la charge
    const int delai_switch_on = 10000;    // delai avant d'autoriser la charge
    const int delai_switch_off = 10000;    // delai avant de couper la charge
    void setup() {
    Serial.begin(9600);
    pinMode(u_generateur, INPUT); // le pin A0 en entrée, tension générateur
    pinMode(interrupteur, OUTPUT); // le pin 13 en sortie, commande interrupteur
    }
    void loop()
    {
      static enum {PLUS, MOINS, INCONNU} etat=INCONNU;
      int valeur = analogRead(u_generateur); // Mesure la tension sur la broche A0
      float tension = valeur * (100 / 1023.0); // Transforme la mesure (nombre entier) en tension via un produit en croix
      unsigned long dateCourante = millis();
      unsigned long intervalle = dateCourante - dateDernierChangement;
      Serial.println(tension); // on envoie la tension dans le moniteur série
    
      if (tension >= seuil)
      {
        if (etat == PLUS)
        {
          if  (intervalle > delai_switch_on)
            digitalWrite(interrupteur, HIGH);
        }
        else
        {
          // on vient de changer d'état
          dateDernierChangement = dateCourante;
          etat = PLUS;
        }
      }
      else
      {
        if (etat == MOINS)
        {
          if (intervalle > delai_switch_off)
            digitalWrite(interrupteur, LOW);
        }
        else
        {
          // on vient de changer d'état
          dateDernierChangement = dateCourante;
          etat = MOINS;
        }
      }
      delay(250);
    }
    Merci à Kamill pour son aide !

Discussions similaires

  1. [Programmation] [Arduino] Programme pour accélérometre
    Par Raptor44450 dans le forum Électronique
    Réponses: 1
    Dernier message: 08/04/2016, 12h33
  2. Programme pour arduino
    Par f1abr36 dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2015, 12h06
  3. [Arduino] Programme pour accélérometre
    Par Jusepith dans le forum Électronique
    Réponses: 12
    Dernier message: 03/05/2015, 22h21
  4. Adaptation d'un programme Arduino pour Zigbee
    Par thomas785 dans le forum Électronique
    Réponses: 0
    Dernier message: 30/04/2014, 17h25
  5. Programme pour carte arduino
    Par robotfan dans le forum Électronique
    Réponses: 17
    Dernier message: 28/11/2013, 07h52
Découvrez nos comparatifs produits sur l'informatique et les technologies.