Prise de poids sur Lilygo esp32 défaillante

Bonjour tout le monde, je suis sur un projet de balance connectée avec transmission lora.

J'ai câblé et programmé mon esp32 Liligo v1.6.1, voici la pinmap:

J'ai cablé les capteurs de poids (HX711) + un capteur de température (ds18b20).

Je vous joint le programme qui s'arrête au niveau de la tare (ligne en gras):
Lorsque j'exclue la ligne en gras ainsi que le "couplet" pesée, le programme déroule et la température remonte bien.

Pourriez-vous me dire qu'est ce qui cloche avec cette pesée s'il vous plaît ? Merci!

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>  
#include "SSD1306.h" 
#include "images.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include "HX711.h"

#define SCK     5    // GPIO5  -- SX1278's SCK
#define MISO    19   // GPIO19 -- SX1278's MISnO
#define MOSI    27   // GPIO27 -- SX1278's MOSI
#define SS      18   // GPIO18 -- SX1278's CS
#define RST     14   // GPIO14 -- SX1278's RESET
#define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND  868E6
#define ONE_WIRE_BUS 25
#define DOUT  35
#define CLK  34

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
HX711 scale;
unsigned int counter = 0;
float calibration_factor = 36100;
float poids;

SSD1306 display(0x3c, 21, 22);
String rssi = "RSSI --";
String packSize = "--";
String packet ;

 

