Bonjour;
Je viens poster ici car je suis un face à un petit problème. Etant en terminale STi2D nous sommes dans les dernières période pour terminer nos projet. Le notre étant la réalisation d'un stylo 3D. Aujourd'hui nous étions entrain de regrouper nos programmes (RTC + Programme du Thermocouple + Réglages des seuils etc) et nous avons eu un petit problème ou nous avons plonger pendant plus de deux heures sans trouver la réponse...
Je m'explique, le problème viens plus précisément du programme de la RTC (Real time clock).
Dans ce programme lorsque j'appuie la première fois sur le bouton ça fait une capture de ce temps (que l'on appellera t1) et lorsque que je rappuie ça fait une seconde capture (que l'on nomme t2).
Ensuite le programme fait t2 - t1 pour connaitre le temps totale d'utilisation.
Le problème vient du fait que le programme détecte l'appuie de t1 ou t2 que lorsqu'il viens d'afficher le l'heure sur le moniteur série. Je voudrais qu'on puisse faire l'image de ce temps n'importe quand et pas seulement lorsque l'heure s'affiche, de plus l'utilisateur lui ne verras pas le moniteur série.
Je vous met mon programme :
#include "EEPROMAnything.h"
#include <EEPROM.h>
#include <TinkerKit.h>
#include <Wire.h>
#include "DS1307.h"
#define BOUTON_ENREGISTREMENT 7 // bouton poussoir pour démarrer et arreter l'enregistrement
#define BOUTON_CHANGER_BUSE 10 // bouton poussoir pour dire qu'on a changé la buse (sinon la led reste allumée) et on n'enregistre rien
// #define LED_ENREGISTREMENT 9 // led qui s'allume dès qu'on enregistre et s'éteint quand on enregistre pas
#define LED_CHANGER_BUSE 14 // led qui s'allume dès qu'on doit changer la buse
boolean buse_changee = true;
double SEC;
// const int buttonPin = A2;
int buttonState = 0;
double result1;
double result2;
int comptage=0;
unsigned int resultfinal;
byte dueeprom,mceeprom;
double current_sec = 0;
double starting_sec = 0;
double final_sec = 0;
double current_delta_sec = 0;
int test;
double final_delta_sec;
#define adr_eprom_test 200 // For the test for 1st time init of the Arduino (First power on)
#define adresse_eeprom_compteur 0
const int adresse_epromdu= 0;
const int adresse_eprommc= 1;
DS1307 clock;//define a object of DS1307 class
const unsigned long DISPLAY_INTERVAL = 5000; // in ms
static unsigned long lastTime=0; // in ms
unsigned long time=millis(); // in ms
void setup()
{
Serial.begin(9600);
clock.begin();
clock.fillByYMD(2014,3,27);// 06 Fevrier,2014
clock.fillByHMS(17,50,30);//13:53 30"
clock.fillDayOfWeek(THU);//Jeudi
clock.setTime();//write time to the RTC chip
pinMode(BOUTON_ENREGISTREMENT,INPUT);
pinMode(BOUTON_CHANGER_BUSE,INPUT);
// pinMode(LED_ENREGISTREMENT,OUTPUT);
pinMode(LED_CHANGER_BUSE,OUTPUT);
// Test pour le premier lancement avec une EEPROM vide
EEPROM_readAnything(adr_eprom_test, test);
if (test != 12345)
{
EEPROM_writeAnything(adr_eprom_test,12345); // marqueur pour dire qu'on a déjà initialisé
delay(5); // ça prends 3,3 ms d'écrire dans l'eeprom donc on attend 5ms pour etre sur d'avoir les valeurs
EEPROM_writeAnything(adresse_eeprom_compteur, 0); // met à 0 la variable d'utilisation du stylo pour la 1ere utilisation
delay(5); // ça prends 3,3 ms d'écrire dans l'eeprom donc on attend 5ms pour etre sur d'avoir les valeurs
Serial.print("Premiere init OK! test=");
Serial.println(test);
Serial.print("temps d'utilisation du stylo precedemment enregistre:");
EEPROM_readAnything(adresse_eeprom_compteur, final_delta_sec);
delay(5);
Serial.println(final_delta_sec);
}
// affiche l'heure courante avant de démarrer
else
{
// si on a deja init. alors
// Lit les valeurs sauvées en EEPROM
EEPROM_readAnything(adresse_eeprom_compteur, final_delta_sec);
delay(5);
Serial.print("temps d'utilisation precedemment enregistre:");
Serial.println(final_delta_sec);
}
}
void loop()
{
// affiche l'heure toute les 5 sec
time=millis();
if (time-lastTime>DISPLAY_INTERVAL) // if at least DISPLAY_INTERVAL ms have passed
{
printTime();
lastTime=time; // reset timer
}
enregistrement_temps();
changement_buse();
}
void backup_eeprom()
{
final_delta_sec = current_delta_sec + final_delta_sec; // on calcule le delta final en ajoutant à l'ancienne valeur la valeur courante
Serial.println("temps totale d'utilisation");
Serial.println(final_delta_sec, DEC);
if (final_delta_sec < 3600000) // Si delta secondes final est inférieur à la durée d'utilisation de la buse
{
// alors on enregistre en memoire la duree d'utilisation du stylo
EEPROM_writeAnything(adresse_eeprom_compteur, final_delta_sec);
delay(5); // ça prends 3,3 ms d'écrire dans l'eeprom donc on attend 5ms pour etre sur d'avoir les valeurs
}
else // sinon
{
// on allume la led de suivi pour dire qu'on doit changer la buse
digitalWrite(LED_CHANGER_BUSE,HIGH);
Serial.println("BUSE A CHANGER!");
// on met l'état de la variable de changement de buse à FALSE
// qui ne changera pas tant qu'on aura pas appuyé sur le bouton "buse changée"
buse_changee = false;
}
}
/*--------------------------------------------------*
* Fonction: Affiche le temps sur le moniteur série *
*--------------------------------------------------*/
void printTime()
{
clock.getTime();
Affiche_HMS();
Serial.println(" ");
delay(500);
}
void Affiche_HMS()
{
Serial.print(clock.hour, DEC);
Serial.print(":");
Serial.print(clock.minute, DEC);
Serial.print(":");
Serial.print(clock.second, DEC);
}
void enregistrement_temps()
{
// DEBUT ENREGISTREMENT
// détecte appui sur bouton d'enregistrement et commence le décompte
if (digitalRead(BOUTON_ENREGISTREMENT)==HIGH)
// Mon bouton est a l'etat bas quand j'appuie et quand j'appuie pas il est a l'etat haut
// il faudra adapter le test a l'etat du bonton en question
// ATTENTION: on ne peut pas rentrer dans cette partie si la buse n'a pas ete changee
// c'est à dire si la variable buse_changee est à l'état 'FALSE' !!
{
delay(300); // délai anti rebond pour éviter de rentrer plusieur fois dans la boucle
current_sec=((clock.hour)*36E2)+((clock.minute)*60)+ (clock.second);
Serial.print("temps courant:");
Serial.println(current_sec);
comptage++; // 1st give starting, 2nd give final
if (comptage==1) // 1st give starting
{
starting_sec = current_sec;
Serial.print("debut de l'enregistrement a t1=");
Serial.println(starting_sec);
// digitalWrite(LED_ENREGISTREMENT,HIGH); // on passe en mode enregistrement
}
if (comptage==2) // 2nd give final status and storage
{
// 1/4
// calcul de la fin du comptage
final_sec = current_sec;
Serial.print("fin de l'enregistrement a t2=");
Serial.println(final_sec);
current_delta_sec=(final_sec-starting_sec)+3599990;
Serial.print("delta temps t2-t1=");
Serial.println(current_delta_sec);
// 2/4
// stockage de la fin dans l'eeprom
backup_eeprom();
// 3/4
// réinitialisation du bouton
comptage=0; // reset comptage
Serial.print("temps total d'utilisation du stylo:");
Serial.println(final_delta_sec);
// 4/4
// On éteint la led pour dire qu'on a fini d'enregistrer
// digitalWrite(LED_ENREGISTREMENT,LOW);
// et du coup on repasse en mode écoute en sortant du if
}
}// FIN ENREGISTREMENT
}
void changement_buse()
{
// DEBUT CHANGEMENT BUSE
// Détecte si appui sur le bouton de changement de buse
if (digitalRead(BOUTON_CHANGER_BUSE)==HIGH && buse_changee == false)
{
delay(300); // délai anti rebond pour éviter de rentrer plusieur fois dans la boucle
// si appui sur le bouton alors
// on met l'état de changement de buse à l'état VRAI
buse_changee = true;
// on réinitialise la variable à 0
final_delta_sec = 0;
EEPROM_writeAnything(adresse_eeprom_compteur, final_delta_sec);
delay(5); //
// et on éteint la led de suivi pour dire qu'on a changé la buse
digitalWrite(LED_CHANGER_BUSE,LOW);
Serial.println("BUSE CHANGEE!");
Serial.print("temps d'utilisation réinitialisé à :");
Serial.println(final_delta_sec);
}// FIN CHANGEMENT BUSE
}
Voila si quelqu'un à une idée ou pourrait m'orienter ce serait vraiment bien. Je vous en remercie d'avance.