====== ESP8266 : communications ======
L'ESP8266 et votre ordinateur se connectent au réseau d'un routeur Wi-Fi "linksys", puis s'échangent des données.
Installer la bibliothèque OSC (Menu Croquis > Inclure une bibliothèque > Gérer les bibliothèques > Taper OSC).
* Code PD > ESP en OSC : {{ :materiel:esp8266:communications:pd_esp_osc.zip |}}
===== Adresse IP statique =====
La plupart des exemples fonctionnent en adressant automatiquement le module Wi-Fi. Il est possible de configurer aussi une adresse statique, c'est-à-dire que la connaît avec la fonction //Wifi.config (ip1, ip2, ip3)//. Veillez à ne pas utiliser deux fois la même adresse. Pour cela, on peut choisir des adresses au-delà des 10 premières.
// Setup
char ssid[] = "linksys"; // Name of the Wi-Fi network
char pass[] = ""; // No password
IPAddress ip(192, 168, 0, 110); // Local IP
IPAddress gateway(192, 168, 0, 1); // Router IP
IPAddress subnet(255, 255, 255, 0);
//...
void setup() {
WiFi.config(ip, gateway, subnet); // Choose the static IP Address
WiFi.begin(ssid, pass); // WiFi Connection
//...
}
//...
===== Send OSC to Pure Data =====
{{:materiel:esp8266:communications:pd-to-esp8266-osc.png|}}
/*
* Send OSC messages to PD
*
* Examples : OSC/ESP8266SendMessages
*/
#include
#include
#include
//#include
int status = WL_IDLE_STATUS;
char ssid[] = "linksys";
char pass[] = "";
WiFiUDP udp;
const IPAddress outIp(192,168,1,110); // MASTER IP
const unsigned int outPort = 9999; // MASTER PORT
void setup() {
Serial.begin(115200);
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
printWifiStatus();
}
void loop() {
// SEND OSC
OSCMessage msg("/test");
msg.add("Hello from ESP8266");
udp.beginPacket(outIp, outPort);
msg.send(udp);
udp.endPacket();
msg.empty();
delay(500);
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
Serial.println("Starting UDP");
udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(udp.localPort());
}
===== Receive OSC from Pure Data =====
Pure Data controls the ESP8266.
// Pd > bundle and typed message > packOSC > udpsend > routeur Wi-Fi
// ESP8266 > OscBundle
#include
#include
#include
#include
#include
int status = WL_IDLE_STATUS;
char ssid[] = "linksys"; // your network SSID (name)
char pass[] = ""; // your network password
// A UDP instance to let us send and receive packets over UDP
WiFiUDP Udp;
const unsigned int localPort = 8888; // local port to listen for UDP packets (here's where we send the packets)
OSCErrorCode error;
unsigned int ledState = LOW; // LOW means led is *on*
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
digitalWrite(BUILTIN_LED, ledState); // turn *on* led
WiFi.begin(ssid, pass); // Connect to WiFi network
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Udp.begin(localPort);
}
void ledOut(OSCMessage &msg) {
ledState = msg.getInt(0);
digitalWrite(BUILTIN_LED, ledState);
}
void loop() {
OSCBundle bundle;
int _size = Udp.parsePacket();
if (_size > 0) {
while (_size--) {
bundle.fill(Udp.read());
}
if (!bundle.hasError()) {
bundle.dispatch("/led", ledOut);
} else {
error = bundle.getError();
}
}
}
===== Receive UDP Packets from Pure Data =====
{{:materiel:esp8266:pd-to-esp8266-udp.png|}}
/*
* Receive UDP Packets from Pure Data with [netsend]
*
* Connect the ESP8266 to the "linksys" Wi-Fi router
*
*/
#include
#include
const boolean DEBUG = false;
// WIFI
char ssid[] = "linksys";
char pass[] = "";
const unsigned int localPort = 8888; // port
char packetBuffer[255]; // incoming
String data[3]; // data
int status = WL_IDLE_STATUS;
WiFiUDP udp;
void setup() {
// Output
pinMode(14,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(14,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
// WiFi Connection
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
// UDP Connection
udp.begin(localPort);
if (DEBUG)
{
Serial.begin(115200);
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
}
void loop() {
// Read data if available
int packetSize = udp.parsePacket();
if (packetSize)
{
// Read the packet into packetBuffer
int len = udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
// Parse with space delimiter ' ' and fill data[]
String strData(packetBuffer);
splitString(strData, ' ');
analogWrite(data[0].toInt(), data[1].toInt() * 4);
if (DEBUG)
{
Serial.println(data[0]);
Serial.println(data[1]);
// Serial.println(data[2]);
}
}
}
// Méthode pour découper le message avec un séparateur (ou "parser")
void splitString(String message, char separator) {
int index = 0;
int cnt = 0;
do {
index = message.indexOf(separator);
// s'il y a bien un caractère séparateur
if(index != -1) {
// on découpe la chaine et on stocke le bout dans le tableau
data[cnt] = message.substring(0,index);
cnt++;
// on enlève du message le bout stocké
message = message.substring(index+1, message.length());
} else {
// après le dernier espace
// on s'assure que la chaine n'est pas vide
if(message.length() > 0) {
data[cnt] = message.substring(0,index); // dernier bout
cnt++;
}
}
} while(index >=0); // tant qu'il y a bien un séparateur dans la chaine
}