Clignoteurs_trottinette

Salut à tous,
Je ne suis pas sûr d'être sur la bonne rubrique, donc mea culpa au modos, si je devais faire erreur...
S'il y avait une âme charitable pour me mettre sur la voie... 2 semaines que je tourne en rond :frowning:
Le sujet :
Sur une trottinette, je souhaite mettre 3 boutons.

  • 1 qui allume/éteint les lumières, (1 pression sur le bouton allume, une 2e pression éteint)
  • 2 autres pour faire clignoter à gauche/droite les mêmes lumières. (1 pression sur le bouton fait clignoter, la 2 remet l'état allumé/éteint précédent)
    Dans le premier cas, c'est simple et réglé :slight_smile: C'est dans le second cas que sa pèche.
    J'ai essayé de commenter le mieux possible mon code :wink:
#include <Arduino.h>
// --- Circuit à réaliser ---
// Connecter  sur la broche 6,7 et 8 (configurée en entrée)  les 3 Boutons à la masse (0V)
// Connecter  sur la broche 3 et 4 (configurée en sortie) les 2 leds
// --- Déclaration des constantes ---

const int APPUI = 0;     // constante état des Boutons - appui sur niveau bas
const int PAS_APPUI = 1; // constante état des Boutons - relâché sur niveau haut

// --- constantes des broches ---

const int Bouton1 = 6; //bouton allumage des 2 leds
const int Bouton2 = 7; //bouton clignotte à gauche
const int Bouton3 = 8; //bouton clignotte à droite
const int Led1 = 3; //led gauche
const int Led2 = 4; //led droite

// --- Déclaration des variables globales ---

boolean etatLed = 0; // variable bit reflet d'état de la Led
boolean etat = 0;      // variable d'etat de position switch
int etape = 0;


// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

void setup() {
  // --- initialisation console serie ---
  Serial.begin(9600);
  Serial.println(F("Console initialisee"));
  // --- les boutons ---
  // --- broches en entrée ---
  pinMode(Bouton1, INPUT); //met les broches en entree
  pinMode(Bouton2, INPUT);
  pinMode(Bouton2, INPUT);
  
  // --- Activation du rappel au + interne des broches en entrée si nécessaire ---
  digitalWrite(Bouton1, HIGH); // activation des pullup des broches en entrée
  digitalWrite(Bouton2, HIGH);
  digitalWrite(Bouton3, HIGH);

  // --- Broches en sortie ---
  pinMode(Led1, OUTPUT); //met la broche en sortie
  pinMode(Led2, OUTPUT);
}
void cligno()
{
  while(etape==0)
  {
    Serial.println("ca clignote");
    etatLed = !etatLed;
    digitalWrite(Led1, LOW); // la LED 1 s’éteint
    digitalWrite(Led2, HIGH); // la LED 2 s'allume
    delay(500);
    digitalWrite(Led1,HIGH); // la LED 1 s’allume
    digitalWrite(Led2,LOW); // la LED 2 s’éteint
    delay(500);
/*    if(etape == 0)
    {
      Serial.println("sa doit clignotter");
    }*/
  }
}

void loop()
{
  // --- ici instructions à exécuter par le programme principal ---
  if (digitalRead(Bouton1) == APPUI)
  {
    // --- si appui sur Bouton 1 ---
    Serial.println("bouton 1 enfonce");
    etatLed = !etatLed; // --- inverse l'état du Relais ---
    digitalWrite(Led1, etatLed); // --- met la broche de commande dans l'état voulu ---
    digitalWrite(Led2, etatLed);
    delay(250);
    if (etatLed == LOW)
    {
      Serial.println("Leds 1 et 2 = Off");
    }
    else
    {
      Serial.println("leds 1 et 2 = On");
    }
  }
  //if (digitalRead(Bouton2) == APPUI && etat==0)
  if (digitalRead(Bouton2) == APPUI)
  {
    Serial.println(etat);
    Serial.println(etape);
    switch(etat)
    {
      case 1:
      etat = etat;
      cligno();
      Serial.println(etat);
      break;

      case 0:
      etat = !etat;
     // cligno();
      Serial.println(etat);
      break;
    }
//    cligno();
    delay(500);
  }
}

Je fais ou parts mal à un endroit et j'arrive pas à mettre la main dessus.
Si qqu'un pouvait m'éguiller...
Merci et salut à tous.
Suzz

ben ce n'est pas un tuto :wink:

➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone”


C'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

et pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

J'ai retravailler le code un peut a ma sauce, je pense que il fixe les petit bug que tu avait.

#include <Arduino.h>

#define START_BTN 6
#define LEFT_BTN 7
#define RIGHT_BTN 8
#define LEFT_LED 3
#define RIGHT_LED 4

bool state_start = false;
bool state_left = false;
bool state_right = false;
bool state_left_led = false;
bool state_right_led = false;

void setup()
{
  Serial.begin(9600);
  Serial.println("Console initialisee");
  pinMode(START_BTN, INPUT);
  pinMode(LEFT_BTN, INPUT);
  pinMode(RIGHT_BTN, INPUT);
  digitalWrite(START_BTN, HIGH);
  digitalWrite(LEFT_BTN, HIGH);
  digitalWrite(RIGHT_BTN, HIGH);
  pinMode(LEFT_LED, OUTPUT);
  pinMode(RIGHT_LED, OUTPUT);
}

// Change state btn
void change_state(void)
{
	if (digitalRead(START_BTN))
	{
		state_start = !state_start;
		Serial.println("Start btn push");
	}
	if (digitalRead(LEFT_BTN))
	{
		state_left = !state_left;
		Serial.println("Left btn push");
	}
	if (digitalRead(RIGHT_BTN))
	{
		state_right = !state_right;
		Serial.println("Right btn push");
	}
}

// Change state led
void toggle_led(int led)
{
	switch (led)
	{
		case LEFT_LED:
			state_left_led = !state_left_led;
			digitalWrite(LEFT_LED, state_left_led);
			Serial.println("Toggle left led");
			break ;
		case RIGHT_LED:
			state_right_led = !state_right_led;
			digitalWrite(RIGHT_LED, state_right_led);
			Serial.println("Toggle right led");
			break ;
	}
}

// Turn on LEDs
void on_leds(void)
{
	digitalWrite(LEFT_LED, HIGH);
	digitalWrite(RIGHT_LED, HIGH);
	Serial.println("Turn on all leds");
}

// Turn off LEDs
void off_leds(void)
{
	digitalWrite(LEFT_LED, LOW);
	digitalWrite(RIGHT_LED, LOW);
	Serial.println("Turn off all leds");
}

// Turn on LED
void on_led(int led)
{
	digitalWrite(led, HIGH);
	Serial.println("Turn on led");
}

// Turn off LED
void off_led(int led)
{
	digitalWrite(led, LOW);
	Serial.println("Turn off led");
}

void loop()
{
	change_state();
	while (state_left || state_right)
	{
		if (state_left && state_right)
		{
			toggle_led(LEFT_LED);
			toggle_led(RIGHT_LED);
		}
		else if (state_left)
			toggle_led(LEFT_LED);
		else if (state_right)
			toggle_led(RIGHT_LED);
		
		if (!state_left)
		{
			if (state_start)
				on_led(LEFT_LED);
			else
				off_led(LEFT_LED);
		}
		if (!state_right)
		{
			if (state_start)
				on_led(RIGHT_LED);
			else
				off_led(RIGHT_LED);
		}
		
		delay(500);
		
		change_state();
	}

	if (state_start)
		on_leds();
	else
		off_leds();
	
	delay(10);
}

Te remercie bledda,
D'un code à la logique d'un mécano, tu nous livre un code d'électro :grinning:
Je me penche sur le projet dès mardi et je me permettrai de revenir.
Dans tous les cas, merci pour le travail et bon dimanche à tous :vulcan_salute:
Suzz

De rien, après reflexion je pense que tu va avoir un problème avec le delay(500).
Voici un fix potentiel:

for (int i = 500; i > 0; i -=10)
{
        change_state();
        delay(10);
}```
Joyeux noel a tout le monde

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.