Ont continue avec l'ajout d'un encodeur rotatif et la création de menus ...
.
Encodeur.jpg
.
Le programme :
Code : Tout sélectionner
/*
***************************************************
****** Ascenseur avec un moteur pas à pas *******
****** *******
****** Programme V 3.0 *******
****** Du 22/02/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 (**%) 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 29192 / 80192 bytes (36%)
║ SEGMENT BYTES DESCRIPTION
╠══ DATA 1536 initialized variables
╠══ RODATA 1240 constants
╚══ BSS 26416 zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60995 / 65536 bytes (93%)
║ SEGMENT BYTES DESCRIPTION
╠══ ICACHE 32768 reserved space for flash instruction cache
╚══ IRAM 28227 code in IRAM
. Code in flash (default, ICACHE_FLASH_ATTR), used 245364 / 1048576 bytes (23%)
║ SEGMENT BYTES DESCRIPTION
╚══ IROM 245364 code in flash
*/
#include <AccelStepper.h> // Bibliothéque moteur pas a pas
const byte pin_DIR = D3; // Borne contrôle pour TMC2209
const byte pin_STEP = D4; // Borne contrôle pour TMC2209
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Bibliothéque ecran protocole I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 ou 0x3F déclaration adresse du lcd
#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 4 // Position MAX de l'encodeur
#define BPE D5 // Borne SW encodeur (bouton)
RotaryEncoder encoder(D6, D7); // Borne de l'encodeur (DT, CLK)
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 Init = 0; // Variable pour l'initialisation
int Ebpe = 10; // Variable bouton encodeur
int lastPos, newPos; // Variable encodeur
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 ("* Programme *"); // affichage sur le lcd
stepper.setMaxSpeed(8000.0); // Vitesse max moteur
stepper.setAcceleration(500.0); // distance accélération / décélération
encoder.setPosition(10 / STEPSS); // Position initiale encodeur
pinMode(BPE, INPUT); // Initialisation 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 (100);
lcd.setCursor (0,0);
lcd.print (" Niveau reseau. ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (200);
Init = 1; // Informe que l'initialisation a été faite pour ne pas y revenir
}
void loop()
{
if (Init <1) { // Si 1er passage executerligne 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
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("Choix => ");lcd.print(newPos);lcd.print(" ");
delay (10);
lastPos = newPos;
}
if (newPos >= 1){ // Valable si 1
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("Choix => ");lcd.print("Reglage");
delay (10);
lastPos = newPos;
}
}
if (digitalRead(BPE) == LOW) { // Control si Bouton encodeur actionné
Ebpe = newPos;
delay(500); // Tempo de pause pour éviter la redondance du clic
}
/*
*****************************
* Appel au rez de chaussée *
*****************************
*/
if (Ebpe == 0) { // Action si choix 0 RC
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(Pos0SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau reseau. ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
/*
**************************
* Appel au 1er sous sol *
**************************
*/
if (Ebpe == -1) { // Action si choix -1
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(Pos1SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau -1 ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
/*
***************************
* Appel au 2ème sous sol *
***************************
*/
if (Ebpe == -2 ) {
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(Pos2SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau -2 ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
/*
***************************
* Appel au 3ème sous sol *
***************************
*/
if (Ebpe == -3 ) {
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(Pos3SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau -3 ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
/*
***************************
* Appel au 4ème sous sol *
***************************
*/
if (Ebpe == -4 ) {
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(Pos4SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau -4 ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
/*
***************************
* Appel au 5ème sous sol *
***************************
*/
if (Ebpe == -5 ) {
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(Pos5SS);
delay(1000) ;
Ebpe = 10;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" Niveau -5 ");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (1000);
}
}
La vidéo qui vas bien avec :
https://www.youtube.com/watch?v=jlBSXtZ7rxA
Etape suivante :
Régler finement les arrêt et enregistrement (volatil dans un 1er temps) des novelles positions.
Modification du programme de sélections qui passera de 170 lignes de codes a .... 40 lignes.

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.