bonjour,
je cherche a incrémenter plus ou moins rapidement via un codeur rotatif. J'arrive a le faire avec un pas de 1 voir plus selon l'incrément mais c'est fixe. Y a t'il un moyen d'incrémenter par exemple doucement si on tourne doucement et plus fort si on tourne plus vite. j'ai essayer avec millis() mais sans succès. j'ai tenté aussi en changent le taux d'incrémentation avec des appuis sur Switch (un appui pour X 1 deux pour X par 10 etc...) mais je n'y arrive pas non plus.
Quel Arduino utilises-tu ?
Quelle est la référence de ton codeur ?
Comment est-il connecté ?
Comment fais-tu la lecture de ses valeurs ?
Le code fourni fonctionne! Et celui qui n'est pas fourni est difficile à deviner....
houla oui en effet désolé ça manque de précision tout ça. :-[
le bouton rotatif: module WayinTop KY 040 360 , le capteur de pression: AZDelivery GY-BMP280
j'aimerai faire un tableau de bord pour mon ulm, avec plusieurs indicateurs, dont l'altimetre.
le code de test avec calibrage du QNH (valeur de référence pour l'altitude) fonctionne, mais selon le taux d'incrémentation ou décrémentation: c'est rapide peut de tour, mais pas précis ou précis, mais très lent et beaucoup de tours ( pas possible en vol) d'ou ma question pour adapter la valeur selon la vitesse ou l'on tourne le bouton.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
int buttonState = 0;
/****************** bouton rotatif ***********************/
#define PinA 2 // codeur
#define PinB 3 // codeur
volatile boolean mouvement;
volatile boolean up;
float valeur = 1013; // QNH niveau de la mer 1013.25
int etat = 0;
// routine déclanchée quand le signal A passe de haut a bas
void routineInterruption () {
if (digitalRead(PinA))
up = digitalRead(PinB);
else
up = !digitalRead(PinB);
mouvement = true;
}
/**********************************************************/
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
/******************************* bouton rotatif **************************/
pinMode(PinA,INPUT);
pinMode(PinB,INPUT);
attachInterrupt (0,routineInterruption,FALLING); // interruption sur front descendant
Serial.begin (9600);
/**************************************************************************/
}
void loop() {
/****************************** boutob rotatif ******************************/
if (mouvement) {
if (up)
valeur = valeur + 1;
else
valeur = valeur - 1;
mouvement= false;
}
Serial.print ("valeur = ");
Serial.println (valeur);
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(valeur)); // valeur pour ajuster le QNH
Serial.println(" m");
Serial.println();
delay(500);
}
Il manque attachInterrupt pour la pin 3 ? ? ?
EDIT : mais cela peut se faire aussi avec une seule interruption.
J'ai plus l'habitude de ceci : Improved-Arduino-Rotary-Encoder-Reading
Au sujet de ton problème il suffit de mesurer le temps entre deux interruptions avec millis() ou micros() et de modifier la valeur d'une variable incrément dans l'interruption.
Ensuite :
if (up)
valeur = valeur + increment;
else
valeur = valeur - increment;
merci , ça marche avec millis mais faut pas tourner trop vite sinon ca perd des pas. Entre temps j'ai tester avec un potar multi tours et je prefère avec ce potentiomètre c'est plus agréable a tourner
encore merci pour votre aide.
il existe plusieurs bibliothèques supportant l'accélération, par exemple celle ci
son principal inconvénient est de monopoliser un timer (qui par défaut va consulter l'encodeur 1000 fois par seconde) plutôt que d'utiliser des interruptions