Bonjour adel9
Voilà la première version du programme.
Nécessite la bibliothèque VarSpeedServo.h
Quelques points, quand au paramétrage des servo et de leur mouvement, ces paramètres se trouvent dans le tableau servo[] qui contient la vitesse, l’angle fermé et l’angle ouvert.
// Paramètrees des mouvements des servo
// Vitesse Fermé Ouvert
{ 70, 10, 180},
{ 50, 10, 180},
{ 50, 10, 180},
Pour faire bouger les servo, il faut, taper la commande DISTR2, pour la colonne 2, par exemple. Le servo 2 doit aller à Ouvert puis aller à Fermé. Également avec DISTR1 et DISTR3.
Quel capteur de présence de la capsule comptes tu employer ?
Je vais faire des essais avec de simples LDR.

Le schéma attenant au programme :
Le nécessaire pour la liaison Bluetooth fait déjà partie du sketch (
btSerial).
Le schéma :
ARDFR_adel94_DistribDosette.pdf (138.6 KB)
Des indications quant au déroulement du programme sont affichées dans la console à 115200
Au lancement du programme :
Distributeur de dosettes:
3crus:
Livento
Ristretto
Volluto Deca
La commande DISTR2
Ejection de Ristretto
Servo ouverture 10
Servo fermeture 180
Commande OK 2
Le brochage du programme n’est pas encore adapté à ton shield.
Charges et lis ce programme et pose un maximum de questions
.
Le programme :
/*
Name: ARDFR_adel94_DistribDosettes.ino
Created: 19.01.2024
Author: jpbbricole/adel94
Remarque: Distributeur de dosettes genre Nespresso
23.01.2024 Première version #79
*/
#include <SoftwareSerial.h> // Pour communicaton avec Bluetooth
#include <VarSpeedServo.h> // https://github.com/netlabtoolkit/VarSpeedServo
//------------------------------------- Bluetooth
const int btRxPin = 8; // Réception de Bluetooth
const int btTxPin = 9; // Transmission vers Bluetooth
SoftwareSerial btSerial(btRxPin, btTxPin); // RX, TX
//------------------------------------- Dosettes (dose)
const String doseCrusLabel[] = {"Livento", "Ristretto", "Volluto Deca"};
enum { doseCruNumLivento, doseCruNumRistretto, doseCruNumVollutoDeca};
//------------------------------------- Distributeur (distr)
const int distrServoPin[] = {5, 6, 7}; // Pin de commande des servo
const int distrPosNombre = sizeof(distrServoPin) / sizeof(sizeof(distrServoPin[0]));
//------------------------------------- Servo
struct servoDef // Structure de données des servo du distributeur
{
int speed; // Vitesse
int pulseOuvert; // Impulsion ou degrés pour ouvert
int pulseFerme; // Impulsion ou degrés pour fermé
};
servoDef servoParam[] =
{
// Paramètrees des mouvements des servo
// Vitesse Fermé Ouvert
{ 70, 10, 180},
{ 50, 10, 180},
{ 50, 10, 180},
};
const int servoNombre = sizeof(servoParam) / sizeof(servoParam[0]); // Calcul du nombre de servo
VarSpeedServo servo[servoNombre]; // Tableau des servo
const boolean servoEndWait = true; // Si attente fin mouvement
//------------------------------------- Ligne de commandes
bool cmdNouvelleRecue = false; // Si une nouvelle commande a été reçue de moniteur ou Bluetooth
String cmdTexte = ""; // Texte de la commande
void setup()
{
Serial.begin(115200);
btSerial.begin(9600);
progrPresentation();
servoInitialisation();
}
void loop()
{
//--------------------------------- Ecoute des entrées de commandes;
serialLecture(); // Lecture du port série du moniteur
btSerialLecture(); // Lecture du port série du HC-06
if (cmdNouvelleRecue) // Si une nouvelle commande depuis le moniteur ou Bluetooth
{
cmdExecute(cmdTexte); // Exécution de la commande reçue
cmdTexte = "";
cmdNouvelleRecue = false;
}
}
//------------------------------------- Distributeur (distr)
void distrDoseSelect(int distrDose)
{
// Tester la validité de la sélection
distrDoseEject(distrDose);
}
void distrDoseEject(int position)
{
Serial.println("\nEjection de " + doseCrusLabel[position]);
Serial.println("Servo ouverture\t" + String(servoParam[position].pulseOuvert));
servo[position].write(servoParam[position].pulseOuvert, servoParam[position].speed, servoEndWait); // Mouvement ouvrir en attendant la fin
delay(1000);
Serial.println("Servo fermeture\t" + String(servoParam[position].pulseFerme));
servo[position].write(servoParam[position].pulseFerme, servoParam[position].speed, servoEndWait); // Mouvement ouvrir en attendant la fin
}
//------------------------------------- Servo
void servoInitialisation() // Initialisation des servo
{
for (int s = 0; s < servoNombre; s ++)
{
servo[s].attach(distrServoPin[s]);
servo[s].write(servoParam[s].pulseFerme, servoParam[s].speed, !servoEndWait); // Mouvement ouvrir en attendant la fin
}
}
/*----------------------------------------------------------------------------
Ligne de commandes, le format est la CommandeParamètre
Ce système n'est pas sensible à la casse.
Commandes acceptées DISTR1 ou DISTR2 ...pour colonne du distributeur
'*----------------------------------------------------------------------------
*/
void cmdExecute(String cmdRx)
{
cmdRx.toUpperCase(); // Tout en majuscules
cmdRx.replace(" ", ""); // Supprimer les espaces
bool cmdOk = true;
if (cmdRx.startsWith("DISTR")) // Commande distributeur
{
cmdRx.replace("DISTR", ""); // On ne garde que le 01 de DISTR01
distrDoseSelect(cmdRx.toInt() -1); // On envoie le 01 sous forme de int -1 à distrDoseSelect
// En interne la numérotation débute à 0
}
else
{
Serial.print(F("Commande inconnue ")); Serial.println(cmdRx);
cmdOk = false;
}
if (cmdOk) // Si la commande est valide
{
Serial.println("Commande OK " + cmdRx);
}
}
void progrPresentation()
{
Serial.println(F("\nDistributeur de dosettes:"));
Serial.println("\t" + String(distrPosNombre) + "crus:");
for (int c = 0; c < distrPosNombre; c ++) // Liste des crus
{
Serial.println("\t" + doseCrusLabel[c]);
}
}
/* -----------------------------------------------------------------------
Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialLecture()
{
if (Serial.available())
{
cmdTexte = Serial.readStringUntil('\n'); // Attente de nouvelle ligne
cmdTexte.trim(); // Nettoyage de la réception
cmdNouvelleRecue = true;
}
}
/* -----------------------------------------------------------------------
Réception de commandes depuis Bluetoorh
'*------------------------------------------------------------------------
*/
void btSerialLecture()
{
if (btSerial.available())
{
cmdTexte = btSerial.readStringUntil('\n'); // Attente de nouvelle ligne
cmdTexte.trim(); // Nettoyage de la réception
cmdNouvelleRecue = true;
}
}
Mon montage de développement:
Amuses toi bien ![]()
Une toute belle journée à toi!
jpbbricole0

