Bonjour Mesdames et Messieurs,
Je suis nouveau ici.
Actuellement en prepa, je dois réalsier un TIPE.
Pour celui-ci, j'ai une première carte arduino qui fait marcher un capteur de poids HX711 et qui affiche le poids sur un écran LCD.
Pour la deuxième carte arduino, elle controle un capteur RGB TCS 320 et affiche sur un écran la couleur de l'objet scanné.
Mon objectif est de pouvoir comparer trois types de balle, par leurs poids et leurs couleur.
Je voudrais donc que sur l'écran 2(couleur), mon programme affiche le type de la balle, mais pour cela il lui faut l'information du poids qui provient de l'autre programme.
Je suis bloqué et je ne trouve pas de solutions.
Merci d'avance pour votre aide
Bonne journée
Gabriel Leblanc
Hello,
Quelle distance entre les deux cartes?
Aucune si il le faut, je peux les coller comme les éloigner.
J'an entendu parler de cartes maitres et esclaves.
Je suis un peu perdu
Bonjour gab_lbc
C'est quels types d'Arduino ?
Mets tes 2 programmes en ligne.
A+
Cordialement
jpbbricole
quelles platines arduino utilises tu?
tu peux les raccorder directement en "TTL"
RX de l'une sur TX de l'autre
TX de l'une sur RX de l'autre.
si ce sont des mega2560, elles ont 4 "canaux" de liaison série.
tu peux donc garder la liaison série 0 ( RX0 TX0 ) pour ta liaison avec le PC
utile pour la programmation et le débugage.
et utiliser la liaison série 3 ( par exemple) pour dialoguer avec la deuxième platine Arduino
tu utilises Serial3.print( poids_lu);
Ce sont des arduinos UNO.
Tout ce que tu me dis me semble très complexe mais je vais me renseigner
J'ai la très nette impression que gab_lbc confond réunion de deux cartes et fusion de deux programmes en un seul.
Bonjour gab_lbc
Pour plus de clarté, corriges ton post pour mettre tes 2 programmes entre les balises
Sélectionne chaque sketch et clique sur
Veux tu réunir les 2 sketches en un seul ou relier les 2 Arduino entre eux?
Cordialement
jpbbricole
Mon idée de départ était de ne faire mon projet qu'avec une seule arduino, je n'y suis pas arrivé alors j'ai acheté les composants necessaires pour faire avec deux, je voudrai donc continuer sur cette voie.
Voici les codes mieux formaté :
// (c) Michael Schoeffler 2017, http://www.mschoeffler.de
#include <HX711_ADC.h> // GitHub - olkal/HX711_ADC: Arduino library for the HX711 24-bit ADC for weight scales
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library
HX711_ADC LoadCell(4, 5); // parameters: dt pin, sck pin
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 is the i2c address of the LCM1602 IIC v1 module (might differ)
void setup() {
LoadCell.begin(); // start connection to HX711
LoadCell.start(4500); // load cells gets 2000ms of time to stabilize
LoadCell.setCalFactor(999.0); // calibration factor for load cell => strongly dependent on your individual setup
lcd.begin(16, 2); // begins connection to the LCD module
lcd.backlight(); // turns on the backlight
}
void loop() {
LoadCell.update(); // retrieves data from the load cell
float i = LoadCell.getData(); // get output value
lcd.setCursor(0, 0); // set cursor to first row
lcd.print("Weight[g]:"); // print out to LCD
lcd.setCursor(0, 1); // set cursor to secon row
lcd.print(i); // print out the retrieved value to the second row
}
et le deuxième :
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define outPin 8
#define s0 9
#define s1 10
#define s2 11
#define s3 12
boolean DEBUG = true;
// Variables
int red, grn, blu;
String color ="";
long startTiming = 0;
long elapsedTime =0;
void setup(){
Serial.begin(9600);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(outPin, INPUT); //out from sensor becomes input to arduino
// Setting frequency scaling to 100%
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor (3,0);
lcd.print("Welcome To");
lcd.setCursor (1,1);
lcd.print("Color Detector");
delay(2000);
lcd.clear();
startTiming = millis();
}
void loop(){
getColor();
if(DEBUG)printData();
elapsedTime = millis()-startTiming;
if (elapsedTime > 1000) {
showDataLCD();
startTiming = millis();
}
}
/* read RGB components */
void readRGB(){
red = 0, grn=0, blu=0;
int n = 10;
for (int i = 0; i < n; ++i){
//read red component
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = red + pulseIn(outPin, LOW);
//read green component
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = grn + pulseIn(outPin, LOW);
//let's read blue component
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = blu + pulseIn(outPin, LOW);
}
red = red/n;
grn = grn/n;
blu = blu/n;
}
/***************************************************
Showing captured data at Serial Monitor
/
void printData(void){
Serial.print("red= ");
Serial.print(red);
Serial.print(" green= ");
Serial.print(grn);
Serial.print(" blue= ");
Serial.print(blu);
Serial.print (" - ");
Serial.print (color);
Serial.println (" detected!");
}
///
// Showing capured data at LCD
//****************************************************/
void showDataLCD(void){
lcd.clear();
lcd.setCursor (0,0);
lcd.print("R");
lcd.print(red);
lcd.setCursor (6,0);
lcd.print("G");
lcd.print(grn);
lcd.setCursor (12,0);
lcd.print("B");
lcd.print(blu);
lcd.setCursor (0,1);
lcd.print("Color: ");
lcd.print(color);
}
void getColor(){
readRGB();
if(red>7 && red<11 && grn>17 && grn<23 && blu>13 && blu<18) color = "RED";
else if(red>17 && red<21 && grn>11 && grn<15 && blu>12 && blu<18) color = "GREEN";
else if(red>22 && red<28 && grn>11 && grn<16 && blu>6 && blu<10) color = "BLUE";
else if(red>4 && red<8 && grn>6 && grn<10 && blu>9 && blu<13) color = "YELLOW";
else if(red>5 && red<8 && grn>4 && grn<8 && blu>3 && blu<7) color = "WHITE";
else if(red>28 && red<36 && grn>25 && grn<34 && blu>20 && blu<29) color = "BLACK";
else color = "NO_COLOR";
}
C'est pour cela que je souhaiterai que mon programme recupere la valeur du poids dans l'autre programme afin de pouvoir dire sur l'autre écran de quel type de balle il s'agit
Merci de consacrer votre temps pour mon projet.
Bonjour gab_lbc
Oui, c'est aussi un bon exercice, je vais étudier tes programmes pour te faire une proposition, ça se fera, certainement, avec la bibliothèque SoftwareSerial
A+
Cordialement
jpbbricole
Merci beaucoup, j'attends votre réponse avec impatience, cela fait maintenant deux semaines que je suis bloqué.
tu es toujours bloqué malgré le message de @dfgh ?
Tu as essayé ca proposition ou y a t-il une raison pour ne pas le faire ?
hello
j'ai changé le titre du post pour le mettre en accord avec l'objectif
Je ne comprends toujours pas pourquoi il faut 2 Arduinos….
Un seul peu très bien lire la masse et la couleur et faire les affichages…
Sinon merci d’éditer le message moche auquel il manque les balises de code.
Bonsoir gab_lbc
Voila une façon de faire, 2 UNO nommés balance et display.
Côté balance :
La liaison série à 9600, est construite au moyen de la bibliothèque SoftwareSerial.
//------------------------------------- Communications
#include <SoftwareSerial.h> // Pour la communication vers l'affichage
SoftwareSerial displaySerial(10, 11); // RX sur A1 display, TX sur A0 display
Toutes les 500 millisecondes, le poids, (float Weight; // Poids mesuré
) est envoyé à display.
Le tempo est réglé par :
const unsigned long displTxTempo = 500; // Pour envoi des données au display toutes les demi secondes
long displTxMillis = millis(); // Pour envoi des données au display, chrono
et utilisé ici :
if (millis() - displTxMillis >= displTxTempo) // S'il est temps pour envoyer les données
{
displayEnvoi(String(Weight));
displTxMillis = millis(); // Redémarrage du chrono
}
La fonction void displayEnvoi(String valeur)
, se charge d’envoyer le poids (Weight
) à display.
Côté display :
La liaison série à 9600, est construite au moyen de la bibliothèque SoftwareSerial.
//------------------------------------- Communications avec balance
#include <SoftwareSerial.h>
SoftwareSerial balanceSerial(A0, A1); // RX sur 11 balance, TX sur 10 balance
float balanceWeight = 0.0; // Poids reçu de balance
La réception des données de balance est assurée par :
if (balanceSerial.available()) // S'il y a réception de balance
{
String balanceRx = balanceSerial.readStringUntil('\n'); // Lecture jusqu'à nouvelle ligne (\n)
balanceRx.trim(); // Nettoyage de la réception https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
balanceWeight = balanceRx.toFloat();
Serial.println(balanceRx);
}
Et le poids reçu se trouve dans la variable balanceRx.
Pour des raisons de facilité, dans loop(), j’ai mis tes lignes de programme en remarque !!!
Le programme balance :
// (c) Michael Schoeffler 2017, http://www.mschoeffler.de
#include <HX711_ADC.h> // GitHub - olkal/HX711_ADC: Arduino library for the HX711 24-bit ADC for weight scales
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C library
#include <SoftwareSerial.h> // Pour la communication vers l'affichage
HX711_ADC LoadCell(4, 5); // parameters: dt pin, sck pin
float Weight; // Poids mesuré
LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 is the i2c address of the LCM1602 IIC v1 module (might differ)
//------------------------------------- Communications avec display
#include <SoftwareSerial.h> // Pour la communication vers l'affichage
SoftwareSerial displaySerial(10, 11); // RX sur A1 display, TX sur A0 display
const unsigned long displTxTempo = 500; // Pour envoi des données au display toutes les demi secondes
long displTxMillis = millis(); // Pour envoi des données au display, chrono
void setup() {
Serial.begin(9600); // Démarrage de la communication vers le display
displaySerial.begin(9600); // Démarrage de la communication vers le display
LoadCell.begin(); // start connection to HX711
LoadCell.start(4500); // load cells gets 2000ms of time to stabilize
LoadCell.setCalFactor(999.0); // calibration factor for load cell => strongly dependent on your individual setup
lcd.begin(16, 2); // begins connection to the LCD module
lcd.backlight(); // turns on the backlight
}
void loop() {
if (millis() - displTxMillis >= displTxTempo) // S'il est temps pour envoyer les données
{
displayEnvoi(String(Weight));
displTxMillis = millis(); // Redémarrage du chrono
}
LoadCell.update(); // retrieves data from the load cell
Weight = LoadCell.getData(); // get output value
lcd.setCursor(0, 0); // set cursor to first row
lcd.print("Weight[g]:"); // print out to LCD
lcd.setCursor(0, 1); // set cursor to secon row
lcd.print(Weight); // print out the retrieved value to the second row
}
void displayEnvoi(String valeur) // Envoi de la valeur sous forme de chaîne de caractère
{
displaySerial.println(valeur);
}
Le programme display :
//------------------------------------- Communications avec balance
#include <SoftwareSerial.h>
SoftwareSerial balanceSerial(A0, A1); // RX sur 11 balance, TX sur 10 balance
float balanceWeight = 0.0; // Poids reçu de balance
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define outPin 8
#define s0 9
#define s1 10
#define s2 11
#define s3 12
boolean DEBUG = true;
// Variables
int red, grn, blu;
String color ="";
long startTiming = 0;
long elapsedTime =0;
void setup(){
Serial.begin(9600);
balanceSerial.begin(9600);
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(outPin, INPUT); //out from sensor becomes input to arduino
// Setting frequency scaling to 100%
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor (3,0);
lcd.print("Welcome To");
lcd.setCursor (1,1);
lcd.print("Color Detector");
delay(2000);
lcd.clear();
startTiming = millis();
}
void loop(){
if (balanceSerial.available()) // S'il y a réception de balance
{
String balanceRx = balanceSerial.readStringUntil('\n'); // Lecture jusqu'à nouvelle ligne (\n)
balanceRx.trim(); // Nettoyage de la réception https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/trim/
balanceWeight = balanceRx.toFloat();
Serial.println(balanceRx);
}
//getColor();
////if(DEBUG)printData();
//elapsedTime = millis()-startTiming;
//if (elapsedTime > 1000) {
//showDataLCD();
//startTiming = millis();
//}
}
/* read RGB components */
void readRGB(){
red = 0, grn=0, blu=0;
int n = 10;
for (int i = 0; i < n; ++i){
//read red component
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = red + pulseIn(outPin, LOW);
//read green component
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = grn + pulseIn(outPin, LOW);
//let's read blue component
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = blu + pulseIn(outPin, LOW);
}
red = red/n;
grn = grn/n;
blu = blu/n;
}
/***************************************************
Showing captured data at Serial Monitor
/
void printData(void){
Serial.print("red= ");
Serial.print(red);
Serial.print(" green= ");
Serial.print(grn);
Serial.print(" blue= ");
Serial.print(blu);
Serial.print (" - ");
Serial.print (color);
Serial.println (" detected!");
}
///
// Showing capured data at LCD
//****************************************************/
void showDataLCD(void){
lcd.clear();
lcd.setCursor (0,0);
lcd.print("R");
lcd.print(red);
lcd.setCursor (6,0);
lcd.print("G");
lcd.print(grn);
lcd.setCursor (12,0);
lcd.print("B");
lcd.print(blu);
lcd.setCursor (0,1);
lcd.print("Color: ");
lcd.print(color);
}
void getColor(){
readRGB();
if(red>7 && red<11 && grn>17 && grn<23 && blu>13 && blu<18) color = "RED";
else if(red>17 && red<21 && grn>11 && grn<15 && blu>12 && blu<18) color = "GREEN";
else if(red>22 && red<28 && grn>11 && grn<16 && blu>6 && blu<10) color = "BLUE";
else if(red>4 && red<8 && grn>6 && grn<10 && blu>9 && blu<13) color = "YELLOW";
else if(red>5 && red<8 && grn>4 && grn<8 && blu>3 && blu<7) color = "WHITE";
else if(red>28 && red<36 && grn>25 && grn<34 && blu>20 && blu<29) color = "BLACK";
else color = "NO_COLOR";
}
Le câblage :
Balance 10 sur display A1
Balance 11 sur display A0
A toi de jouer
A ta disposition pour toutes questions.
Bonne soirée
Cordialement
Jpbbricole
Je ne crois pas qu'il faut absolument 2 Arduinos, @gab_lbc l'a fait par simplicité d'écriture de code.
Maintenant, qu'il a deux Arduino, il a l'impression que c'est plus simple de faire communiquer les deux, que de fusionner ses deux programmes.
Mais comme il ne semble pas encore assez maitriser la programmation Arduino pour faire sur TIPE.
Sans vouloir le dénigrer ou me moquer, je dirais même que c'est pas ses connaissances en programmation, mais plutôt son approche de la démarche scientifique
@gab_lbc personnellement je suis de l'avis de @J-M-L, il n'y a pas de raison objective d'utiliser deux Arduino, même si tu as trouver une solution fonctionnel, celle-ci réclame à peu prés voir plus de développement et mise au point et deux fois plus de matériel, donc du gâchis ou un bilan Carbonne médiocre.
Bonsoir,
Merci beaucoup pour cette plus que complete, je teste les branchements des que possible et je vous redis si j'ai des questions.
Encore merci
Bonne soirée
Bonjour gab_lbc
J'ai oublié l'essentiel dans le câblage, connecter les GND des 2 Arduino ensemble.
Une toute belle journée à toi!
jpbbricole
@gab_lbc Merci de nettoyer le post 6. Dernière demande.
Vous ne pouvez pas venir sur le forum et obtenir de l’aide sans respecter au minimum la communauté et laisser un fils de discussion « moche ».
Faites votre part du boulot svp
Espérons qu'il soit un peu sensible à la communauté, maintenant qu'il a obtenu la réponse et le code de son TIPE