Réalisation d'une commande de nettoyage d'une grille qui filtre

Bonjour,
Je reprends ce projet après un an d’arrêt.
je cherche un peut d’aide.
Mon projet consiste à réaliser la commande d’un râteau mécanique de nettoyage d’une grille de filtrage de l’eau d’une rivière arrivant dans une microcentrale hydroélectrique.
L’arduino avec 2 capteurs à ultrason DYP-ME007Y mesure le niveau d’eau avant et après la grille de filtrage. Quand le niveau d’eau est différent. logiquement le niveau après est plus bas que le niveau avant la grille quand elle se bouche alors on lance le nettoyage de la grille à l’aide du râteau mécanique.
le projet affiche les 2 niveaux et la différence sur un afficheur et met à un bit de commande qui attaque l’entrée d’un automate.

Mon code est le suivant:

[/#include <LiquidCrystal.h>

int _ABVAR_1_distance = 0 ;
int _ABVAR_2_distance = 0 ;
int difference =0 ;
int valeur_prog=2;
int ardublockUltrasonicSensorCodeAutoGeneratedReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  digitalWrite( 7 , LOW );
  digitalWrite( 9 , LOW );
  pinMode( 10 , OUTPUT);
 // pinMode(14, INPUT);
  lcd.begin(20, 4);
}

void loop()
{
  _ABVAR_2_distance = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 9, 8 ) ;
  
  _ABVAR_1_distance = ardublockUltrasonicSensorCodeAutoGeneratedReturnCM( 7 , 6 ) ;
  
  difference=_ABVAR_2_distance - _ABVAR_1_distance;
  

  if (difference > 3){ 
    
    digitalWrite(10 , HIGH);
  }
  else{ 
    
    digitalWrite(10 , LOW);
    delayMicroseconds(1000000);
  }
  
  
  lcd.setCursor(0, 0);
  lcd.home();
  
  lcd.print( "niveau aval:" );
  lcd.print( _ABVAR_1_distance );
  
  lcd.setCursor(0, 1);
   lcd.print( "niveau amont:" );
   
  lcd.print( _ABVAR_2_distance );
  lcd.setCursor(0, 2);
  lcd.print( "la difference:" );
   lcd.print( difference );
}code]

Mes problèmes sont:
L'affichage des valeur mesurées bouge trop.
L'écran s'affiche mal noir et un peut plus clair.
la led d'état du bit de sortie pour attaquer l'api clignote des fois.

Merci de votre aide.
gaël.

euh... quitte à faire long pour les noms de fonctions, vous n’avez pas trouvé plus parlant que ardublockUltrasonicSensorCodeAutoGeneratedReturnCM() ?

delayMicroseconds(1000000); si c’est pour attendre 1 seconde sans rien faire, autant utiliser delay(1000) (en millisecondes)... mais à quoi sert cette attente ?

Vous programmez avec ArduBlock ?

Pour l’ecran Réglez le contraste

Pour le reste montrez nous un schéma (desssiné à la main, pas un truc théorique fritzing) de vos connexions

Comment est-ce l’alimenté ?

Dans ce thread il est expliqué que le senseur demande pas mal de courant lors du "ping" et que s'il est alimenté par la sortie 5V de l'Arduino il ne fonctionne pas correctement. Il suggère d'utiliser un 5V externe un peu plus conséquent.

Autrement, si un senseur retourne des valeurs qui fluctuent, sur une amplitude limitée, il est des fois nécessaire de faire un filtrage basique en prenant une suite d'échantillons et en en faisant la moyenne afin d'avoir un résultat stable.

Bonjour,
merci pour vos réponses.
J'ai quelquse notions de programmation en C qui date de 95.
je vais modifier le nom de la fonction; je ne programme pas avec ardublock.
je vais prendre un régulateur 5V et alimenter les 2 capteurs avec cette alimentation. l'alimentation que j'utilise pour mes test est celle du port USB.
je vais régler le contraste. Je suppose que c'est avec une tension de réf.
excusez moi j'ai perdu un peut le fils depuis le temps. Je n'en fais pas au travail.
je vous met mon code.

Voici mon code modifié:

 
#include <LiquidCrystal.h>

int _ABVAR_1_distance = 0 ;
int _ABVAR_2_distance = 0 ;
int difference =0 ;
int valeur_prog=2;
int UltrasonicReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  digitalWrite( 7 , LOW );
  digitalWrite( 9 , LOW );
  pinMode( 10 , OUTPUT);
 // pinMode(14, INPUT);
  lcd.begin(20, 4);
}

void loop()
{
  _ABVAR_2_distance = UltrasonicReturnCM( 9, 8 ) ;
  
  _ABVAR_1_distance = UltrasonicReturnCM( 7 , 6 ) ;
  
  difference=_ABVAR_2_distance - _ABVAR_1_distance;
  

  if (difference > 3){ 
    
    digitalWrite(10 , HIGH);
    delay(1000);
  }
  else{ 
    
    digitalWrite(10 , LOW);
    delay(1000);
  }
  
  
  lcd.setCursor(0, 0);
  lcd.home();
  
  lcd.print( "niveau aval:" );
  lcd.print( _ABVAR_1_distance );
  
  lcd.setCursor(0, 1);
   lcd.print( "niveau amont:" );
   
  lcd.print( _ABVAR_2_distance );
  lcd.setCursor(0, 2);
  lcd.print( "la difference:" );
   lcd.print( difference );
}

.

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l’IDE avant de copier le code pour qu’il soit indenté correctement)

======
Votre fonction retourne un entier ou un boolean ?

if ((duration < 2) || (duration > 300)) return false;
  return duration;

Si vous n’effacez pas votre LCD ça va être vite le bazar à l’affichage

ma fonction retourne un entier.
merci

Bonjour,
Je vais faire un schéma dans la journée de mon montage et le publier.
Pour le moment la compilation se passe bien mais le téléversement échoue.
Pour mon arduino chinois à 5 euros l'ide est le 1.7.8.
Il fonctionnait très bien jusqu'à présent.
est ce que quelqu'un peut me le donner. je n'arrive pas à le télécharger.
J'ai essayer d installe un autre ide pour un arduino elegoo uno R3 mais je ne sais pas lequel mettre.
merci à tous pour votre aide.
je veux réussir.
merci.

Prenez la dernière version de l’IDE pour votre PC/Mac et dites-nous l’erreur que vous voyez téléchargement (vérifiez ou changer de câble usb)

Bonsoir,
j’ai télécharger et installer la nouvelle version: ide 1.8.5.
le message d’erreur que j’ai est:
avrdude: ser_open(): can’t open device “\.\COM26”: Le fichier spécifié est introuvable.
le téléversement ne s’arrête pas.
merci pour vos réponses.
celle qui marchait était la 1.7.8.
clt;

#include <LiquidCrystal.h>

int _ABVAR_1_distance = 0 ;
int _ABVAR_2_distance = 0 ;
int difference =0 ;
int valeur_prog=2;
int UltrasonicReturnCM(int trigPin, int echoPin)
{
  long duration;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  duration = duration / 59;
  if ((duration < 2) || (duration > 300)) return false;
  return duration;
}

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  digitalWrite( 7 , LOW );
  digitalWrite( 9 , LOW );
  pinMode( 10 , OUTPUT);
 // pinMode(14, INPUT);
  lcd.begin(20, 4);
}

void loop()
{
  _ABVAR_2_distance = UltrasonicReturnCM( 9, 8 ) ;
  
  _ABVAR_1_distance = UltrasonicReturnCM( 7 , 6 ) ;
  
  difference=_ABVAR_2_distance - _ABVAR_1_distance;
  

  if (difference > 3){ 
    
    digitalWrite(10 , HIGH);
    delay(1000);
  }
  else{ 
    
    digitalWrite(10 , LOW);
    delay(1000);
  }
  
  
  lcd.setCursor(0, 0);
  lcd.home();
  
  lcd.print( "niveau aval:" );
  lcd.print( _ABVAR_1_distance );
  
  lcd.setCursor(0, 1);
   lcd.print( "niveau amont:" );
   
  lcd.print( _ABVAR_2_distance );
  lcd.setCursor(0, 2);
  lcd.print( "la difference:" );
   lcd.print( difference );
}

J’ai un peut modifié le code. dans une boucle.
je vais faire le schéma de câblage.
merci

