Programmation

Par Amin Svendsen

Dans un premier temps, j’ai monté et programmé le microcontrolleur avec le site internet Wokwi. Wokwi est une plateforme en ligne de simulation de projets Arduino. Wokwi nous à permis de concevoir, coder et tester notre projet électronique directement dans le navigateur sans avoir besoin de matériel physique.

capture d'écran du montage sur wokwi

Cependant Wokwi est seulement un simulateur et n’est pas parfaitement fidèle avec les composants que nous avons. Une grande partie de mon code ne correspondait pas à la réalité, c’est ce qui m’a donné le plus de temps dans cette étape.

Nous avons donc dû prototyper le programme sur le breadboard pour corriger et faire marcher le code en situation réelle.

Le but de notre programme est de faire tourner le moteur avec le temps et la vitesse choisi par l’utilisateur. On peut mieux visualiser le fonctionnement de notre programme avec le logigramme suivant:

logigramme

Étapes de programmation

Nous avons divisé le programme en deux parties principales pour simplifier la tâche :

Moteur : Pour contrôler le moteur, nous avons utilisé la bibliothèque AccelStepper. Nous avons créé une instance de la classe AccelStepper puis configuré une broche de sortie qui lie les pins step et Dir du driver. Dans la fonction “loop”(), nous avons les fonctions Stepper.setSpeed() pour gérer la vitesse de rotation et Stepper.runSpeed() dans la fonction pour assurer une rotation continue.

#include <AccelStepper.h>

// configuration des pins
#define STEP_PIN 25
#define DIR_PIN 23

// Creation d une classe stepper
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

void setup() {
  Serial.begin(115200);
  pinMode(13,OUTPUT);
  digitalWrite(13, LOW);

  // Les fonctions pour gerer la vitesse maximal et la vitesse de rotation.

  stepper.setMaxSpeed(1000); 
  stepper.setSpeed(100);
}

void loop() {
  stepper.runSpeed();
}

Écran et potentiomètre : Nous utilisons un écran OLED 1306, nécessitant les bibliothèques Adafruit GFX et Adafruit SSD1306.

Il faut aussi crée une instance de la classe Adafruit_SSD1306 pour gérer l’écran OLED.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Arduino.h>

//definition de la taille de l ecran
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

Dans la fonction setup(), on a initialisé l’écran ainsi que configuré le pin de l’interrupteur:

void setup() {
  Serial.begin(115200);

  //initialisation de l ecran
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }

  display.display();
  delay(2000);
  display.clearDisplay();
  pinMode(button,INPUT);
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
}

Avant de commencer la boucle principale, il y a une boucle qui s’appelle la fonction “config()” qui demande à l’utilisateur sur l’écran de configurer la vitesse et la durée souhaitée.

La configuration se fait tant que le bouton n’est pas pressé.

display.clearDisplay();
  display.setCursor(0, 0);
  while(digitalRead(button) == LOW){ // tant que le bouton n est pas presse
    val = map(analogRead(potT),0,4095,0,720); // lecture des valeurs des potentiometres
    speed = analogRead(potV);
    if(val != (hour + minute)){ // fait visualiser la valeur de potard en heures et minutes
      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 ecran

    display.setCursor(0, 16);
    display.clearDisplay(); 
    display.setTextSize(1);
    display.print("Veuillez configurer le temps et la vitesse: \nTemps: ");
    display.print(hour);
    display.print("h ");
    display.print(minute);
    display.print(" min");
    display.print("\nVitesse: ");
    display.print(speed);
    display.display();
    Serial.print("hour = ");
    Serial.print(hour);
    Serial.print(" and min = ");
    Serial.print(minute);
    Serial.print("\n");
    
  }
  display.setTextSize(2);
  remaining_hour = hour;
  remaining_min = minute;
}

Une fois le bouton pressé, la boucle principale “loop()” commence, la configuration est terminée et le temps de compte à rebours est initialisé. Le minuteur s’affiche sur l’écran au format HH:MM:SS, et le moteur continue de tourner jusqu’à ce que le minuteur atteigne 00:00:00.

unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // mise a jour du compte a rebours
    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;
    }

// affichage du compte a rebours

    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Countdown: ");
    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(); 
  }
}

Voici le lien si vous voulez visualiser le code entier: Main.cpp