Réaliser une temporisation avec condensateurs...

Portrait de Timothée49

Bonjour à tous !

Cela fait 3 jours que je recherche une solution à mon problème ! et j'espère être sur le bon forum pour m'aider à trouver une solution. Ca a l'air pourtant si simple ...

Voici mon problème:

Un émetteur 433 MHz est activé par un bouton poussoir 

je souhaite le fonctionnement suivant

Si je reste appuyé sur le bouton plus de 2 secondes l'émetteur n'envoi plus de signal, il réagi comme si le bouton poussoir n'était pas activé. Si je relâche et que j'appui de nouveau le ca recommence à envoyer un signal

L'ensemble est alimenté par une pile 3.7 V 

Le dispositif doit consommer le moins d'énergie possible ! et la solution être simple

Merci pour votre aide

PS: ci joint quelque chose que j'ai bidouillé (émetteur remplacé par une LED) mais qui ne fonctionne pas car le condensateur met trop de temps à se recharger 

Timothée

Portrait de Anonyme

J'avais écrit une bêtise DSL

Portrait de hercule124

Bonjour,

essaye avec une bascule jk 

à chaque fois qu’on appui et on relâche le bouton poussoir la bascule change d’état

un exemple  que j'ai trouvé après tu peux bidouiller pour la tempo

Portrait de Timothée49

Bonjour Hercule, j'ai essayé mais la LED ce montage retarde l'allumage de la LED et ensuite l'action sur le poussoir ne change rien à l'état de la LED

Portrait de Anonyme

Il existe un micro-contrôleur qui ne nécessite aucun composant supplémentaire dans le cas d'une LED sauf la résistance de limitation c'est le ATTINY85 puce de 8 pins.

Le code de programmation est on ne peut plus simple, et très précis !

La tension d'alimentation est entre 2.7 V et 5.5 V donc parfait pour les 3.7 V de ton montage !

Si la sortie doit être maintenue 2 secondes  quand le bouton poussoir est relâché avant les 2 secondes utiliser ce code :

// ----- DECLARATION DES VARIABLES ------
int PinSortie = 0;
int PinBouton = 2;
int Temps = 2000; // temps de maintient
 

// ----- DECLARATION ENTREES ET SORTIES ------
void setup ()
{
  pinMode (PinSortie, OUTPUT);
  pinMode (PinBouton, INPUT_PULLUP);
  digitalWrite(PinSortie, LOW);

}

// ----- ACTIONS A EFFECTUER ------
void loop()
{
  if (digitalRead(PinBouton) == 0) {
    digitalWrite(PinSortie, HIGH);
    delay(Temps);
    digitalWrite(PinSortie, LOW);
  }
  while (digitalRead(PinBouton) == 0) {
    // ne fait rien
    delay(1);
  }
}

Si la sortie doit être remise à 0 quand le bouton poussoir est relâché avant les 2 secondes utiliser ce code :

// ----- DECLARATION DES VARIABLES ------
int PinSortie = 0;
int PinBouton = 2;
int Temps = 2000;
unsigned long Delais;

// ----- DECLARATION ENTREES ET SORTIES ------
void setup ()
{
  pinMode (PinSortie, OUTPUT);
  pinMode (PinBouton, INPUT_PULLUP);
  digitalWrite(PinSortie, LOW);

}

// ----- ACTIONS A EFFECTUER ------
void loop()
{
  if (digitalRead(PinBouton) == 0) {
    Delais = millis() + Temps;
    digitalWrite(PinSortie, HIGH);

    while (digitalRead(PinBouton) == 0) {

      if (millis() >= Delais)
        digitalWrite(PinSortie, LOW);
    }
    digitalWrite(PinSortie, LOW);
  }
}

Cette solution offre la possibilité de modifier le fonctionnement par une simple programmation ce qui est beaucoup plus difficile avec des composants classiques, l'air est au micro-contrôleur !!!!

Pour programmer ce micro-contôleur voir le tuto d'Heliox, c'est une excellente "Youtubeuse" et elle explique très bien comment procéder pour programmer cette pude !

Portrait de Timothée49

