Programmer Arduino Uno et esp8266

Bonjour,

J'aurais besoin d'aide concernant mon projet d'arduino. J'ai pu comprendre que je pouvais programmer mon esp8266 en AT ou en code directement en utilisant un adaptateur série programmeur.
Au tout début tout se passe bien je passe mon esp8266 en mode prog avec la clé, le téléversement s'effectue correctement puis je passe mon esp8266 en mode UART, tout se passe bien également j'arrive à récupérer une adresse ip et à visualiser mes données.
Mon problème apparait quand j'essaie de brancher mon esp8266 sur la carte arduino Uno. Je ne reçois d'adresse Ip dans mon moniteur série.
Au début j'ai cru que cela était dû au branchement, j'ai donc flasher mon esp8266 en AT, et branché ma carte esp8266 avec un nouveau code en AT et tout fonctionne mais je ne peux pas utiliser la librairie de esp8266 d'où mon achat d'adaptateur.

Mon but étant de récupérer mes données de temperatures sur un serveur.

Est ce que lorsqu'on transfert du code sur l'Esp8266(en mode code) il faut mettre un code dans l'arduino Uno?

Merci pour votre aide d'avance.

Quel esp?
Quel circuit? (Adaptation de tension?)
Quel code?

:lire les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

C’est le esp-01, avec cet adaptateur https://es.aliexpress.com/i/32970437000.html, lorsque c’est branché en usb avec cet clé le code fonctionne mais lorsque j’essaie d’alimenter avec ce circuit la :

Plus rien il s’allume mais pas de réponse , il est alimenté en 3.3v le module sur la photo et le code je l’ai mis en pièce jointe et le problème c’est que je dois branché esp sur l’arduinl car j’en aurais besoin pour récupérer la température avec un capteur.

#include <SoftwareSerial.h>


SoftwareSerial esp8266(10,11); 

#define SSID "xxxxx"     // "SSID-WiFiname" 
#define PASS "xxxxxx"       // "password"
#define IP "184.106.153.149"// thingspeak.com ip
String msg = "GET /update?key=xxxxx";
//Variables

float temp; //Stores temperature value

void setup()
{
  //pinMode(A1,INPUT);
  //pinMode(8,INPUT);
  //dht.begin();
  delay(100);
  Serial.begin(9600); //or use default 115200.
  esp8266.begin(9600);
  Serial.println("AT");
  esp8266.println("AT");
  delay(3000);
  if(esp8266.find("OK")){
    connectWiFi();
  }
}

void loop()
{
  //Temperature
  //float temperature_celcius = valeur_brute * (5.0 / 1023.0 * 100.0);
  int valeur_brute = analogRead(A0);
  temp= valeur_brute * (5.0 / 1023.0 * 100.0);
  //Serial.println(temp);
  delay(2000);
    update();

  }

void update(){
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";
  Serial.println(cmd);
  esp8266.println(cmd);
  delay(2000);
  if(esp8266.find("Error")){
    return;
  }
  cmd = msg ;
  cmd += "&field1=";   
  cmd += temp;
  cmd += "\r\n";
  Serial.print("AT+CIPSEND=");
  esp8266.print("AT+CIPSEND=");
  Serial.println(cmd.length());
  esp8266.println(cmd.length());
  Serial.print(cmd);
  esp8266.print(cmd);

}

boolean connectWiFi(){
  Serial.println("AT+CWMODE=1");
  esp8266.println("AT+CWMODE=1");
  delay(2000);
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial.println(cmd);
  esp8266.println(cmd);
  delay(5000);
  if(esp8266.find("OK")){
    Serial.println("OK");
    return true;    
  }else{
    return false;
  }
} 

