Liquid crystal et potentiomètre

Bonjour,
J'ai actuellement mon programme et mes 3 recettes :
J'aimerais , à l'aide d'un potentiomètre et d'un écran liquid crystal pouvoir choisir entre mes recettes "a", "b" et "c" et quand je fais mon choix, la recette sélectionné se lance.
en vous remerciant par avance !

ceci n'est pas un projet fini.... ➜ déplacé

lire les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Bonsoir joebillybob

Mets ton programme en ligne pour pouvoir comment "caser" cette fonction.

C'est vraiment un potentiomètre
image
ou c'est un codeur rotatif?
image

Cordialement
jpbbricole

Oups, effectivement je me suis trompé il s'agit bien d'un codeur
encodeur
pour la recette je vous mets juste la partie void loop , les 3 recettes sont identiques seuls les valeurs changent :

void loop()
{


  etatbouton = digitalRead(bouton);
if (etatbouton == HIGH) // Rappel : bouton = 3
  { delay(1000) ;
    scale.tare();
    compteur = 0;
    digitalWrite(in1, HIGH);
  }
  else if (scale.get_units() > 0.017 && compteur == 0)
  {  digitalWrite(in1, LOW);
    delay(1000) ;
    compteur = 1;
    scale.tare();
  }

  else if (compteur == 1)
  {

    digitalWrite(in3, HIGH);
  }
if (scale.get_units() > 0.025 && compteur == 1)
  {
    digitalWrite(in3, LOW);
    delay(1000) ;
    scale.tare();
    compteur = 2;
  }
  else if (compteur == 2)
  {
    digitalWrite(in5, HIGH);
  }
if (scale.get_units() > 0.120 && compteur == 2)
  {
    digitalWrite(in5, LOW);
    delay(1000) ;
    scale.tare();
    compteur = 3;
  }
}

Je me permets de rajouter quelques détails à ma demande :
Je veux simplement, en tournant le potar, faire apparaitre "A", en tournant le potar soit "C" soit "B".
Une fois que je clique sur une recette , par exemple " A" , ma recette se lance automatiquement.

prenez une bibliothèque pour l'encodeur, par exemple encoder

ensuite il suffit de lire la valeur et de réagir aux modifications

Bonjour joebillybob

Voilà un exemple de traitement d'un codeur rotatif:

/*
    Name:       ARDFR_joebillybob_Rotenc.ino
    Created:	14.01.2022
    Author:     jpbbricole
*/
#include <Encoder.h>      https://www.arduino.cc/reference/en/libraries/encoder/
Encoder rotEnc(9, 10);
long rotEncPosition = 1;
long rotEncPositionNew = 0;

int lcdMenuIndex = 0;


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

void loop()
{
  // /4 parce que quadrature   %3 modulo 3 parce que 3 options A, B, C
  rotEncPositionNew = (rotEnc.read() /4) %3;    

  if (rotEncPositionNew != rotEncPosition) 
  {
	  rotEncPosition = rotEncPositionNew;
	  lcdMenuIndex = abs(rotEncPositionNew);     // abs() pour tout en positif

	Serial.print(F("Selection menu "));
	switch(lcdMenuIndex) 
	{
		case 0: 
			Serial.println(F("A"));
			break;
		case 1:                                            
			Serial.println(F("B"));
			break;
		case 2:                                            
			Serial.println(F("C"));
			break;
	}
  }
}

Avec la bibliothèque Encoder.h
Adaptes cette ligne
Encoder rotEnc(9, 10);
à ton installation.

A+
Cordialement
jpbbricole

Merci beaucoup jpbbricole ! mes recettes s'affichent quand je tourne le codeur :slight_smile:
Question : les recettes s'affichent directement si je tourne dans le sens anti-horaire, mais si je tourne dans le sens horaire la recette ne change pas du premier coup.
Comment cela ce fait-il ?

Bonsoir joebillybob
Postes ton code complet.

Cordialement
jpbbricole

#include <HX711.h>
float calibration_factor = 9950600;
HX711 scale;
const int LOADCELL_DOUT_PIN = 5;
const int LOADCELL_SCK_PIN = 6;
int screen = 0;

#include <Encoder.h> 

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
int lcdMenuIndex = 0;

