/* 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; } }