Comunicación Esp32 con Arduino

 La comunicación de Arduino con Matlab mediante wifi se produce con el siguiente código


//#include <Wire.h>               // Only needed for Arduino 1.6.5 and earlier

#include <WiFi.h>

#include <RBDdimmer.h>            //Libreria del modulo Dimmer

#include <BH1750.h>               //Libreria del sensor de lumenes}

#define Light 32                   //Para el LDR Lm393 puerto 32



#include <PubSubClient.h>


BH1750 lightMeter(0x23);          //La biblioteca usa la dirección 0x23 por defecto

/*

  UNIVERSIDAD TECNICA DEL NORTE 

  INGENIERIA EN MANTENIMINETO ELECTRICO 

  INFORMATICA APLICADA

  ISRAEL MORENO

  9 / 08 / 2021

  Comunicacion Arduino Matlab

 */


//**************************************

//*********** DECLARACION PINES ********************

//**************************************

// for ESP32 microcontroller


const int zeroCrossPin  = 17;   //Z-C

const int acdPin  = 13;         //PWM

int MIN_POWER  = 0;

int MAX_POWER  = 80;

int POWER_STEP  = 2;



WiFiServer server(80);



//**************************************************

//***********CONFIGURACION DEL  MQTT  **************

//**************************************************

const char *mqtt_server = "ioticos.org";

const int mqtt_port = 1883 ;

const char *mqtt_user = "XWDHUsbEsK1qo9W";

const char *mqtt_pass = "4JCbY4bS9rvRavp";

const char *root_topic_subscribe = "DslhagJmUb6VBu5/entrada";

const char *root_topic_publish = "DslhagJmUb6VBu5/salida";



//*************************************************

//*********** CONFIGUACION DEL WIFI ***************

//*************************************************

const char* ssid = "NETLIFEMORENO";

const char* password =  "israel1998";



//**************************************

//*********** GLOBALES   ***************

//**************************************

WiFiClient espClient;

PubSubClient client(espClient);

char msg[25];

long count = 0;





//************************

//** V A R I A B L E S ***

//************************


int power = 0;                  //Intensidad de encendido del foco

int lux_ambiente = 1000;        //Parametro maximo para del ambiente

int lux = 0;

int luz = 0;


//Objects

dimmerLamp acd(acdPin, zeroCrossPin);




//************************

//** F U N C I O N E S ***

//************************

void callback(char* topic, byte* payload, unsigned int length);

void reconnect();

void setup_wifi();



void setup()

{

  Serial.begin(115200);


  setup_wifi();

  client.setServer(mqtt_server, mqtt_port);

  client.setCallback(callback);


  //Control del sensor

  /*Wire.begin();

  if (lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE_2)) {

    Serial.println(F("BH1750 Advanced begin"));

  } else {

    Serial.println(F("Error initialising BH1750"));

  }*/

  Serial.println(F("ESP32 System"));

  acd.begin(NORMAL_MODE, ON);

}


void loop()

{


  if (!client.connected()) {

    reconnect();

  }


  if (client.connected()) {

    luminosidad();

    String str =  String(lux);

    str.toCharArray(msg, 25);

    client.publish(root_topic_publish, msg);

    delay(300);

  }

  client.loop();

  //Calibracion y encendido del foco

}


void luminosidad()

{

  /*lux = lightMeter.readLightLevel();

    Serial.print("Luminosidad: ");

    Serial.print(lux);

    Serial.println(" lx");

    delay(1000);+

  */

  lux = 1000 - analogRead(Light);

  Serial.print("Luminosidad: ");

  Serial.print(lux);

  Serial.println(" lx");

  delay(100);


}


void calibracion(int lux)

{

  if (lux > lux_ambiente )

  {

    power = 0;

  }

  if (lux <= 0)

  {

    power = 100;

  }

  if (lux > 0 and lux < lux_ambiente)

  {

    int lux1 = lux / 10;

    power = 100 - lux1;

  }

}


void testDimmer() { /* function testDimmer */

  ////Sweep light power to test dimmer

  acd.setPower(power); // setPower(0-100%);

  Serial.print("lampValue -> ");

  Serial.print(acd.getPower());

  Serial.println("%");

}



//*****************************

//***    CONEXION WIFI      ***

//*****************************

void setup_wifi() {

  delay(10);

  // Nos conectamos a nuestra red Wifi

  Serial.println();

  Serial.print("Conectando a ssid: ");

  Serial.println(ssid);


  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }


  Serial.println("");

  Serial.println("Conectado a red WiFi!");

  Serial.println("Dirección IP: ");

  Serial.println(WiFi.localIP());

}




//*****************************

//***    CONEXION MQTT      ***

//*****************************


void reconnect() {


  while (!client.connected()) {

    Serial.print("Intentando conexión Mqtt...");

    // Creamos un cliente ID

    String clientId = "IOTICOS_H_W_";

    clientId += String(random(0xffff), HEX);

    // Intentamos conectar

    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {

      Serial.println("Conectado!");

      // Nos suscribimos

      if (client.subscribe(root_topic_subscribe)) {

        Serial.println("Suscripcion ok");

      } else {

        Serial.println("fallo Suscripciión");

      }

    } else {

      Serial.print("falló :( con error -> ");

      Serial.print(client.state());

      Serial.println(" Intentamos de nuevo en 5 segundos");

      delay(5000);

    }

  }

}



//*****************************

//***       CALLBACK        ***

//*****************************


