NANO + HC-06 + HX711 (bluetooth scale)

There is few subjects with this NANO+HC-06.
A lot of questions, but few complete solution.
So after getting a lot of help here for years (thanks all!), I give back the job :wink:

One thing to know before all, the NANO is very limited so NANO+HC-06 will only work for very simple project. So, as always, start basic, validate, and perhaps add gradually some stuffs.

I explain all the steps here below (full information for anyone that should have never used BLYNK). Yes, it’s all french, google translator is your friend :slight_smile:


Balance pour rapace.




Table des matiĂšres

  1. OBJECTIF
  2. MATERIEL
  3. PREPARATION DU PC
  4. PREPARATION DU GSM
  5. Programmation de l’arduino NANO
  6. Cablage Hardware
  7. Utilisation de la balance

1. OBJECTIF

  • PesĂ©e d’un rapace <3kg / prĂ©cision 1g.
  • Robuste, rĂ©sistant Ă  la pluie et l’humiditĂ©.
  • Pas cher (<10€ sur alibrol / <20€ sur amazonbrol).

2. MATOS

  • Arduino NANO v3 (2€)

  • Jauge de contrainte 3kg + module HX711 (2€)

  • Module bluetooth /slave HC-06 (2€)

  • De la gaine thermorĂ©tracatable / du tape isolant / un fer Ă  souder / du fil Ă©lectrique fin

  • Une boite plastique Ă©tanche (idĂ©alement transparente pour voir facilement la LED de statut bluetooth)

  • Un cable USB pour l’alimentation (j’utilise une power-bank comme pour charger les GSM)

  • Qlq morceaux de bois / qlq visses

3. PREPARATION DU PC

  • TĂ©lĂ©charger et installer le programme ARDUINO IDE pour programmer l’arduino NANO.
    (prendre version Windows >7) -> https://www.arduino.cc/en/main/software
  • Ensuite, installer le driver Windows de l’arduino NANO (driver CH340 v3.4.2014.8).

Si il est bien installé, dans les propriétés Windows on peut voir :


Une fois installĂ©, on branche le NANO en USB pour vĂ©rifier qu’il est bien reconnu. (pop-up en bas Ă  droite de la barre des tĂąches « nouveau pĂ©riphĂ©rique reconnu »).
Un reboot windows est peut-ĂȘtre nĂ©cessaire.


Comment installer une librairie à partir d’un .zip ->


:point_up:Do not unzip the downloaded library, leave it as is.
In the Arduino IDE, navigate to Sketch > Include Library > Add .ZIP Library. At the top of the drop down list, select the option to "Add .ZIP Library’’.
Return to the Sketch > Include Library menu. menu. You should now see the library at the bottom of the drop-down menu. It is ready to be used in your sketch. The zip file will have been expanded in the libraries folder in your Arduino sketches directory.


4. PREPARATION DU GSM

Ce compte gratuit confĂšre un peu d’énergie gratuite.
Cette Ă©nergie permet de crĂ©er l’interface du projet (sous forme de « widget » Ă  disposer sur le projet).
Un widget sert Ă  afficher une valeur, un graphe, un bouton, une LED etc
 pour crĂ©er l’interface sur le GSM.

On commence par crĂ©er un nouveau projet dans BLYNK. On reçoit par mail un code unique qui devra ĂȘtre copiĂ©/collĂ© plus tard dans le code arduino (Il sert simplement Ă  lier l’arduino au projet sur le GSM).

Ensuite on crĂ©e l’interface sur le projet.
Dans ce projet, 3 widget suffisent (dont 2 indispensable, le dernier c’est pour faire joli)

  • 1 « bluetooth » (config BT)
  • 1 « Labeled Value » (affichage du poids)
  • 1 « Superchart » (joli graphe)

On configure les paramĂštres des widgets.
Le plus important est de sélectionner « INPUT » en V1, et le mode « PUSH ».
Le reste est purement « cosmétique ».


5. Programmation de l’arduino NANO

-Copier/coller le programme dans un nouveau projet du programme IDE.

