BLYNK
HOME       📲 GETTING STARTED       📗 DOCS       ❓HELP CENTER       👉 SKETCH BUILDER

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:

1 Like