Créer deux sorties signaux carré "horloges" différentes et simulatanément

Bonjour,

Je suis entrain de travailler sur un projet dans le cadre de mon boulot et je commande un interrupteur en envoyant un signal 0-5 v transistor mosfet qui commande un relais, cette horloge a un premier etat haut de 640 sec et aprés et périodique de 140 sec. Mon signal sort de la pin A0 et je voudrais créer une deuxieme "horloge réglable" un premier etat haut de 140 sec puis et périodique de 75 sec qui sortirai sur la pin A1. je voudrais que c'est deux horloges démarre en meme temps. Mon probleme est que le déroulement d'un programme se fait etape par etape comment faire deux choses a la fois.

Aujourd'hui j'utilise deux carte avec deux programme differentes je voudrai utiliser qu'une seule carte ci c'est possible.

Voici mes deux codes:

Le code mis sur le microcontrôleur Arduino ORANGE (13200 tr/min 3N.m)

int horloge=A0; // on dit sur quelle pin on va sort irle signal ici la pin analogique 0
int compteur=0; // on initialise un compteur qui va compter le nombre de (montées et descentes)
void setup()
{
pinMode(horloge, OUTPUT); // on dit que la pin horloge est une sortie de signal.
}
void loop()
{
compteur=0; // on réinitialise la variable à 0 pour repartir recompter jusqu'à 3000
digitalWrite(horloge, HIGH); //longue monté au début pour atteindre vitesse max
delay(169000); //*1000 durer de monter à la vitesse max
while(compteur<3000)
{
digitalWrite(horloge, LOW); // état bas
delay(75000); //*1000 car en milliseconde dans les parenthèses
digitalWrite(horloge, HIGH); // état haut
delay(75000); //*1000
compteur++; // on incrémente la variable compteur de la valeur « 1 »
}
}

deuxiemes code sur l'autre carte arduino
Le code mis sur le microcontrôleur Arduino BLEU (6000 tr/min 11N.m)

int horloge=A0; // on dit sur quelle pin on sort le signal ici la pin analogique 0
int compteur=0; // on initialise un compteur qui va compter le nombre de (montées et descentes)
void setup()
{
pinMode(horloge, OUTPUT); // on dit que la pin horloge est une sortie de signal
}
void loop()
{
compteur=0; // on réinitialise la variable à 0 pour repartir
digitalWrite(horloge, HIGH); //longue monté au début pour atteindre vitesse max
delay(641000); //*1000 durer de monter à la vitesse max
while(compteur<3000)
{
digitalWrite(horloge, LOW); // état bas
delay(140000); //*1000 car en milliseconde dans les parenthèses
digitalWrite(horloge, HIGH); // état haut
delay(140000); //*1000
compteur++; // on incrémente la variable compteur de la valeur 1
}
}

hor.bmp (2.37 MB)

Bonjour,
Les delay sont blocants (ton programme ne fait rien pendant ce temps, si il attend).
Remplace tes delay par une fonction équivalente;
Faire une recherche sur le site Arduino avec "blink without delay" et tu trouveras la solution.
@+

Remarque préalable : mets ton code entre les balises codes --> icone #.
Le code est plus facile à lire et par là même tu auras plus de chance d'avoir une réponse.

La solution est dans l'utilisation des timers ( c'est en fait ce qu'Icare te propose de découvrir :grin: ).
Un timer ce n'est rien d'autre qu'un compteur numérique implanté sur la même puce que la partie micro-controleur mais qui vit sa vie indépendamment du micro-controleur. C'est pour cette raison qu'ils ne sont pas bloquants. La liaison entre les deux se limite à la configuration de différents registres par la partie micro.

Ce qui me gêne dans ton affaire c'est la valeur des périodes : 140s et 640s cela fait beaucoup, même avec le timer 16 bits ce n'est pas possible directement sans diminuer fortement la fréquence du quartz ce qui posera d'autres problèmes..
J'aurais tendance a proposer une solution mixte.

  • gèrer avec le timer une partie variable.
  • ajouter en externe des diviseurs fixes pour obtenir les bonnes fréquences.

Merci à vous deux pour vos réponses rapides par contre je ne comprend pas trop.
"gèrer avec le timer une partie variable.

  • ajouter en externe des diviseurs fixes pour obtenir les bonnes fréquences."
    Je suis novice dans ce domaine et ne connait pas des diviseurs fixes et as tu un exemple sur comment "gèrer avec le timer une partie variable. "?
    Merci encore, c'est cool de trouver de l'aide

Il n'y a pas besoin de toucher aux timers.
Comme le suggérait Icare il suffit d'utiliser millis() qui permet de gérer des temps sur de longues périodes.
Le programme BlinkWithoutDelay se trouve dans les exemples livrés avec la chaîne Arduino

Je n'avais pas pensé à millis(), si cela fonctionne tant mieux.

Je reviens sur ma partie fixe et variable.
Le micro est cadencé par une fréquence d'horloge de 16 MHz (16 million de hertz).

Tu veux une impulsion toutes les 160s ce qui correspond à une fréquence de 1/160 = 6,25 milli hertz.
Pour passer de 16 MegaHertz à 6,25 milli hertz il faut diviser par: 16E6/6,25E-3 = 2,56 E9.
Cette ampleur de division le micro n'est dimentionné pour le faire. Mais il existe des circuits intégrés diviseurs tout fait qui permettent de faire n'importe quel rapport de division avec des composant extérieur (pas simple) et des modèles qui divisent directement par 10, 100 1000
Il est possible d'utiliser les diviseurs internes du micro-contrôleur pour diviser par 2560, le micro délivrera une fréquence égale à 16E6/2 560 = 6250 Hz ou 6,25 kHz. Ce signal sera appliqué sur l'entrée d'un diviseur par 1000, suivi par un autre diviseur par 1000.

Mais si la fonction millis() fonctionne c'est plus astucieux et oublie ce que je t'ai dit.

Tu devrais jeter un oeil là : [Lib] SoftTimer - Une lib pour faciliter les taches périodique ou liées au temps - Réalisations et Projets Finis - Arduino Forum
Cette librairie pourrait t'aider à résoudre ton problème

bonjour
ce serait quand même plus simple de prendre la sortie d'un DS1307 programmé pour qu'elle sorte du 1 Hz non ?

Qu'a tu derrière la tête ?

Se servir de cette horloge 1 Hz comme une horloge externe d'un timer ( pins broches T0 ou T1 ou T2 ) ?
C'est une bonne solution pour éviter les diviseurs externes et en plus cela donne l'heure.

PS : Pour traduire en français le concept "timer" je n'ai rien en rayon. :frowning:

MOI ? Rien !

Oui il compte les interruptions et comme ce sont des secondes cela simplifie le problème !
Il compte 640 ou 140 ou 75 et voili voilà !!! :smiley: