Hi,
HW-206 and FC-106 are SGL8022W based Touch LED PWM Module to use as dimmer control module.
Module output as below:
Short touch / press = ON / OFF
Each Long press = Led fading increased / decreased vice versa
I am trying to achieve the same output through software side with simple dry contact button. I add code below with serial output.
I achieve toggle the state on short press. Also fading the led on long press.
Problem: When led is fading state long press didn't revert the brightness until short press and state change to work the logic.
Goal:
- During fading stage short press toggle the led state like ON / OFF
- During fading stage long press toggle fading state like fading ++ / fading--
#define PUSHED LOW
#define NOTPUSHED HIGH
#define LEDon HIGH
#define LEDoff LOW
boolean switchFlag = false; //true means we will allow switch hold timing checking
boolean fastFlag = false; //false means fast switch operation is enabled
byte ledState = 0;
byte buttonOld = 0;
byte buttonNew;
byte LEDstate = 0;
const byte ledPin = 3;
const byte buttonPin = A0;
const byte heartBeatLED = 13; //LED that flashes at 1Hz to show things are non blocking
int brightness;
//timing stuff
const unsigned long longPress = 750; //time before level adjustment start being made
const unsigned long speed = 50; //time between each level change
unsigned long heartBeatMillis;
unsigned long switchMillis;
unsigned long longMillis;
unsigned long timePUSHED;
//****************************************************************************************
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LEDstate);
pinMode(heartBeatLED, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
} //END of setup()
//****************************************************************************************
void loop()
{
//***************************
//toggle Heartbeat LED every 500ms
if (millis() - heartBeatMillis > 500)
{
//restart timer
heartBeatMillis = millis();
//toggle LED
digitalWrite(heartBeatLED, !digitalRead(heartBeatLED));
}
//***************************
//time to check the switches?
if (millis() - switchMillis > 50)
{
//restart timer
switchMillis = millis();
checkSwitches();
}
//***************************
//has the switch been held long enough?
if (switchFlag == true && millis() - longMillis > longPress)
{
//is it time to go to the next level?
if (digitalRead(buttonPin) == PUSHED && millis() - timePUSHED > speed)
{
//restart timing
timePUSHED = millis();
//disable fast switch operation
fastFlag = true;
//adjust level
if (LEDstate == false)
{
analogWrite(ledPin, brightness);
brightness = brightness - 10;
Serial.print("brightness: "); Serial.println(brightness);
if (brightness < 0)
{
brightness = 0;
LEDstate = false;
switchFlag = false;
}
}
else
{
analogWrite(ledPin, brightness);
brightness = brightness + 10;
Serial.print("brightness: "); Serial.println(brightness);
if (brightness > 255)
{
brightness = 255;
LEDstate = true;
switchFlag = false;
}
}
}
}
} //END of loop()
//****************************************************************************************
void checkSwitches()
{
//***************************
buttonNew = digitalRead(buttonPin);
//has the switch changed state?
if (buttonOld != buttonNew)
{
//update to the new state
buttonOld = buttonNew;
//***********************
//was the switch pushed/closed?
if (buttonNew == PUSHED)
{
//start timing
timePUSHED = millis();
longMillis = millis();
switchFlag = true;
Serial.println("S_Flag = true");
}
//***********************
//was the switch released/open?
else if (fastFlag == false && buttonNew == NOTPUSHED)
{
//disable switch 'hold' timing
switchFlag = false;
Serial.println("S_Flag = false");
//toggle LED
digitalWrite(ledPin, LEDstate);
LEDstate = !LEDstate;
if (LEDstate == LOW)
{
brightness = 255;
Serial.println("Led ON");
}
else
{
brightness = 0;
Serial.println("Led OFF");
}
}
//allow fast switch operation
fastFlag = false;
}
} //END of checkSwitches()
//****************************************************************************************
Serial output with comment
S_Flag = true // Short press
S_Flag = false
Led ON
S_Flag = true // Short press
S_Flag = false
Led OFF
S_Flag = true // Long press brightness ++
brightness: 10
brightness +++ up
brightness: 260
S_Flag = true // Long press
brightness: 265
S_Flag = true // Long press
brightness: 265
S_Flag = true // Short press
S_Flag = false
Led ON
S_Flag = true // Long press brightness --
brightness: 245
brightness --- up
brightness: 5
Alternate approach or solution also welcome.