ESP01 + arduino

Bonjour,
J'utilise un arduino Nano avec un ESP01 et j'ai trouvé pas mal d'exemples pour qu'il reponde a des requetes exterieures. Par contre je ne trouve pas d'exemples pour qu'il pousse les données vers une adresse IP precise. Je voudrais qu'il se connecte au reseau Wifi et que toutes les 30mn il envoit des données. Mais je ne trouve pas de commande AT pour envoyer des données vers une IP.
Est ce possible ?
Merci

Salut Touf,

Voici,

Send TCP/IP data (CIPMUX=0) AT+CIPSEND=;
(CIPMUX=1) AT+CIPSEND= ,

Attendre que l'ESP repond + IPD et ensuite envoyer la string

:wink:

bonjour,
déjà un code simple repris sur instructables, la flemme de tout retaper à la mano

#include "SoftwareSerial.h"
String ssid ="yourSSID";

String password="yourPassword";

SoftwareSerial esp(6, 7);// RX, TX

String data;

String server = "yourServer"; // www.example.com

String uri = "yourURI";// our example is /esppost.php

int DHpin = 8;//sensor pin

byte dat [5];

String temp ,hum;

void setup() {

pinMode (DHpin, OUTPUT);

esp.begin(9600);

Serial.begin(9600);

reset();

connectWifi();

}

//reset the esp8266 module

void reset() {

esp.println("AT+RST");

delay(1000);

if(esp.find("OK") ) Serial.println("Module Reset");

}

//connect to your wifi network

void connectWifi() {

String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";

esp.println(cmd);

delay(4000);

if(esp.find("OK")) {

Serial.println("Connected!");

}

else {

connectWifi();

Serial.println("Cannot connect to wifi"); }

}

byte read_data () {

byte data;

for (int i = 0; i < 8; i ++) {

if (digitalRead (DHpin) == LOW) {

while (digitalRead (DHpin) == LOW); // wait for 50us

delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1'

if (digitalRead (DHpin) == HIGH)

data |= (1 << (7-i)); // high front and low in the post

while (digitalRead (DHpin) == HIGH);

// data '1 ', wait for the next one receiver

}

} return data; }

void start_test () {

digitalWrite (DHpin, LOW); // bus down, send start signal

delay (30); // delay greater than 18ms, so DHT11 start signal can be detected

digitalWrite (DHpin, HIGH);

delayMicroseconds (40); // Wait for DHT11 response

pinMode (DHpin, INPUT);

while (digitalRead (DHpin) == HIGH);

delayMicroseconds (80);

// DHT11 response, pulled the bus 80us

if (digitalRead (DHpin) == LOW);

delayMicroseconds (80);

// DHT11 80us after the bus pulled to start sending data

for (int i = 0; i < 4; i ++)

// receive temperature and humidity data, the parity bit is not considered

dat[i] = read_data ();

pinMode (DHpin, OUTPUT);

digitalWrite (DHpin, HIGH);

// send data once after releasing the bus, wait for the host to open the next Start signal

}

void loop () {

start_test ();

// convert the bit data to string form

hum = String(dat[0]);

temp= String(dat[2]);

data = "temperature=" + temp + "&humidity=" + hum;// data sent must be under this form //name1=value1&name2=value2.

httppost();

delay(1000);

}

void httppost () {

esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//start a TCP connection.

if( esp.find("OK")) {

Serial.println("TCP connection ready");

} delay(1000);

String postRequest =

"POST " + uri + " HTTP/1.0\r\n" +

"Host: " + server + "\r\n" +

"Accept: *" + "/" + "*\r\n" +

"Content-Length: " + data.length() + "\r\n" +

"Content-Type: application/x-www-form-urlencoded\r\n" +

"\r\n" + data;

String sendCmd = "AT+CIPSEND=";//determine the number of caracters to be sent.

esp.print(sendCmd);

esp.println(postRequest.length() );

delay(500);

if(esp.find(">")) { Serial.println("Sending.."); esp.print(postRequest);

if( esp.find("SEND OK")) { Serial.println("Packet sent");

while (esp.available()) {

String tmpResp = esp.readString();

Serial.println(tmpResp);

}

// close the connection

esp.println("AT+CIPCLOSE");

}

}}

pour toutes les 30mn
tu peux rajouter la fonctionn millis()

long start;
int delais_envoi = 30000; //30mn

**
**
remplacer

data = "temperature=" + temp + "&humidity=" + hum;// data sent must be under this form //name1=value1&name2=value2.

httppost();

delay(1000);

par

data = "temperature=" + temp + "&humidity=" + hum;// data sent must be under this form //name1=value1&name2=value2.

if ((millis() - start) >  delais_envoi){
start = millis();
httppost();

}

Merci bien, je vais tester tout ça.

Dernieres questions:

Sur les modes de connection wifi:

AT+CWMODE=1
AT+CWMODE=2
AT+CWMODE=3

STA
AP
BOTH

En mode serveur dans l'esp :

  • J'ai testé en AP et je vois bien l'esp et j'arrive à communiquer en me connectant au reseau qu'il a créé.
  • J'ai testé en STA et j'arrive à me connecter via la connexion de ma box mais sans avoir coder dans l'esp le nom de reseau de ma box. Comment la connexion se fait elle depuis l'esp sur mon reseau box ?

Sur l'IP:

  • Peut on mettre une IP fixe quand on utilise l'esp en serveur ?

Oui tu peux la commande est AT+CIPSTA=" tonip"

infobarquee:
pour toutes les 30mn
tu peux rajouter la fonctionn millis()

long start;
int delais_envoi = 30000; //30mn

ça fait pas plutot 30sec ça ? :slight_smile:

oups :slight_smile:

int delais_envoi = 300000 ; //30mn

Pour raisonner en minute, voici le code

int delais_envoi = 30 * 60000 ; //30mn

:wink:

Merci tout le monde.
Je rajoute quelques infos sur les problèmes que j'ai rencontré si ça peut servir.
Dans la configuration j'ai ajouté le passage en mode station (STA) pour que ça marche. Il ne devait pas y être par défaut.
J'avais aussi laissé la com à 115200. Ca marchait mais avec des loupés de création de connexion et/ou d'envoi des données. J'ai donc mis à 9600 et c'est bien plus stable.
Dernière chose j'ai du passer en connexion multiple. En connexion simple j'avais aussi des loupés mais faudrait que je creuse un peu sur ce point car ça me surprend.