Encoder rotEnc(4, 3);
#define sw 2 // Used for the Rotary push button switch
#define dt 3 // Used for reading DT signal
#define clk 4 // Used for generating interrupts using CLK signal
int compteur = 3;
long rotEncPosition = 1;
long rotEncPositionNew = 0;


#define in1 7
#define in2 8
#define in3 9
#define in4 10
#define in5 11
#define in6 12


void setup() {

  lcd.init();
  lcd.backlight();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("Welcome");
  lcd.setCursor(4,1);
  lcd.print("Machine");
  pinMode(sw, INPUT_PULLUP);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(in5, OUTPUT);
  pinMode(in6, OUTPUT);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  digitalWrite(in5, LOW);
  digitalWrite(in6, LOW);

  Serial.begin(9600);
  scale.begin(5, 6);
  scale.set_scale();
  delay(3000) ;
  scale.tare(); //effectue un reset de la balance
}
 void loop()
{
  {
  scale.set_scale(calibration_factor); //ajuster la mesure avec le facteur de calibration
  Serial.print("lecture: ");
  Serial.print(scale.get_units(), 3); //unité ( dixieme, centieme...)
  Serial.print(" kg");
  Serial.print(" facteur_calibration: ");
  Serial.print(calibration_factor);
  Serial.println();
}


  
  rotEncPositionNew = (rotEnc.read() /4) %3;    // /4 parce que quadrature   %3 modulo 3 parce que 3 options A, B, C

  if (rotEncPositionNew != rotEncPosition && compteur == 3) 
  {
   rotEncPosition = rotEncPositionNew;
    lcdMenuIndex = abs(rotEncPositionNew);     // abs() pour tout en positif
  
  switch(lcdMenuIndex) 
  {
    case 0: 
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Choix ");
      lcd.setCursor(3,1);
      lcd.print("A");
      screen = 1 ;
      break;
    case 1:  

      lcd.clear();
      lcd.setCursor(0,0);                                   
      lcd.print("Choix ");
      lcd.setCursor(5,1);
      lcd.print("B");
      screen = 2 ;
      break;
    case 2:  
      lcd.clear();  
      lcd.setCursor(0,0);                                   
      lcd.print("Choix :");
      lcd.setCursor(5,1);
      lcd.print("C");
      screen = 3 ;
      break;
  }
  }

   // ---------------------------------------------------------------- 
 if (digitalRead(sw) == 0 && screen == 1) // Rappel : bouton = sw 2
  { 
    scale.tare();
    compteur = 0;
    digitalWrite(in1, HIGH);
    lcd.clear();                                   
    lcd.setCursor(5,0);                               
    lcd.print(F("texte "));
    lcd.setCursor(5,1);                               
    lcd.print(F("texte"));
  }
if (scale.get_units() > 0.100 && compteur == 0)
  {  digitalWrite(in1, LOW);
    lcd.clear();
    delay(1500) ;
    compteur = 1;
    scale.tare();
  }

if (compteur == 1)
  {

    digitalWrite(in3, HIGH);  
    lcd.setCursor(5,0);                               
    lcd.print(F("texte "));
    lcd.setCursor(6,1);                               
    lcd.print(F("texte "));
  }
if (scale.get_units() > 0.890 && compteur == 1)
  {
    digitalWrite(in3, LOW);
    lcd.clear();
    delay(1500) ;
    scale.tare();
    compteur = 2;
  }
if (compteur == 2)
  {
    digitalWrite(in5, HIGH);   
    lcd.setCursor(5,0);                               
    lcd.print(F("texte "));
    lcd.setCursor(6,1);                               
    lcd.print(F("texte"));
  }
if (scale.get_units() > 0.333 && compteur == 2)
  {
    digitalWrite(in5, LOW);
    lcd.clear();
    lcd.setCursor(5,0);                               
    lcd.print(F("Texte "));
    lcd.setCursor(1,1);                               
    lcd.print(F("texte "));
    scale.tare();
    compteur = 3;
  }

//  ----------------------------------------------------------------     
   if (digitalRead(sw) == 0 && screen == 2) // Rappel : bouton = sw 2
  { 
    scale.tare();
    compteur = 4;
    digitalWrite(in1, HIGH);
    lcd.clear();  
    lcd.setCursor(3,0);                                  
    lcd.print(F("texte "));
        lcd.setCursor(3,1);                                  
    lcd.print(F("texte"));
  }
if (scale.get_units() > 0.333 && compteur == 4)
  {  digitalWrite(in1, LOW);
    lcd.clear();
    delay(1500) ;
    compteur = 5;
    scale.tare();
  }

if (compteur == 5)
  {

    digitalWrite(in3, HIGH);                               
    lcd.setCursor(5,0);                               
    lcd.print(F("texte"));
    lcd.setCursor(6,1);                               
    lcd.print(F("texte "));
  }
if (scale.get_units() > 0.444 && compteur == 5)
  {
    digitalWrite(in3, LOW);
    lcd.clear();
    delay(1500) ;
    scale.tare();
    compteur = 6;
  }
if (compteur == 6)
  {
    digitalWrite(in5, HIGH);  
    lcd.setCursor(5,0);                               
    lcd.print(F("Texte"));
    lcd.setCursor(6,1);                               
    lcd.print(F("Texte "));
  }
if (scale.get_units() > 0.94 && compteur == 6)
  {
    digitalWrite(in5, LOW);
    lcd.clear();
    lcd.setCursor(2,0);                               
    lcd.print(F("texte "));
    lcd.setCursor(0,1);                               
    lcd.print(F("texte"));
    scale.tare();
    compteur = 3;
  }
//  ----------------------------------------------------------------     
   if (digitalRead(sw) == 0 && screen == 3) // Rappel : bouton = sw 2
  { 
    scale.tare();
    compteur = 7;
    digitalWrite(in1, HIGH);
    lcd.clear();  
    lcd.setCursor(5,0);                               
    lcd.print(F("Texte"));
    lcd.setCursor(5,1);                               
    lcd.print(F("Texte"));
  }
if (scale.get_units() > 0.456 && compteur == 7)
  {  digitalWrite(in1, LOW);
    lcd.clear();
    delay(1500) ;
    compteur = 8;
    scale.tare();
  }

if (compteur == 8)
  {

    digitalWrite(in3, HIGH);  
    lcd.setCursor(5,0);                                
    lcd.print(F("Texte "));
        lcd.setCursor(2,1);                                
    lcd.print(F("Texte"));
  }
if (scale.get_units() > 0.372 && compteur == 8)
  {
    digitalWrite(in3, LOW);
    lcd.clear();
    delay(1500) ;
    scale.tare();
    compteur = 9;
  }
if (compteur == 9)
  {
    digitalWrite(in5, HIGH);  
    lcd.setCursor(5,0);                               
    lcd.print(F("Texte"));
    lcd.setCursor(6,1);                               
    lcd.print(F("Texte "));
  }
if (scale.get_units() > 0.725 && compteur == 9)
  {
    digitalWrite(in5, LOW);
    lcd.clear();
    lcd.setCursor(2,0);                               
    lcd.print(F("Texte "));
    lcd.setCursor(0,1);                               
    lcd.print(F("Texte"));
    scale.tare();
    compteur = 3;
  }
   }