-Changer le code d’authentification du projet (recu par mail).
-Envoyer le programme dans l’arduino.
PS : pour envoyer le code, il faut que le module HC-06 bluetooth ne soit pas encore connectĂ© Ă  l’arduino et alimentĂ© (si c’est le cas, dĂ©connectez juste le VCC).
-Dans l’onglet OUTILS, sĂ©lectionner le bon modĂšle de carte « Arduino NANO », le bon processeur « AT328p (old bootloader) » et sĂ©lectionner le bon port « COM x » :


https://zupimages.net/viewer.php?id=20/40/ncwy.png

-Envoyer le code :
VĂ©rifier statut d’envoi « succesfull » dans les messages en bas de l’écran.
Si c’est OK, on peut passer au cñblage du hardware.
Ce programme est testĂ© et fonctionne Ă  100%. Si vous n’avez pas oubliĂ© de changer le code d’authentification, aucun problĂšme ne peut venir de cette partie.


6. Cablage Hardware


Attention lors du cablage de bien penser Ă  placer des gaines thermo sur les parties nues (connecteurs, rĂ©sistances), de dĂ©jĂ  prĂ©parer la boite Ă©tanche pour y passer les cables AVANT soudure. Ces petits circuits n’aiment pas ĂȘtre soudĂ©/desoudĂ©/resoudé 
Attention également à bien protéger les 4 cables du capteur de poids(fragiles ! Ne pas tirer desus !).
Je les ai passé dans une gaine thermo et mis un gros coups de silicone sur la sortie des fils cÎté capteur une fois monté sur son chassis (pour les protéger des coups de griffes éventuels).

-Sur l’arduino NANO, on n’a qu’une sortie 5V et une sortie GND. Il faut donc regrouper ces connections sur un mĂȘme cĂąble.
-Comme dĂ©jĂ  dit, une fois le bluetooth HC-06 cĂąblĂ© et alimentĂ©, il n’est plus possible d’envoyer le programme sur la NANO.
-Le pont diviseur 1Kohm/2Kohm sert Ă  ramener les 5V de la NANO aux 3.3V requis sur le HC-06.
-Le RX du HC-06 est cĂąblĂ© au TX de la NANO, et inversement dans l’autre direction.
-J’alimente la balance avec une power bank (chargeur GSM classique). Je soude donc sur la NANO un cable USB coupĂ© du cĂŽtĂ© micro-USB. D’autres mĂ©thodes sont possibles.
En cas d’utilisation d’une pile 9V, il faut prĂ©voir un interrupteur en plus pour mettre sous tension.

7. Utilisation de la balance

A la premiÚre utilisation, il faut pairer le module bluetooth avec le téléphonne (code 1234).
Cela se fait soit par le menu de configuration du GSM, ou/et par le widget bluetooth du projet BLYNK.
Ensuite cette Ă©tape ne sera plus nĂ©cessaire. Il suffira alors pour utiliser la balance de la mettre sous tension, et ENSUITE lancer l’application BLYNK.
Une fois la balance mise sous tension, elle effectue son tarage automatique et la led rouge de la carte bluetooth clignote (=attente de connexion).
Une fois connectée, elle reste allumée en permanence.
Voilà il ne reste plus qu’à l’utiliser.
Pour la mettre hors ou en tension, je branche simplement la power-bank USB. Pas d’interrupteur, pas d’afficheur LCD, pas de problĂšme de cĂąblage superflus, moins de risque d’oxydation car tout est enfermĂ© dans une boite Ă©tanche. Seul un cĂąble en sort (et j’ai bien siliconĂ© le passage).


CODE:


/*RELEASE V3.0 -> 
*/
//V1.0 : Tare HX711, puis mesure HX711 pour jauge de 3kh max (moyenne sur 8, en enlevant les 6 extrĂȘmes) + dĂ©tection/protection d'erreurs HX711
//V2.0 : Ajout du bluetoot HC-06 pour envoi vers BLYNK  (code appairage = 1234)
//V3.0 : Add simpleTimer Blynk / !! TX fiable max sur le cloud = 1 paramĂštre/1sec (40% / 41%)
//V3.1 : AllÚgement drastique du sketch pour éviter les instabilités "TOO BIG PACKET" (31% / 28%)

