meta données pour cette page
  •  

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
projets:comptetemps [12/12/2022 20:46] – [étape 2 : Communication via Serial] laureprojets:comptetemps [28/01/2023 23:10] (Version actuelle) laure
Ligne 1: Ligne 1:
-=====Compte - Temps Interactif ======+<jumbotron> 
 +===== ⏲️ 🍄 Compte - Temps Interactif ===== 
 +{{tag>arduino processing montage 3Ddesign 3DPrint}} 
 + 
 +<lead>Un dispositif qui mêle affichage écran (Processing) ET bouton physique (Arduino) pour créer un simple compte-temps pour une réalisation chroonométrée. </lead> 
 +On lance l'activité, le compteur démarre pour tous et le premier qui a fini appuie sur le bouton pour arrêter le compteur.  
 + 
 +<label type="default">vide-armoire</label> 
 +<label type="primary">arduino</label> 
 +<label type="primary">processing</label> 
 +<label type="success">en cours</label> 
 +<label type="info">3D</label> 
 +<label type="warning">warning</label> 
 +<label type="danger">danger</label> 
 + 
 +</jumbotron> 
  
-<lead>Un dispositif qui mêle affichage écran (Processing) ET bouton physique (Arduino) pour créer un simple compte-temps pour une réalisation chroonométrée. \\  
-On lance l'activité, le compteur démarre pour tous et le premier qui a fini appuie sur le bouton pour arrêter le compteur. </lead> 
  
  ==== étape 1 : du code simple de chaque côté====   ==== étape 1 : du code simple de chaque côté==== 
Ligne 100: Ligne 114:
 <WRAP half column> <WRAP half column>
    
-<lead>Le code  Arduino pour un bouton poussoir qui change une valeur... </lead> +<lead>Arduino un bouton poussoir qui change une valeur... </lead>
 <accordion> <accordion>
 <panel title="⬇️ le code à télécharger : Btn_Poussoir"> <panel title="⬇️ le code à télécharger : Btn_Poussoir">
Ligne 177: Ligne 190:
 </panel> </panel>
 </accordion> </accordion>
 +C'est tout bête il me faut une carte Uno, un bouton poussoir et là j'ai mis une LED pour témoigner que ça se passe bien... 
 </WRAP> </WRAP>
 </WRAP> </WRAP>
