Stylo 3D

Moi aussi je suis fatigué mais j'ai réussi à faire quelque chose donc voici mon code:

/*
Gestion buse de STYLO3D
v1.0

La buse du stylo est à changer toute les 1000h d'utilisation
et ce programme permet de savoir quand la changer en mémorisant
le temps d'utilisation du stylo.

/////PIN MAPPING ON UNO/////
 D0:  RX Serial
 D1:  TX Serial
 D2:  
 D3:  BOUTON ENREGISTREMENT 
 D4:  BOUTON CHANGER BUSE
 D5:  
 D6:  
 D7:  
 D8:  
 D9:  
 D10: 
 D11: 
 D12: LED ENREGISTREMENT EN COUR
 D13: LED CHANGER BUSE
 
 A0: 
 A1: 
 A2: 
 A3: 
 A4: SDA FOR RTC DS1307
 A5: SCL FOR RTC DS1307
 
*/

#include <EEPROM.h>    // pour écrire en mémoire de l'arduino
#include <TinkerKit.h> // 
#include <Wire.h>      // for communication with DS1307
#include "RTClib.h"    // DS1307 lib
#include "EEPROMAnything.h"

#define BOUTON_ENREGISTREMENT 3    // bouton poussoir pour démarrer et arreter l'enregistrement
#define BOUTON_CHANGER_BUSE 4      // bouton poussoir pour dire qu'on a changé la buse (sinon la led reste allumée) et on n'enregistre rien
#define LED_ENREGISTREMENT 12      // led qui s'allume dès qu'on enregistre et s'éteint quand on enregistre pas
#define LED_CHANGER_BUSE   13      // led qui s'allume dès qu'on doit changer la buse

boolean buse_changee = true; // buse changée? pour le premier lancement on considerera que la buse est neuve

double current_sec = 0;
double starting_sec = 0;
double final_sec = 0;
double current_delta_sec = 0;
int test;
double final_delta_sec; // !!! ATTENTION: NE PAS INITIALISER CETTE VARIABLE A 0 SINON LE TEMPS D'UTILISATION DE LA BUSE SERA REINITIALISE A CHAQUE REDEMARRAGE DE LA CARTE !!!
int buttonState = 0;
double result1; 
double result2;
int comptage=0;
unsigned int resultfinal;
byte valuefinal;

#define adr_eprom_test 200                 // For the test for 1st time init of the Arduino (First power on)
#define adresse_eeprom_compteur 0      

// DS1307 clock;//define a object of DS1307 class
static RTC_DS1307  clock;
static DateTime clock_currentTime;

// for refresh time
const unsigned long DISPLAY_INTERVAL = 5000; // in ms
static unsigned long lastTime=0;  // in ms
unsigned long time=millis();      // in ms


///// SETUP /////
void setup()
{
  Serial.begin(9600);
  delay(10);
  Wire.begin();
  delay(10);
  clock.begin();
  delay(10);
  //clock__rtc.adjust(DateTime(__DATE__, __TIME__)); // set time of RTC DS1307 with computer time for the 1st time
  
  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);
  }
  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);
  }
  
  // affiche l'heure courante avant de démarrer
  clock_currentTime = clock.now();
  printTime();
}

///// MAIN LOOP /////
void loop()
{
  clock_currentTime = clock.now();
  
  // 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
  }
  
  
  // DEBUT ENREGISTREMENT
  // détecte appui sur bouton d'enregistrement et commence le décompte
  if (digitalRead(BOUTON_ENREGISTREMENT)==LOW && buse_changee == true) 
  // 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_currentTime.hour())*36E2)+((clock_currentTime.minute())*60)+ (clock_currentTime.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); 
        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
  
   // DEBUT CHANGEMENT BUSE
   // Détecte si appui sur le bouton de changement de buse
   if (digitalRead(BOUTON_CHANGER_BUSE)==LOW && 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
}

// print time DS1307
void printTime()
{
    Serial.print(clock_currentTime.year(), DEC);
    Serial.print('/');
    Serial.print(clock_currentTime.month(), DEC);
    Serial.print('/');
    Serial.print(clock_currentTime.day(), DEC);
    Serial.print(' ');
    Serial.print(clock_currentTime.hour(), DEC);
    Serial.print(':');
    Serial.print(clock_currentTime.minute(), DEC);
    Serial.print(':');
    Serial.print(clock_currentTime.second(), DEC);
    Serial.println();  
}

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

TU devra l'adapter pour qu'il puisse fonctionner avec tes composant mais la trame de base y est et cela fonctionne je l'ai testé.

Pour les tests plutot que d'ajouter 995 tu changes la condition par exemple en mettant:

if (final_delta_sec < 36) // Si delta secondes final est inférieur à la durée d'utilisation de la buse

Pour le reste je te laisse regarder si tu as des questions je te répondrais.

il y a une chose que je n'ai pas géré c'est l'état 'true' ou 'false' a garder en mémoire si jamais on a débranché l'arduino mais que l'on a pas encore changé la buse.

Mais bon ça je vais te laisser le faire, il faut bien que t'ai un peu de boulo :grin: