Encodeur Rotatif Absolu 1024 pas : BRT38-SOM1024

Portrait de Anonyme

Suite à une demande sur mon Email voici le code pour ce BRT38-SOM1024 non commenté ;

int CS = 10;
int DO = 12;
int CLK = 13;
float Angle, Data, xData;
String Dep;
int N, Tr;

void setup() {
  Serial.begin(115200);
  Serial.println();
  pinMode(CS, OUTPUT);
  digitalWrite(CS, HIGH);
  pinMode(DO, INPUT);
  pinMode(CLK, OUTPUT);
  digitalWrite(CLK, LOW);
}

void loop() {
  digitalWrite(CS, LOW);
  Data = 0;
  Dep = "";
  for (N = 0; N < 10; N++) {
    digitalWrite(CLK, LOW);
    delay(2);
    digitalWrite(CLK, HIGH);
    delay(2);
    Data = Data + (pow(2, 9 - N) * digitalRead(DO));
  }
  if (xData - Data > 600)
    Tr++;
  if (Data - xData > 600)
    Tr--;

  if (xData != Data) {
    xData = Data;
    Serial.println("Valeur BRT38 =" + StringF(Data, 0, 5 ) + " pas  Nbr Tour =" + StringF(Tr, 0, 4) + " Degrés =" + StringF((Data * 360 / 1024), 2, 8) + " Grades =" + StringF(400 * Data / 1024, 2, 7));
    Serial.println("Soit : " + DegMinSec((Data * 360 / 1024)));
  }
  digitalWrite(CS, HIGH);
  delay(5);
}

String StringF(float Valeur, int Dec, int Lg) { // Converti une valeur numerique en chaine de caractère avec dec décimal et une longueur mini de Lg caractères
  String sValeur = String(Valeur, Dec);
  Lg = Lg - sValeur.length();
  while (Lg > 0) {
    sValeur = " " + sValeur;
    Lg--;
  }
  return (sValeur);
}

String DegMinSec(float Valeur) {
  int Degres = Valeur;
  int Minutes = 60 * (Valeur - Degres);
  float Secondes = 60 * (Valeur - Degres - (Minutes / 60));
  String Retour = String(Degres) + String("°") + String(Minutes) + "'" + String(Secondes); //+String(char(34));
  Retour.replace(".", String(char(34)));
  return (Retour);

}

brossden abondamment critiqué par des ... je préfère m'abstenir, avait réalisé cette vidéo :