``Pb avec HX711 et deux points de références

`

Bonsoir,
Je souhaite réaliser une balance avec deux points de références (240,0 gr et 260,0 gr) qui allume une diode led verte lorsque le poids est compris entre 240,0gr et 260,0 gr et autrement allume une diode rouge.
J'ai trouvé un code sur internet qui fonctionne bien jusqu'à Serial.println("\t");
// jusque là, le sketch fonctionne

Je rencontre un problème après i f (Serial.available()>0;

Merci de votre aide.
Je suis débutant.

// HX711 library for Arduino - example file
// https://github.com/bogde/HX711
 
 // MIT License
 // (c) 2018 Bogdan Necula
 


#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.



HX711 scale;

void setup() {
  Serial.begin(57600);
  Serial.println("HX711 Demo");

  pinMode(ledrouge,OUTPUT);                    // la led rouge est une sorite
  pinMode(ledverte,OUTPUT);                    // la led verte est une sortie
  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
            // by the SCALE parameter (not set yet)
            
  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
            // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  Serial.print(scale.get_units(), 1);
  Serial.println("\t");
                                                // jusque là, le sketch fonctionne

if (Serial.available()>0; 

  Serial.read ("\t");               

 
    ("\t") < 240,0 && ("\t")>260,0 {   // si le poids est compris entre 240.0 et 260.0
pinMode (ledverte,HIGH);                           // la led verte s'allume.
pinMode (ledrouge,LOW);                            // la led rouge est éteinte.
}
else                                               // sinon 
{
  pinMode (ledverte,LOW);                           // la led verte est éteinte.
  pinMode (ledrouge, HIGH);                         // la led rouge s'allume.
}

    delay(2000);
}




Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

hello
je suis justement à jouer avec une balance.
tu as essayé de faire un code avec l'exemple de la librairie.
c'est un bon réflexe, mais on voit que tu ne comprends pas tout de ce que tu fais.
l'instruction pinMode sert donner une affectation ( un role ) à une pin de la platine arduino:
pinMode(2,OUTPUT); passe la pin D2 en sortie.
cette fonction ne sert pas pour passer une valeur à une pin. pour cela il y a:
DigitalWrite(2,HIGH); passe la valeur HIGH à la sortie D2.

pour l'endroit ou ton prg bloque, (n'en parlons pas) :scream:

revenons à la balance,
chaque mécanisme à ses résistances et contraintes. chaque HX711 à ses caractéristiques qui lui sont propres.
il faut donc "étalonner cette partie. il y a des programmes qui permettent de trouver la valeur à passer à la librairie . il faut préparer un poids connu( chez moi, 200gr), puis lancer le prg d'étalonnage. au moment voulu, tu dois mettre les 200gr sur la balance. le prg calcule et affiche la valeur que tu devras mettre en dur dans le prog: scale.set_scale(-416); (chez moi, cette valeur est -416).

je te passe:
ton prog qui fonctionne, attention j'ai changé la déclaration du cablage (D2 et D3) et la vitese de com avec le moniteur à 115200.
libre à toi de corriger soit le hard soit le soft.

// HX711 library for Arduino - example file
// https://github.com/bogde/HX711
// MIT License
// (c) 2018 Bogdan Necula
#include <Arduino.h>
#include "HX711.h"
// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = A1;//2;
const int LOADCELL_SCK_PIN = A2;//3;
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;
HX711 scale;

void setup() {
  Serial.begin(115200);                        //vitesse de com avec le moniteur
  Serial.println("HX711 Demo");                //la meme vitesse doit etre reglée en bas du moniteur
  digitalWrite(ledrouge, LOW);                 //la led sera éteinte
  digitalWrite(ledverte, LOW);                 // la led sera éteinte
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  Serial.println("Initializing the scale");    // initialisation de la balance
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC
  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC
  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
  // by the SCALE parameter (not set yet)
  //scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  scale.set_scale(-416);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0
  Serial.println("After setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC
  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC
  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()
  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
  // by the SCALE parameter set with set_scale
  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print('\t');
  if ((poids_lu > 240.0) && (poids_lu < 260.0)) { // si le poids est compris entre 240.0 et 260.0
    digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
    digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
    Serial.println(F("led verte ON et led rouge OFF"));
  }
  else                                               // sinon
  {
    digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
    digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
    Serial.println(F("led verte OFF et led rouge ON"));
  }
  delay(2000);
}

une copie d'écran , avec depose d'un poids >240 gr puis <240gr

et le programme de calibration de la balance
(nota: il en existe d'autres avec dialogue sur le moniteur, la valeur finale est la meme)

/**
   HX711 library for Arduino - example file
   https://github.com/bogde/HX711

   MIT License
   (c) 2018 Bogdan Necula
  ## How to calibrate your load cell
  1. Call `set_scale()` with no parameter.
  2. Call `tare()` with no parameter.
  3. Place a known weight on the scale and call `get_units(10)`.
  4. Divide the result in step 3 to your known weight. You should
   get about the parameter you need to pass to `set_scale()`.
  5. Adjust the parameter in step 4 until you get an accurate reading.
**/
#include "HX711.h"


// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = A1;
const int LOADCELL_SCK_PIN = A2;


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");

  Serial.println("Initializing the scale");

  // Initialize library with data output pin, clock input pin and gain factor.
  // Channel selection is made by passing the appropriate gain:
  // - With a gain factor of 64 or 128, channel A is selected
  // - With a gain factor of 32, channel B is selected
  // By omitting the gain factor parameter, the library
  // default "128" (Channel A) is used here.
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  /*
    1. Call `set_scale()` with no parameter.
    2. Call `tare()` with no parameter.
    3. Place a known weight on the scale and call `get_units(10)`.
    4. Divide the result in step 3 to your known weight. You should
     get about the parameter you need to pass to `set_scale()`.
    5. Adjust the parameter in step 4 until you get an accurate reading.
  */
  scale.set_scale();
  //scale.set_scale(2280.f);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                // reset the scale to 0
  Serial.println ("vous avez 5 secondes pour mettre 200gr sur la balance");
  delay(5000);
  Serial.println (scale.get_units(10));
  Serial.println(scale.get_units(10) / 200); //diviseur est le poids connu
  Serial.println(F("mettre la valeur affichée à l'écran dans la ligne suivante dans le programme"));
  Serial.println(F("puis relancer le programme"));
  scale.set_scale(-416);//2244);
  Serial.println(F("enlever le poids"));
  delay(5000);

  scale.set_scale(-416);//2244);
  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());			// print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));  	// print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);	// print the average of 5 readings from the ADC minus tare weight (not set) divided
  // by the SCALE parameter (not set yet)
  //scale.set_scale(-414.15);
  //scale.set_scale(2280.f);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();				        // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 2);        // print the average of 5 readings from the ADC minus tare weight, divided
  // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}

void loop() {
  Serial.print("one reading:\t");
  Serial.print(scale.get_units(), 2);
  Serial.print("\t| average:\t");
  Serial.println(scale.get_units(10), 2);

  scale.power_down();			        // put the ADC in sleep mode
  delay(5000);
  scale.power_up();
}

si tu as des questions, n'hésite pas.

Merci beaucoup de ton aide.

J'ai bien compris la déclaration de la variable double poids_lu = 0.0; que je n'arrivais pas à formuler ainsi que l'utilisation de digitalWrite qui est une fonction au lieu de pinMode qui est une affectation.

La boucle est très claire.

je cable les led prochainement.

Très bonne soirée.

Merci du retour :+1:

Bonsoir, tu m’avais bien aidé, il y a quelques semaines a réaliser un sketch qui fonctionne toujours bien.
Cependant, la donne a légèrement changée et un capteur a été installé qui mesure la présence de l’objet.
Je souhaite que le fonctionnement des leds s’effectue uniquement si l’objet est sur la balance.
J’ai essayé de modifier le sketch à partir de la ligne 73 en introduisant une seconde condition mais sans succès.
Pourrais-tu m’aider ?

saisissez ou collez du
#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int detecteur = 8;  // indique que le détecteur de présence est connectée à la broche n°8.
const int ledorange = 9;  // indique que la led orange est connectée sur la borne n°9.
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;   // définition de la variable à une décimale.


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  digitalWrite(ledrouge, LOW);                 //la led rouge  est éteinte.
  digitalWrite(ledverte, LOW);                 // la led verte est éteinte.
  digitalWrite(ledorange,HIGH);                // la led orange est allumée.
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  pinMode (detecteur, INPUT);                  // le détecteur est une entrée
  pinMode (ledorange,OUTPUT);                  // la led orange est une sortie

  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
            // by the SCALE parameter (not set yet)
            
  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
            // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print("\t");
  
if ((detecteur)==HIGH) {                      // si le détecteur est en position Haute
 

else if { ((poids_lu > 250.0) && (poids_lu < 260.0));  //  et si le poids est compris entre 240.0 et 260,0 gr

    digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
    digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
    Serial.println(F("led verte ON et led rouge OFF"));
    digitalWrite (ledorange,LOW);                           // led orange éteinte
     }
     
}
  else                                               // sinon
  {
    digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
    digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
    Serial.println(F("led verte OFF et led rouge ON"));
    digitalWrite (ledorange,LOW);                          // led orange éteinte
  }
  if ((detecteur)==LOW){                                   // si le détecteur est en position basse,
   digitalWrite(ledverte,LOW);                            // la diode verte est éteinte.
   digitalWrite(ledrouge,LOW);                            // la diode rouge est éteinte.
   digitalWrite(ledorange,HIGH);                          // la diode orange est allumée
   }
  delay (1000);
}

                                        //




 code ici

Hello

if faut lire l'entrée digitale D8 avant de se servir de son état.

  • problème de else et accolades mal placés
    teste ce code
#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int detecteur = 8;  // indique que le détecteur de présence est connectée à la broche n°8.
const int ledorange = 9;  // indique que la led orange est connectée sur la borne n°9.
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;   // définition de la variable à une décimale.


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  digitalWrite(ledrouge, LOW);                 //la led rouge  est éteinte.
  digitalWrite(ledverte, LOW);                 // la led verte est éteinte.
  digitalWrite(ledorange, HIGH);               // la led orange est allumée.
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  pinMode (detecteur, INPUT);                  // le détecteur est une entrée
  pinMode (ledorange, OUTPUT);                 // la led orange est une sortie

  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
  // by the SCALE parameter (not set yet)

  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
  // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print("\t");

  if (digitalRead(detecteur) == HIGH)                     // si le détecteur est en position Haute
  {
    if ((poids_lu > 250.0) && (poids_lu < 260.0));  //  et si le poids est compris entre 240.0 et 260,0 gr
    {
      digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
      digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
      Serial.println(F("led verte ON et led rouge OFF"));
      digitalWrite (ledorange, LOW);                          // led orange éteinte
    }
    else                                               // sinon
    {
      digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
      digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
      Serial.println(F("led verte OFF et led rouge ON"));
      digitalWrite (ledorange, LOW);                         // led orange éteinte
    }
  }
  else
  {
    if (digitalRead(detecteur) == LOW)                                 // si le détecteur est en position basse,
    {
      digitalWrite(ledverte, LOW);                           // la diode verte est éteinte.
      digitalWrite(ledrouge, LOW);                           // la diode rouge est éteinte.
      digitalWrite(ledorange, HIGH);                         // la diode orange est allumée
    }
    delay (1000);
  }
}

Bien sur, tu as raison, c'est la lecture digitale du détecteur qui permet ensuite d'activer les lignes suivantes. J'ai tout de suite fait les corrections.

Cependant lorsque j'ai testé le code, la réponse a été :"Compilation error: expected '}' before 'else' ". il a surligné les deux lignes else (sinon1 et sinon 2) et la dernière accolade.
j'ai bien regardé l'ouverture et la fermeture logiques de celles-ci mais je n'ai pas réussi à résoudre le problème.

saisissez ou collez#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int detecteur = 8;  // indique que le détecteur de présence est connectée à la broche n°8.
const int ledorange = 9;  // indique que la led orange est connectée sur la borne n°9.
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;   // définition de la variable à une décimale.


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  digitalWrite(ledrouge, LOW);                 //la led rouge  est éteinte.
  digitalWrite(ledverte, LOW);                 // la led verte est éteinte.
  digitalWrite(ledorange, HIGH);               // la led orange est allumée.
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  pinMode (detecteur, INPUT);                  // le détecteur est une entrée
  pinMode (ledorange, OUTPUT);                 // la led orange est une sortie

  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
  // by the SCALE parameter (not set yet)

  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
  // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print("\t");

  if (digitalRead(detecteur) == HIGH)                     // si le détecteur est en position Haute
  {
    if ((poids_lu > 250.0) && (poids_lu < 260.0));  //  et si le poids est compris entre 240.0 et 260,0 gr
    {
      digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
      digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
      Serial.println(F("led verte ON et led rouge OFF"));
      digitalWrite (ledorange, LOW);                          // led orange éteinte
    }
    else                                               // sinon 1
    {
      digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
      digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
      Serial.println(F("led verte OFF et led rouge ON"));
      digitalWrite (ledorange, LOW);                         // led orange éteinte
    }
  }
  else                                                    // sinon 2
  {
    if (digitalRead(detecteur) == LOW)                                 // si le détecteur est en position basse,
    {
      digitalWrite(ledverte, LOW);                           // la diode verte est éteinte.
      digitalWrite(ledrouge, LOW);                           // la diode rouge est éteinte.
      digitalWrite(ledorange, HIGH);                         // la diode orange est allumée
    }
    delay (1000);
  }
}

Toujours un point virgule mal placé.


Dans sinon2, inutile de faire

puisque c'est le else de

Bonsoir,

Quel plaisir de travailler avec toi.

En effet, le ; était bien à supprimer et à le remplacer par { par cohérence avec les autres lignes et obtenir une condition if complète.

C’est ce que j’ai fait et le code a répondu O.K.

J’ai ensuite connecté la carte Arduino et après téléversement, l’ensemble à l’air de bien fonctionner. Les diodes s’allument comme prévus.

De même j’ai testé une autre version en supprimant if (digitalRead(detecteur)==LOW) comme tu le suggérais.

Cela fonctionne aussi bien avec toutefois une vitesse plus lente que dans la première version. le taux de transfert (115200) et le delay (1000) sont pourtant identiques.

Le processeur préfère-t-il une ligne de plus pour plus de clarté et de vitesse d’exécution ? à voir avec le temps.

En tout cas merci de ton aide.

Bonne soirée et bon week end

P.S. Je souhaite continuer à apprendre le C++. J’ai acheté le grand livre d’Arduino d’Erik Bartmann et j’ai fait un MOOC de la French University Numerical. J’ai donc un petit niveau.

Pourrais tu me conseiller un ou deux livres pour progresser car ceux que j’ai trouvé rappelle les notions que je connais déjà?

Oui, c'est ce que doit normalement t'indiquer le compilateur.
Comme le ; mets fin à ton if, le else qui suit ne peut être rattaché à aucun IF, donc le compilateur t'indique qu'il y a une erreur.

sketch.ino:21:5: error: 'else' without a previous 'if'
     else                                               // sinon 1
     ^~~~

Error during build: exit status 1

Tu as dû faire quelques chose d'autre, qu'appel tu plus lent?
comme tu l'as indiqué @fdufnews le IF est inutile, il ne fait strictement rien, il n'est pas possible d'ailleurs de voir la différence entre avec ou sans.

Le processeur ne préfère rien, il applique ce que tu lui demandes.

C'est exactement ce qu'il faut faire pour voir ton niveau évoluer, continu comme ça et ton niveau va rapidement augmenter.

Mets ton code


#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int detecteur = 8;  // indique que le détecteur de présence est connectée à la broche n°8.
const int ledorange = 9;  // indique que la led orange est connectée sur la borne n°9.
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;   // définition de la variable à une décimale.


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  digitalWrite(ledrouge, LOW);                 //la led rouge  est éteinte.
  digitalWrite(ledverte, LOW);                 // la led verte est éteinte.
  digitalWrite(ledorange,HIGH);                // la led orange est allumée.
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  pinMode (detecteur, INPUT);                  // le détecteur est une entrée
  pinMode (ledorange,OUTPUT);                  // la led orange est une sortie

  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
            // by the SCALE parameter (not set yet)
            
  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
            // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print("\t");
  
if (digitalRead(detecteur)==HIGH) {                      // si le détecteur est en position Haute
 
 if  ((poids_lu > 250.0) && (poids_lu < 262.0))  //  et si le poids est compris entre 240.0 et 260,0 gr
     {
    digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
    digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
    Serial.println(F("led verte ON et led rouge OFF"));
    digitalWrite (ledorange,LOW);                           // led orange éteinte
     }
     
  else                                                      // sinon 1
  {
    digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
    digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
    Serial.println(F("led verte OFF et led rouge ON"));
    digitalWrite (ledorange,LOW);                          // led orange éteinte
      }
  }
  else                                                     // sinon 2
  {
  if (digitalRead(detecteur)==LOW)
  {                                   // si le détecteur est en position basse,
   digitalWrite(ledverte,LOW);                            // la diode verte est éteinte.
   digitalWrite(ledrouge,LOW);                            // la diode rouge est éteinte.
   digitalWrite(ledorange,HIGH);                          // la diode orange est allumée
   }
  delay (1000);
}
}
                                        //






#include <Arduino.h>
#include "HX711.h"

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 2;
const int LOADCELL_SCK_PIN = 3;

const int detecteur = 8;  // indique que le détecteur de présence est connectée à la broche n°8.
const int ledorange = 9;  // indique que la led orange est connectée sur la borne n°9.
const int ledrouge = 5;  // indique que la ledrouge  est connectée sur la broche 5 (nombre entier).
const int ledverte = 6;  // indique que la led verte est connectée sur la broche 6.
double poids_lu = 0.0;   // définition de la variable à une décimale.


HX711 scale;

void setup() {
  Serial.begin(115200);
  Serial.println("HX711 Demo");
  digitalWrite(ledrouge, LOW);                 //la led rouge  est éteinte.
  digitalWrite(ledverte, LOW);                 // la led verte est éteinte.
  digitalWrite(ledorange,HIGH);                // la led orange est allumée.
  pinMode(ledrouge, OUTPUT);                   // la led rouge est une sortie
  pinMode(ledverte, OUTPUT);                   // la led verte est une sortie
  pinMode (detecteur, INPUT);                  // le détecteur est une entrée
  pinMode (ledorange,OUTPUT);                  // la led orange est une sortie

  Serial.println("Initializing the scale");    // initialisation de la balance

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);

  Serial.println("Before setting up the scale:");
  Serial.print("read: \t\t");
  Serial.println(scale.read());      // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));   // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight (not set yet)

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);  // print the average of 5 readings from the ADC minus tare weight (not set) divided
            // by the SCALE parameter (not set yet)
            
  scale.set_scale(1071.49);             // le rapport a été calculé avec un autre sketch "calibration" . le résultat est 1071,49  O.K.
  //scale.set_scale(1071.49);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();               // reset the scale to 0

  Serial.println("After setting up the scale:");

  Serial.print("read: \t\t");
  Serial.println(scale.read());                 // print a raw reading from the ADC

  Serial.print("read average: \t\t");
  Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

  Serial.print("get value: \t\t");
  Serial.println(scale.get_value(5));   // print the average of 5 readings from the ADC minus the tare weight, set with tare()

  Serial.print("get units: \t\t");
  Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided
            // by the SCALE parameter set with set_scale

  Serial.println("Readings:");
}
void loop() {
  poids_lu = scale.get_units();
  Serial.print(poids_lu, 1);
  Serial.print("\t");
  
if (digitalRead(detecteur)==HIGH) {                      // si le détecteur est en position Haute
 
 if  ((poids_lu > 250.0) && (poids_lu < 262.0))  //  et si le poids est compris entre 240.0 et 260,0 gr
     {
    digitalWrite (ledverte, HIGH);                          // la led verte s'allume.
    digitalWrite (ledrouge, LOW);                           // la led rouge est éteinte.
    Serial.println(F("led verte ON et led rouge OFF"));
    digitalWrite (ledorange,LOW);                           // led orange éteinte
     }
     
  else                                                      // sinon 1
  {
    digitalWrite(ledverte, LOW);                          // la led verte est éteinte.
    digitalWrite(ledrouge, HIGH);                         // la led rouge s'allume.
    Serial.println(F("led verte OFF et led rouge ON"));
    digitalWrite (ledorange,LOW);                          // led orange éteinte
      }
  }
  else                                                     // sinon 2 le detecteur est en position basse.
    {
   digitalWrite(ledverte,LOW);                            // la diode verte est éteinte.
   digitalWrite(ledrouge,LOW);                            // la diode rouge est éteinte.
   digitalWrite(ledorange,HIGH);                          // la diode orange est allumée
   }
  delay (1000);
}

                                        //





Le délai en fin de boucle....:grin:
Un prog, il est exécuté à chaque boucle
L'autre prog, il est dans une condition

O.K. j'ai compris.
J'ai déplacé le delay du code de plus lent en le mettant en fin de boucle.
Les deux codes fonctionnent bien maintenant.
Merci et bon week end

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.