void callback(char* topic, byte* payload, unsigned int length) {

  String incoming = "";

  Serial.print("Mensaje recibido desde -> ");

  Serial.print(topic);

  Serial.println("");

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

    incoming += (char)payload[i];

  }

  incoming.trim();

  luz = toInt(incoming);

  Serial.println("Mensaje -> " + incoming);

  calibracionl(luz);

  testDimmer();

}

En el Monitor serie de Arduino se puede ver como sensa las variables


 Código Comunicación PID

%UNIVERSIDAD TÉCNICA DEL NORTE

%MANTENIMIENTO ELECTRICO

%INFORMATICA APLICADA

%ISRAEL MORENO

%COMUNICANION PID

%11/08/2021

clc;

clear all;

close all;

myMQTT = mqtt('tcp://ioticos.org','Username','XWDHUsbEsK1qo9W','Password','4JCbY4bS9rvRavp','ClientID','','port',1883);

Topic ='DslhagJmUb6VBu5/entrada';

%Message= '78';

%publish(myMQTT,Topic,Message);

Topic2 = 'DslhagJmUb6VBu5/salida';

%Data = subscribe(myMQTT,Topic2,'Qos',0,'Callback',@myMQTT_Callbak);

Data = subscribe(myMQTT,Topic2,'QoS',0);

% %************************

% %** V A R I A B L E S ***

% %************************

% parámetros de medidas

tmax = 400; % tiempo de captura en s para graficar

rate = 5; % tiempo de respuesta para los graficos

setpoint= 1000; % el valor al que queremos llegar 

% preparar la figura

inicio=0;

f = figure('Name','Captura');

a = axes('XLim',[0 tmax],'YLim',[0 150]);

l1 = line(nan,nan,'Color','r','LineWidth',2);

l2 = line(nan,nan,'Color','b','LineWidth',2);

l3 = line(nan,nan,'Color','g','LineWidth',2);

xlabel('Tiempo (s)')

ylabel('LUMINOSIDAD (LUMENES)')

title('TIEMPO REAL')

grid on

hold on


% inicializar variables para las gráficas22002 

v1 = zeros(1,tmax*rate);

v2 = zeros(1,tmax*rate);

v3 = zeros(1,tmax*rate);

i = 1;

t = 0;

%parametros PID

feed1 = 1;          % retroalimentación 1 del sistema

feed2 = 1;          % retroalimentación 2 del sistema para comparar valores con la primera

Kp = 10;          % proportional term Kp

Ki = 1;           % Integral term Ki

Kd = 3;           % derivative term Kd

dt = 0.01;        % tiempo de respuesta del sistema con cada entrada de datos

signal=0;         % valor para graficar la línea de guia del sistem

%inicialización de variables para los calculos de los Parametros PID

Prop = 0; Der = 0; Int = 0; I = 0;

PID = 0;

FeedBack = 0;

Output = 0;

Error = 0;

state1 = 0; STATE1 = 0;

state2 = 0; STATE2 = 0;

previousTime=0;

lastError=0;

dato=0;

pause(6);

% function myMQTT_Callbak(topic ,msg)

%     fprintf('aqui  %s  :  %s \n',topic, msg)

%     a=str2double(msg)

%     

%     

% end

% ejecutar bucle cronometrado

tic

while true

    values = Data.MessageCount;

    if(values>0)

        a=str2double(read(Data));

        t = toc;        % tiempo de procesamiento del sistema en el ciclo while

        inicio=inicio+1; % contador para las graficas en tiempo real

        % leer del puerto serie

        %a = fscanf(s,'%d');    % lectura del dato de RPM por el COM 3

        v1(i)=a(1);                % v1 v2 y v3 son los datos que van a ser graficados

        v2(i)=setpoint;

        v3(i)=signal;

        %PID

        elapsedTime = t - previousTime;  % almacena datos del tiempo de estados anteriores 

        error= setpoint-a;               % error resultado de la  resta del setpoint y nuestra señal de entrada RPM

        Prop = error;                    % guarda el valor de error proporcional 

        Der  = Der+(error* elapsedTime); % calculo del error derivativo 

        %rateError = (error - lastError)/elapsedTime;    

        Int  = (error - lastError)*dt/2; % guarda el calculo del error integral

        I    = sum(Int); % sumatoria de lso estados del error integral

        PID  = Kp*Prop + Ki*I+ Kd*Der % calculo de los 3 parametros PID

        STATE1 = sum(PID); %  sumatoria del calculo PID primer estado

        state2 = (STATE1 + STATE1)*dt/2; % salida despues de la primera implementacion PID

        STATE2 = sum(state2); % sumatoria de la implementación PID

        Output = (STATE2 + STATE2)*dt/2; % salida del sistema despues de la 2da implementación

        FeedBack = state2*feed1 + Output*feed2; % dato de compensacion obtenido del PID para la corrección del sistema

        % dibuja las figuras

        x = linspace(0,i/rate,i);

        set(l1,'YData',v1(1:i),'XData',x);

        set(l2,'YData',v2(1:i),'XData',x);

        set(l3,'YData',v3(1:i),'XData',x);

        drawnow

        % reinicialización de estados para nuevos calculos

        i = i+1;  %contador para las graficas

        lastError=error; %guarda estado del error para nuevos calculos

        previousTime = t; % guarda el estado de tiempo para nuevos calculos

        dato=num2str(FeedBack) % conversión de dato PWM para enviar

        % codigo para la señal guía del sistema

        if signal<= setpoint

            signal= signal + 0.5;

        end

        convertStr=num2str(PID)

        publish(myMQTT,Topic,convertStr);

    end

    

end

Comentarios

Entradas populares de este blog

Diseño y Prueba de Circuitos

Descripción Proyecto Final, Tema, Objetivos, Problema