l'ESP01 est un device 3.3V. avez vous une adaptation de tension?
(quand l'arduino lui parle et qu'il envoie 5V sur la pin Tx et c'est reçu sur la pin Rx de l'ESP qui ne supporte que 3.3V ➜ risque de griller l'ESP)

De plus la sortie 3,3V de la carte Arduino n'envoie pas assez de courant pour que l'ESP-01 fonctionne à tous les coups en WiFi. Alimenter l'ESP-01 avec un régulateur 3,3V capable de fournir au moins 500mA, c'est que l'on trouve sur toutes les cartes complètes avec des ESP8266 (NodeMCU, D1 MIni.....)

IL faut ajouter des composants aux ESP-01 pour les associer sérieusement à des cartes UNO. ou MEGA...si tant est que ce genre de combinaison ait encore un intérêt en 2023... autre qu'historique.

Mais je comprends pas pourquoi elle fonctionne quand le module esp est en AT , tout se passe bien. Quand c’est en AT, lorsque je fais les branchements comme sur la photo aucune soucis. Mais quand j’ai téléversé le code en avance avec mon adapteur et qu’après je le branche sur l’arduino, c’est là le problème.

C’est parce que c’est un projet universitaire, et c’est le module esp qui m’a été fournie

Quand c’est en AT, lorsque je fais les branchements comme sur la photo aucune soucis.

Pourvu que ça dure .!!

L'adaptateur USB que tu évoques fait deux choses importantes :

-alimenter correctement en 3,3V y compris pendat les 'pointes de courant' apparaissant ors de la connection au point d'accès (pointes signalées data sheet )

-limiter à 3,3V le niveau de tension reçu par l'ESP8266 sur sa borne Rx pour garantir la longévité de l'ESP8266 , conformémément aux spécifications (data sheet)

On est plusieurs sur ce forum (et sur d'autres)..... a avoir fait comme sur ta photo il y a 7 ou 8 ans (arrivée des ESP-01 sur le marché en l'absence, à l'époque, de documentation) et constaté des dysfonctionnements divers dus à une sous-alimentation chronique de la puce WiFi qui par moments appelle brièvement un courant voisin de 400mA... résulta : reboots intempestifs de l'ESP8266 au rythme des accès WiFi

Le code que tu montres au message #4 est à flasher sur la carte Arduino associée à un ESP8266 doté d'un firmware AT, ce n'est pas un code destiné à tournere sur ESP8266.

*Ce que tu essaies de faire (publication sur ThingSpeak d'un grandeur analogique) se fait très facilement et de manière simple , fiable et moins coûteuse, sans carte UNO ni ESP-01 !!
Code édité , compilée et téléversé avec l'IDE Arduino
Carte : NodemCU ou LOLIN D1 MIni
Faire ça avec un composant 'retro' est moins simple......

D'après mes souvenirs un ESP-01 :

-généreusement alimenté en 3,3V (400mA par instants )
-dont l'entrée CH_PD est reliée 3,3V
-dont GPIO0 n'est pas relié
-recevant sur son RX des commandes AT au bon débit (en évitant de préférence de dépasser 3,3V comme recommandé par Espressif, fabricant des ESP8266)

-> exécute ces commandes et répond sur sa sortie Tx

De memoire , mais c'est loin et je ne suis pas tenté d'y revenir....
-tous les firmwares AT ne fonctionnaient pas à 9600 bauds
-tous les firmwares AT n'avaient pas les mêmes attentes en matière de terminaison de ligne (CR ? NL ?...)

Du coup j'ai décidé de coder en AT:


SoftwareSerial esp8266(10,11); 

#define SSID "xxxx"     // "SSID-WiFiname" 
#define PASS "xxxx"       // "password"
#define IP "x.x.x.x"
String msg = "http://x.x.x.x/post-sensor-data.php?";
String apiKeyValue = "tPmAT5Ab3j7F9";
String sensorName = "LM35";
String sensorLocation="Home";
int distance=20;


float temp; //Stores temperature value

void setup()
{
  delay(100);
  Serial.begin(9600); //or use default 115200.
  esp8266.begin(9600);
  Serial.println("AT");
  esp8266.println("AT");
  delay(3000);
  if(esp8266.find("OK")){
    connectWiFi();
  }
}

void loop()
{
  //Temperature
  //float temperature_celcius = valeur_brute * (5.0 / 1023.0 * 100.0);
  int valeur_brute = analogRead(A0);
  temp= valeur_brute * (5.0 / 1023.0 * 100.0);
  Serial.println(temp);
  delay(2000);
    update();

  }

void update(){
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";
  Serial.println(cmd);
  esp8266.println(cmd);
  delay(2000);
  if(esp8266.find("Error")){
    return;
  }
 /* cmd = msg ;
  cmd += "&field1=";   
  cmd += temp;
  cmd += "\r\n";*/
  cmd = msg;
  cmd += "api_key=";
  cmd += apiKeyValue;
  cmd += "&sensor=";
  cmd += sensorName;
  cmd += "&location=";
  cmd += sensorLocation;
  cmd += "&distance=";
  cmd += distance ;
  cmd +=  "\r\n";

  Serial.print("AT+CIPSEND=");
  esp8266.print("AT+CIPSEND=");
  Serial.println(cmd.length());
  esp8266.println(cmd.length());
  Serial.print(cmd);
  esp8266.print(cmd);

}

boolean connectWiFi(){
  Serial.println("AT+CWMODE=1");
  esp8266.println("AT+CWMODE=1");
  delay(2000);
  String cmd="AT+CWJAP=\"";

> Citation

cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial.println(cmd);
  esp8266.println(cmd);
  delay(5000);
  if(esp8266.find("OK")){
    Serial.println("OK");
    return true;    
  }else{
    return false;
  }
} ```

Et j'ai une page php qui doit permettre d'envoyer les données dans la BDD mais quand je branche l'arduino je vois bien le lien se créer mais rien ne rentre dans la BDD comme si j'ai oublié une ligne dans mon code arduino, je n'arrive pas à voir ca peut être quoi. Quand je test en mettant l'url directement dans ma barre avec des valeurs l'insertion fonctionne. Mais en laissant tourner seul avec l'arduino, rien n'est ajouté.
Voici mon php :

<?php

$servername = "127.0.0.1";

// REPLACE with your Database name
$dbname = "sensor database";
// REPLACE with Database user
$username = "root";
// REPLACE with Database user password
$password = "";

// Keep this API Key value to be compatible with the ESP8266 code provided in the project page. 
// If you change this value, the ESP8266 sketch needs to match
$api_key_value = "tPmAT5Ab3j7F9";


//$api_key= "tPmAT5Ab3j7F9";
//$id = NULL;
//$sensor =  "";
//$location = "";
//$value1 = "";
//$value2 = "";
//$distance = "";
$api_key = $_GET['api_key'];
$sensor =  $_GET['sensor'];
$location = $_GET['location'];
$distance = $_GET['distance'];

//$api_key= $sensor = $location = $value1 = $value2 = $distance = "";
if (strtoupper($_SERVER["REQUEST_METHOD"]) === "POST") {
    $api_key = test_input($_POST["api_key"]);
    if($api_key == $api_key_value) {
        $sensor = test_input($_POST["sensor"]);
       	$location = test_input($_POST["location"]);
        $distance = test_input($_POST["distance"]);
        
        
try {
    $pdo = new PDO("mysql:host=$servername;dbname=sensor database", $username, $password);
    // set the PDO error mode to exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected successfully"; 
}
catch(PDOException $e)
{
    echo "Connection failed: " . $e->getMessage();
}
    $id = NULL;
	$sensor = "tata";
	$location = "uau";
	$distance = 7;

	$sql = "INSERT INTO `SensorData` (`id`, `sensor`, `location`, `distance`) VALUES (:id,:sensor,:location,:distance)";
	$res = $pdo->prepare($sql);
	$exec = $res->execute(array(":id"=>$id,":sensor"=>$sensor,":location"=>$location,":distance"=>$distance));
  // vérifier si la requête d'insertion a réussi
  if($exec){
    echo 'Données insérées';
  }else{
    echo "Échec de l'opération d'insertion";
  }
    
       // $conn->close();
    }
    else {
        echo "Wrong API Key provided.";
    }

}
else {
    echo "No data posted with HTTP POST.";
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

Tu es sur de ton code, cela ne ressemble pas à une requête HTTP.

AT+CIPSTART établi bien la connexion TCP/IP avec ton serveur, mais après tu dois envoyer du texte qui correspond au protocole HTTP.
ex pour un GET : GET /images/logo.png HTTP/1.1
pour un post cela doit commencer par POST suivi de l'URL et de la version du protocole HTTP utilisé de la même façon que pour le GET, mais contient en plus les données au format que tu veux.

Tu peux voir ce qu'envois ton navigateur en faisant F12 et dans l'onglet réseaux de mémoire.

En faite tout les tuto que je vois ne sont pas en commande AT, d’accord ben je vais chercher encore

utiliser un ESP-01 attaché à un arduino par le port série et le gérer en commande AT c'est peu has been...

vous vous simplifierez grandement la vie en prenant un ESP32 tout seul

J’aurais aimé mais c’est un projet universitaire et c’est le module esp-01 qui m’a été fournie.

En faite tout les tuto que je vois ne sont pas en commande AT, d’accord ben je vais chercher encore

Etrange , en 2015 -2017 de tonnes de tutoriels portaient sur un ESP8226 recevant des commandes AT, seule façon à l'époque d'exploiter les ESP8266

J-M-L a traité le sujet sous l'angle serveur WEB via des commandes AT envoyées à un ESP-01

C’est un projet universitaire et c’est le module esp-01 qui m’a été fournie.

Projet 'retro' donc..... ils y voient sans doute un intérêt......

Je vais allez voir ce lien alors, merci

j'ai rajouté cette ligne mais rien ne rentre toujours pas

esp8266.print('AT+HTTPCLIENT="3,0,"http://x.x.x.x/post-sensor-data.php/","http://x.x.x.x","/post-sensor-data.php",1,"api_key=tPmAT5Ab3j7F9&sensor=LM35&location=Home&distance=16"');

Ton université a sans probablement un abonnement à la revue Elektor

En fouillant dans les archives tu trouverais sans doute de bons articles sur l'ESP8266 avec son firmware AT.... et qui sait l'un d'entre eux pourrait porter sur l'encoi de mesures vers une base de données

A une époque j'ai utilisé une (ou plusieurs librairies) qui prenait en charge l'ESP8266 par des commandes AT, tout le travail de bas niveau donc. ça simplifiait le travail

un chaîne en C++ est délimitée par des guillemets. l'aprostrope c'est pour 1 seul caractère

esp8266.print('AT+HTTPCLIENT....
              ^
               c'est un souci 

si on veut mettre des guillemets dans une chaîne il faut faire un échappement, mettre un anti-slash devant

Serial.println("le mot est \"coucou\".");

va afficher
le mot est "coucou"