je suis en train de me faire un compteur pour mesurer du fil et me donner une alerte lorsque que la valeur d'enroulement est atteinte.
Je rencontre un problème avec le Potentiomètre Angulaire qui n'incrémente et/ou décrémente la valeur que bizarrement, très souvent elle augmente plus qu'elle ne réduit ...
Puis mon buzzer maintient un bip continu une fois qu'il à joué une fois ...
/*
Compteur bobine
*/
#include <Wire.h>
#include "rgb_lcd.h"
#include "pitches.h"
rgb_lcd lcd;
const int colorR = 45;
const int colorG = 100;
const int colorB = 21;
//potentiometre
int outputA = 2;
int outputB = 3;
int aState;
int aLastState;
int PinSW = 4;
//compteur
long metrage = 0;
long compteur = 0;
long compVal = 0;
int PinCapteur = 6;
//buzzer
const int buzPin = 5;
void setup() {
pinMode (outputA,INPUT_PULLUP);
pinMode (outputB,INPUT_PULLUP);
aLastState = digitalRead(outputA);
pinMode (PinCapteur, INPUT);
pinMode (PinSW, INPUT_PULLUP);
metrage = 10;
digitalWrite(buzPin, LOW);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
resetCompteur();
compteurAFF();
ValMetrage();
lcd.setCursor(0, 0);
lcd.print("Long : ");
lcd.print(metrage);
lcd.setCursor(0, 1);
lcd.print(compteur);
delay(20);
if (compteur >= metrage){
playFailed();
lcd.setRGB(255, 0, 0);
}
}
void playPassed() { /* function playPassed */
////Play 'ON' Sound
int melodyOn[] = {NOTE_C5, NOTE_C6, NOTE_D5, NOTE_A6};
int durationOn = 200;
for (int thisNote = 0; thisNote < 4; thisNote++) {
tone(buzPin, melodyOn[thisNote], durationOn);
delay(200);
}
}
void playFailed() { /* function playFailed */
////Play 'OFF' Sound
int melodyOff[] = {NOTE_C3, NOTE_D3};
int durationOff = 200;
for (int thisNote = 0; thisNote < 2; thisNote++) {
tone(buzPin, melodyOff[thisNote], durationOff);
delay(200);
}
}
void resetCompteur(){
if (!(digitalRead(PinSW))) { // Reset la position si on appui sur le potentiomètre
compteur = 0;
lcd.clear();
lcd.setRGB(colorR, colorG, colorB);
playPassed();
delay(1000);
}
}
void compteurAFF(){
if (digitalRead(PinCapteur) == LOW){
compteur++;
}
}
void ValMetrage(){
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
metrage --;
} else {
metrage ++;
}
Serial.print("Position: ");
Serial.println(metrage);
}
aLastState = aState;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
Si j'ai bien compris, la bobine entraîne ton potentiomètre angulaire?
Si oui, tu as tout intérêt à utiliser une bibliothèque comme Encoder.h, pour "lire" ton potentiomètre angulaire, ça te facilitera nettement le programme.
Non, le potard sert à fixer une valeur en mètres. Le capteur va compter le nombre de tours de la bobine et dès que le nombre de tours aura depassé la valeur fixée elle fait sonner le buzzer ...
J'ai lu le topic auquel tu as répondu sur le forum usinage a propos du compte tours de diiity je pensais y trouver mon bonheur mais je ne suis pas très à l'aise avec le codage ... j'apprends n core ...
Pour clarifier les choses, ce que tu appelles "potentiomètre angulaire" se nomme codeur incrémental.
Comme le suggère @jpbbricole il y a des librairies pour gérer ce genre de composants.
ni le noTone() ni digitalWrite(buzPin, LOW); peu importe ou je les place dans le code loop ou fonction j'ai toujours ce léger bruit qui semble être parasite ...
une fois dans la boucle je n'arrive plus a descendre à LOW le D5 ?!
Un petit conseil, pour ton codeur rotatif tu utilises
int outputA = 2;
int outputB = 3;
Ce sont les 2 seules entrées avec interruption du UNO. Or pour ta cellule de comptage, actuellement sur D6 serait mieux sur D3 et pourrait travailler en interruption, ce qui est nettement plus efficace.
Ainsi tu pourrais mettre:
Pour remettre mon compteur à 0 j'utilise la fonction resetCompteur(); qui me remet bien mon compteur à 0 donc le buzzer devrait se couper, j'ai essayé de placer le noTone() dans cette fonction ou bien de set la pin 5 du buzzer à LOW rien n'y fait j'ai toujours un très leger bip parasite ...
j'arrive à m'en débarrasser dans le setup avec digitalWrite(buzPin, LOW); mais ça ne tiens que jusqu'à ce que je joue du buzzer, après plus moyen de m'en débarrasser ...
Le noTone() devrait être placé à la fin de playFailed().
Et il ne devrait plus y avoir de son si tu ne rentres plus dans playFailed()
Et il faut faire la même chose avec playPassed() évidemment.