🔍

ESP32 meets OSC Communication

This example shows a direct connection of both ESP32 and any computer running Processing in the same network. Both ESP needs the suitable C++ code uploaded with the Processing application.

you will need this lib to get it done 🙂 https://github.com/CNMAT/OSC

nice content: https://madskjeldgaard.dk/posts/esp32-simple-osc-receiver/

get realtime data from ESP32 to host

import oscP5.*;
import netP5.*;

ArrayList income_buffer_arr = new ArrayList();  
  
OscP5 oscP5;
NetAddress myRemoteLocation;

float lerpspeed = .1;


void setup() {
  size(400,400);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,7777);
  myRemoteLocation = new NetAddress("192.168.1.8",7777);
  frameRate(30);
}


void draw() {
 
  fill(0,12);
  rect(0,0,width,height);
   drawRealtimeData();
  
}

void mousePressed() {
  
  OscMessage myMessage = new OscMessage("/toggle_stream");
  myMessage.add(1); /* add an int to the osc message */
  oscP5.send(myMessage, myRemoteLocation); 
}


void mouseReleased() {
  
  OscMessage myMessage = new OscMessage("/toggle_stream");
  myMessage.add(0); /* add an int to the osc message */
  oscP5.send(myMessage, myRemoteLocation); 
}


PVector tpos1 = new PVector();
PVector tpos2 = new PVector();
PVector tpos3 = new PVector();
PVector tpos4 = new PVector();

PVector spos1 = new PVector();
PVector spos2 = new PVector();
PVector spos3 = new PVector();
PVector spos4 = new PVector();

void oscEvent(OscMessage theOscMessage) {
 
  
  spos1.lerp(tpos1, lerpspeed);
   spos2.lerp(tpos2, lerpspeed);
    spos3.lerp(tpos3, lerpspeed);
     spos4.lerp(tpos4, lerpspeed);
    
  tpos1.x =   theOscMessage.get(0).floatValue();
  tpos1.y =   theOscMessage.get(1).floatValue();
  
  tpos2.x = theOscMessage.get(2).floatValue();
  tpos2.y =   theOscMessage.get(3).floatValue();
 
 
   tpos3.x =   theOscMessage.get(4).floatValue();
  tpos3.y =   theOscMessage.get(5).floatValue();
  
    tpos4.x =   theOscMessage.get(6).floatValue();
  tpos4.y =   theOscMessage.get(7).floatValue();
  
}

// just visualize the incoming data
void drawRealtimeData(){
   
  noStroke();
  fill(255);
  ellipse(spos1.x*width,spos1.y*height,12,12);
  ellipse(spos2.x*width,spos2.y*height,12,12);
  ellipse(spos3.x*width,spos3.y*height,12,12);
  ellipse(spos4.x*width,spos4.y*height,12,12);
  
  
}
#include "Arduino.h"
#include "WiFi.h"
#include <OSCMessage.h>

WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP
const IPAddress outIp(192,168,1,7); // your esp ip here

// Options
int update_rate = 16;

// Network settings
char ssid[] = " "; // your network SSID (name)
char pass[] = " ";  // your network password
unsigned int localPort = 7777; // local port to listen for OSC packets

bool is_streaming = false;

void setup() {
  /* setup wifi */
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  Udp.begin(localPort);
}

void sendOSC() {
  OSCMessage msg("/datafromesp");

  // send some random values from 0 to 1
  float _v1 = (sin(millis()*.01)+1.)*.5;
  float _v2 = (sin(millis()*.04)+1.)*.5;
  float _v3 = (sin(millis()*.001)+1.)*.5;
  float _v4 = (sin(millis()*.02)+1.)*.5;
  float _v5 = (sin(millis()*.0041)+1.)*.5;
  float _v6 = (sin(millis()*.0091)+1.)*.5;
  float _v7 = (sin(millis()*.021)+1.)*.5;
  float _v8 = (sin(millis()*.0031)+1.)*.5;
  msg.add( _v1);
  msg.add( _v2);
  msg.add( _v3);
  msg.add( _v4);
  msg.add( _v5);
  msg.add( _v6);
  msg.add( _v7);
  msg.add( _v8);
  
  Udp.beginPacket(outIp, 7777);
  msg.send(Udp); // Send the bytes to the SLIP stream
  Udp.endPacket();  // Mark the end of the OSC Packet
  msg.empty();   // Free space occupied by message
  delay(10);
}


