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
Publicar un comentario