//Connecter HX711 Data en 5, CLK en 9 et VCC en 5V & E+/E-/A-/A+ vers jauge
//Connecter 'TX HC-06' en D3/RX (3), et 'RX HC-06' en en D2/TX (2) via un pont diviseur 1k/2k pour ramener les 5V en ~3.3V sur le 'RX HC-06' (le HC-06 fonctionne en 3.3V, pas 5V)

//<<LIBRARIES>>
//#define BLYNK_PRINT Serial      //pour debug port console (désactivé aprÚs développement pour alléger le travail de l'arduino -> plus stable (toutes les commandes 'Serial.print' sont aussi commentées avec //  dans le code plus bas
#include <BlynkSimpleSerialBLE.h> //librairie bluetooth BLYNK
#include <SoftwareSerial.h>       //librairie série Tx-Rx
SoftwareSerial BTSerial(3, 2);    //RX=3, TX=2 sur arduino
#define BLYNK_PRINT BTSerial      
#define BLYNK_USE_DIRECT_CONNECT

#include <SimpleTimer.h>         //librairie TIMER
SimpleTimer timer;               //déclaration de l'objet TIMER
#include <HX711.h>               //librairie master-bodge HX711 dans folder "sketchs in progress" (cfr preferences.txt)


/////////////////////////////////////////////////////////////////////////////////
//Auth Token for device 'Balance IMOTEP' : fake______208468bb5cejs25ea4d280a     (recu par mail lors de la création du projet sur l'appli GSM BLYNK)
/////////////////////////////////////////////////////////////////////////////////

// DĂ©claration de l'objet HX711-> HX711 scale(DataPin, CLKPin, ADCRes)
// DataPin=D5 CLKPin=D9  
HX711 scale(5, 9); 

//Variables boucles
byte Count_TareErrorHX711 = 0;          //compteur pour détection erreurs de TARE
byte WorkDone =0;                       //Check mesure et TX terminé avant de recommencer un cycle

//Variables poids
int Poids_long_HX711[8];                //variable de poids en grammes


void setup() {  // la fonction 'setup' s'exécute une seule fois au démarrage de la balance
//__________FONCTION INITIALISATION des communications SERIAL______  
  BTSerial.begin(9600);  // pour tx/rx via bluetooth (9600 is for HC-06. For HC-05 default speed is 38400)
  //Serial.begin(9600);       // pour debug port console (désactivé aprÚs développement pour alléger le travail de l'arduino -> plus stable
  //Serial.println("HELLO");

//__________FONCTION TIMER BLYNK______
  timer.setInterval(1010L, TimerBLYNK);  // Config timer = 1TX Blynk toutes les 1sec max pour ne pas saturer le serveur cloud (freeze mesures) 
  
//__________FONCTION DEMARRAGE BALANCE____
  scale.power_up();    //boot du HX-711 balance

  delay(100);   // pause 0.1sec
  while (scale.is_ready()==false) {/*Serial.println("HX?");*/delay(100);}    //attente que la balance soit UP

  scale.set_scale(717.0);// cette valeur (le gain de la balance) est trouvée par essai/erreur avec un poids connu (test avec un objet de 693g dans mon cas) => 600=815g  700=710g   710=700g   717=693g + test de poids sur toute la plage 0->1000g OK :)
 
  //Serial.println("SCALE READY");

//__________FONCTION TARAGE______(8 mesures Ă  0.1 sec d'intervalle = 0.8sec)
    for (int i=0 ; i < 8 ; i++){                                                           
    Poids_long_HX711[i] = scale.get_units(3);            //request poids HX711 brut full pesée 
    //Serial.print("HX");Serial.print(i+1);Serial.print("=");Serial.println(Poids_long_HX711[i]);    //affichage 10 mesures intermédiaires en g. full pesée
      if (Poids_long_HX711[i] <= 0) {Count_TareErrorHX711++;/*Serial.println("HX<0g?");*/} //si mesure=0g: HX711 vers NANO KO / si mesure <0g: HX711 vers ZEMIC KO                  
    delay(100);
    }  
     
    TRI_LONG(Poids_long_HX711,8);  //appel de la fonction "tri" (voir tout en bas du code) pour exclure les 3+ grands et 3+ petits => moyenne calculée sur 2 mesures restantes      

  Poids_long_HX711[7] = (Poids_long_HX711[3]+Poids_long_HX711[4])/2; //moyenne brute en gr. des 2 mesures // Poids_long_HX711[7] sert de TARE   


//__________FONCTION CONNECT BLYNK______
 // Serial.println("Connect..");

  // Blynk will work through Serial
  // 9600 is for HC-06. For HC-05 default speed is 38400
  // Do not read or write this serial manually in your sketch
  Blynk.begin(BTSerial,"fake______208468bb5cejs25ea4d280a");     //Connection de la balance au serveur BLYNK
  //Serial.println("Blynk.begin done");     
}  


