[Demande d'aide] Gérer afficheur 7segments 4 digits avec clavier

Je viens de test, pour l’affichage le fait de changer de pin a résolu le problème merci.
Pour ce qui est du moteur je viens de tester cela; ca fonctionne sauf que le moteur fait des saccades comme tu me le disais. Et si je met un trop grd nombre l’affichage clignote. Je ne pense pas être capable de mettre en ouvre l’idée que tu m’as soumise avec l’ajout du temps comme pour le decompte

#include <SevSeg.h>
#include <Keypad.h>
#include <Stepper.h>

const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 14, 15, 16, 17);

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = { 39, 41, 43, 45 };
byte colPins[COLS] = {47, 49, 51, 53};

Keypad membraneKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

boolean affichageModifie;

unsigned long chrono;
unsigned long duree = 0;

enum {REPOS, CUISSON} etat;

SevSeg sevseg;


void setup() {
  Serial.begin(115200);
  sevseg.Begin(0,2,3,4,5,6,7,8,9,10,11,12,13);
  etat = REPOS;
  affichageModifie = true;
  sevseg.NewNum( 0,(byte)0);
  sevseg.PrintOutput();
  affichageModifie = false;
   myStepper.setSpeed(60);
}

void lireClavier()
{
      affichageModifie = false;
  char entry = membraneKeypad.getKey();
  if (entry != NO_KEY) {
    // une touche du clavier a été appuyée

    if (etat != REPOS) { // si on était en train de décompter on arrête
      etat = REPOS;
      duree = 0000; // et on remet à 0
    }

    if ((entry >= '0') && (entry <= '9')) { // si c'est un chiffre
      affichageModifie = true;
      duree = 10 * duree + entry - '0';
      if (duree > 9999) duree -= (duree / 10000ul) * 10000ul; // on a dépassé les 4 chiffres, on conserve les 4 derniers
    } else if (entry == 'D') { // on déclenche le compte à rebours
      etat = CUISSON;
      chrono = millis();
    } else { // N'importe quelle autre touche efface l'écran et remet à 0
      affichageModifie = true;
      duree = 0;
    }
  }
}


void loop() {

  lireClavier(); // gestion des évènements
 
  if (etat == CUISSON) {
    if (millis() - chrono >= 1000) {
      affichageModifie = true;
      chrono += 1000ul;
      duree--;
     myStepper.step(100);
      if (duree == 0)  {
        etat = REPOS;
        Serial.println(F("C'EST CUIT - DING DONG")); // si vous avez un buzzer, faites le sonner au lieu de cette ligne
      }
    }
  }

  if (affichageModifie) {
    Serial.println(duree); // c'est ici qu'il faut demander à votre afficheur 7 segments d'afficher
//sevseg.NewNum( duree,(byte)0);
sevseg.NewNum( (int) duree,0);
    affichageModifie = false;
  }
   sevseg.PrintOutput();
   }

essayez quelque chose comme cela - tapé à la volée, dans le forum à partir de votre code donc je ne sais même pas si ça compile… (par exemple ça me parait vraiment louche que la méthode Begin de SevSeg commence par une majuscule, idem pour sevseg.NewNum… vous êtes sûr de vous là ou vous avez modifié cette librairie ?

essayez cela et jouez sur la constante tempoMoteur qui définit le nombre de milliseocndes entre 2 pas du moteur quand il tourne.

Si vous regardez le code, le principe est exactement le même que pour le décompte, on vérifie si c’est le bon moment de faire quelque chose avec une autre variable, chronoMoteur, qui se souvient de la dernière fois où vous avez avancé d’un pas.

→ vous devriez étudier en détail le tuto d’eskimon [ Arduino 202] Introduire le temps - la partie à la fin où il parle de millis()

#include <SevSeg.h>
#include <Keypad.h>
#include <Stepper.h>

const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 14, 15, 16, 17);

const unsigned int tempoMoteur = 10; // nombre de ms entre deux pas du moteur en mode cuisson
unsigned long chronoMoteur;

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

//define the symbols on the buttons of the keypads
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = { 39, 41, 43, 45 };
byte colPins[COLS] = {47, 49, 51, 53};

Keypad membraneKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

boolean affichageModifie;

unsigned long chrono;
unsigned long duree = 0;

enum {REPOS, CUISSON} etat;

SevSeg sevseg;


