Changer la valeur PWM de deux leds en une ligne moniteur serie

Bonjour je suis novice avec arduino et je cherche à modifier la valeur PWM de deux leds en une ligne de code via le moniteur serie exemple du code envoyé : 150,255 , avec virgule espace ou rien ca me va.

Mon code :

int Led1 = 5;
int Led2 = 6;
int pwm1 = 0;
int pwm2 = 0;



void setup() {
  pinMode(Led1, OUTPUT);
  pinMode(Led2, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() == 6)

  {

    pwm1 = (Serial.read() - 48) * 100;
    pwm1 = pwm1 + (Serial.read() - 48) * 10;
    pwm1 = pwm1 + Serial.read() - 48;

    pwm2 = (Serial.read() - 48) * 100;
    pwm2 = pwm2 + (Serial.read() - 48) * 10;
    pwm2 = pwm2 + Serial.read() - 48;



    analogWrite(Led1, pwm1);
    analogWrite(Led2, pwm2);
    Serial.println(pwm1);
    Serial.println(pwm2);
  }
}

Le problème c'est que lorsque j'envois exemple : 123255 ca fonctionne pour la premiere fois mais les suivantes mon font des des retours incohérents.

J'aborde certainement mal la facon de faire ou quelque chose que je ne comprends pas bien.

Merci pour votre retour.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Après avoir lu les bonnes pratiques du forum francophone, il faudra mettre le code de ton premier post entre balises comme expliqué dans les bonnes pratiques puis tu pourras regarder ce tuto

qu'est-ce qu'il envoie comme fin de ligne ?

Bonsoir,
Je ne vois pas de fin de ligne, juste les deux valeurs si je rentre 123123

J'ai dans le moniteur serie

123
123

J'envois rien juste mes 6 nombres

Exemple 200125

Bonsoir ruddy-1982

Regardes dans les exemples, 04.Communication/SerialEvent, il y a tout ce qu'il faut.

Cordialement
jpbbricole

Merci, je suis tombé dessu hier, je vais creuser un peut plus pour essayer de trouver se qui me correspondrait.

Merci, je regarde ca.

Le pop up menu de fin de ligne est bien sur l’option de ne rien envoyer, c’est ça ? Pas de nouvelle ligne ou retour chariot ou les 2 ?


Ça expliquerait que le première fois ça marche mais plus ensuite.

Changez le test pour >= juste pour être tranquille

Et puis pour distinguer le premier nombre du second ce serait quand plus malin de mettre un séparateur. Cela évitera les plantages si tu oublies les zéro devant les nombres à 1 ou 2 chiffres.

Bonjour, merci pour les conseils le code fonctionne en changeant le test , je me demande quand même si c'est la bonne méthode ou si il y a pas une solution plus simple.

oui c'est une bonne idée mais je ne vois pas encore comment traiter le point dans le code, mais je cherche ...

Non la bonne méthode c’est de lire les données petit à petit quand elles arrivent - et ce serait mieux d’envoyer un ‘\n’ à la fin pour séparer les valeurs. Ça permet de se synchroniser sur une bonne trame. Séparer les valeurs par une virgule ou espace serait aussi une bonne idée

Bonjour ruddy-1982

La solution, simple, serialEvent et son exemple.
Le voici adapté à ton besoin.

int pwm1 = 0;
int pwm2 = 0;

const String donneesSeperateur = ",";

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() 
{
  Serial.begin(115200);

  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() 
{
  if (stringComplete) 
  {
    Serial.println("Parametres recus : " + inputString);
	commandeTraitement(inputString);

    inputString = "";
    stringComplete = false;
  }
}

void commandeTraitement(String & commande)
{
	// Premier paramètre
	String parametre = commande.substring(0, commande.indexOf(donneesSeperateur));     // Séparation de commande au séparateur
    pwm1 = parametre.toInt();
	Serial.println("PWM1 = " + String(pwm1));

	// Deuxième paramètre
	parametre = commande.substring(commande.indexOf(donneesSeperateur)+1);     // Séparation de commande depuis le séparateur +1 jusqu'à la fin
    pwm2 = parametre.toInt();
    Serial.println("PWM2 = " + String(pwm2));
}
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      inputString.trim();
	  stringComplete = true;
    }
  }
}

C'est assez simple.
Tu peux le tester, manuellement, en introduisant tes 2 valeurs dans la ligne de commande du moniteur à 115200, données séparées par une virgule (const String donneesSeperateur = ",";)
Les valeurs s'affichent dans le moniteur

Parametres recus : 150,255
PWM1 = 150
PWM2 = 255

Cette méthode de séparation des paramètres est valable que s'il n'y a que 2 paramètres, avec plus, il faudra splitter les données.

Dans l'exemple, j'ai juste ajouté, (conseil de @j-m-l), inputString.trim(); pour nettoyer la chaîne.
Attention au Notes and Warnings de serialEvent.

PS: ton moniteur doit être sur
image
ou sur
image

Cordialement
jpbbricole

Merci beaucoup d'avoir pris du temps pour ma demande, je vais tester cela ce soir et surtout comprendre comment le code fonctionne.

J'avais essayé de faire quelque chose avec serialEvent suite a ton conseil mais un peu compliqué pour moi .

Bonjour ruddy-1982

Si tu n'as pas de caractère(s) de fin comme \n ou \r, dis le moi, je t'indiquerai comment faire.

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.