#define LED2 2
#define LED5 5
#define LED4 4
#define TRUE 1
#define FALSE 0
#define ON 1
#define OFF 0
#define OnOff 0
#define TimerOnOff 0
#define Pulse 1
#define OUTPUT_DIGITAL 1
#define PWM 2
#define PWM_Resolution 11
struct stc_DIOControl
{
bool bo_stc_DelayTrigger_S = 0;
bool bo_stc_OutputStateRequest_S = OFF;
unsigned int ch_stc_PinoutNumber;
unsigned int u8_stc_OutputLastState_P = 0; //(0 - OFF ; 1 - ON ; 2 - Last State)
unsigned int u8_stc_PinoutType_P = 0; //(0 - Input ; 1 - Output ; 2 - PWM)
unsigned int u8_stc_DigitalOutputOpMode_P = 0; //(0 - Timer ON/OFF ; 1 - Pulse )
unsigned int u8_stc_PWMChannel_P = 0;
unsigned int u8_stc_PWMFreq_P = 0;
unsigned int u8_stc_PWMDutyCycle_P = 0;
unsigned long int u16_stc_TimerOnMs_P = 0;
unsigned long int u16_stc_TimerOffMs_P = 0;
unsigned long int u16_stc_PreviousMills_S = 0;
//unsigned long int u16_stc_CycleTime_P = 0;
unsigned long int u16_stc_PulseInterval_P = 0;
};
struct stc_DelayMS
{
bool bo_stc_DelayTrigger_S = 0;
unsigned long int u16_stc_DelayMs_P = 0;
unsigned long int u16_stc_PreviousMills_S = 0;
};
struct stc_DIOControl LED2_DIO_Control;
struct stc_DIOControl LED4_DIO_Control;
struct stc_DelayMS LED5_DelayMS;
//*************************************************************************************
void setup()
{
Serial.begin(9600);
pinMode(LED5, OUTPUT);
//pinMode(LED2, OUTPUT);
//pinMode(LED4, OUTPUT);
LED2_DIO_Control.u8_stc_PinoutType_P = PWM;
LED2_DIO_Control.ch_stc_PinoutNumber = 2;
LED2_DIO_Control.u8_stc_DigitalOutputOpMode_P = TimerOnOff;
LED2_DIO_Control.u16_stc_TimerOnMs_P = 5000;
LED2_DIO_Control.u16_stc_TimerOffMs_P = 1000;
LED2_DIO_Control.u8_stc_PWMDutyCycle_P = 100;
LED2_DIO_Control.u8_stc_PWMChannel_P = 0;
LED2_DIO_Control.u8_stc_PWMFreq_P = 1000;
LED2_DIO_Control.bo_stc_DelayTrigger_S = 0;
/* LED4_DIO_Control.u8_stc_PinoutType_P = PWM;
LED4_DIO_Control.ch_stc_PinoutNumber = 4;
LED4_DIO_Control.u8_stc_DigitalOutputOpMode_P = TimerOnOff;
LED4_DIO_Control.u16_stc_TimerOnMs_P = 5000;
LED4_DIO_Control.u16_stc_TimerOffMs_P = 3000;
LED4_DIO_Control.u8_stc_PWMDutyCycle_P = 100;
LED2_DIO_Control.u8_stc_PWMChannel_P = 1;
LED4_DIO_Control.u8_stc_PWMFreq_P = 1000;
LED4_DIO_Control.bo_stc_DelayTrigger_S = 0;*/
LED5_DelayMS.u16_stc_DelayMs_P = 2000;
}
//*************************************************************************************
void loop()
{
LED2_DIO_Control.bo_stc_OutputStateRequest_S = ON;
fcn_DIO_Control(&LED2_DIO_Control);
}
//*************************************************************************************
bool fcn_DIO_Control(struct stc_DIOControl* ptr_DIO_DelayMS)
{
if ((ptr_DIO_DelayMS->u8_stc_PinoutType_P == OUTPUT_DIGITAL) || (ptr_DIO_DelayMS->u8_stc_PinoutType_P == PWM)) //Configured like OUTPUT
{
if (ptr_DIO_DelayMS->u8_stc_PinoutType_P == OUTPUT_DIGITAL)
{
pinMode(ptr_DIO_DelayMS->ch_stc_PinoutNumber, OUTPUT);
}
//else ledcSetup(ptr_DIO_DelayMS->u8_stc_PWMChannel_P, (ptr_DIO_DelayMS->u8_stc_PWMFreq_P), PWM_Resolution);
Serial.println("HABILITADO");
if ((ptr_DIO_DelayMS->bo_stc_OutputStateRequest_S == ON) && (digitalRead(ptr_DIO_DelayMS->ch_stc_PinoutNumber) == LOW) && (ptr_DIO_DelayMS->u8_stc_DigitalOutputOpMode_P == TimerOnOff))
{
Serial.println("Saida on");
Serial.println(ptr_DIO_DelayMS->bo_stc_DelayTrigger_S);
if (ptr_DIO_DelayMS->bo_stc_DelayTrigger_S == 0)
{
Serial.println("Saida trigger");
ptr_DIO_DelayMS->u16_stc_PreviousMills_S = millis();
ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = TRUE;
}
else if ((millis() - ptr_DIO_DelayMS->u16_stc_PreviousMills_S) >= ptr_DIO_DelayMS->u16_stc_TimerOnMs_P)
{
Serial.println("Saida trigger");
if (ptr_DIO_DelayMS->u8_stc_PinoutType_P == OUTPUT_DIGITAL)
{
digitalWrite(ptr_DIO_DelayMS->ch_stc_PinoutNumber, HIGH);
}
else
{
Serial.println("Saida pwm");
ledcAttachPin(ptr_DIO_DelayMS->ch_stc_PinoutNumber, ptr_DIO_DelayMS->u8_stc_PWMChannel_P);
ledcWrite(ptr_DIO_DelayMS->u8_stc_PWMChannel_P, (ptr_DIO_DelayMS->u8_stc_PWMDutyCycle_P/100*2047));
}
//ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = FALSE;
//Serial.println("ON");
}
return FALSE;
}
/*else if ((ptr_DIO_DelayMS->bo_stc_OutputStateRequest_S == OFF) && (digitalRead(ptr_DIO_DelayMS->ch_stc_PinoutNumber) == HIGH) && (ptr_DIO_DelayMS->u8_stc_DigitalOutputOpMode_P == TimerOnOff))
{
if (ptr_DIO_DelayMS->bo_stc_DelayTrigger_S == 0)
{
ptr_DIO_DelayMS->u16_stc_PreviousMills_S = millis();
ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = TRUE;
}
else if ((millis() - ptr_DIO_DelayMS->u16_stc_PreviousMills_S) >= ptr_DIO_DelayMS->u16_stc_TimerOffMs_P)
{
if (ptr_DIO_DelayMS->u8_stc_PinoutType_P == OUTPUT_DIGITAL)
{
digitalWrite(ptr_DIO_DelayMS->ch_stc_PinoutNumber, LOW);
}
else ledcWrite(ptr_DIO_DelayMS->u8_stc_PWMChannel_P, OFF);
ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = FALSE;
Serial.println("OFF");
}
}*/
/*else if ((ptr_DIO_DelayMS->bo_stc_OutputStateRequest_S == ON) && (ptr_DIO_DelayMS->u8_stc_DigitalOutputOpMode_P == Pulse))
{
if (!ptr_DIO_DelayMS->bo_stc_DelayTrigger_S)
{
ptr_DIO_DelayMS->u16_stc_PreviousMills_S = millis();
ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = TRUE;
digitalWrite(ptr_DIO_DelayMS->ch_stc_PinoutNumber, HIGH);
Serial.println("ON");
}
else if ((millis() - ptr_DIO_DelayMS->u16_stc_PreviousMills_S) >= ptr_DIO_DelayMS->u16_stc_TimerOnMs_P)
{
digitalWrite(ptr_DIO_DelayMS->ch_stc_PinoutNumber, LOW);
ptr_DIO_DelayMS->bo_stc_DelayTrigger_S = TRUE;
Serial.println("OFF");
}
return FALSE;
}*/
}
return FALSE;
}
//*************************************************************************************
bool fcn_DelayMs(struct stc_DelayMS* ptr_DEL_DelayMS)
{
if (!ptr_DEL_DelayMS->bo_stc_DelayTrigger_S)
{
ptr_DEL_DelayMS->u16_stc_PreviousMills_S = millis();
ptr_DEL_DelayMS->bo_stc_DelayTrigger_S = TRUE;
//Serial.println("TRUE");
}
else if ((millis() - ptr_DEL_DelayMS->u16_stc_PreviousMills_S) >= ptr_DEL_DelayMS->u16_stc_DelayMs_P)
{
ptr_DEL_DelayMS->bo_stc_DelayTrigger_S = FALSE;
//Serial.println("FALSE");
return TRUE;
}
return FALSE;
}