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 ![]()