J'ai testé ! et ca fonctionne bien :-) Un grand merci ! ( a part Si la sortie doit être maintenue 2 secondes  quand le bouton poussoir est relâché avant les 2 secondes utiliser ce code :) car lorsque j'appuie moins de 2 secondes la LED s'éteint aussitôt.

Tu sais si il est possible de modifier un peu le programme de façon à ce que :

une micro impulsion ( moins de 1s) sur le poussoir garantisse une sortie minimum de 1 seconde

et si le poussoir reste appuyé plus de 1 seconde la sortie s'arrête

Respecter un délai de 5 secondes minimum entre chaque sortie activé (même si le contact est activé entre temps)

D'avance merci pour ton aide

Timothée

Portrait de Jetfuzz

Hello

il existe même celui la, plus qu'a brancher sur un pc et le programmer via l'ide Arduino.
il est franchement top pour ce genre d'application.

Cordialement

Jetfuzz

Portrait de Anonyme

Timothée49  ne donne plus signe de vie, je pense qu'il a résolu son problème mais il aurait pu avoir la courtoisie de nous répondre, mais bon pas grave !

Par contre ce que tu proposes, Jetfuzz et sans bidouillage, ne s'alimente qu'en 5 volts mini voir jusqu'à 18 volts alors que son système fonctionne en 3.7 volts...

Portrait de Timothée49

Bonjour à tous !

Dsl je vois seulement maintenant vos messages qui étaient dans les spams ...

Je vais étudier tout ca ce wk et je vous tiens informé

Merci pour vos contributions ca m'aide beaucoup !

Timothée

Portrait de Walter

Très bonne idée ce Attiny85, pour a petit besoin d'afficheur température humidité, si en plus on peut directement le programmer en usb c'est encore mieux, bon à pars le prix :)
Mais sur aliexpress, c'est déjà plus raisonnable.
Merci les gars ;)

Portrait de Timothée49

Ah oui et je n'ai pas de ARDUINO , pour programmer la puce j'ai vu sur internet des petits module que l'on branche directement sur le pc via usb mais certain dise que ca ne fonctionne pas  c'est quoi d'apres vous le plus simple pour programmer ca ? et le moins chère ? en sachant que je ne m'y connais pas trop en electronique 

Portrait de Walter

Celui que propose Jetfuzz est programmable directement via l'IDE d'arduino, mais comme l'indique wolframe69 il n'est pas alimentable en li-ion 3,7V.
Pour programmer un ATTINY85, il faut un FTDI, voici un tuto
mais pour le même prix tu as un arduino, moi je prendrais un arduino :)

Si tu n'es pas pressé, tu peux prendre sur Aliexpress et diviser les coûts par 2.

Portrait de Anonyme

Timothée49  lit bien TOUT mon tuto ! Tout le monde donne la solution maintenant que je l'ai donné mais sans prendre en considération tout les paramètres ! Je ne comprend pas pourquoi d'ailleurs tout ce petit monde très fort en l'occurrence n'a pas parlé de cette puce avant moi ?

Fais moi confiance achète un Arduino UNO sur Aliexpress ainsi que les Attiny85 tu n'en auras pas pour cher et laisse les beaux parleurs ou ils sont !

Portrait de Walter

Tout le monde alors qu'il y a que 4 intervenant, dont un ne donne pas la même solution que toi et un autre est toi même, surprenant que tu prennes autan de gant!!!

Je ne voulais pas polémiquer, mais comme tu met les pieds dans le plat, personnellement je préfère la solution de Hercule.
Uniquement des composants, pas de programmation, pas de logiciel à installer,
Pour un néophyte qui ne souhaite pas ce lancé dans l'arduino, c'est bien plus simple, je trouve.
Après si on aime la massue pour résoudre le moins problème, ca marche aussi ;)

Merci Wolframe pour l'information, je suis entrain de finir l'achat sur Aliexpress, de celle connectable en USB.

La bise à vous

Portrait de Anonyme

Lol pas content le Walter de se faire moucher !

Si une autre solution était mieux pourquoi appuyer sur la mienne, tu prends vraiment les gens pour ... ce qu'ils ne sont pas !