Bonjour,
Après plusieurs mois d’arrêt, je vous met à disposition le code de programmation qui fonction.

[#include <LiquidCrystal.h>
#include <Wire.h>

int niveau_aval = 0 ;// déclaration de la variable en entier niveau_aval et initialisation à 0
int niveau_amont = 0 ;// déclaration de la variable en entier niveau_amont et initialisation à 0
int difference =0 ;// déclaration de la variable différence et initialisation à 0
int UltrasonicReturnCM(int trigPin, int echoPin)// déclaration du renvoie d'une fonction en entier avec declaration en entier des paramètres utiliser
{
  long duration;
  int mesure; // déclaration du renvoie d'une fonction en entier avec declaration en entier des paramètres utilisés
  pinMode(trigPin, OUTPUT); // déclaration 
  pinMode(echoPin, INPUT);// déclaration
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2); // attendre 2 microsecondes
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(20);// attendre 10 microsecondes
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);//
  
  mesure = duration / 59; // 58,8 ;// x0,0017 cm
 if ((mesure < 2) || (mesure > 300)){ return false;}
return mesure;
}
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// déclaration de l'afficheur LCD sur les broches 12,11 5,4,3,2

void setup()// fonction principale ||
{
  niveau_aval = 0 ;// déclaration de la variable en entier niveau_aval et initialisation à 0
  niveau_amont = 0 ;// déclaration de la variable en entier niveau_amont et initialisation à 0
  difference =0 ;// déclaration de la variable différence et initialisation à 0
  
  pinMode( 10 , OUTPUT);// mettre ou configurer la broche 10 en sortie
 // pinMode(14, INPUT); // valeur réglable de la différence
  lcd.begin(20, 4);// configurer afficheur lcd de 20 caractères sur 4 lignes
  

}

void loop()// fonction boucle
{
 
  
  (niveau_aval) = UltrasonicReturnCM( 9, 8 ) ;// niveau_aval égal la valeur que retour la fonction UltrasonicReturnCM pour le module 1 à ultrason en broche 8 ET 9
  
  //delay(10);//attendre 100 miliseconde
  
  (niveau_amont) = UltrasonicReturnCM( 7, 6 ) ;// niveau_amont égal la valeur que retour la fonction UltrasonicReturnCM pour le module 2 à ultrason en broche 7 ET 6
   
   //delay(10);//attendre 100 miliseconde
  
  
  difference = (( niveau_amont ) - ( niveau_aval ));// calcul de la difference entre ces deux valeurs
  
 
  if (difference > 1){ // boucle si le difference entre ces deux valeurs est supèrieur à 2 cm faire:
    
    digitalWrite(10 , HIGH);// écrire niveau haut sur broche 10
    
  }
  else{ //si non faire:
    
    digitalWrite(10 , LOW);// écrire niveau bas sur broche 10
   
  }

  
  lcd.setCursor(0, 0);// mettre le depart curseur à la ligne 0 et à la colonne 0
  
  lcd.print( "niveau aval:  " );
  lcd.print( niveau_aval );
  lcd.print( " cm" );
  
  lcd.setCursor(0, 1);// mettre le depart curseur à la ligne 1 et à la colonne 0
  lcd.print( "niveau amont: " );
  lcd.print( niveau_amont );
  lcd.print( " cm" );
  
  lcd.setCursor(0, 2);// mettre le depart curseur à la ligne 1 et à la colonne 0
  lcd.print( "la difference:" );
  
 lcd.print( difference );
  lcd.print( " cm" );
  //lcd.home();// revenir à la position en haut à gauche de l’écran
  delay(4000);// attendre 4000 milisecondes
  lcd.clear();
 }/code]


Bonjour,
Ce programme fonctionne pour nettoyer la grille d'une micro centrale hydroélectrique.
Il faut:
-1 arduino uno                                         8 euros
-un afficheur LCD                                     5 euros
-2 capteurs à ultrason étanche                  16 euros
-Une alimentation.


Cette boucle de programmation est effectué assez lentement pour avoir des mesures et un affichage correct. J'ai mis les commentaires pour la compréhension des fonctions.
je reste à votre disposition pour vous aider à réaliser ce montage.

sketch_13_10_2018_V1.ino (3.13 KB)