Réverbère automatique et moniteur série

Bonjour,

Je cherche à commander un réverbère (photorésistance et moniteur série) automatique. Deux problèmes se posent à moi : comment transmettre par le biais du moniteur une valeur décimale (tension seuil minimale aux bornes de R du PDDT) ET comment faire en sorte que le programme mémorise la valeur seuil indiquée (la DEL s'allume une seule fois puis s'éteint)? Merci beaucoup pour votre aide!

//Définition des broches numériques utilisées
int Valeur_A0 = A0;
float Tension_A0;
int DEL = 2;
int valeur_seuil;

//BOUCLE D'INITIALISATION
void setup() {
  pinMode(A0, INPUT);
  pinMode(DEL, OUTPUT);
  Serial.begin(9600);
  Serial.println("Renseigner la valeur seuil puis 'Envoyer'");
  Serial.println();
  Serial.println("Tension aux bornes de la résistance du PDDT (en V) :");
  while (!Serial) {
  } //Ne rien faire tant que la liaison série n'est pas établie
}

//BOUCLE PRINCIPALE
void loop() {
  Valeur_A0 = analogRead(A0); //On lit la sortie "numérique" A0 de la carte Uno aux bornes de la résistance R (PDDT). Valeur_A0 est comprise entre 0 (si A0 = 0V) et 1023 (si A0 = 5V).
  Tension_A0 = Valeur_A0 * 5.0 / 1024;
  Serial.println(Tension_A0);
  if (Serial.available() > 0) {//Serial.available() : renvoie le nombre d'octets présents sur la liaison série
    //Lecture du buffer et chargement des données
    valeur_seuil = Serial.read(); //Chargement des données
    Serial.print("Valeur seuil :");
    Serial.println(valeur_seuil);
  }
  if (Valeur_A0 <= valeur_seuil) {
    digitalWrite(DEL, HIGH); //Met un niveau logique HAUT sur la broche numérique "diode"
  }
  else {
    digitalWrite(DEL, LOW);  //Met un niveau logique BAS sur la broche numérique "diode"
  }
  delay(1000);
}

Bonjour,
Merci de prendre connaissance des bonnes pratiques du forum français et de mettre ton code entre balises pour qu'il soit lisible. Pense aussi à le mettre en forme dans l'IDE (Ctrl + T) avant de le copier afin que l'indentation soit correcte.

Tu peux modifier ton message initial en cliquant sur le petit crayon dans le bas du message.

Merci!

Si vous voulez explorer comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Bonjour,

Ta valeur est transmise sous forme de chaine de caractère, il faut don lire la chaine et la convertir en entier.


//BOUCLE PRINCIPALE
void loop() {
  Valeur_A0 = analogRead(A0); //On lit la sortie "numérique" A0 de la carte Uno aux bornes de la résistance R (PDDT). Valeur_A0 est comprise entre 0 (si A0 = 0V) et 1023 (si A0 = 5V).
  Tension_A0 = Valeur_A0 * 5.0 / 1024;
  Serial.println(Tension_A0);
  if (Serial.available() > 0) {//Serial.available() : renvoie le nombre d'octets présents sur la liaison série
    char buf[10];
    int n=Serial.readBytesUntil('\n',buf,sizeof buf-1);
    buf[n]=0;   // fin de la chaine
    //Lecture du buffer et chargement des données
    valeur_seuil = atoi(buf); //Chargement des données
    Serial.print("Valeur seuil :");
    Serial.println(valeur_seuil);
  }
  if (Valeur_A0 <= valeur_seuil) {
    digitalWrite(DEL, HIGH); //Met un niveau logique HAUT sur la broche numérique "diode"
  }
  else {
    digitalWrite(DEL, LOW);  //Met un niveau logique BAS sur la broche numérique "diode"
  }
  delay(1000);
}

Remarque: ton programme pourrait être amélioré car tant que tu n'as pas reçu une valeur seuil, c'est la valeur 0 qui est utilisée. Il faudrait mettre une valeur par défaut ou encore mieux mémoriser la dernière valeur transmise.
Prévoir aussi un hystérésis si tu ne veux pas que ta led clignote en permanence.