void setup() {
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
  delay(50); 
  digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
  
  Serial.begin(9600);
  while (!Serial);
  Serial.println();
  Serial.println("LoRa Sender Test");
  scale.begin(DOUT, CLK);
  Serial.println("Demarrage en cours");
  sensors.begin();  // Start up the library
  scale.set_scale();
  **scale.tare(); //Resetta la scala a 0**
  
  SPI.begin(SCK,MISO,MOSI,SS);
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(868E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  //LoRa.onReceive(cbk);
//  LoRa.receive();
  Serial.println("init ok");
  display.init();
  display.flipScreenVertically();  
  display.setFont(ArialMT_Plain_10);
   
  delay(1500);
}

void loop() {
  //Prise de la température
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  float temp = sensors.getTempCByIndex(0);
  
  if(temp != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(temp);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }

  //Pesée
  scale.set_scale(calibration_factor); //Aggiustamento del calibration_factor
  poids = - scale.get_units();
  Serial.print("En lecture: ");
  Serial.print(poids, 3);
  Serial.print(" kg"); 
  Serial.print(" facteur de calibration: ");
  Serial.print(calibration_factor);
  Serial.println();


  
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  
  display.drawString(0, 0, "Sending packet: ");
  display.drawString(90, 0, String(counter));
  Serial.println(String(counter));
  display.display();

  // send packet
  LoRa.beginPacket();
  LoRa.print(temp);
  LoRa.print(counter);
  LoRa.endPacket();

  counter++;

}

les balises de mise en forme de texte **, ne fonctionne pas dans une balise code, donc rien n'est en gras :frowning:

La fonction tare est en attente active sur is_ready, ton programme ne fonctionne pas quelque soit le temps que tu attends?

Ah mince, oui le programme ne fonctionne pas même en attendant longtemps.

Tu as essayé l'exemple full, qui contient aussi l'utilisation de la fonction tare?

Qu'est ce que tu entends par l'exemple full ? J'ai essayé en enlevant le commentaire et bug!

L'exemple qui contient full dans son nom

Tu l'as vu où cet exemple?

Bonjour @biker32,
@terwal pense peut-être à cet exemple :



HX711_full_example
Maintenant je ne peux pas vous dire si il a raison car je n’ai pas d’ordinateur sous la main.
Bonne journée

comme l'indique @philippe86220 sur la librairie HX711 que tu as inclue.
Je suppose que les exemples que l'on retrouve sur leur GIT, doit être disponible dans les exemples accessible par l'IDE.
Au pire tu fais un copier/coller de ton browser à ton IDE.

Bonjour à tous, je vous remercie pour vos informations. J'ai bel et bien trouvé la librairie "full". En téléversant ça ne marchait toujours pas...

Du coup j'ai essayé toute les pins et en fait je ne devais pas être sur les bonnes puisqu'avec les 02 et 15 tout à fonctionné nickel !

Merci encore, je risque de revenir vers vous car j'ai un autre soucis de remonté de température DHT11 que je n'arrive pas à lire sur l'ESP alors que sur arduino ça marche...

Bref je potasse de mon côté et je reviens vers vous dès que j'ai tout essayé!
:wave:

Cool, pour ton capteur, indique le branchement et ton code.
Ainsi que l'ouput du moniteur série si tu as inséré de l'affichage de debug.

Alors pour le branchement, j'ai mis le Dout sur la pin 02 et le CLK sur la pin 15.

Et comme je l'avais évoqué ce matin, après moultes essais, je n'arrive pas à faire communiquer le DHT11.
Le moniteur serie m'affiche les autres températures (DHT20 + DS18B20) mais il n'affiche pas le DHT11 car la valeur ne doit pas être lu... Bien sûr, j'ai essayé plusieurs pins sans succès!

Je vous joint mon code qui a légèrement évolué !! :smile: :smile:

PS: Je précise que mon projet est une ruche connecté avec :

  • Température intérieure (DS18B20)
  • Prise d'humidité intérieure DHT11
  • Température + humidité extérieure (DHT20)
  • Poids

Tous cela est envoyé en lora sur un ESP qui réceptionnera le tout. Tout fonctionne hormis ce satané DHT11 :face_with_thermometer:


//VERSION FONCTIONNELLE AU 21/03/2023
#include <DFRobot_DHT20.h>
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>  
#include "SSD1306.h" 
#include "images.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include "HX711.h"
#include <soc/rtc.h>
#include <dht_nonblocking.h>

#define SCK     5    // GPIO5  -- SX1278's SCK
#define MISO    19   // GPIO19 -- SX1278's MISnO
#define MOSI    27   // GPIO27 -- SX1278's MOSI
#define SS      18   // GPIO18 -- SX1278's CS
#define RST     14   // GPIO14 -- SX1278's RESET
#define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define ONE_WIRE_BUS 25
#define DOUT  02
#define CLK  15
#define BAND    8695E5 // Plutôt que 868E6 plus encombrée (868E6 bande de fréquences pour l'Europe)
#define uSc_Sc 1000000  // Facteur de conversion de micro-seconde à seconde
#define Sc_Mn 60 //Facteur de conversion de seconde à minute
#define Time_To_Sleep  1   // Définit le temps d'endormissement en minutes
static const int DHT_SENSOR_PIN = 04;
#define DHT_SENSOR_TYPE DHT_TYPE_11


DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
HX711 scale;
DFRobot_DHT20 dht20;

unsigned int counter = 0;
float calibration_factor = 23100;
float poids;
float dataE[6];
float tempINT;
float tempEXT;
float humEXT;
//float temperatureDHT11;
//float humidityDHT11;
SSD1306 display(0x3c, 21, 22);
String rssi = "RSSI --";
String packSize = "--";
String packet ;

 

void setup() {
  pinMode(16,OUTPUT);
  digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
  delay(50); 
  digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high

  rtc_clk_cpu_freq_set(RTC_CPU_FREQ_80M); // ramène la fréquence à 80MHz bien meilleur pour le bon fonctionnement du HX711
  Serial.begin(9600);
  while (!Serial);
  Serial.println();
  Serial.println("LoRa Sender Test");
  scale.begin(DOUT, CLK);
  Serial.println("Demarrage en cours");
  sensors.begin();  // Start up the library
  
  SPI.begin(SCK,MISO,MOSI,SS);
  LoRa.setPins(SS,RST,DI0);
  if (!LoRa.begin(868E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  while(dht20.begin()){
    Serial.println("Initialize sensor failed");
  }
  //LoRa.onReceive(cbk);
//  LoRa.receive();
  LoRa.setSpreadingFactor(10); // Facteur d'étalement 7 est la valeur par défaut. Permet de discriminer deux émissions
  Serial.println("LoRa Initial OK!");
 
  display.init();
  display.flipScreenVertically();  
  display.setFont(ArialMT_Plain_10);

  //Calibration du pese-ruche
  Serial.println("Calibration du HX711");
  Serial.println("Enlever tous les poids de la balance");
  Serial.println("des la lecture commencee, placer un poids connu sur la balance");
  Serial.println("Presser a,s,d,f ajoute a la calibration 10,100,1000,10000 respectivement");
  Serial.println("Presser z,x,c,retranche a la calibration 10,100,1000,10000 respectivement");
  Serial.println("taper t dans le moniteur pour tarer la balance");
  scale.set_scale();
  //scale.tare(); //Remet la balance a zero. Attention à chaque redemarrage il reinitialise la tare

/*************************** Notice de la tare: ***************************
Pour la tare:
- Laisser le contenant vide.
- Décommenter scale.tare();
- Se mettre en liaison série et relever le "Zero factor: "
- Mettre le zero factor dans scale.set_offset(***);
- Recommenter la ligne scale.tare();*/
  
  long zero_factor = scale.read_average();
  Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
  Serial.println(zero_factor);
  scale.set_offset(341318); //fixe le zero (la tare) a partir d'un zero_factor Nouvelle valeur
  // préalablement enregistre avec scale.tare active.
  
  delay(1500);
}

//dht11
static bool measure_environment( float *temperatureDHT11, float *humidityDHT11 )
{
  static unsigned long measurement_timestamp = millis( );

  /* Measure once every four seconds. */
  if( millis( ) - measurement_timestamp > 3000ul )
  {
    if( dht_sensor.measure( temperatureDHT11, humidityDHT11 ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }
return( false );
}


void loop() {
  dataE[0] = 1; // numéro de la ruche

  //Prise de la température DS180
  Serial.print("Requete en cours...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  tempINT = sensors.getTempCByIndex(0);
  dataE[1]  = tempINT ;
  if(tempINT != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature interieure: ");
    Serial.println(tempINT);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }

//Prise de la température + hygro DHT20
//Get ambient temperature
  tempEXT = dht20.getTemperature();
  Serial.print("temperature DHT20:");
  Serial.print(tempEXT);
  Serial.print("C");
  dataE[2]  = tempEXT;
  //Get relative humidity
  humEXT = dht20.getHumidity()*100;
  Serial.print("  humidity DHT20:");
  Serial.print(humEXT);
  Serial.println(" %RH");
  dataE[3]  = humEXT;

//Prise de la température DHT11
   float temperatureDHT11;
   float humidityDHT11;

  /* Measure temperature and humidity.  If the functions returns
     true, then a measurement is available. */
  if( measure_environment( &temperatureDHT11, &humidityDHT11 ) == true )
  {
    /*Serial.print( "T = " );
    Serial.print( temperatureDHT11, 1 );
    Serial.print( " deg. C, H = " );*/
    Serial.print( humidityDHT11, 1 );
    Serial.println( "%" );
    dataE[4] = humidityDHT11;
  }
  
  //Pesée
  scale.set_scale(calibration_factor); //Aggiustamento del calibration_factor
  poids = scale.get_units();
  dataE[5]  = poids ; // met la donnée dans la première ligne (ou colonne) du tableau
  

  //Calibration de la pesée via la sortie série
  if (Serial.available()) // Si liaison série disponible...
  {
    char temp = Serial.read();
    if (temp == '+' || temp == 'a')
      calibration_factor += 10;
    else if (temp == '-' || temp == 'z')
      calibration_factor -= 10;
    else if (temp == 's')
      calibration_factor += 100;
    else if (temp == 'x')
      calibration_factor -= 100;
    else if (temp == 'd')
      calibration_factor += 1000;
    else if (temp == 'c')
      calibration_factor -= 1000;
    else if (temp == 'f')
      calibration_factor += 10000;
    else if (temp == 'v')
      calibration_factor -= 10000;
    else if (temp == 't')
      scale.tare();  //Remet la balance a zero
  }
  
  Serial.print("En lecture: ");
  Serial.print(poids, 3);
  Serial.print(" kg"); 
  Serial.print(" facteur de calibration: ");
  Serial.print(calibration_factor);
  Serial.println();
  Serial.print(" ----------------------------------------------------------------- ");
  Serial.println();
  
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  
  display.drawString(0, 0, "Sending packet: ");
  display.drawString(90, 0, String(counter));
  display.drawString(0, 15, "Temp: ");
  display.drawString(90, 15, String(tempINT));
  display.drawString(0, 30, "Poids: ");
  display.drawString(90, 30, String(poids));
  display.display();

  // send packet
  LoRa.beginPacket();
 // LoRa.print(temp);
 // LoRa.print(poids);
  LoRa.write((uint8_t*)&dataE, sizeof(dataE)); // &data signifie adresse de data stocké dans la mémoire sous forme unsigned integer
  LoRa.print(counter);
  
  LoRa.endPacket();

  counter++;
  delay(500);
  
  /*esp_sleep_enable_timer_wakeup(uSc_Sc * Sc_Mn * Time_To_Sleep); // Timer d'endormissement en microsecondes
  Serial.print("deepsleep:");
  esp_deep_sleep_start(); // Mise en sommeil durant le temps d'endormissement défini ci-dessus*/
}

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