problème valeure analogique et potentiomètre

bonjour,

j'ai comme projet de fabrique une soudeuse par points, et je me suis dis que pour gérer la tempo une arduino, un relai et deux trois bricoles ferai parfaitement l'affaire,

donc le fonctionnement et simple:

  • Je règle la durée de soudage, par potentiomètre 10K ohm, fourchette de 250 millis, fonction MAP 1 - 40;
  • j'appuie sur un bouton poussoir (qui sera remplace par un capteur fin de course ou un bouton poussoir pour une fonction manuel de la soudure) et le relai claque pendant le temps defini plus haut
  • une délai de 5000 millis en fin de boucle pour me laisser le temps de relâcher le fin de course pour éviter que la boucle se lance a nouveau (je crois que je pourrai dire aussi active le relai une seul fois mais je verrai ça par la suite)

j'utilise un TM1637 pour l'affichage de la durée en millis avant la soudure et il affiche 0000 pendant l'action de soudage (lorsque le relai et en NC) pour m'indique que ca soude simplement.

bon mon problème concrètement c'est que la valeur analogique n'est pas stable, du coup après calcul dans le code c'est encore pire, si je regle sur 1000 par exemple l'écran affiche 750 1000 1250 sans cesse...

donc sois ça vien de ma façon de rédiger mon code (en sachant que je début et que mes connaissance son limités) soit, ça vien de la partie électronique

par ailleurs: j'ai choisi volontairement de ne pas utiliser la fonction millis() pour mon code car je ne la maitrise pas, mais je pense que cela pourrai solutionner le problème...