J'ai un problème supplémentaire en plus de l'encodeur qui fonctionne mieux dans le sens anti horaire : j'ai l'impression du fait que mon programme soit bien plus long, il met plus de temp à lire la loop et est moins rapide à traiter les valeurs de ma balance , se qui est un gros soucis pour moi car je suis beaucoup moins précis sur la masse de mon produit fini... Avez vous une idée?

Bonjour joebillybob

L'encodeur ne fonctionne pas très bien. Cela ne provient pas de son programme de gestion qui fonctionne très bien, je pense que tu affiches, dans le moniteur, inutilement trop souvent.
Avec une temporisation, il n'y a plus d'erreurs.

Il faut ajouter une variable globale
unsigned long tempoAffichage = millis();
et afficher ainsi:

	if (millis()-tempoAffichage >= 250)     // Afficher tout les 0,25 seconde
	{
		scale.set_scale(calibration_factor); //ajuster la mesure avec le facteur de calibration
		Serial.print("lecture: ");
		Serial.print(scale.get_units(), 3); //unité ( dixieme, centieme...)
		Serial.print(" kg");
		Serial.print(" facteur_calibration: ");
		Serial.print(calibration_factor);
		Serial.println();

		tempoAffichage = millis();
	}

Peut-être que ça résout ton 2ème problème, je n'ai pas l'installation pour essayer "en vrai"

A+
Cordialement
jpbbricole