programmation sorties et tempo

bonjour

je suis en train d’essayer de piloter ma télécommande de portail avec un arduino
en effet, lorsque l’on est en moto, enlever les gants puis chercher la télécommande dans une de ses poches est une galère quotidienne

je me suis dit qu’il y avait des systèmes (onéreux) qui existaient pour les voitures donc pourquoi ne pas adapter pour les motos

un premier appel de phare, on ouvre le portail, un second appel de phare, on ouvre le garage…

en pj le fonctionnement je souhaiterai avoir ainsi que le code que j’ai commencé, mais maintenant, je suis bloqué :

  • lorsque j’appui sur mon bp, je passe d’une sortie a l’autre par contre, je ne sais pas remettre mon compteur a zéro
  • je ne sais pas non plus où insérer les tempos

merci pour votre aide

comptage_bp_pour_allumer_ledmodif_wf_v7led.ino (4.33 KB)

fichier expliquant le fonctionnement

fichier

bonjour,
il y a longtemps... tres longtemps, dans un elektor ou un radioplan, il y avait un montage du type:

modulation de l'ampoule de phare d'une voiture ( , de l'autre cote on recupere le signal via un dispositif(ldr? photodiode? ) je ne me souviens plus et ca marchais.

je pense que ca doit etre faisable..
un uno, un mosfeet de puissance , l'ampoule de ta moto..
en face photodiode, uno relais et hoopp!!

faut essayer...

en fait, je veux faire plus simple : quand je fais un appel de phare, j’alimente un relais, je recupére le contact sec de celui ci pour l’envoyer sur une entrée de l’arduino
c’est ce signal que je compte

c'est exactement le genre de projet qui se prête à la programmation par machines à états

voir pour cela le tuto de J-M-L pour bien comprendre de quoi on parle, et éventuellement pour simplifier les choses ma librairie YASM

ton image :

Je viens d'essayer de comprendre ton image mais c'est vraiment pas clair, je pense que c'est aussi pour ça que tu coup tu ne t'en sors pas avec ton code

je regarde le tuto de j m l et reviens vers vous

bonjour

en m’inspirant (voir même plus), j’ai réussi a adapter les infos du tuto a mon projet

lorsque l’on appui la première fois sur le bp, on active la sortie 11, si on appui a nouveau avant 3s on active la sortie 10 sinon on revient en étape initiale, …jusqu’à la quatrième sortie

je pourrai me contenter de ce fonctionnement mais je vais essayer encore de modifier

le fonctionnement souhaité :
on démarre un timer de 3 secondes et pendant ces 3 secondes on compte le nombre de fois que l’on appui sur le bouton poussoir
a la fin des 3 secondes on fait le bilan
1 appui = sortie 11
2 appuis = sortie 12
3 appuis = sortie 9
4 appuis = sortie 8
la sortie devra rester activé 2 secondes puis on revient a l’étape initiale

si quelqu’un peut m’aider sur la bibliothèque a utiliser

merci

ouverture_portail_final.ino (4.65 KB)

Bonsoir

Alors pour reprendre ton fonctionnement voulu avec YASM, ça pourrait donner ça :

/*
 Essai avec YASM pour willyf6 sur le forum arduino


 Le montage :
 * un bouton poussoir connecté entre la broche 2 et le GND



 */

// Les constantes ne changent pas durant le programme.
// Utilisée ici pour définir la numéro de la broche :

const int  BOUTON_PIN = 2;     // crée un identifiant pour la broche utilisée avec le bouton poussoir
const int LED_PINS[4] = {13, 12, 6, 4}; // tableau pour les numéros des broches de sorties


//librairie yasm à installer depuis le gestionnaire de librairie de l'IDE arduino :
//croquis->inclure une bibliotheque->gérer les bibliothèques chercher "yasm" et cliquer sur installer
#include <yasm.h> 
YASM telecommande; //la machine à états que l'on va utiliser
#include <btn.h>
BTN bouton; //la classe BTN : un outil pratique pour gérer le bouton

//les délais employés :
const unsigned long DELAI_ATTENTE_ORDRE=5*1000; //5*1000ms = 5s
const unsigned long DELAI_ACTIVE_SORTIE=2*1000; // 2s

byte choixOrdre;


void setup() 
{
  // met la broche du bouton en entrée
  pinMode(BOUTON_PIN, INPUT_PULLUP);

  // met toutes les broches des leds en sortie :
  for(byte i=0;i<3;i++) {
    pinMode(LED_PINS[i], OUTPUT);
  }
  
  //donne l'état initial de la machine à états
  telecommande.next(attente);
  
  // initialise la communication série
  // Attention : utiliser la meme vitesse de communication pour le Terminal Série
  Serial.begin(115200);  //pourquoi aller lentement ??
  
  Serial.println(F("prêt"));
}

void loop() 
{
  // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  bouton.update( ! digitalRead(BOUTON_PIN) ); // on utilise ! car le bouton fait contact au GND donc il faut inverser l'état réel (actif LOW)

  // execute la machine à états
  telecommande.run();
}

void ledsOff()
{
  // met toutes les broches des leds à LOW :
  for(byte i=0;i<3;i++) {
    digitalWrite(LED_PINS[i], LOW);
  }
}


////////////////machine à états "telecommande" ////////////////////

void attente()
{
  if( telecommande.isFirstRun()) bouton.state(); //juste pour vider le buffer du bouton au cas où
  
  if( bouton.state(BTN_LONGCLICK) )  {
    telecommande.next(compteur);
    Serial.println(F("appui long détecté : passage au comptage"));
  }
}

void compteur()
{
  if( telecommande.isFirstRun()) {
    bouton.state(); //juste pour vider le buffer du bouton au cas où
    choixOrdre=0; //et RAZ du compteur au cas où déja utilisé
  }
  
  //on compte les appuis sur le bouton
  if( bouton.state(BTN_CLICK) ) {
    choixOrdre++;
    Serial.print(choixOrdre);
    Serial.println(F(" appui(s) détecté(s)"));
  }
  
  //au bout du delai on passe à la suite
  if( telecommande.elapsed(DELAI_ATTENTE_ORDRE) ) telecommande.next(decode);
}

void decode()
{
  if( telecommande.isFirstRun() ) {
    Serial.print(F("décodage : "));
    //on active la sortie correspondante
    switch (choixOrdre) {
      case 1 :
        digitalWrite(LED_PINS[0],HIGH);
        Serial.println(F("allumage led 1"));
        break;
      case 2 :      
        digitalWrite(LED_PINS[1],HIGH);
        Serial.println(F("allumage led 2"));
        break;
      case 3 :
        digitalWrite(LED_PINS[2],HIGH);
        Serial.println(F("allumage led 3"));
        break;
      case 4 :
        digitalWrite(LED_PINS[3],HIGH);
        Serial.println(F("allumage led 4"));
        break;
      default :
        //sauf dans le cas où on n'a ps eu d'ordre valide où on retourne au début immédiatement (si 0 ou >4)
        telecommande.next(attente);
        Serial.println(F("erreur, retour en attente"));
    }
  }
  
  //au bout du delai on désactive et on revient au début
  if( telecommande.elapsed(DELAI_ACTIVE_SORTIE) ) {
    ledsOff();
    telecommande.next(attente);
    Serial.println(F("fin d'activation, retour en attente"));
  }
}

ici on a : appui long (>700ms) sur le bouton pour démarrer le compteur
puis on compte les appuis simples et on agit en conséquence

ça devrait fonctionner (testé avec juste un fil en lieu de place du bouton, pas idéal, du coup j’ai mis 5s de délai et non 3 sinon j’y arrivais pas)

bonjour et merci beaucoup pour le coup de main

j’ai testé ton programme, il fonctionne pour le 3 premières sortie mais par pour la 4 ème

je pense qu’en fait dans les calculs on dit que l’on est strictement inférieur a 4 or quand on est sur la sortie 4 , on est égal a 4

du coup, j’ai fait comme si j’utilisai une sortie 5

for(byte i=0;i<4;i++) {

maintenant toutes les sorties fonctionnent, quant j’aurai fini l’installation, je posterai une photo

merci beaucoup

oui tu as raison, j’ai fait une erreur grossière dans les boucles for en effet. sinon il aurait fallu mettre i<=3 ca aurait fait pareil

ou faire comme tu avais fait au départ, activer les sorties avec 4 lignes séparées.

tu peux aussi utiliser l’événement BTN_DOUBLECLICK pour le bouton si besoin, pour faire autrechose.

tu peux aussi rajouter ça dans comptage() :

if(telecommande.periodic(300)) digitalWrite(LED_PINS[0], !digitalRead(LED_PINS[0]));

pour faire clignoter la led sur pin 13 pour indiquer que tu es en mode “comptage des appuis” ça peut être utile sur montage réel sans sortie sur port série

merci

si j'ai la possibilité de rajouter une led13, je pense que vais suivre ton idée

je regarde ça lundi
bon week end
merci

j'ai parlé de la pin 13 car sur beaucoup de cartes (uno, mega...) il y a déjà une led sur cette pin.

Mais elle peut-être connecté n'importe où. Si j'ai bien compris tu as deux télécommandes à activer, ça fait donc deux sorties sur les 4 actuellement utilisées, il va rester plein de possibilités :slight_smile: