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

  }
  }

  }
   }

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

a quel endroit dans mon programme je dois rajouter des tempos?

j'ai essayé en rajoutant le if(millis() etc, ça ne fonctionne pas... en supprimant toute les parties en dessous de en dessous de :

   lcd.print("Choix :");
      lcd.setCursor(5,1);
      lcd.print("C");
      screen = 3 ;
      break;
  }
  }

Mes infos dans le moniteur de série défile à nouveau très rapidement, est-il possible que le fait d'avoir beaucoup de condition à contrôler en lisant le capteur de force ralentisse l'execution total de ma loop?

➜ le modulo de nombre négatif est un souci

si vous faites tourner ce code:

void setup() {
  Serial.begin(115200); Serial.println("\n---------------");
  for (long rotEncRead = 5; rotEncRead >= -5; rotEncRead--) {
    long position = (rotEncRead / 4) % 3;
    Serial.print(rotEncRead); Serial.print("\t-> "); Serial.println(position);
  }
}
void loop() {}

le moniteur série (à 115200 bauds) affichera
---------------
5 -> 1
4 -> 1
3 -> 0
2 -> 0
1 -> 0
0 -> 0
-1 -> 0
-2 -> 0
-3 -> 0
-4 -> -1
-5 -> -1

vous obtenez des valeurs négatives qui ne sont pas prévues... (ÉDIT: qui sont prévues)

Bonsoir J-M-L

Tu n'as pas lu tout le programme :wink:, il y a:
lcdMenuIndex = abs(rotEncPositionNew); // abs() pour tout en positif
Donc pas de nombres négatifs.

Cordialement
jpbbricole

J’avais vu cela

Pas de abs() mais oui j’avais pas lu la suite !

Autres questions : j'ai 2 L298N pour piloter mes 3 moteurs ,
Au lieu d'etre en ON/OFF basique j'aimerais faire tourner les moteurs plus doucement.
Problème : il faut que je branche mets 3 pins EN de mes L298N sur ma carte arduino pour faire varier la vitesse .
Or il ne me reste que les pins 0, 1 et 13 de dispo et d'après se que je comprend , Seuls les pins 3, 5, 6, 9, 10 et 11 sont fait pour le PWM.
Est ce que je peux brancher mes conditions utilisant les pins fait le PWM sur 0,1 et 13 et basculer mes EN de mes cartes L298N sur les pins PWM?Ou est ce que 0, 1 e 13 sont elles aussi des entrées spécifiques?

Bonjour joebillybob

Oui, 0 et 1 sont respectivement Rx et Tx du port serial (USB) utilisé par la console et le téléchargement. C'est possible de les utiliser dans certaines conditions mais rendrai le développement très "inconfortable", donc à éviter. La pin 13 est la commande de la LED L sur la carte du UNO est utilisable.
image

Si tu est en manque de ports E/S, mise à part les PWM, ils peuvent être étendus avec un module MCP23017.

Est-ce que la modif proposée au post #12 a fonctionné?

Cordialement
jpbbricole

Est-ce que la modif proposée au post #12 a fonctionné?

j'ai essayé en rajoutant le if(millis() etc, ça ne fonctionne pas...

Est-il possible que le fait d'avoir beaucoup de condition à contrôler en lisant le capteur de force ralentisse l'execution total de ma loop?

quelle bibliothèque utilisez vous ? je vois plus loin dans le setup un

lcd.init();

mais aussi un

lcd.begin(16, 2);


Pour améliorer le timing des print, passez le moniteur série à 115200 bauds dans le setup. 9600 bauds c'était bien au millénaire dernier...

  Serial.begin(115200);

Dans les if quand il y a plusieurs conditions avec des &&, mettez toujours en premier les conditions qui ne sont pas chères à tester. Si la première condition est fausse, le compilateur n'évalue pas la seconde et donc on gagne du temps à l'exécution.
Par exemple

  if (digitalRead(sw) == 0 && screen == 2) // Rappel : bouton = sw 2

devient

  if (screen == 2 && digitalRead(sw) == 0) // Rappel : bouton = sw 2

ou encore

  if (scale.get_units() > 0.333 && compteur == 4)

devient

  if (compteur == 4  && scale.get_units() > 0.333)

de plus vous appelez scale.get_units() de nombreuses fois, peut être ne lire cela qu'une fois par loop et stocker la valeur dans une variable pour l'utiliser lors des tests


Enfin au lieu de choisir ces pins

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

ce qui fait que l'encodeur n'est pas sur 2 pins supportant les interruptions (si la bibliothèque est bien écrite, je ne sais pas laquelle vous utilisez, est-ce Encoder Library, for Measuring Quadarature Encoded Position or Rotation Signals ?) vous pourriez mettre le bouton sur la pin 4 et conserver 2 et 3 pour DT et CLK

#define sw 4 // Used for the Rotary push button switch
#define dt 2 // Used for reading DT signal
#define clk 3 // Used for generating interrupts using CLK signal
Encoder rotEnc(dt, clk);

En effectuant ces modifications mon Programme s'execute beaucoup plus rapidement, merci !

j'ai supprimé

j'utilise la bibliotheque LiquidCrystal by arduino version 1.0.7
Pour l'encodeur j'utilise la bibliotheque Encoder de Paul stoffregen version 1.4.2

Pouvez vous m'expliquer comment le fait de changer de pin d'entrée me permettra d'avoir un meilleur rendu en tournant le potar?
merci pour vos précieux conseilles à tous.