Ligne 285: Ligne 298:
 <WRAP half column>   <WRAP half column>  
 <lead>Je mélange les 2 codes processing pour un chrono interactif</lead> <lead>Je mélange les 2 codes processing pour un chrono interactif</lead>
 +  * Ajout d'un compteur millisecondes pour que ça aille plus vite (les heures ne sont plus affichées) 
 +  * Le bouton physique Arduino arrête le chrono à l'écran et affiche un meilleur temps "score"
 +  * Pour relancer le chrono le MJ utilise sa souris de PC
 +  * Possibilité de passer en Plein écran plutôt qu'en 800x600px
 +  * 
 +</WRAP>
  
 +<WRAP half column>
 +<accordion>
 +<panel title="⬇️ Code Processing Chrono final">
 +<file java Compte-Temps2.java>
 +/* MON PROJET : un compteur de seconde centré dans l'écran
 + + Piloté par Arduino et un bouton ( stop / start)
 +  Utiloser millis() pour créer une horloge hors temps officiel,
 + solution approhée par https://forum.processing.org/one/topic/timer-in-processing.html
 + */
 +
 +// objet global Chrono, déclaration de classe
 +StopChronoTimer sc;
 +
 +// Communication avec Arduino
 +import processing.serial.*;
 +Serial myPort;  // Create object from Serial class
 +
 +String dt;    // Data received from the serial port
 +float valD;
 +int btnVal = 0; // une valeur pour l'etat du bouton
 +
 +int oldBtn = 0; // une valeur pour conserver l'état précédent
 +
 +int cptBtn = 1; // une variable pour compter les appuis
 +
 +PFont matypo;  // ça c'est parcequ'il aime pas les car du Serial il râle si on précise pas
 +
 +void setup() {
 +  // fullScreen();
 +  size(800,600); 
 +
 +  //  printArray(Serial.list()); // utile pour voir le port qui parle
 +  String portName = "/dev/ttyACM3";// Changer le nom selon valeur reçue du listing ligne pcdte.
 +  myPort = new Serial(this, portName, 9600); // valeur cadence en baud comme dans Arduino
 +
 +  sc = new StopChronoTimer();
 +  sc.start();
 +}
 +
 +void draw() {
 +  while (myPort.available() >0) {
 +
 +    dt = myPort.readStringUntil('\n');
 +    if (dt !=null) {
 +      // si on lit qqchose on le trasnforme en int avec ces 2 lignes
 +      valD = float(dt);
 +      btnVal = int(valD);
 +    }
 +  }
 +  top();
 +}
 +
 +/// FONCTONS
 +
 +void top() { // dessine le texte-temps sur l'écran
 +  background(#fecb00);
 +  fill(000);
 +  textSize(208);
 +  textAlign(CENTER);
 +  // nf est utile pour transformer des chiffres en string text https://processing.org/reference/nf_.html
 +  text(nf(sc.minutes(), 2)+":"+nf(sc.secondes(), 2)+":"+nf(sc.millisec(), 2), width/2, height/2);
 +
 +
 +  if (btnVal==0  &&  oldBtn !=0) { // si c relache sur les 2 on ne fait rien mais si ça vient de changer
 +    ///
 +  } else if (btnVal ==1 &&  oldBtn !=1) {
 +    cptBtn = cptBtn + 1;
 +    oldBtn = 1;
 +    score();
 +  }
 +}
 +
 +void score() {
 +  int[] score = new int[3];
 +  score[0] = sc.minutes();
 +  score[1] = sc.secondes();
 +  score[2] = sc.millisec();
 +
 +  fill(#ff2503);
 +  textSize(24);
 +
 +  text("MEILLEUR SCORE "+nf( score[0], 2)+":"+nf( score[1], 2)+":"+nf( score[2], 2), width/4, height/2+100);
 +  noLoop();
 +}
 +
 +
 +// Pour relancer un compteur j'utilise la souris c OK
 +// mais il ne faut pas cliquer si le compteur n'est pas déjà arrêté
 +
 +void mouseReleased() {
 + btnVal = 0;
 +oldBtn = 0;
 +  sc.start();
 +  loop();
 +}
 +
 +
 +
 +// CLASSES
 +
 +class StopChronoTimer {
 +  int startTime = 0;
 +  int stopTime = 0;
 +  boolean running = false;
 +
 +  void start() {
 +    startTime = millis();
 +    running = true;
 +  }
 +
 +  void stop() {
 +    stopTime = millis();
 +    running = false;
 +  }
 +  
 +  /* int[] score(int s, int m, int h){
 +    int s = return secondes(); 
 +    int m = return minutes(); 
 +    int h = return heures(); 
 +  }
 +  */ 
 +  
 +  void fin() {
 +    stopTime = 0; 
 +    startTime = 0; 
 +    running = false;  
 +  }
 +
 +  int gTempsPasse() {
 +    int tempsP;
 +    if (running) {
 +      tempsP = (millis()-startTime);
 +    } else {
 +      tempsP =(stopTime - startTime);
 +    }
 +    return tempsP;
 +  }
 +
 +int millisec(){
 +  return (gTempsPasse()/10 ) %100; 
 +}
 +
 +  int secondes() {
 +    return (gTempsPasse()/1000) % 60;
 +  }
 +
 +  int minutes() {
 +    return (gTempsPasse()/(1000*60)) % 60;
 +  }
 +
 +  int heures() {
 +    return (gTempsPasse()/(1000*60*60)) % 24;
 +  }
 +}
 +
 +
 +
 +
 +
 +</file>
 +
 +
 +</panel>
 +</accordion>
 +</WRAP>
 +</WRAP>
 +
 + ==== étape 4 : le bouton - champi === 
 +<WRAP group>
 +<WRAP half column>  
 +<lead>Je veux un gros bouton mais je n'ai que des petits caps</lead>
 +Je vais donc prendre les dimensions de l'existant et modéliser un push button qui va bien...
 +{{ :projets:freecad_btnchampi0.png?nolink |}}
 +Bon évidemment le premier essai n'est pas au top mais mon fichier FreeCAD est enregistré avec les modif : 
 +  * élargissement du diamètre accueil bouton ( de 11,2 mesuré mais trop serrant à 11,5 mm)
 +  * diamètre pied champi fixé à 24 mm
 +Il faudra regénérer un mesh si on veut le réimprimer
 </WRAP> </WRAP>
  
 <WRAP half column> <WRAP half column>
- depuis Arduino on envoie un signal... +Mon premier jet est mal adapté, à bricoler pour que le caps bouton rentre dedans.   
 +</WRAP> 
 +</WRAP> 
 + 
 + ==== étape 5 : montage et miniaturisation ===  
 +<WRAP group> 
 +<WRAP half column> 
 +colonnes 
 +</WRAP> 
 + 
 +<WRAP half column> 
 </WRAP> </WRAP>
 </WRAP> </WRAP>