AT COMMANDS

Bonjour j'ai une question vraiment bête:

#include "SoftwareSerial.h"


void setup() {
 Serial.begin(9600);
 delay(2000);
 Serial1.begin(115200);
 delay(2000);
}
void loop()
{
Serial1.println("AT");
  if((Serial1.find("AT")) || (Serial1.find("ok")) || (Serial1.find("OK")))                 // ESP8266 n'a pas bien répondu
  {
    Serial.println("Connexion au serveur réussie");                 // Affichage Ordinateur
  }
  else    // ESP8266 n'a bien répondu
  {
    Serial.println("Echec de la Connexion au serveur !");             // Affichage Ordinateur
  }
  delay(2000);
}

Je n'arrive pas du tout à envoyer une commande depuis le code, est-ce normal ?

Je pense qu'il faut définir les deux liaisons série que tu veux utiliser, voir la doc :

https://www.arduino.cc/en/Reference/SoftwareSerialBegin

Genre :

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11
#define rx1Pin 12
#define tx1Pin 14

// set up a new serial port
SoftwareSerial Serial =  SoftwareSerial(rxPin, txPin);
SoftwareSerial Serial1 =  SoftwareSerial(rx1Pin, tx1Pin);

void setup()  {
  // define pin modes for tx, rx:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(rxPin1, INPUT);
  pinMode(txPin1, OUTPUT);
  // set the data rate for the SoftwareSerial port
  Serial.begin(9600);
  Serial1.begin(115200);
}

void loop() {
  // ...
}

Bonjour,

Ca sert à quoi cette ligne #include "SoftwareSerial.h" ?

Comme tu utilises Serial1, je suppose que tu utilises une carte avec plusieurs liaison séries hard et non SoftwareSerial.

Il n'y a aucune chance que cette ligne fonctionne correctement

 if((Serial1.find("AT")) || (Serial1.find("ok")) || (Serial1.find("OK")))                 // ESP8266 n'a pas bien répondu

Serial1.find("AT") recherche bien si AT est présent dans la transmission, mais s'il n'est pas présent les caractères sont lus et ne se présenterons plus jamais (tant que l'on n'aura pas envoyé de nouvelle commande), donc les deux Serial1.find suivant ne donnerons jamais rien.

Il faut que tu reçoive la réponse entière et ensuite tu analyse si elle contient "AT" ou "ok" ...

#include "SoftwareSerial.h"
SoftwareSerial Serial1(2,3);

void setup() {
  Serial.begin(9600);
  delay(500);
  Serial1.begin(112500);
  delay(500);
}
void loop()
{
  Serial1.println("AT");
  if((Serial1.find("ok")) || (Serial1.find("OK")))                 // ESP8266 n'a pas bien répondu
  {
    Serial.println("Connexion au serveur réussie");                 // Affichage Ordinateur
  }
  else    // ESP8266 n'a bien répondu
  {
    Serial.println("Echec de la Connexion au serveur !");             // Affichage Ordinateur
  }
  delay(2000);
}

J'ai reessayé mais rien n'y change, ça doit vraiment etre untruc tout simple

kamill:
Bonjour,

Ca sert à quoi cette ligne #include "SoftwareSerial.h" ?

Comme tu utilises Serial1, je suppose que tu utilises une carte avec plusieurs liaison séries hard et non SoftwareSerial.

Il n'y a aucune chance que cette ligne fonctionne correctement

 if((Serial1.find("AT")) || (Serial1.find("ok")) || (Serial1.find("OK")))                 // ESP8266 n'a pas bien répondu

Serial1.find("AT") recherche bien si AT est présent dans la transmission, mais s'il n'est pas présent les caractères sont lus et ne se présenterons plus jamais (tant que l'on n'aura pas envoyé de nouvelle commande), donc les deux Serial1.find suivant ne donnerons jamais rien.

Il faut que tu reçoive la réponse entière et ensuite tu analyse si elle contient "AT" ou "ok" ...

Que dois-je faire à la place des Serial.find dans ce cas ?

Et est-ce qu'au moins j'ordonne d'envoyer la commande AT ?

Merci d'avance,

keaume:
Que dois-je faire à la place des Serial.find dans ce cas ?

Tu fais un Serial1.readbytes() ou Serial1.readBytesUntil() et dans le message reçu tu recherche tes chaines avec strstr (par exemple)

keaume:
Et est-ce qu'au moins j'ordonne d'envoyer la commande AT ?

Oui, si tout est bien connecté et si la vitesse est bonne.

Pourriez-vous me proposer un petit code permettant de faire cela ? J'aimerais simplement m'assurer que je puisse envoyer des commandes AT depuis le code en lui même.
Merci d'avance,

Par exemple:

void setup() {
  Serial.begin(9600);
  delay(2000);
  Serial1.begin(115200);
  delay(2000);
}

char msg[40];

void loop()
{
  Serial1.println("AT");
  int n=Serial1.readBytesUntil('\n',msg,sizeof msg-1);
  msg[n]=0;                 // marque la fin de la chaine
  Serial.println(msg);      // pour debug
  if (strstr(msg,"AT") || strstr(msg,"ok") || strstr(msg,"OK"))     // teste si ESP8266 a bien répondu
  {
    Serial.println("Connexion au serveur réussie");                 // Affichage Ordinateur
  }
  else    // ESP8266 n'a bien répondu
  {
    Serial.println("Echec de la Connexion au serveur !");             // Affichage Ordinateur
  }
  delay(2000);
}

Merci beaucoup pour votre réponse,

Voici mon code :

#include "SoftwareSerial.h"
SoftwareSerial Serial1(2,3);


void setup() {
  Serial.begin(9600);
  delay(2000);
  Serial1.begin(115200);
  delay(2000);
}

char msg[40];

void loop()
{
  Serial1.println("AT");
  int n=Serial1.readBytesUntil('\n',msg,sizeof msg-1);
  msg[n]=0;                 // marque la fin de la chaine
  Serial.println(msg);      // pour debug
  if (strstr(msg,"AT") || strstr(msg,"ok") || strstr(msg,"OK"))     // teste si ESP8266 a bien répondu
  {
    Serial.println("Connexion au serveur réussie");                 // Affichage Ordinateur
  }
  else    // ESP8266 n'a bien répondu
  {
    Serial.println("Echec de la Connexion au serveur !");             // Affichage Ordinateur
  }
  delay(10000);
}

Je voudrais simplement envoyer une commande AT (ou AT+RST) et bien voir si le système répond ''OK''.

Il me semblerait que parfois votre code m'annonce des erreurs, parfois cela affiche AT parfois cela affiche OK parfois cela affiche rien et la connexion echoue...

Tu utilises SoftwareSerial
Il ne fonctionne pas (ou mal) à 115200 bds

Pourtant je ne peux le baisser à 9600 sinon il n'exécute plus rien..

Bien sur il faut aussi changer la vitesse de l'ESP8266