#include <AccelStepper.h>
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>

//Definition de la taille de l'écran
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Affectation des pins
#define STEP_PIN 33
#define DIR_PIN 32
#define enable 13
#define button 12
#define potV 25
#define potT 26

// Declaration de l'objet stepper
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

unsigned long previousMillis = 0;
unsigned long interval = 1000; 
unsigned int temp = 0;
int remaining_hour = 0;
int remaining_min = 0;
int remaining_sec = 0;
int speed;
unsigned long val = 0;

void config();
void init();

void setup() {
  Serial.begin(115200);

  //initialisation de l'écran
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  pinMode(enable, OUTPUT);
  digitalWrite(enable, LOW);

  // Tourner l'écran 180 degrées
  display.setRotation(2); 

  display.display();
  delay(2000);
  display.clearDisplay();
  pinMode(button,INPUT_PULLUP);   
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  stepper.setMaxSpeed(8000); 
  stepper.setSpeed(250);

}

void loop() {
  //initialisation
  if(digitalRead(button) == HIGH && temp == 0){
      temp = 1;
      init();
    }
   
  if(digitalRead(button) == LOW && temp == 1){
    config();
  }
  if(digitalRead(button) == LOW && temp == 0){
    config();
    temp = 1;
  }
  //le moteur tourne
  stepper.runSpeed();
  
  //Affichage de l'heure restante
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    if (remaining_sec > 0) {
      remaining_sec -= 1;
    }
    else if(remaining_sec == 0){
      remaining_sec = 59;
      remaining_min --;
    }
    if(remaining_min <= 0){
      remaining_hour--;
      remaining_min = 59;
    }
    
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Temps\nrestant:\n\n ");
    display.print(remaining_hour);
    display.print(":");
    if (remaining_min < 10) {
      display.print("0"); 
    }
    display.print(remaining_min);
    display.print(":");
    if (remaining_sec < 10) {
      display.print("0"); 
    }
    display.println(remaining_sec);
    display.display();
  }
}

//fonction de configuration du temps et de la vitesse
void config(){
  int hour = 0 ;
  int minute = 0;
  speed = 200;
  display.clearDisplay();
  display.setCursor(0, 0);
  while(digitalRead(button) == LOW ){ //tant que l'utilisateur n'appuie sur l'interrupteur
    val = map(analogRead(potT),0,4095,0,720);
    if( speed > (map(analogRead(potV),0,4095,0,8000) + 50)){
      speed = speed - 50;
    }
    if( speed < (map(analogRead(potV),0,4095,0,8000) - 50)){
      speed = speed + 50;
    }
    if(val != (hour + minute)){
      if(val > (hour * 60 + minute + 15)){
        minute = minute + 15;
        Serial.print("plus");
      }
      if(val < (hour * 60 + minute - 15)){
        minute = minute - 15;
        Serial.print("moins");
      }
    }
    if(minute > 59){
      hour++; 
      minute = 0;
    }
    if(minute < 0){
      hour--;
      minute = 45;
    }
    //affichage de l'écran
    display.setCursor(0, 0); 
    display.clearDisplay(); 
    display.setTextSize(1);
    display.print("Reglez temps \net vitesse: \n\nTemps: ");
    display.print(hour);
    display.print("h ");
    display.print(minute);
    display.print(" min");
    display.print("\nVitesse: ");
    display.print(map(speed,0,8000,0,4000));
    display.display();
    Serial.print("Bouton = ");
    Serial.println(speed);
    
  }
  display.setTextSize(2);
  remaining_hour = hour;
  remaining_min = minute;
  //affectation de la vitesse
  stepper.setSpeed(speed);
}

void init(){
  while(digitalRead(button) == HIGH ){
    display.setCursor(0, 16); 
    display.clearDisplay(); 
    display.setTextSize(1);
    display.println("Appuyez sur\nl'interrupteur pour\ncommencer");
    display.display(); 
  }
}






