Communication avec port série et serialread

Bonjour,

Le but de ce petit programme est de recevoir des ordres venant de mon smartphone via le bt et aussi du pc pour commander des éclairages. Les modules qui allument ou éteignent les sorties se commandent par une impulsion de 400 ms. Une impulsion sur l’entrée du module active la sortie à 1 et une nouvelle impulsion sur cette même entrée va mettre la sortie à 0. (fonctionne comme un télérupteur)

Je reçois bien les instructions via les ports série et bt mais et mes sorties leds restent à l’état 1 jusqu’au moment de recevoir une autre commande du port série.

J’ai d’abord essayé de faire un
delay 400 ms
digitalwrite led… low mais la led reste allumée.
2° j’essaye d’envoyer une autre commande par serial read ou serial print mais pareil?
Dans le moniteur série les valeurs s’affiche et changent bien mais sans changer l’état de la sortie led?

Merci de votre aide.

#include <SoftwareSerial.h> //Software Serial Port
#define RxD 10 //Pin 10 le TX du HC-06
#define TxD 11 //Pin 11 le RX du HC-06 
SoftwareSerial BTSerie(10, 11); //rx tx


int ledsalon = 2;
int ledveranda = 13;
int ledchambre = 4;
int ledSB = 5;
int ledambiance = 6;
int ledclim = 7;
int ledcuisine = 8;
int ledvoletUP = 9;
int ledvoletDown = 10;

 byte state = 0;
 byte statebt = 0;
 void setup() {

 pinMode(ledsalon, OUTPUT);
 pinMode(ledveranda, OUTPUT);
 pinMode(ledchambre, OUTPUT);
 pinMode(ledSB, OUTPUT); 
 pinMode(ledambiance, OUTPUT);
 pinMode(ledclim, OUTPUT);
 pinMode(ledcuisine, OUTPUT);
 pinMode(ledvoletUP, OUTPUT);
 pinMode(ledvoletDown, OUTPUT);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);

digitalWrite(ledsalon, HIGH);
digitalWrite(ledveranda, HIGH);
digitalWrite(ledchambre, HIGH);
digitalWrite(ledSB, HIGH); 
digitalWrite(ledambiance, HIGH);
digitalWrite(ledclim, HIGH);
digitalWrite(ledcuisine, HIGH);
digitalWrite(ledvoletUP, HIGH);
digitalWrite(ledvoletDown, HIGH);

 Serial.begin(9600);
 Serial.println("Hello");

// Configuration du bluetooth

BTSerie.begin(9600); 
   
 }
void loop() {
  if(Serial.available() > 0){
  state = Serial.read();
  Serial.println(state);  

if (BTSerie.available()) {
state = BTSerie.read(); //lecture
Serial.print(state); //ecriture
} 
 
if (state == '1') {
digitalWrite(ledsalon, LOW);
delay(400);
digitalWrite(ledsalon, HIGH);
 }

Bonjour,

state n'est jamais reinitialisé. De plus il manque des }

void loop() {
  state=0;
  if (Serial.available() > 0) {
    state = Serial.read();
    Serial.println(state);
  }
  
  if (BTSerie.available()) {
    state = BTSerie.read(); //lecture
    Serial.print(state); //ecriture
  }

  if (state == '1') {
    digitalWrite(ledsalon, LOW);
    delay(400);
    digitalWrite(ledsalon, HIGH);
  }
}

Merci,

C'est juste pour les accolades j'ai coupé le reste du code pour l'insérer. Elle change d'état seulement lorsque j'ai une autre instruction qui vient du port série.

Donc c'était un problème car elle doit changer d'état soit par le port série relié au Pc soit par le port série du bluetooth.

Les valeurs changent bien dans le moniteur série au fur et à mesure qu'elles arrivent soit du bt ou du port com.

Si je reçois '1' ou si je l'entre au clavier la led passe bien en LOW mais elle y reste jusqu'à ce qu'une autre commande venant du port ou du clavier arrive pour repasser en HIGH.

Si j'envoie une valeur dans un serial println, ou un serial write le moniteur série affiche bien le contenu mais ma led reste en low. Si j'entre au clavier la led repasse en HIGH?

J'ai chargé votre code, mais il manque plusieurs }

N'y a t'il pas de problème entre SoftwareSerial.h et delay() ?

pierre34700:
Si je reçois '1' ou si je l'entre au clavier la led passe bien en LOW mais elle y reste jusqu'à ce qu'une autre commande venant du port ou du clavier arrive pour repasser en HIGH.

Je ne vois pas comment ça peut être possible avec le programme que tu as mis en #1

if (state == '1') {
digitalWrite(ledsalon, LOW);
delay(400);
digitalWrite(ledsalon, HIGH);

Soit le programme n'est pas le bon, soit il y a d'autres choses que tu ne nous a pas dites.
Mets le programme complet avec tous les } et profites en pour indenter correctement ton programme avec CTRL T ou CMD T.

Je n'ai pas chargé le code complet...

Le problème est le même avec le serial bt et le port usb (rx et tx)
Si je tape 1 au clavier, j'ai bien 49 qui s'affiche dans le moniteur pareil si c'est venant du bt ou du serial la led passe à O et y reste.
Si je tape 2, j'ai bien 50 dans le moniteur serie la led se remet à High.

J'ai essayé d'ajouter un serialprintl ('9') il s'affiche bien dans le moniteur série mais ne remet pas la led à HIGH

Voici la partie du code qui pose problème

int ledsalon = 13;
byte state = 0;

void setup() {

pinMode(ledsalon, OUTPUT);
digitalWrite(ledsalon, HIGH);

Serial.begin(9600);
Serial.println("Hello");
}
void loop() {

if (Serial.available() > 0){
state = Serial.read();
Serial.println(state);
}
if (state == '1') {
digitalWrite(ledsalon, LOW);
delay (500);
digitalWrite(ledsalon, HIGH);

}
}

Comme je te l'ai déjà dit state doit être mis à 0, autrement il garde sa valeur jusqu'à nouvelle réception et on entre continuellement dans le if jusqu'à réception d'une valeur différente.

Kamill, merci mais je ne vois pas ou mettre à 0?

J’ai fait ceci et ça semble fonctionner:
int ledsalon = 13;
byte state = 0;

void setup() {

pinMode(ledsalon, OUTPUT);
digitalWrite(ledsalon, HIGH);

Serial.begin(9600);
Serial.println(“Hello”);
}
void loop() {

if (Serial.available() > 0){
state = Serial.read();
Serial.println(state);
}
if (state == ‘1’) {
digitalWrite(ledsalon, LOW);
delay (500);
//digitalWrite(ledsalon, HIGH);
}
state = digitalRead(ledsalon);
if (state == LOW) {
digitalWrite(ledsalon, HIGH);
delay (500);
}
}

Kamill a raison, state vaut toujours 1 dans la boucle si pas de nouvelle réception donc la LED clignote en permanence mais elle semble allumée à cause de la persistance rétinienne (je pense).

Il faut remettre state à une autre valeur que 1 en fin de la fonction loop()

pierre34700:
Kamill, merci mais je ne vois pas ou mettre à 0?

On peut le mettre à plusieurs endroits, mais le plus logique pour une initialisation c'est de le mettre au début, donc mets le au début de la loop().