void receiveMessage() {
  OSCMessage inmsg;
  int size = Udp.parsePacket();

  if (size > 0) {
    while (size--) {
      inmsg.fill(Udp.read());
    }
    if (!inmsg.hasError()) {
      inmsg.dispatch("/toggle_stream", stream_toggle);
    } 

   
  
    //else { auto error = inmsg.getError(); }
  }
}


void stream_toggle(OSCMessage &msg) {
  switch (msg.getInt(0)) {
  case 0:
   is_streaming=false;
    break;
  case 1:
    is_streaming=true;
    break;
  }
}




void loop() {

    
    if(is_streaming){sendOSC();}


    receiveMessage();
    delay(10);

   

}

get a data stream pack from ESP32 to host

import oscP5.*;
import netP5.*;

ArrayList income_buffer_arr = new ArrayList();  
  
OscP5 oscP5;
NetAddress myRemoteLocation;

void setup() {
  size(400,400);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,7777);
  myRemoteLocation = new NetAddress("192.168.1.8",7777);
}


void draw() {
  background(0);  
  
  drawInputBuffer();
  
}

void mousePressed() {
  
  OscMessage myMessage = new OscMessage("/send_sensor_stream");
  myMessage.add(1); /* add an int to the osc message */
   income_buffer_arr = new ArrayList(); // reset the temp buffer

  /* send the message */
  oscP5.send(myMessage, myRemoteLocation); 
}


void oscEvent(OscMessage theOscMessage) {
 
  // expect 8 float values from the osc message.
 float[] _c = new float[8]; 
 
 _c[0] = theOscMessage.get(0).floatValue();
 _c[1] = theOscMessage.get(1).floatValue();
 _c[2] = theOscMessage.get(2).floatValue();
 _c[3] = theOscMessage.get(3).floatValue();
 _c[4] = theOscMessage.get(4).floatValue();
 _c[5] = theOscMessage.get(5).floatValue();
 _c[6] = theOscMessage.get(6).floatValue();
 _c[7] = theOscMessage.get(7).floatValue();
  income_buffer_arr.add(_c);
 
}

// just visualize the incoming data
void drawInputBuffer(){
   
  for(int i=0;i<income_buffer_arr.size();i++){
  
    float[] cs = (float[])income_buffer_arr.get(i);
    
    for(int j=0;j<cs.length;j++){
      noStroke();
      fill(cs[j]);
      rect(i*3+10,j*40+10,3,38);
    }
  
  }
 
}
#include "Arduino.h"
#include "WiFi.h"
#include <OSCMessage.h>

WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP
const IPAddress outIp(192,168,1,7); // put in IP of your ESP here!

// Options
int update_rate = 16;

// Network settings
char ssid[] = " "; // your network SSID (name)
char pass[] = " ";  // your network password
unsigned int localPort = 7777; // local port to listen for OSC packets

bool is_streaming = false;
int stream_tick = 0;
int stream_max = 128;

void setup() {
  /* setup wifi */
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  Udp.begin(localPort);
}

void sendOSC() {
  OSCMessage msg("/datafromesp");

  float _v1 = random(25500)*.01;
  float _v2 = random(25500)*.01;
  float _v3 = random(25500)*.01;
  float _v4 = random(25500)*.01;
  msg.add( _v1);
  msg.add( _v2);
  msg.add( _v3);
  msg.add( _v4);
  msg.add( _v1);
  msg.add( _v2);
  msg.add( _v3);
  msg.add( _v4);
  
  Udp.beginPacket(outIp, 7777);
  msg.send(Udp); // Send the bytes to the SLIP stream
  Udp.endPacket();  // Mark the end of the OSC Packet
  msg.empty();   // Free space occupied by message
  delay(10);
}


void receiveMessage() {
  OSCMessage inmsg;
  int size = Udp.parsePacket();

  if (size > 0) {
    while (size--) {
      inmsg.fill(Udp.read());
    }
    if (!inmsg.hasError()) {
      inmsg.dispatch("/led", ledtoggle);
    } 

   is_streaming = true;
   stream_tick = 0;
    //else { auto error = inmsg.getError(); }
  }
}

void loop() {

    
    if(is_streaming){
        if(stream_tick<stream_max){
            stream_tick++;
            sendOSC();
        }else{
         is_streaming = false; 
         }
    }else{

      receiveMessage();
      delay(update_rate);
     }

}