void setup() {
  Serial.begin(115200);
  sevseg.Begin(0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
  etat = REPOS;
  sevseg.NewNum(0, 0);
  sevseg.PrintOutput();
  myStepper.setSpeed(100); // importe peu puisque l'on ne fait que des pas de 1 cran
}

void lireClavier()
{
  affichageModifie = false;
  char entry = membraneKeypad.getKey();
  if (entry != NO_KEY) {
    // une touche du clavier a été appuyée

    if (etat != REPOS) { // si on était en train de décompter on arrête
      etat = REPOS;
      duree = 0; // et on remet à 0
    }

    if ((entry >= '0') && (entry <= '9')) { // si c'est un chiffre
      affichageModifie = true;
      duree = 10 * duree + entry - '0';
      if (duree > 9999) duree -= (duree / 10000ul) * 10000ul; // on a dépassé les 4 chiffres, on conserve les 4 derniers
    } else if (entry == 'D') { // on déclenche le compte à rebours
      if (duree > 0) { // décompte que si un temps est donné
         etat = CUISSON;
         chrono = millis();
         chronoMoteur = chrono;
      }
    } else { // N'importe quelle autre touche efface l'écran et remet à 0
      affichageModifie = true;
      duree = 0;
    }
  }
}


void loop() {

  // maintient l'affichage des LEDs
  sevseg.PrintOutput();

  // gestion des évènements
  lireClavier();

  // gestion des états
  if (etat == CUISSON) {

    // on fait tourner le moteur
    if (millis() - chronoMoteur >= tempoMoteur) {
      myStepper.step(1); // on avance d'un cran toutes les tempoMoteur ms
      chronoMoteur += tempoMoteur;
    }

    // on vérifie s'il faut mettre à jour le compteur
    if (millis() - chrono >= 1000) {
      affichageModifie = true;
      chrono += 1000ul;
      duree--;
      if (duree == 0)  {
        etat = REPOS;
        Serial.println(F("C'EST CUIT - DING DONG")); // si vous avez un buzzer, faites le sonner !
      }
    }

  }
  
  // gestion de l'affichage
  if (affichageModifie) {
    Serial.println(duree);
    sevseg.NewNum( (int) duree, 0);
    affichageModifie = false;
  }

}

Cool çà fonctionne, et en + je viens de lire le tuto sur l'emploi de millis pour éviter de bloquer le programme et j'ai a peu pré tout compris.
Un grand merci a vous sans qui ma fille n'aurait pu jouer a son micro onde comme une grande lol...

Je viens de m'apercevoir en testant le moteur que lorsqu'on appuie sur "D" alors que le compteur est à 0 l'afficheur décompte -1 -2 -3 etc???

j'ai rajouté cela est ça fonctionne

else if (entry == 'D' & duree != 0)

MERCIIIIII

super

dans le code ci dessus il y avait bien le test

    } else if (entry == 'D') { // on déclenche le compte à rebours
      if (duree > 0) { // décompte que si un temps est donné
         etat = CUISSON;
         chrono = millis();
         chronoMoteur = chrono;
      }

c'est bien la dernière version que vous avez copié ?

sinon avec votre version il faut utiliser && pas juste & qui est l'opérateur pour les bits (même si ici ça va marcher, autant utiliser les vraies commandes)

else if (entry == 'D' &[color=red]&[/color] duree != 0)

Quid des majuscules sur les fonctions ?

PS - (sans vouloir juger) je pense que vous reproduisez les vieux Schéma sexistes - ma recommendation: au lieu de faire jouer votre fille avec un Micro onde vous devriez lui apprendre à programmer (et apprendre avec elle des choses nouvelles) - il y a des langages par bloc ou de conduite de robot qui sont sympa...

Pour les majuscules je ne sais pas… Quand je tape sevseg.Begin(0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); avec b minuscule j’ai une erreur dans le compilateur!!!

Pour ton avis de fin de post, sache que je partage totalement ton avis :wink:
Le problème ma fille à tout juste 14 mois, donc elle n’est pas encore capable de comprendre grand chose mais sache que je me suis déjà renseigné et j’ai vue un logiciel “scratch” qui a l’air pas mal pour débuter avec des enfants. Si tu as d’autre logiciel en tête je suis preneur?! Peux-t-on programmer en language bloc un arduino ?

Tu trouveras en pièces jointes deux photos en cours de montage de mon projet. Je suis trop contant que vous m’ayez aidé dans la réalisation de mon projet :wink:

Certes à 14 mois c'est un peu jeune - même pour la cuisine !!! Elle marche déjà bien ou c'est pour un peu plus tard ?

En tout cas Super la cuisine - du boulot de pro et belle intégration de l'arduino !

Pour le langage par bloc il y a ArduBlock ou S4A (Scratch pour Arduino) par exemple - mais elle a le temps :slight_smile:

Elle a le temps mais chez la nourrice il y a une petite cuisine en plastique et elle passe ses journées à jouer à la dînette
Du coup j'ai voulu anticiper et lui en faire une "maison".

Merci pour les logiciels de programmation...

Je souhaiterais faire un montage (mais sans arduino) je pense pour les plaques de cuisson électrique.
Je voulais incorporé des leds rouges relié à un potentiomètre pour faire varier la luminosité. Et ainsi simuler la chaleur. Penses tu que je dois passer par un arduino ou juste un montage simple avec les résistances et potentiomètres suffit.
De plus j'aurais peux être besoin de toi car du coup je vais certainement intégrer un écran lcd avec des boutons pour simuler l'affichage du four!!!

Dernière question: pour alimenter l'ensemble de ma cuisine (micro-onde, plaque cuisson, afficheur four) comment ferais-tu?
Je pensais mettre une prise avec transfo intégré qui ressort avec un bout style jack directement branché à mon arduino. Mais du coup si il y a un souci on peut se retrouver avec du 220v :frowning: . Sinon branché une batterie accumulateur style voiture téléguidé sur l'arduino mais penses tu qu'il faudra la charger souvent?

Oui potentiomètre coulisse ou à tourner, résistance et led - pas besoin de l’Arduino

Pour l’alimentation un transfo 9v, certifié CE, branché sur l’Arduino. si c’est bien intégré et que la cuisine est contre un mur avec la prise derrière il n’y aura sans doute pas de risque. Les batteries pourquoi pas mais c’est un peu pénible de toujours changer/charger des piles.

Vous devriez chercher aussi à intégrer des jeux avec lumière et son genre Simon, choix de couleur, et puis vous savez faut laisser aux enfants Le soin de développer un imaginaire et donc des objets en bois à assembler etc c’est tout aussi intéressant que de l’électronique

Bonjour J-M-L, je reviens vers toi car j’ai un autre projet pour ma cuisinière , j’ai trouvé un bouton rotatif d’un vieux four que je souhaiterais utiliser comme ceci

il possède 8 positions, je souhaiterais le relié a un écran lcd pour pouvoir écrire différente chose dessus suivant la position du bouton

pour écrire sur le lcd je devrais m’en sortir par contre pour le bouton rotatif je ne sais pas comment mis prendre…

Voici à quoi il ressemble

le problème c’est que les positions sont reliées comme ceci

position 1 borne 3 et 7
position 2 borne 3 et 6
position 3 borne 3 et 5
position 4 borne 3 et 4
position 5 borne 2 et 4
position 6 borne 2 et 5
position 7 borne 2 et 6
position 8 borne 2 et 7

comme puis je dire a l’Arduino suivant tel broche d’activé tu dois écrire ceci…

il faut simplement détecter quel circuit est "passant"

J-M-L:
il faut simplement détecter quel circuit est "passant"

Ok mais comment faire, avez vous une idée? De plus les bornes 4 5 6 et 7 sont communes à la détection avec la 2 et la 3 du coup je suis perdu...
Y a t il une fonction dans l’Arduino pour vérifier si deux bornes sont passantes.
Sinon je pensais mettre les bornes 4 5 6 et 7 à 5 V et vérifier quand j'ai 5 v sur la borne 2 ou 3 mais ca marche pas pacque je serais pas faire la différence entre les bornes 4 5 6 et 7 ou alors il faut que je mette des résistances de différente valeur

voici tous les liens possibles,

mais à un instant T une seule connexion est active physiquement, par exemple en position 3

-> si vous mettez des pins connectées en aux bornes 4,5,6,7 en input pull-up, et

1/ si vous mettez les pins connectées à 2 et 3 LOW, LOW
2/ si vous mettez les pins connectées à 2 et 3 LOW, HIGH
3/ si vous mettez les pins connectées à 2 et 3 HIGH, LOW

dans chaque cas, quel valeur allez vous lire (HIGH ou LOW) sur les pins des bornes 4,5,6 et 7 ??

Chouette dessins! :slight_smile:

j'ai toujours trouvé qu'une image valait 1000 mots :slight_smile:

Merci pour ton aide J-M-L, ce qui me rassure c'est que ton schéma ressemble étrangement au mien (en plus jolie bien sur; le mien été griffonné sur un bout de feuille lol)

Voici le code que j'ai testé et qui marche... Me reste plus qu'a écrire sur mon afficheur au lieu du moniteur série.

Le code est peut être pas très jolie (débutant), alors si tu as des astuces je veux bien que tu me montres.Merci

const int broche_2 = 2;       //rien de branché sur la broche 1
const int broche_3 = 3;
const int broche_4 = 4;
const int broche_5 = 5;
const int broche_6 = 6;
const int broche_7 = 7;


void setup() {
  Serial.begin (9600);
  
  pinMode(broche_2, OUTPUT);
  pinMode(broche_3, OUTPUT);
  pinMode(broche_4, INPUT_PULLUP);
  pinMode(broche_5, INPUT_PULLUP);
  pinMode(broche_6, INPUT_PULLUP);
  pinMode(broche_7, INPUT_PULLUP);

  digitalWrite(broche_2, HIGH);
  digitalWrite(broche_3, HIGH);

  }

void loop() {

  digitalWrite (broche_2, LOW);
  digitalWrite (broche_3, HIGH);
  
if (digitalRead(broche_4) == LOW)
{
  Serial.println("position5");
}

if (digitalRead(broche_5) == LOW)
{
  Serial.println("position6");
}

if (digitalRead(broche_6) == LOW)
{
  Serial.println("position7");
}

if (digitalRead(broche_7) == LOW)
{
  Serial.println("position8");
}



{
  digitalWrite (broche_2, HIGH);
  digitalWrite (broche_3, LOW);
}

if (digitalRead(broche_4) == LOW)
{
   Serial.println("position4");
}

if (digitalRead(broche_5) == LOW)
{
   Serial.println("position3");
}

if (digitalRead(broche_6) == LOW)
{
   Serial.println("position2");
}

if (digitalRead(broche_7) == LOW)
{
   Serial.println("position1");
}

}