je vous laisse mon code (trés inspiré de bout de code choppé sur le net dans différent tuto donc commenter en francais et en anglais parfois mais je pense que ça reste pas mal lisible

#include <TM1637Display.h>

const int CLK = 9; //Set the CLK pin connection to the display
const int DIO = 8; //Set the DIO pin connection to the display
TM1637Display display(CLK, DIO);  //set up the 4-Digit Display.

int pinPot = 0; //stocke le CAN utilisé
int valPot = 0; //variable pour récupérer la valeur de tension du potentiomètre. On l'initialise à 0.
int pinRELAI = 7;
int contact = 3;
int contactState = 0;

void setup() {
  pinMode(3, INPUT); // mode input pour la pin du end stop
  pinMode(7, OUTPUT); //mode OUTPUT pour le pin du relai
  display.setBrightness(0x0a);  //set the display to maximum brightness
  Serial.begin(9600);
}

void loop() {

  contactState = digitalRead(3);
   Serial.println(contactState);
    valPot = analogRead(A0); //lit la valeur de la tension, la numérise et la stocke dans valPot
     int valInter = map(valPot, 0, 1023, 1, 40); //fonction de mappage
     int attente = 250*valInter ; // calcul du temps d'arrêt
    display.showNumberDec(attente, false, 4,0);
    Serial.println(attente);

  if (contactState == HIGH) {
    valPot = analogRead(A0); //lit la valeur de la tension, la numérise et la stocke dans valPot
    int valInter = map(valPot, 0, 1023, 1, 40); //fonction de mappage
    int attente = 250 * valInter ; // calcul du temps d'arrêt
    display.showNumberDec(0000, true, 4,0);
    Serial.println(attente);
    Serial.println(contactState);
    digitalWrite(pinRELAI, HIGH); //on allume le RELAI
    delay (attente); //attente calculée
    digitalWrite(pinRELAI, LOW); //on éteint le RELAI
    delay(2000); // delay avant nouveau loop
  }
}

voila

merci,
Free

attente serait bien en unsigned long, sinon ça va déborder.

Salut ,

1ere remarque :

int pinPot = 0; //stocke le CAN utilisé

si c' est une broche GPIO , la GPIO 0 et 1 ne doivent jamais etre utilisé . donc changer cela .

2eme remarque qui n ' empeche pas de faire marcher votre code mais bon :

int contactState = 0;

si cette valeur ne peut prendre que 0 ou 1 , il est mieux de l' ecrire :

bool contactState = 0;

ca sera deja plus lisible .

ceci est une methode integree a la classe " #include <TM1637Display.h> "

display.showNumberDec(0000, true, 4,0);

?

Je pense que le pire est là :

    int attente = 250 * valInter ; // calcul du temps d'arrêt

Si valInter vaut 1023 : 250 * 1023 : attente = 255750

Un int = 32767 maxi.

hbachetti:
Je pense que le pire est là :

    int attente = 250 * valInter ; // calcul du temps d'arrêt

Si valInter vaut 1023 : 250 * 1023 : attente = 255750

Un int = 32767 maxi.

c ' est sur que ca va pasle faire :stuck_out_tongue:

mettre un unsigned long comme vous l' avez dis est une bonne solution pour corriger ce debordement dans un premier temps .

reste a voir ensuite si il n ' y a pas d' autre soucis apres .

Dans ton messages il y a des millis partout. :slight_smile:
Sont-ce des millis secondes (ms), des millis ampères (mA) ou d'autre millis ?

Peut-être n'ai je pas compris mais si effectivement tu règles un temps de contacts en millis secondes avec des relais mécaniques cela me parait peu fiable : dépend trop de la qualité de fabrication et du degrés d'usure de la mécanique.

OULALA, trop cool tout ces retour, alors,

donc dans l'ordre,

iznobe:
Salut ,

1ere remarque :

int pinPot = 0; //stocke le CAN utilisé

si c' est une broche GPIO , la GPIO 0 et 1 ne doivent jamais etre utilisé . donc changer cela .

je comprend pas ce que tu veux me dire,

2eme remarque qui n ' empeche pas de faire marcher votre code mais bon :

int contactState = 0;

si cette valeur ne peut prendre que 0 ou 1 , il est mieux de l' ecrire :

bool contactState = 0;

OK

ca sera deja plus lisible .

ceci est une methode integree a la classe " #include <TM1637Display.h> "

display.showNumberDec(0000, true, 4,0);

?

Je ne pense pas, j'ai ecris 0000 ca a marcher je me suis pas attardé....

hbachetti:
Je pense que le pire est là :

    int attente = 250 * valInter ; // calcul du temps d'arrêt

Si valInter vaut 1023 : 250 * 1023 : attente = 255750

Un int = 32767 maxi.

BAH je peux me tromper mais là j'utilise le mapping pour prendre en compte une valeur entre 1 et 40?

code corriger suite à vos remarques:

#include <TM1637Display.h>

const int CLK = 9; //Set the CLK pin connection to the display
const int DIO = 8; //Set the DIO pin connection to the display
TM1637Display display(CLK, DIO);  //set up the 4-Digit Display.

int pinPot = 0; //stocke le CAN utilisé
int valPot = 0; //variable pour récupérer la valeur de tension du potentiomètre. On l'initialise à 0.
bool pinRELAI = 7;
bool contact = 3;
bool contactState = 0;

void setup() {
  pinMode(3, INPUT); // mode input pour la pin du end stop
  pinMode(7, OUTPUT); //mode OUTPUT pour le pin du relai
  display.setBrightness(0x0a);  //set the display to maximum brightness
  Serial.begin(9600);
}

void loop() {

  contactState = digitalRead(3);
   Serial.println(contactState);
    valPot = analogRead(A0); //lit la valeur de la tension, la numérise et la stocke dans valPot
    int valInter = map(valPot, 0, 1023, 1, 40); //fonction de mappage
    unsigned long attente = 250*valInter ; // calcul du temps d'arrêt
  display.showNumberDec(attente, false, 4,0);
   Serial.println(attente);
  if (contactState == HIGH) {
    valPot = analogRead(A0); //lit la valeur de la tension, la numérise et la stocke dans valPot
    int valInter = map(valPot, 0, 1023, 1, 40); //fonction de mappage
    unsigned long attente = 250 * valInter ; // calcul du temps d'arrêt
    display.showNumberDec(0000, true, 4,0);
    Serial.println(attente);
    Serial.println(contactState);
    digitalWrite(pinRELAI, HIGH); //on allume le RELAI
    delay (attente); //attente calculée
    digitalWrite(pinRELAI, LOW); //on éteint le RELAI
    delay(2000); // delay avant nouveau loop
  }
}

et du coup pas d'améliorations du comportement de l'affichage, peut etre a penne plus stabe mais c'est pas résolu,

Si tu affichais valPot sur la console ?

hbachetti:
Si tu affichais valPot sur la console ?

valPot244
valInter10
2500
contactState0
valPot245
valInter10
2500
contactState0
valPot245
valInter10
2500
contactState0
valPot244
valInter10
2500
contactState0
valPot234
valInter9
2250

Il peut y avoir de multiples causes, en particulier la stabilité de l'alimentation 5V.
Si le 5V sert de référence, il doit être très stable.
Quelle alimentation ? USB ? autre ?

j'ai essayer via le port usb du l'ordi, et que une prise genre chargeur de tel 2A...

j'ai essayer de changer de potentiomètre également mais ça change rien

par contre si j'ecris:

valPot = analogRead(A0)/10; //lit la valeur de la tension, la numérise et la stocke dans valPot
    int valInter = map(valPot, 0, 102, 1, 40);

au lieu de :

valPot = analogRead(A0); //lit la valeur de la tension, la numérise et la stocke dans valPot
    int valInter = map(valPot, 0, 1023, 1, 40);

ca va beaucoup mieux mais c'est pas ca encore c'est une piste de travail non?

hello
prendre des potars bobinés

que fait ce code ?
display.showNumberDec(0000, true, 4,0); il a a voir avec l' affichage non ?

le probleme c ' est quoi exactement , l ' affichage des valeurs , ou les valeurs recuperees dans votre code qui n ' est pas bon ?

Tu ne crois pas qu'un encodeur rotatif serait plus adapté ?

description trop sommaire du montage = pertes en conjectures généralisées