Au fait les deux secondes tu les règles comment avec la solution de la bascule ??? Parce que le système d'hercule fonctionne à l'envers de la demande mais tu es trop fort pour t'en être rendu compte ! Le maintient de cette bascule se fait l'ors du relâchement du bouton lol !!!! Tout faux !

Proposez donc des solutions de votre cru si vous en êtes capables.

J'adore les gens qui, prient en défaut foncent tout droit dans le mur !

Portrait de Walter

Visiblement il y a encore plus mécontent que moi.
Toujours là même chose, personnellement je n'ai pas de problème d'égo et avouer ma méconnaissance de l'électronique.
Cela ne me dérange pas que Timothée ne retienne pas la solution qui me plais le plus, du coup lorsqu'il pause une question, dont je connais la solution, j'y répond simplement.
En allant dans ton sens d'ailleurs :)

J'avoue que je ne comprend pas en quoi donner une réponse et essayer d'aider Timothée est si grave, au point de te mettre dans tout tes états.

D'autant  plus comme tu le dis j'appuis ta solution,  alors pourquoi être méprisant avec ces propos:

Fais moi confiance achète un Arduino UNO sur Aliexpress ainsi que les Attiny85 tu n'en auras pas pour cher et laisse les beaux parleurs ou ils sont ! 

 
Encore une fois merci Wolframe pour cette puce, qui répond exactement à un projet, pour  laquelle je n'y avais pas pensé.
Tu es un amour, la bise à toi

Portrait de Anonyme

Tu fais semblant de ne pas comprendre ?

La solution d'Hercule124 ne fonctionne pas !

Alors ta solution préférée laisse moi rire !

Tu réponds toujours à coté pour ne pas perdre la face ??

Portrait de Walter
lol, quel est le rapport avec mes propos?
Je prends exemple sur vous, ça a l'air de bien marcher avec vous ;)
Portrait de Anonyme

Dans ce schéma l'entrée Clock est maintenue à la tension de l'alimentation (état 1) alimentation qui me semble montée à l'envers,  par la résistance de 10k puisque le condensateur est chargé donc non passant. Lorsque'on appuie sur le Bp de condensateur se vide instantanément et l'entrée Clock passe à 0 tant qu'on laisse le bouton appuyé cela reste dans cet état et lorsque on relâche le Bp Clock reste à 0 tant que le condensateur n'est pas chargé par la cellule RC donc pas du tout conforme à la demande ! Mais Walter préfère ce qui ne fonctionne pas ! C'est plus simple !!

Et pour enfoncer le clou avec J en l'air c'est au petit bonheur la chance le fonctionnement !

Désolé Hercule124 je n'ai absolument rien contre toi mais je ne pouvais pas laisser Walter dans son délire !

Portrait de hercule124

Bonjour,

désolé pour le retard ,  j'ai posté un peu vite le schéma .

il n'est pas bon , mais le principe lui est bon

je propose une solution analogique , et j'apprécie beaucoup vos capacités numérique et j'apprends tout les jours sur ce forum .

voici le bon schéma avec une bascule cd 4013 tension min 3v et  tension max 15v sur simulation ca fonctionne avec 3.7v 

meme principe

à chaque fois qu’on appui et on relâche le bouton poussoir la bascule change d’état

Portrait de Anonyme

Je suis désolé Hercule124 mais je pense que tu n'as pas compris la demande initiale de Timothée49.

Je pense que tu devrais relire le fonctionnement dont Timothée49  a besoin c'est à dire que la led doit s'allumer 2 secondes maxi puis s'éteindre même si on maintient le Bp appuyé, ce n'est pas ce que ton montage réalise !

Portrait de Timothée49

Merci à tous pour vos propositions j'apprécie ce que vous faites

wolfram69, je vais acheter la puce avec l'ARDUINO qui va bien pour programmer les puces, toutefois j'aimerais bien tester le programme que tu as écris en simulation pour voir le résultat et etre sür que ca fonctionne

As tu pu jeter un oeil sur la modification dont j'ai parlé plus haut avec les 5 secondes d'innaction de la sortie 

Encore merci et bon Dimanche à vous tous 

Timothée

Portrait de Anonyme

