%---------------------Configuracion inicial de los objetos del programa instrfind delete(instrfind) clear sObject clear a clear fis clear sObject clear ultrasonicObj a=arduino(); fis2=readfis('fis2.fis'); fisHvac=readfis('fisHvac.fis'); ultrasonicObj = ultrasonic(a,'D5','D6'); sObject = serialport('COM7',9600,"Timeout",0.1) X=5 Y=5 Z=0 pantallaLCD=0 %---------------------Configuracion inicial de los objetos del programa %---------------------Iniciando motor en apagado estadoValvula=0 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) %---------------------Iniciando motor en apagado %---------------------Inicializacion de variables usadas en las operaciones writePWMDutyCycle(a,'D3',0) subRutinaAnterior=0 potenciaIluminacionAnterior=255 potenciaIluminacion=255 pwmdutycicleRecived =0 cambioDePotencia=0 valor=0 estado=0 contadorPIRencendido=1 variableAuxPIR=0 %umbralFlash=2.5 % % contadorPIR=0 % matrizUmbralPIR=zeros(100,1) % variableAuxPIR=0 %---------------------Inicializacion de variables usadas en las operaciones CondicioncambioDePotencia=0 contadorPIRapagado=1 matrizUmbralPIRapagado=zeros(15000,1) %-----------------Variables necesarias para encendido y apagado suave brilloObjetivoY=0 brilloObjetivoX=0 brilloTemporalY=0 brilloTemporalX=0 %-----------------Variables necesarias para encendido y apagado suave %----------------Variables necesarias para el ajuste de brillo automatico contadorAjusteBrillo=1 matrizAjusteBrillo=zeros(10,1) %----------------Variables necesarias para el ajuste de brillo automatico while true %--------Lectura del codigo contenido en el puerto serial y %obteniendo la informacion de control recived = readline(sObject); try A = char(recived) clase= string(A(1)) + string(A(2)) numDisp=string(A(3)) + string(A(4)) operacionDisp=string(A(5)) claseDisp=str2double(clase) numDisp=str2double(numDisp) operacionDisp=str2double(operacionDisp) if claseDisp==1 potenciaIluminacion= string(A(6:end)); potenciaIluminacion= str2double(potenciaIluminacion) end if claseDisp==8 || claseDisp==9 temperatura= string(A(6:end)); temperatura= str2double(temperatura) end catch claseDisp=0 end %--------Lectura del codigo contenido en el puerto serial y %obteniendo la informacion de control %--------Procesando las ordenes para iluminacion if claseDisp==1 if numDisp==0 Z=operacionDisp if 0<=potenciaIluminacion && potenciaIluminacion<=255 pwmdutycicleRecived=potenciaIluminacion/255 end end end %--------Procesando las ordenes para iluminacion %--------Procesando las ordenes para Calefactor if claseDisp==9 if numDisp==0 Y=operacionDisp end end %--------Procesando las ordenes para Calefactor %--------Procesando las ordenes para AireAcondicionado if claseDisp==8 if numDisp==0 X=operacionDisp end end %--------Procesando las ordenes para AireAcondicionado %---------------////////----------------Casos recibidos MiniSplit if X==0 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) writeDigitalPin(a,'D12',0) %El pin 12 enciende/apaga la pantalla pantallaLCD=0 X=5 for g=0:500 fprintf('Aire Acondicionado apagado\n') end end if Y==0 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) writeDigitalPin(a,'D12',0) %El pin 12 enciende/apaga la pantalla pantallaLCD=0 Y=5 for g=0:500 fprintf('Calefactor apagado\n') end end if X==1 %Aire acondicionado encendido if pantallaLCD==0 writeDigitalPin(a,'D12',1) %El pin 12 enciende/apaga la pantalla end pantallaLCD=1 voltageLM35 = readVoltage(a,'A1') temperaturaLM35= voltageLM35*100 ErrorTemperatura= temperatura-temperaturaLM35 %%Si la temperatura sensada es menor que la temperatura configurada el error sera positivo %%Si la temperatura sensada es mayor que la temperatura configurada el error sera negativo %%El aire acondicionado NO puede funcionar si el error es positivo for g=0:500 fprintf('Aire Acondicionado encendido\n') end if ErrorTemperatura>0 X=0 else if estadoValvula==1 writeDigitalPin(a,'D2',0) %El pin d2 indica el estado de la valvula inversora end estadoValvula=0 salidaConDifusoHvac=evalfis(fisHvac,ErrorTemperatura) %%writePWMDutyCycle(a,'D9',salidaConDifusoHvac) if salidaConDifusoHvac<0.125 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.25 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.375 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.5 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.625 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<0.75 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<0.875 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<=1 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',1) end end elseif Y==1 %calefactor acondicionado encendido if pantallaLCD==0 writeDigitalPin(a,'D12',1) end pantallaLCD=1 voltageLM35 = readVoltage(a,'A1') temperaturaLM35= voltageLM35*100 ErrorTemperatura= temperatura-temperaturaLM35 %%Si la temperatura sensada es menor que la temperatura configurada el error sera positivo %%Si la temperatura sensada es mayor que la temperatura configurada el error sera negativo %%El calefactor NO puede funcionar si el error es negativo if ErrorTemperatura<0 Y=0 else if estadoValvula==0 writeDigitalPin(a,'D2',1) %El pin d2 indica el estado de la valvula inversora end estadoValvula=1 salidaConDifusoHvac=evalfis(fisHvac,ErrorTemperatura) for g=0:500 salidaConDifusoHvac end if salidaConDifusoHvac<0.125 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.25 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.375 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.5 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',0) elseif salidaConDifusoHvac<0.625 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<0.75 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',0) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<0.875 writeDigitalPin(a,'D8',0) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',1) elseif salidaConDifusoHvac<=1 writeDigitalPin(a,'D8',1) writeDigitalPin(a,'D9',1) writeDigitalPin(a,'D10',1) end end for g=0:500 fprintf('Calefactor encendido\n') end end %---------------////////----------------Casos recibidos MiniSplit %-------------------------------------Leyendo y binarizando la lectura del sensor % distance = readDistance(ultrasonicObj); % if distance<=1 % variableAuxPIR=1 % else % variableAuxPIR=0 % end variableAuxPIR = readDigitalPin(a,'D13') %-------------------------------------Binarizando la lectura del sensor %-----------------Obteniendo la salida del controlador difuso voltageLDR = readVoltage(a,'A0') %Leyendo voltaje del LDR en un rango de 0-5 EntradaFuzzy=voltageLDR/5 %Acondicionando el voltaje para que este en un rango de 0-1 para poder introducirlo al C fuzzy SalidasControladorDif=evalfis(fis2,EntradaFuzzy) %Evaluando la entrada en el controlador Fuzzy y guardando la salida en SalidasControladorDif vControl=SalidasControladorDif %-----------------Obteniendo la salida del controlador difuso %-------Verificacion de cambios en el nivel de brillo recibido de Alexa if 0<=potenciaIluminacion && potenciaIluminacion<=255 if potenciaIluminacionAnterior~=potenciaIluminacion cambioDePotencia=1 end end %-------Verificacion de cambios en el nivel de brillo recibido de Alexa %---------------////////----------------Casos recibidos %--------Si hubo un cambio en el nivel de brillo entonces escribe el %valor del brillo actual recibido if cambioDePotencia == 1 subRutinaAnterior=1 Z=9 %Bloque que pregunta si el valor actual de brillo es mayor o menor %que el solicitado por alexa, y asi ejecutar una subrutina de %aumento o disminucion de brillo if pwmdutycicleRecived < brilloTemporalY %----------Subrutina de cambio de brillo suave hacia abajo brilloObjetivoY=pwmdutycicleRecived brilloObjetivoX=(-1*realsqrt(brilloObjetivoY))+1 brilloTemporalX=(-1*realsqrt(brilloTemporalY))+1 while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX-1)^2 writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end writePWMDutyCycle(a,'D3',brilloTemporalY) %----------Subrutina de cambio de brillo suavee hacia abajo elseif pwmdutycicleRecived > brilloTemporalY %----------Subrutina de cambio de brillo suave hacia arriba brilloObjetivoY=pwmdutycicleRecived brilloObjetivoX=(realsqrt(brilloObjetivoY)) brilloTemporalX=(realsqrt(brilloTemporalY)) while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX^2) writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end writePWMDutyCycle(a,'D3',brilloTemporalY) %----------Subrutina de cambio de brillo suave hacia arriba end %Bloque que pregunta si el valor actual de brillo es mayor o menor %que el solicitado por alexa, y asi ejecutar una subrutina de %aumento o disminucion de brillo % %----------Subrutina de cambio de brillo suave % brilloObjetivoY=pwmdutycicleRecived % brilloObjetivo=pwmdutycicleRecived % % while estado<=vControl % % valor=(estado^2) % % writePWMDutyCycle(a,'D3',valor) % % fprintf("Encendiendo.\n") % % estado=estado+0.01; % % end % writePWMDutyCycle(a,'D3',pwmdutycicleRecived) % %----------Subrutina de cambio de brillo suave cambioDePotencia=0 CondicioncambioDePotencia=1 potenciaIluminacionAnterior=potenciaIluminacion; %--------Si hubo un cambio en el nivel de brillo entonces escribe el %valor del brillo actual recibido else %------------------Si no hubo cambios en el brillo entoces ejecuta el else if Z==0 %----------------------------------------------Caso apagado por alexa %Rutina de apagado partiendo del valor "valor" de encendido subRutinaAnterior=0 Z=9 %----------Subrutina de cambio de brillo suave hacia cero brilloObjetivoY=0 brilloObjetivoX=(-1*realsqrt(brilloObjetivoY))+1 brilloTemporalX=(-1*realsqrt(brilloTemporalY))+1 while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX-1)^2 writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end brilloTemporalY=0 writePWMDutyCycle(a,'D3',brilloTemporalY) %----------Subrutina de cambio de brillo suavee hacia cero CondicioncambioDePotencia=0 %Rutina de apagado end %----------------------------------------------Caso apagado por alexa if Z==1 %----------------------------------------------Caso encendido por alexa subRutinaAnterior=1 Z=9 %----------Subrutina de cambio de brillo suave hacia 1 brilloObjetivoY=vControl brilloObjetivoX=(realsqrt(brilloObjetivoY)) brilloTemporalX=(realsqrt(brilloTemporalY)) while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX^2) writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end %brilloTemporalY=1 contadorPIRencendido=0 %----------Subrutina de cambio de brillo suave hacia 1 end %---------------------------------------------Caso encendido por alexa if Z==2 %--------------------------------------------Caso comandado por switch if subRutinaAnterior==1 %-------------------Caso apagado por switch %Rutina de apagado partiendo del valor "valor" de encendido subRutinaAnterior=0 Z=9 %----------Subrutina de cambio de brillo suave hacia cero brilloObjetivoY=0 brilloObjetivoX=(-1*realsqrt(brilloObjetivoY))+1 brilloTemporalX=(-1*realsqrt(brilloTemporalY))+1 while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX-1)^2 writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end brilloTemporalY=0 writePWMDutyCycle(a,'D3',brilloTemporalY) %----------Subrutina de cambio de brillo suavee hacia cero CondicioncambioDePotencia=0 %Rutina de apagado %--------------------------------------------Caso apagado por switch else %---------------------------------------Caso encendido por switch %subRutinaAnterior==0 subRutinaAnterior=1 Z=9 %----------Subrutina de cambio de brillo suave hacia 1 brilloObjetivoY=vControl brilloObjetivoX=(realsqrt(brilloObjetivoY)) brilloTemporalX=(realsqrt(brilloTemporalY)) while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX^2) writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end %brilloTemporalY=1 contadorPIRencendido=0 %----------Subrutina de cambio de brillo suave hacia 1 contadorPIRencendido=0 %Rutina de encendido end %--------------------------------------------Caso encendido por switch end %----------------------------------------------------Caso comandado por switch %---------igualar los valores actual y anterior de brillo para %poder hacer la modificacion de brillo temporal al completar un %ciclo de ordenes if 0<=potenciaIluminacion && potenciaIluminacion<=255 potenciaIluminacionAnterior=potenciaIluminacion; end %---------igualar los valores actual y anterior de brillo para %poder hacer la modificacion de brillo temporal al completar un %ciclo de ordenes end %---------------////////----------------Casos recibidos % %-///////-Secuencia de apagado que se activa si la iluminacion ambiental es alta y % si no se ha modificado el brillo y si no se ha detectado presencia en % 20 minutos % %---------------------------------------------------------------------------------- if vControl<0.65 && CondicioncambioDePotencia==0 && subRutinaAnterior==1 if contadorPIRapagado <= 15000 %------Llenando la matriz de apagado con los valores binarizados matrizUmbralPIRapagado(contadorPIRapagado,1) = variableAuxPIR ; %----------------------------Llenando la matriz de apagado con los valores binarizados %--Si la matriz se llena entonces hacer el promedio de los valores, evaluar umbral %y actuar sobre la luz else %----------Realizando el promedio de las lecturas del sensor SumaApagado=sum(matrizUmbralPIRapagado); PromedioApagado=SumaApagado/15000; for x=1:10000 PromedioApagado end %----------Realizando el promedio de las lecturas del sensor %----------Apagando luz si el promedio es mayor al umbral if PromedioApagado10 && subRutinaAnterior==0 %&& luz ambiental < umbralambiental %Rutina de encendido var=0 valor=0 while var<0.99 valor=(var^2) writePWMDutyCycle(a,'D3',valor) var=var+0.066; end %Rutina de encendido %Rutina de apagado partiendo del valor "valor" de encendido var=0 while var<1 valor=(var-1)^2 writePWMDutyCycle(a,'D3',valor) var=var+0.01; end %Rutina de apagado contadorPIRencendido=0 end %--------------//////////////////////////////-----------------Secuencia de encendido flash % %-///////-Secuencia de ajuste de brillo en base al promedio de lecturas del % controlador difuso cuando el estado de la lampara es encendido y cuando no se % ha modificado el brillo de la lampara % %---------------------------------------------------------------------------------- if CondicioncambioDePotencia==0 && subRutinaAnterior==1 if contadorAjusteBrillo <= 10 %------Llenando la matriz de apagado con los valores binarizados matrizAjusteBrillo(contadorAjusteBrillo,1) = vControl; %----------------------------Llenando la matriz de apagado con los valores binarizados %--Si la matriz se llena entonces hacer el promedio de los valores, evaluar umbral %y actuar sobre la luz else %----------Realizando el promedio de las lecturas del sensor SumaAjusteBrillo=sum(matrizAjusteBrillo); PromedioAjusteBrillo=SumaAjusteBrillo/10; % for x=1:10000 % PromedioAjusteBrillo % end %----------Realizando el promedio de las lecturas del sensor %----------Comprobando si el brillo actual es menor o mayor al %PromedioAjusteBrillo y ejecutar subrutina hacia arriba o hacia abajo if PromedioAjusteBrillobrilloTemporalY %----------Subrutina de cambio de brillo suave hacia arriba brilloObjetivoY=PromedioAjusteBrillo brilloObjetivoX=(realsqrt(brilloObjetivoY)) brilloTemporalX=(realsqrt(brilloTemporalY)) while brilloTemporalX<=brilloObjetivoX brilloTemporalY=(brilloTemporalX^2) writePWMDutyCycle(a,'D3',brilloTemporalY) brilloTemporalX=brilloTemporalX+0.1; end writePWMDutyCycle(a,'D3',brilloTemporalY) %----------Subrutina de cambio de brillo suave hacia arriba end contadorAjusteBrillo=1; %Reiniciando llenado de la matriz end end % %-///////-Secuencia de ajuste de brillo en base al promedio de lecturas del % controlador difuso cuando el estado de la lampara es encendido y cuando no se % ha modificado el brillo de la lampara % %---------------------------------------------------------------------------------- %--------------------------------------------Aumentando el contador que indica el indice de las matrices contadorPIRapagado=contadorPIRapagado+1; contadorPIRencendido=contadorPIRencendido+1; contadorAjusteBrillo=contadorAjusteBrillo+1; %--------------------------------------------Aumentando el contador que indica el indice de las matrices end