diff --git a/firmware/config.h b/firmware/config.h
index 625d9d1..d925ab8 100644
--- a/firmware/config.h
+++ b/firmware/config.h
@@ -24,3 +24,13 @@
#define TIME_LIGHTENGINE_INTERVAL_MS (1000UL / BRI_MOD_STEPS_PER_SEC) // BRI_MOD_STEPS_PER_SEC steps per second to in-/decrease the brightness
#define MY_NTP_SERVER "de.pool.ntp.org"
+
+// 10 bit PWM
+#define PWM_FREQ (50000UL)
+#define PWM_OFF 0 // 0V
+#define PWM_MIN 0 // 0V - minimum light amount (~1%)
+#define PWM_MAX 255 // 24V - maximum light amount (100%)
+#define BRI_TO_PWM_FACTOR 1.0 // 24V-0V = 24V range
+
+#define PWM_TEST_INTERVA_MS 1000
+#define TEST_PWM_CHG_CNT 5
diff --git a/firmware/data/bottom.js b/firmware/data/bottom.js
index 3b0a739..db867c4 100644
--- a/firmware/data/bottom.js
+++ b/firmware/data/bottom.js
@@ -581,3 +581,31 @@ toast.style.opacity = 0;
}, 5000);
}
}
+function sendPWMTestRequest(event) {
+event.preventDefault();
+var button = event.target;
+var xhr = new XMLHttpRequest();
+xhr.open("GET", 'http://{{IP_ADDRESS}}/test_pwm', true);
+xhr.onload = function () {
+if (xhr.status == 200 && xhr.responseText === "OK") {
+button.innerHTML = "PWM test started";
+button.style.backgroundColor = "green";
+} else {
+button.innerHTML = "Error!";
+button.style.backgroundColor = "red";
+}
+setTimeout(function () {
+button.innerHTML = "PWM Test";
+button.style.backgroundColor = "";
+}, 2000);
+};
+xhr.onerror = function () {
+button.innerHTML = "Error!";
+button.style.backgroundColor = "red";
+setTimeout(function () {
+button.innerHTML = "PWM Test";
+button.style.backgroundColor = "";
+}, 2000);
+};
+xhr.send();
+}
diff --git a/firmware/data/index_template_top.html b/firmware/data/index_template_top.html
index 7345687..5deb421 100644
--- a/firmware/data/index_template_top.html
+++ b/firmware/data/index_template_top.html
@@ -22,6 +22,7 @@
reset light
reset timing control data
alert
+PWM Test
diff --git a/firmware/firmware.ino b/firmware/firmware.ino
index ef60651..b87bf44 100644
--- a/firmware/firmware.ino
+++ b/firmware/firmware.ino
@@ -55,17 +55,25 @@ IPAddress dns (192, 168, 0, 1);
#define SCENE_BRIGHT 1
#define SCENE_NIGHTLY 2
-// 10 bit PWM
-#define PWM_FREQ (50000UL)
-#define PWM_OFF 0 // 0V
-#define PWM_MIN 0 // 0V - minimum light amount (~1%)
-#define PWM_MAX 255 // 24V - maximum light amount (100%)
-#define BRI_TO_PWM_FACTOR 1.0 // 24V-0V = 24V range
+#define TEST_PWM_STATE_INIT 0
+#define TEST_PWM_STATE_CH1_INC 1
+#define TEST_PWM_STATE_CH1_DEC 2
+#define TEST_PWM_STATE_CH2_INC 3
+#define TEST_PWM_STATE_CH2_DEC 4
+#define TEST_PWM_STATE_CH3_INC 5
+#define TEST_PWM_STATE_CH3_DEC 6
+#define TEST_PWM_STATE_CH4_INC 7
+#define TEST_PWM_STATE_CH4_DEC 8
//********************************//
uint8_t scene;
uint8_t tc_enabled;
+uint8_t tc_enabled_old;
+
+bool test_pwm = false;
+uint32_t test_pwm_lastcheck_ms = 0;
+uint8_t test_pwm_state = TEST_PWM_STATE_INIT;
bool light_state[LIGHTS_COUNT];
bool in_transition;
@@ -345,6 +353,9 @@ void setup()
void loop()
{
server.handleClient();
+
+ ESP.wdtFeed();
+
lightEngine();
if (tc_enabled == TIMING_CONTROL_ENABLED)
@@ -352,6 +363,11 @@ void loop()
//Serial.println("tc_enabled = " + (String)tc_enabled);
tc_update_loop();
}
+
+ ESP.wdtFeed();
+
+ test_pwm_main();
+ delay(100);
}
//********************************//
@@ -463,18 +479,27 @@ void init_webserver()
char macString[32] = { 0 };
sprintf(macString, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
DynamicJsonDocument root(1024);
- root["name"] = LIGHT_NAME;
- root["lights"] = LIGHTS_COUNT;
+ root["name"] = LIGHT_NAME;
+ root["lights"] = LIGHTS_COUNT;
root["protocol"] = "native_multi";
- root["modelid"] = "LWB010";
- root["type"] = "dimmable_light";
- root["mac"] = String(macString);
- root["version"] = LIGHT_VERSION;
+ root["modelid"] = "LWB010";
+ root["type"] = "dimmable_light";
+ root["mac"] = String(macString);
+ root["version"] = LIGHT_VERSION;
String output;
serializeJson(root, output);
server.send(200, "text/plain", output);
});
+ server.on("/test_pwm", []()
+ {
+ test_pwm = true;
+ tc_enabled_old = tc_enabled;
+ tc_enabled == TIMING_CONTROL_DISABLED;
+
+ server.send(200, "text/html", "OK");
+ });
+
server.on("/tc_data_blocks_read", []()
{
String output = tc_getJsonData();
@@ -935,3 +960,190 @@ String formatBytes(size_t bytes)
}
//********************************//
+
+void test_pwm_main()
+{
+ if (test_pwm == false)
+ {
+ return;
+ }
+
+ if ((test_pwm_lastcheck_ms + PWM_TEST_INTERVA_MS) <= millis())
+ {
+ test_pwm_lastcheck_ms = millis();
+
+ switch (test_pwm_state)
+ {
+ // ----------------------- //
+ case TEST_PWM_STATE_INIT:
+ // disable the lights
+ for (uint8_t i = 0; i < LIGHTS_COUNT; i++)
+ {
+ light_state[i] = false;
+ bri[i] = 0;
+ current_bri[i] = 0;
+ current_pwm[i] = 0;
+ transitiontime[i] = 0;
+ process_lightdata(i, transitiontime[i]);
+ }
+
+ light_state[0] = true;
+ test_pwm_state = TEST_PWM_STATE_CH1_INC;
+ break;
+
+ // ----------------------- //
+ case TEST_PWM_STATE_CH1_INC:
+
+ if (current_bri[0] < 255)
+ {
+ bri[0] += TEST_PWM_CHG_CNT;
+ transitiontime[0] = 1;
+ process_lightdata(0, transitiontime[0]);
+
+ } else {
+
+ test_pwm_state = TEST_PWM_STATE_CH1_DEC;
+ }
+ break;
+
+ case TEST_PWM_STATE_CH1_DEC:
+
+ if (current_bri[0] > 0)
+ {
+ bri[0] -= TEST_PWM_CHG_CNT;
+ transitiontime[0] = 1;
+ process_lightdata(0, transitiontime[0]);
+
+ } else {
+
+ light_state[0] = false;
+ transitiontime[0] = 0;
+ light_state[1] = true;
+ test_pwm_state = TEST_PWM_STATE_CH2_INC;
+ }
+ break;
+
+ // ----------------------- //
+ case TEST_PWM_STATE_CH2_INC:
+
+ if (current_bri[1] < 255)
+ {
+ bri[1] += TEST_PWM_CHG_CNT;
+ transitiontime[1] = 1;
+ process_lightdata(1, transitiontime[1]);
+
+ } else {
+
+ test_pwm_state = TEST_PWM_STATE_CH2_DEC;
+ }
+ break;
+
+ case TEST_PWM_STATE_CH2_DEC:
+
+ if (current_bri[1] > 0)
+ {
+ bri[1] -= TEST_PWM_CHG_CNT;
+ transitiontime[1] = 1;
+ process_lightdata(1, transitiontime[1]);
+
+ } else {
+
+ light_state[1] = false;
+ transitiontime[1] = 0;
+ light_state[2] = true;
+ test_pwm_state = TEST_PWM_STATE_CH3_INC;
+ }
+ break;
+
+ // ----------------------- //
+ case TEST_PWM_STATE_CH3_INC:
+
+ if (current_bri[2] < 255)
+ {
+ bri[2] += TEST_PWM_CHG_CNT;
+ transitiontime[2] = 1;
+ process_lightdata(2, transitiontime[2]);
+
+ } else {
+
+ test_pwm_state = TEST_PWM_STATE_CH3_DEC;
+ }
+ break;
+
+ case TEST_PWM_STATE_CH3_DEC:
+
+ if (current_bri[2] > 0)
+ {
+ bri[2] -= TEST_PWM_CHG_CNT;
+ transitiontime[2] = 1;
+ process_lightdata(2, transitiontime[2]);
+
+ } else {
+
+ light_state[2] = false;
+ transitiontime[2] = 0;
+ light_state[3] = true;
+ test_pwm_state = TEST_PWM_STATE_CH4_INC;
+ }
+ break;
+
+ // ----------------------- //
+ case TEST_PWM_STATE_CH4_INC:
+
+ if (current_bri[3] < 255)
+ {
+ bri[3] += TEST_PWM_CHG_CNT;
+ transitiontime[3] = 1;
+ process_lightdata(3, transitiontime[3]);
+
+ } else {
+
+ test_pwm_state = TEST_PWM_STATE_CH4_DEC;
+ }
+ break;
+
+ case TEST_PWM_STATE_CH4_DEC:
+
+ if (current_bri[3] > 0)
+ {
+ bri[3] -= TEST_PWM_CHG_CNT;
+ transitiontime[3] = 1;
+ process_lightdata(3, transitiontime[3]);
+
+ } else {
+
+ test_pwm = false;
+ tc_enabled = tc_enabled_old;
+ for (uint8_t i = 0; i < LIGHTS_COUNT; i++)
+ {
+ light_state[i] = false;
+ bri[i] = 0;
+ current_bri[i] = 0;
+ current_pwm[i] = 0;
+ transitiontime[i] = 0;
+ process_lightdata(i, transitiontime[i]);
+ }
+ }
+ test_pwm_state = TEST_PWM_STATE_INIT;
+ break;
+
+ // ----------------------- //
+ default:
+ test_pwm_state = TEST_PWM_STATE_INIT;
+ }
+
+ Serial.println("---");
+ for (uint8_t i = 0; i < LIGHTS_COUNT; i++)
+ {
+ Serial.println("light_state[" + (String)i + "] = " + (String)light_state[i]);
+ Serial.println("bri[" + (String)i + "] = " + (String)bri[i]);
+ Serial.println("current_bri[" + (String)i + "] = " + (String)current_bri[i]);
+ Serial.println("current_pwm[" + (String)i + "] = " + (String)current_pwm[i]);
+ Serial.println("transitiontime[" + (String)i + "] = " + (String)transitiontime[i]);
+ }
+
+ }
+
+}
+
+//********************************//
diff --git a/firmware/html/bottom.js b/firmware/html/bottom.js
index 20deffc..91a7463 100644
--- a/firmware/html/bottom.js
+++ b/firmware/html/bottom.js
@@ -328,8 +328,6 @@ function updateLightState() {
const onLinkOff = document.getElementById(`on${i - 1}_off`);
briSlider.value = data.bri;
briSliderVal.innerHTML = (Math.round((data.bri * 100.0 / 255.0) * 100) / 100).toFixed(2);
- //console.log('data.on ' + i + ' = ' + data.on);
- //console.log('data light ' + i + ' = ' + data);
if (data.on == true) {
onLinkOn.classList.add('pure-button-primary');
onLinkOff.classList.remove('pure-button-primary');
@@ -708,4 +706,43 @@ function showToast(message, type) {
}, 5000);
}
}
-
\ No newline at end of file
+
+function sendPWMTestRequest(event) {
+
+ event.preventDefault(); // Verhindert das Standardverhalten des Links
+
+ var button = event.target; // Der geklickte Button
+
+ var xhr = new XMLHttpRequest(); // Erstellt eine XMLHttpRequest-Instanz
+ xhr.open("GET", 'http://{{IP_ADDRESS}}/test_pwm', true); // Sendet eine GET-Anfrage an die angegebene URL
+
+ xhr.onload = function () {
+ if (xhr.status == 200 && xhr.responseText === "OK") {
+ button.innerHTML = "PWM test started";
+ button.style.backgroundColor = "green"; // Setzt die Hintergrundfarbe auf Grün
+ } else {
+ button.innerHTML = "Error!";
+ button.style.backgroundColor = "red"; // Setzt die Hintergrundfarbe auf Rot
+ }
+
+ // Nach 2 Sekunden den ursprünglichen Text wiederherstellen
+ setTimeout(function () {
+ button.innerHTML = "PWM Test";
+ button.style.backgroundColor = ""; // Entfernt die Hintergrundfarbe
+ }, 2000);
+ };
+
+ xhr.onerror = function () {
+ button.innerHTML = "Error!";
+ button.style.backgroundColor = "red"; // Setzt die Hintergrundfarbe auf Rot
+
+ // Nach 2 Sekunden den ursprünglichen Text wiederherstellen
+ setTimeout(function () {
+ button.innerHTML = "PWM Test";
+ button.style.backgroundColor = ""; // Entfernt die Hintergrundfarbe
+ }, 2000);
+ };
+
+ xhr.send(); // Sendet die Anfrage
+}
+
diff --git a/firmware/html/index_template_top.html b/firmware/html/index_template_top.html
index 48515ca..9392287 100644
--- a/firmware/html/index_template_top.html
+++ b/firmware/html/index_template_top.html
@@ -22,6 +22,7 @@
reset light
reset timing control data
alert
+
PWM Test
diff --git a/firmware/timing_control.ino b/firmware/timing_control.ino
index 67e1258..17fea0a 100644
--- a/firmware/timing_control.ino
+++ b/firmware/timing_control.ino
@@ -171,7 +171,7 @@ void tc_update_main()
bri[i] = 0;
current_bri[i] = 0;
current_pwm[i] = 0;
- transitiontime[i] = 4;
+ transitiontime[i] = 0;
process_lightdata(i, transitiontime[i]);
}