void loop() {  // la fonction 'loop' s'exécute non-stop en boucle aprÚs la fonction SETUP  //Avec BLYNK toujours garder cette boucle la plus vide possible (c'est pourquoi on utilise la fonction TIMER pour placer le reste du code)
//__________JUST RUN BLYNK CONNECT / EMPTY LOOP______
while (Blynk.connected()==false) {Blynk.disconnect(); Blynk.connect();/*Serial.println("connect..");*/}  //wait connection serveur//semble mieux reprendre la connexion que Blynk.run(); //reste true ~10sec qd la connexion est perdue -> cfr heartbeat? & la boucle tourne au ralentis (~15sec) qd =false -> cfr fonctions discoonnect/connect?
Blynk.run(); 
timer.run();  // timer des mesures/TX Blynk
//Serial.println(".");
}

void TimerBLYNK() {   //fonction 'timer' = code exécuté 1x/sec
  if (WorkDone == 0) {  //Protection appel timer si fonction mesure/TX pas fini
    WorkDone=1;
  //____________________MESURE IMOTEP___________                                                         
    Poids_long_HX711[0] = scale.get_units(1)- Poids_long_HX711[7];     //request poids HX711 brut - TARE // Poids_long_HX711[0] sert de mesure finale

    //Serial.print("Poids=");Serial.print(Poids_long_MOY_HX711);Serial.println("g");  
  
  //____________________TX BLYNK___________  //Envoi vers serveur BLYNK->GSM (dans Virtual Pin 1)
    if (Count_TareErrorHX711 < 3) {Blynk.virtualWrite(V1, Poids_long_HX711[0]);}
    else {Blynk.virtualWrite(V1, "KO ");}  //sauf si problÚme de tarage détecté au démarrage de la balance. Dans ce cas envoi de "KO"
    
    WorkDone=0; //Fin de protection appel timer si fonction TimerBLYNK() n'est pas finie
    }   
}

void TRI_LONG(int a[], byte size) {     //fonctions de tri "LONG", du plus petit au plus grand pour Ă©liminer les valeurs extrĂȘmes
  for(int i=0; i<(size-1); i++) {
      for(int o=0; o<(size-(i+1)); o++) {
              if(a[o] > a[o+1]) {
                  long t = a[o];
                  a[o] = a[o+1];
                  a[o+1] = t;
  }}}
}

2 Likes

Excellent tuto :wink:

Great :+1:
Would have been better if it was in English
Keep going :wink:

Salut ,
j’ai un problùme : no matching function for call to 'HX711::HX711 (int, int) ’
Voici le message sur arduino IDE.
Bonne soirée.
Gus

I’d say that you probably have the wrong HX711 library installed, or multiple libraries and the compiler is selecting the wrong one.

Pete.

Merci beaucoup, j’ai supprimĂ© toutes les bibliothĂšque HX711 et essayĂ© une Ă  une chaque bibliothĂšque et aucune ne fonctionne.
Je suis bloqué !!!
Gus

Pete.

Merci, mais tu n’as pas plus simple que transfernow ?
Gus

Y a aussi WeTransfert

Pourquoi pas !
AvecTransfernow j’ai rien.