Bonjour,
débutant sur Arduino, je ne comprends pas pourquoi ce code ne fonctionne pas au niveau du test de valeur.
Merci de bien vouloir m'aider.
/*
* Réception des données série
*/
int Datalue;
int Texte;
void setup() {
// initialisation du port série
Serial.begin(9600);
// Init diode 13
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// lecture du port
if (Serial.available()) {
Datalue = Serial.read();
Serial.write(Datalue);
}
// Test valeur lue
if (Datalue == 1) {
digitalWrite(LED_BUILTIN, LOW);
}
if (Datalue == 2) {
digitalWrite(LED_BUILTIN, HIGH);
}
}
Tu ne dis pas comment tu envoies les données mais si tu les envoies avec un terminal c'est un code ASCII que tu envoies.
Donc il faut comparer au caractère '1' ou '2' if (Datalue == '1') {
Toujours mettre du code "exclusif" en complément de ce que l'on ne s'attend pas à traiter; à savoir:
if (Datalue == 1) {
digitalWrite(LED_BUILTIN, LOW);
}
if (Datalue == 2) {
digitalWrite(LED_BUILTIN, HIGH);
}
à remplacer par:
if (Datalue == 1) {
digitalWrite(LED_BUILTIN, LOW);
}
else if (Datalue == 2) {
digitalWrite(LED_BUILTIN, HIGH);
}
else {
Serial.print("Value not expected: [0x");
Serial.print(Datalue, HEX);
Serial.println("]");
}
Nous saurons alors quelle valeur est reçue et pas attendue
NB1: Maintenant entre nous, 1 et 2 ne sont pas des valeurs de caractères "imprimables" donc difficilement saisissable
NB2: Exécuter l'exemple Serial.read() et revenir vers nous
Merci à vous 3 pour vos réponses.
La solution de jpbbricole fonctionne ; super.
Pour info, par rapport au commentaires de claudius01, j’obtiens :
Avant saisie dans l'éditeur, affiche :
Value not expected: [0x0]
Après saisie de 1 ou 2 ou 3, affiche :
1Value not expected: [0x31]
2Value not expected: [0x32]
3Value not expected: [0x33]
Puis affiche :
Value not expected: [0xA]
Avec Serial.read(), affiche dans l'éditeur :
Après saisie de 1 :
I received: 49
I received: 10
Après saisie de 2 :
I received: 50
I received: 10
L'explication m’intéresse !
Bien cordialement à tous et merci pour votre aide.
Bonsoir jpbbricole,
et bien oui, je vais avoir encore besoin d'aide !
Je n'arrive pas à gérer un signal reçu tel que 45 par exemple, qui arrive en 2 caractères séparés.
Comment concaténer ces caractères pour pouvoir faire un test if sur la valeur ?
J'ai tenté diverses conversions sans succès ...
Merci.
Bonsoir beber39
J'ai fait "légérement" évoluer ton programme du post#1
Tu n'envoies plus de simples chiffres, mais des commandes:
Il y a 2 commandes pour la LED LED_BUILTIN (13); LED2 pour allumer LED1 pour éteindre
et 2 commandes pour la LED ledPwm (6), qui permet d'envoyer un paramètre à plusieurs chiffres; PWMLED255 pour allumer la LED en plein. PWMLED127 pour allumer la LED à moitié. PWMLED10 pour allumer la LED un tout petit peu. PWMLED0 pour éteindre la LED.
Pour commander une LED en PWM, le port de l'Arduino doit avoir cet attribut ~.
DataLue.trim(); // Nettoyage de Datalue
DataLue.toUpperCase(); // Tout en majuscule
At, surtout, n'hésites pas à poser des questions
Le programme:
/*
* Réception des données série
*/
String DataLue;
//int Texte;
const int ledPwm = 6; // Pour la LED variable
void setup()
{
// initialisation du port série
Serial.begin(9600);
// Init diode 13
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ledPwm, OUTPUT);
}
void loop()
{
// lecture du port
if (Serial.available())
{
DataLue = Serial.readStringUntil('\n'); // Lecture du port série jusqu'à nouvelle ligne \n
DataLue.trim(); // Nettoyage de Datalue
DataLue.toUpperCase(); // Tout en majuscule
Serial.println("Commande recue: " + DataLue);
if (DataLue.startsWith("LED")) // Si commande de la LED
{
DataLue.replace("LED", ""); // Supprimer la commande pour ne garder que le paramètre.
ledCommande(DataLue.toInt()); // Dans le cas d'une commande comme LED3 il ne reste que 3 que l'on transforme en numérique
}
else if (DataLue.startsWith("PWMLED")) // Si commande de la luminosité de la LED
{
DataLue.replace("PWMLED", ""); // Supprimer la commande pour ne garder que le paramètre.
int pwmValeur = DataLue.toInt();
analogWrite(ledPwm, pwmValeur); // Allumage de la LED à pwmValeur
}
else
{
Serial.println("Commande inconnue " + DataLue);
}
}
}
void ledCommande(int Data) // Commander la LED en fonction de Data
{
if (Data == 1)
{
digitalWrite(LED_BUILTIN, LOW);
}
if (Data == 2)
{
digitalWrite(LED_BUILTIN, HIGH);
}
}
Je vais tester ce programme très complet et comprendre son fonctionnement pour l'adapter.
Mon objectif est de piloter des sorties analogiques en fonction de la valeur reçue sur l'entrée série.