Bonjour Timothée49 , non désolé je n'avais pas remarqué la modif que tu as faite mais avec la programmation "no soucy !" Je te fais cela cet après-midi. Avec des composant classiques je ne te parle pas de la complexité !! Sauf pour Walter bien sûr.

Portrait de Anonyme

Voilà chose promise ....

Par contre tu peux voir dans le code ci dessous qu'il y a deux possibilités de fonctionnement selon que tu changes ou pas la ligne :

bool Repetition = false;// true (vrai) ou false (faux) selon ton désir

Dans ce cas il faut absolument que le bouton soit relâché au terme des 5 secondes pour pouvoir relancer une commande.

Si tu change cette ligne par :

bool Repetition = true ;// true (vrai) ou false (faux) selon ton désir

Tant que tu laisses le bouton appuyé une commande sera lancer toute les 5 secondes après la dernière commande et cessera lorsque le bouton sera relâché plus de 5 secondes !

Si tu veux d'autres modifs pas de soucis, tu peux aussi toi même changer les tempos Temps et Attente à ta convenance le tout en secondes x 1000 (millisecondes). C'est beaucoup plus précis et constant qu'une tempo par une cellule RC ! La programmation n'en déplaise à certains c'est vraiment top car tu peux changer le code à ta convenance sans modif de soudures de composants et tu disposes de fonction limités à ton imagination. Je te conseille de regarder les vidéos d'Alex qui sont très bien faites et à la portée de tout le monde.

Les textes après "//" ne sont pas pris en charge pour le programme ceux sont uniquement des commentaires pour la comprenette ! :o)

// ----- DECLARATION DES VARIABLES ------
int PinSortie = 0; // Numéro de la pin attribué à la sortie
int PinBouton = 2; // Numéro de la pin attribué à l'entrée

int PinVeille = 3; // Numéro de la pin attribué à l'entrée

int Temps = 1000; // temps de maintient de la sortie en millisecondes
int Attente = 5000 ;// temps entre deux commandes en millisecondes
bool Repetition = false;// true (vrai) ou false (faux) selon ton désir
bool Encore; //Memoire si répétition ou pas
// ----- DECLARATION ENTREES ET SORTIES ------
void setup ()
{
  pinMode (PinSortie, OUTPUT); // on déclare que la sortie PinSortie est une sortie
  pinMode (PinBouton, INPUT); // on déclare que la sortie PinBouton est une entrée et maintenue à l'état haut par défaut
  digitalWrite(PinSortie, LOW);// on n'autorise pas la commande au lancement du programme

digitalWrite(PinVeille, LOW);// on auto-alimente l'Attiny

}

// ----- ACTIONS A EFFECTUER ------
void loop()
{

  while (digitalRead(PinBouton) == 0 ) { //Tant que le bouton poussoir est appuyé !
    if (Encore == true) { // si encore passe à false 7 lignes plus bas il faut que le bouton soit relaché pour relancer la commande
      digitalWrite(PinSortie, HIGH); //commande activée
      delay(Temps); // on attend que Temps soit écoulé (1 seconde)
      digitalWrite(PinSortie, LOW); // on arrête la commande
      delay(Attente); // on attent que Attente soit écoulé (5 secondes)
     digitalWrite(PinVeille,HIGH); // on arrête l'auto-alimentation
      delay(Attente); // on attent que Attente soit écoulé (5 secondes)
    }
    delay(10); //anti rebond
    Encore = Repetition; // si Repetition est vrai on relance la commande, sinon on attend que le bouton soit relâché !
  }
  Encore = true; // On autorise une nouvelle commande
}

Portrait de Timothée49

wolfram69, ton programme fonctionne à merveille !! 

Je viens de commander l'arduino et les puces 

Vraiment un grand merci !!

Portrait de Anonyme

De rien Bonne fin de Week-end

Portrait de Timothée49

Bonjour wolfram69

J'ai reçu le matériel, suivi le tuto , réalisé le montage et tout fonctionne comme je veux mais parfaitement à l'inverse ahaha, la sortie est activée lorsqu'elle ne devrait pas l'etre  et inversement. Ca ne doit pas etre grand chose à changer mais je prefère te demander quand meme

Portrait de Anonyme

