La V4 est là, le plus est la possibilité de régler les niveaux avec enregistrement des paramètres du niveau réglé.
L'enregistrement ne se fait que dans la mémoire volatile.
Code : Tout sélectionner
/*
***************************************************
****** Ascenseur avec un moteur pas à pas *******
****** *******
****** Programme V 4.0 *******
****** Du 06/05/2025 *******
****** Par C.ARFEL *******
****** *******
****** Carte Wemos D1 Mini *******
****** *******
****** Version 1.0 *******
****** Mise a quai manuelle *******
****** Afficheur lcd 16 x 2 I2C *******
****** RC + 5 sous sol *******
****** Menu par encodeur *******
****** *******
****** *******
****** Liste des bornes utilisées *******
****** *******
****** D0 Capteur infrarouge *******
****** D1 I2C écran *******
****** D2 I2C écran *******
****** D3 DIR commande de direction moteur *******
****** D4 STEP commande nb pas moteur *******
****** D5 SW encodeur *******
****** D6 DT encodeur *******
****** D7 Clic encodeur *******
****** D8 Arrêt d'urgence + FC total *******
****** RST (reset carte) *******
****** *******
****** Le croquis utilise ***** octets (**%)*******
****** de l'espace de stockage de *******
****** programmes. Le maximum est de *******
****** ****** octets. *******
****** *******
****** Les variables globales utilisent *******
****** **** octets (36%) de mémoire *******
****** dynamique, ce qui laisse **** *******
****** octets pour les variables locales. *******
****** Le maximum est de **** octets. *******
****** *******
****** *******
***************************************************
. Variables and constants in RAM (global, static), used 29024 / 80192 bytes (36%)
║ SEGMENT BYTES DESCRIPTION
╠══ DATA 1540 initialized variables
╠══ RODATA 1172 constants
╚══ BSS 26312 zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60415 / 65536 bytes (92%)
║ SEGMENT BYTES DESCRIPTION
╠══ ICACHE 32768 reserved space for flash instruction cache
╚══ IRAM 27647 code in IRAM
. Code in flash (default, ICACHE_FLASH_ATTR), used 241172 / 1048576 bytes (22%)
║ SEGMENT BYTES DESCRIPTION
╚══ IROM 241172 code in flash
*/
#include <AccelStepper.h> // Bibliothéque moteur pas a pas
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Bibliothéque ecran protocole I2C
#include "RotaryEncoder.h" // Appel de la bibliothéque pour encodeur
#define STEPSS 1 // Nombre par pas d'encodeur
#define POSMIN -5 // Position MINI de l'encodeur
#define POSMAX 9 // Position MAX de l'encodeur
#define BPE D5 // Borne SW encodeur (bouton)
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 ou 0x3F déclaration adresse du lcd
RotaryEncoder encoder(D6, D7); // Borne de l'encodeur (DT, CLK)
const byte pin_DIR = D3; // Borne contrôle pour TMC2209
const byte pin_STEP = D4; // Borne contrôle pour TMC2209
AccelStepper stepper(AccelStepper::DRIVER, pin_STEP, pin_DIR); // création objet Stepper
int Pos0SS = 0; // Crans moteur pour la position plateau niveau reseau.
int Pos1SS = 10000; // Crans moteur pour la position plateau 1er sous sol
int Pos2SS = 20000; // Crans moteur pour la position plateau 2ème sous sol
int Pos3SS = 30000; // Crans moteur pour la position plateau 3ème sous sol
int Pos4SS = 40000; // Crans moteur pour la position plateau 4ème sous sol
int Pos5SS = 50000; // Crans moteur pour la position plateau 5ème sous sol
int Position = 0; // variable information position du plateau
int Init = 0; // Variable pour l'initialisation
int Ebpe = 10; // Variable position bouton encodeur 1
int lastPos, newPos; // Variable encodeur
int Aller = 1; // Variable destination
int Deplace ; // variable 1 pour le deplacement réglage
void setup()
{
lcd.init(); // Initialisation de l'afficheur
lcd.backlight(); // Allume l'ecran
lcd.clear(); // Efface l'ecran
lcd.setCursor (0,0); // place le curseur sur la ligne 0 a gauche
lcd.print ("*Initialisation*"); // Affichage sur le lcd
lcd.setCursor (0,1); // passe a la ligne suivante
lcd.print ("* du Programme *"); // affichage sur le lcd
stepper.setMaxSpeed(8000.0); // Vitesse max moteur
stepper.setAcceleration(1000.0); // distance accélération / décélération
encoder.setPosition(10 / STEPSS); // Position initiale encodeur
pinMode(BPE, INPUT); // Initialisation en entrée (de la borne D5) du clic encodeur rotatif
}
/*
************************
* Fin de la zone SETUP *
************************
*/
/*
****************************
* Séquence initialisation *
****************************
*/
void Initialisation() { // Module initialisation du plateau Recherche du FC
// Il ne se passe rien d'important ici pour le moment a ce stade du programme.
lcd.clear (); // Efface l'ecran
delay (10);
lcd.setCursor (0,0);
lcd.print (" Niveau reseau. ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (20);
Init = 1; // Informe que l'initialisation a été faite pour ne pas y revenir
}
/*
**************************************
* Fin de la séquence initialisation *
**************************************
*/
/*
*********************************
* Début boucle principale LOOP *
*********************************
*/
void loop()
{
if (Init <1) { // Si 1er passage executer la ligne suivante sinon passer
Initialisation(); // Vas executer le bloc "initialisation"
}
/*
********************************
* Début de la zone des appels *
********************************
*/
/*
****************************************
* Menu selection par encodeur rotatif *
****************************************
*/
// ________________ Zone lecture encodeur rotatif _______________
encoder.tick();
newPos = encoder.getPosition() * STEPSS;
if (newPos < POSMIN) {
encoder.setPosition(POSMIN / STEPSS);
newPos = POSMIN;
}
else if (newPos > POSMAX) {
encoder.setPosition(POSMAX / STEPSS);
newPos = POSMAX;
}
if (lastPos != newPos) {
if (newPos <= 0){ // valable de -5 a 0
delay (100);
lcd.setCursor (0,0);
lcd.print ("Niveau ");
lcd.print (Position);
lcd.print (" ");
delay(100);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("Destination : ");lcd.print(newPos);lcd.print(" ");
delay (100);
lastPos = newPos;
}
if (newPos == 1){ Deplace = 10; Affiche1(); lastPos = newPos; } // Valable si 1
if (newPos == 2){ Deplace = 30; Affiche1(); lastPos = newPos; } // Valable si 2
if (newPos == 3){ Deplace = 50; Affiche1(); lastPos = newPos; } // Valable si 3
if (newPos == 4){ Deplace = 100; Affiche1(); lastPos = newPos; } // Valable si 4
if (newPos == 5){ Deplace = -10; Affiche1(); lastPos = newPos; } // Valable si 5
if (newPos == 6){ Deplace = -30; Affiche1(); lastPos = newPos; } // Valable si 6
if (newPos == 7){ Deplace = -50; Affiche1(); lastPos = newPos; } // Valable si 7
if (newPos == 8){ Deplace = -100; Affiche1(); lastPos = newPos; } // Valable si 8
}
if (digitalRead(BPE) == LOW) { // Control si Bouton encodeur actionné
Ebpe = newPos;
delay(500); // Tempo de pause pour éviter la redondance du clic
}
/*
***************************
* Appel Dans les niveaux *
***************************
*/
if (Ebpe == 1) { ReglageNiveau(); } // Réglage niveau +10
if (Ebpe == 2) { ReglageNiveau(); } // Réglage niveau +20
if (Ebpe == 3) { ReglageNiveau(); } // Réglage niveau +50
if (Ebpe == 4) { ReglageNiveau(); } // Réglage niveau +100
if (Ebpe == 5) { ReglageNiveau(); } // Réglage niveau -10
if (Ebpe == 6) { ReglageNiveau(); } // Réglage niveau -20
if (Ebpe == 7) { ReglageNiveau(); } // Réglage niveau -50
if (Ebpe == 8) { ReglageNiveau(); } // Réglage niveau -100
if (Ebpe == 9) { Affiche2(); }
if (Ebpe == 0) { Aller = Pos0SS; Position = 0; deplacement(); } // Action si choix RC
if (Ebpe == -1) { Aller = Pos1SS; Position = -1; deplacement(); } // Action si choix -1
if (Ebpe == -2) { Aller = Pos2SS; Position = -2; deplacement(); } // Action si choix -2
if (Ebpe == -3) { Aller = Pos3SS; Position = -3; deplacement(); } // Action si choix -3C
if (Ebpe == -4) { Aller = Pos4SS; Position = -4; deplacement(); } // Action si choix -4
if (Ebpe == -5) { Aller = Pos5SS; Position = -5; deplacement(); } // Action si choix -5
} // Fin du loop
/*
***************************************************
* Fin boucle principale LOOP *
***************************************************
*/
/*
****************
* Affichage 1 *
****************
*/
void Affiche1(){
lcd.clear (); // Efface l'ecran
delay (10);
lcd.setCursor (0,0);
lcd.print (" Reglage niveau ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print (" ** "); lcd.print (Deplace); lcd.print (" **");
delay (10);
}
/*
********************
* Fin Affichage 1 *
********************
*/
/*
****************
* Affichage 2 *
****************
*/
void Affiche2(){
// lcd.clear (); // Efface l'ecran
delay (10);
lcd.setCursor (0,0);
lcd.print ("** En attente **");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** choisissez **");
delay (10);
}
/*
********************
* Fin Affichage 2 *
********************
*/
/*
************************
* REGLAGE DES NIVEAUX *
************************
*/
void ReglageNiveau(){
delay (100);
if (Position == 0) { Aller = Pos0SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos0SS = Aller ; delay(500) ; }
if (Position == -1) { Aller = Pos1SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos1SS = Aller ; delay(500) ; }
if (Position == -2) { Aller = Pos2SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos2SS = Aller ; delay(500) ; }
if (Position == -3) { Aller = Pos3SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos3SS = Aller ; delay(500) ; }
if (Position == -4) { Aller = Pos4SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos4SS = Aller ; delay(500) ; }
if (Position == -5) { Aller = Pos5SS + (Deplace * 10); stepper.runToNewPosition(Aller); Pos5SS = Aller ; delay(500) ; }
lcd.clear (); // Efface l'ecran
delay (10);
lcd.setCursor (0,0);
lcd.print (" Reglage niveau ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print (" - Fait - ");
delay (1000);
Ebpe = 10; // Place hors champ la variable de l'encodeur pour éviter une boucle infini.
Affiche2() ;
} // Fin réglage niveaux
/*
****************
* DEPLACEMENT *
****************
*/
void deplacement () { // Action selon choix clik
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print ("** Plateforme **");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("* En mouvement *");
delay (10);
stepper.runToNewPosition(Aller);
delay(1000) ;
Ebpe = 10; // Place hors champ la variable de l'encodeur pour éviter une boucle infini.
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print ("Niveau ");
lcd.print (Position); // affiche la position du plateau
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
} // fin déplacement
/*
*********************
* Fin du programme *
*********************
*/
Prochaine étape, sauvegarder les niveaux dans la mémoire EEPROM (non volatile).