Bonjour Timothée49

Il suffit d'inverser LOW et HIGH dans tout le code !

Cela dépend de la référence que tu prends soit par rapport à la masse soit par rapport au + toi tu dois être entre + et la sortie !!! Ce qui n'est pas très logique en général on coupe le + !!! comme dans mon code initial mais en inversant ces deux valeurs tu retrouveras tes petits !!. hahaha ! Bonne continuation :o)

    

Portrait de Timothée49

oui je sais pas pourquoi ca fait ca mais en tout cas ta soluce marche au top ;-)

Portrait de Anonyme

J'en suis heureux pour toi !!

As tu compris le code avec les explications ?

Portrait de Timothée49

oui j'ai changé quelques tempos c'est parfait maintenant 

bon wk

Portrait de Anonyme

Tu deviens un pro D'Arduino !

 En bas à droite on peut chatter !

Portrait de Timothée49

Re wolfram69 :)

Je viens de mesurer l'intensité consommé par mon dispositif, je mesure 2.25 mA 

Tu sais si il y a moyen de le mettre en veille ? et qu'il se réactive lorsque le contact est activé 

sinon je dois trouver des piles nucléaires....

Portrait de Anonyme

Oui c'est possible en mettant un transistor piloté par une sortie temporisée de Attiny et qui alimente ce même Attiny durant le temps nécessaire, puis la tempo arrivée à sa fin il coupe l'alimentation de ce dernier, consommation 0 µA.

Voici le Code :

int PinVeille = 3;
int PinSortie = 0;
int Temps = 2000;
int Attente = 3000 ; // 5 seconde au total avec les 2 secondes d'allumage de le LED

void setup()
{
  pinMode(PinVeille, OUTPUT);
  pinMode(PinSortie, OUTPUT);
  digitalWrite(PinVeille, HIGH);
  digitalWrite(PinSortie, LOW);
}

void loop(){
  digitalWrite(PinVeille, LOW);
  digitalWrite(PinSortie,HIGH);
  delay(Temps);
  digitalWrite(PinSortie, LOW);
  delay(Attente);
  digitalWrite(PinVeille, HIGH);
}

je suis étonné du silence radio de certains ici pas pour toi Hercule124!

Portrait de Timothée49

j'ai testé, la première impulsion sur le poussoir fonctionne puis ensuite plus rien

Portrait de Anonyme

Plus d'intéret

Portrait de Anonyme

Plus d'intéret

Portrait de Timothée49

si pas de problème

Portrait de Timothée49
Portrait de Anonyme

J'ai changé le dernier topic avec une vidéo sur Youtube !

Portrait de Anonyme

Il est aussi possible de ne pas relancer le programme lorsque le BP est maintenu appuyé et d'économiser la pile en passant en mode sleep.

#include <avr/sleep.h>
#include <avr/wdt.h>
int PinVeille = 3;
int PinSortie = 0;
int Temps = 2000;
int Attente = 3000 ;

void setup()
{
  pinMode(PinVeille, OUTPUT);
  pinMode(PinSortie, OUTPUT);
  digitalWrite(PinVeille, HIGH);
  digitalWrite(PinSortie, LOW);
   digitalWrite(PinVeille, LOW);
  digitalWrite(PinSortie,HIGH);
  delay(Temps);
  digitalWrite(PinSortie, LOW);
  delay(Attente);
  digitalWrite(PinVeille, HIGH);
}

void setup_watchdog(int ii) {

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);
}

void loop(){
  setup_watchdog(8);
 
}

Portrait de Timothée49

Salut !

J'ai trouvé pourquoi je devais inverser les valeurs du pin de sortie pour que ca fonctionne, c'est parce que normalement, l'emetteur fonctionne avec un BP qui relis une entrée à la masse.

Dans mon cas ce n'est pas un BP qui active l'emetteur mais la sortie de l'attiny 

il faut que je mette un relais miniature ? l'attiny ne fait pas ca ?

car j'ai essayé d'inverser les valeurs de sortie mais ca fonctionne mal avec le systeme de veille...

Portrait de Anonyme

Voilà la modif à faire : Il suffit de mettre un transistor pour inverser la polarité