Hi all,
I need your help again.
This code works for me and adresses the PWM correctly. Also for big numbers like 2000.
SYSTEM_MODE ( MANUAL );
#include "libraries/WebServer/WebServer.h"
#include "libraries/PCA/Adafruit_PCA9685.h"
#include "libraries/Timer/SparkCorePolledTimer.h"
#include <stdio.h>
#define PREFIX "/box"
#define Red 3
#define Green 0
#define Blue 4
#define Infrared 1
#define White 2
//#define buffer 128
Adafruit_PCA9685 LedDriver = Adafruit_PCA9685 ( 0x40, true );
WebServer webserver ( PREFIX, 80 );
SparkCorePolledTimer updateTimer_0 ( 10000 );
SparkCorePolledTimer updateTimer_1 ( 10000 );
SparkCorePolledTimer updateTimer_2 ( 10000 );
SparkCorePolledTimer updateTimer_3 ( 10000 );
void OnTimer_0 ( void );
void OnTimer_1 ( void );
void OnTimer_2 ( void );
void OnTimer_3 ( void );
int i = 0;
int enable = 0;
int repeat_0 = 0;
int timing_0 = 0;
int timing_1 = 0;
int timing_2 = 0;
int timing_3 = 0;
int red_0 = 0;
int red_h_0 = 0;
int red_1 = 0;
int red_h_1 = 0;
int red_2 = 0;
int red_h_2 = 0;
int red_3 = 0;
int red_h_3 = 0;
int blue_0 = 0;
int blue_h_0 = 0;
int blue_1 = 0;
int blue_h_1 = 0;
int blue_2 = 0;
int blue_h_2 = 0;
int blue_3 = 0;
int blue_h_3 = 0;
int green_0 = 0;
int green_h_0 = 0;
int green_1 = 0;
int green_h_1 = 0;
int green_2 = 0;
int green_h_2 = 0;
int green_3 = 0;
int green_h_3 = 0;
int infrared_0 = 0;
int infrared_h_0 = 0;
int infrared_1 = 0;
int infrared_h_1 = 0;
int infrared_2 = 0;
int infrared_h_2 = 0;
int infrared_3 = 0;
int infrared_h_3 = 0;
int white_0 = 0;
int white_h_0 = 0;
int white_1 = 0;
int white_h_1 = 0;
int white_2 = 0;
int white_h_2 = 0;
int white_3 = 0;
int white_h_3 = 0;
int timer_0 = 0;
int timer_1 = 0;
int timer_2 = 0;
int timer_3 = 0;
void boxCmd ( WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete ) {
if ( type == WebServer::POST ) {
bool repeat;
char name [ 16 ], value [ 16 ];
do {
repeat = server.readPOSTparam ( name, 16, value, 16 );
if ( strcmp ( name, "enable" ) == 0 ) {
enable = strtoul ( value, NULL, 10 );
}
if ( strcmp ( name, "red_0" ) == 0 ) {
red_0 = strtoul ( value, NULL, 10 );
red_h_0= red_0;
red_0 = ( int ) ( ( red_0 + 0.979 ) / 1.087 );
}
if ( strcmp ( name, "green_0" ) == 0 ) {
green_0 = strtoul ( value, NULL, 10 );
green_h_0 = green_0;
green_0 = ( int ) ( ( green_0 - 0.239 ) / 1.130 );
}
if ( strcmp ( name, "blue_0" ) == 0 ) {
blue_0 = strtoul ( value, NULL, 10 );
blue_h_0 = blue_0;
blue_0 = ( int ) ( ( blue_0 + 1.308 ) / 2.713 );
}
if ( strcmp ( name, "infrared_0" ) == 0 ) {
infrared_0 = strtoul ( value, NULL, 10 );
infrared_h_0 = infrared_0;
infrared_0 = ( int ) ( ( infrared_0 - 0.617 ) / 2.609 );
}
if ( strcmp ( name, "white_0" ) == 0 ) {
white_0 = strtoul ( value, NULL, 10 );
white_h_0 = white_0;
white_0 = ( int ) ( ( white_0 + 6.701 ) / 13.771 );
}
if ( strcmp ( name, "timer_0" ) == 0 ) {
timer_0 = strtoul ( value, NULL, 10 );
}
if ( strcmp ( name, "red_1" ) == 0 ) {
red_1 = strtoul ( value, NULL, 10 );
red_h_1 = red_1;
red_1 = ( int ) ( ( red_1 + 0.979 ) / 1.087 );
}
if ( strcmp ( name, "green_1" ) == 0 ) {
green_1 = strtoul ( value, NULL, 10 );
green_h_1 = green_1;
green_1 = ( int ) ( ( green_1 - 0.239 ) / 1.130 );
}
if ( strcmp ( name, "blue_1" ) == 0 ) {
blue_1 = strtoul ( value, NULL, 10 );
blue_h_1 = blue_1;
blue_1 = ( int ) ( ( blue_1 + 1.308 ) / 2.713 );
}
if ( strcmp ( name, "infrared_1" ) == 0 ) {
infrared_1 = strtoul ( value, NULL, 10 );
infrared_h_1 = infrared_1;
infrared_1 = ( int ) ( ( infrared_1 - 0.617 ) / 2.609 );
}
if ( strcmp ( name, "white_1" ) == 0 ) {
white_1 = strtoul ( value, NULL, 10 );
white_h_1 = white_1;
white_1 = ( int ) ( ( white_1 + 6.701 ) / 13.771 );
}
if ( strcmp ( name, "timer_1" ) == 0 ) {
timer_1 = strtoul ( value, NULL, 10 );
}
if ( strcmp ( name, "red_2" ) == 0 ) {
red_2 = strtoul ( value, NULL, 10 );
red_h_2 = red_2;
red_2 = ( int ) ( ( red_2 + 0.979 ) / 1.087 );
}
if ( strcmp ( name, "green_2" ) == 0 ) {
green_2 = strtoul ( value, NULL, 10 );
green_h_2 = green_2;
green_2 = ( int ) ( ( green_2 - 0.239 ) / 1.130 );
}
if ( strcmp ( name, "blue_2" ) == 0 ) {
blue_2 = strtoul ( value, NULL, 10 );
blue_h_2 = blue_2;
blue_2 = ( int ) ( ( blue_2 + 1.308 ) / 2.713 );
}
if ( strcmp ( name, "infrared_2" ) == 0 ) {
infrared_2 = strtoul ( value, NULL, 10 );
infrared_h_2 = infrared_2;
infrared_2 = ( int ) ( ( infrared_2 - 0.617 ) / 2.609 );
}
if ( strcmp ( name, "white_2" ) == 0 ) {
white_2 = strtoul ( value, NULL, 10 );
white_h_2 = white_2;
white_2 = ( int ) ( ( white_2 + 6.701 ) / 13.771 );
}
if ( strcmp ( name, "timer_2" ) == 0 ) {
timer_2 = strtoul ( value, NULL, 10 );
}
if ( strcmp ( name, "red_3" ) == 0 ) {
red_3 = strtoul ( value, NULL, 10 );
red_h_3 = red_3;
red_3 = ( int ) ( ( red_3 + 0.979 ) / 1.087 );
}
if ( strcmp ( name, "green_3" ) == 0 ) {
green_3 = strtoul ( value, NULL, 10 );
green_h_3 = green_3;
green_3 = ( int ) ( ( green_3 - 0.239 ) / 1.130 );
}
if ( strcmp ( name, "blue_3" ) == 0 ) {
blue_3 = strtoul ( value, NULL, 10 );
blue_h_3 = blue_3;
blue_3 = ( int ) ( ( blue_3 + 1.308 ) / 2.713 );
}
if ( strcmp ( name, "infrared_3" ) == 0 ) {
infrared_3 = strtoul ( value, NULL, 10 );
infrared_h_3 = infrared_3;
infrared_3 = ( int ) ( ( infrared_3 - 0.617 ) / 2.609 );
}
if ( strcmp ( name, "white_3" ) == 0 ) {
white_3 = strtoul ( value, NULL, 10 );
white_h_3 = white_3;
white_3 = ( int ) ( ( white_3 + 6.701 ) / 13.771 );
}
if ( strcmp ( name, "timer_3" ) == 0 ) {
timer_3 = strtoul ( value, NULL, 10 );
}
if ( strcmp ( name, "repeat_0" ) == 0 ) {
repeat_0 = strtoul ( value, NULL, 10 );
}
} while ( repeat );
server.httpSeeOther ( PREFIX );
return;
}
server.httpSuccess ( );
if ( type == WebServer::GET ) {
#define BUFFER_SIZE 3000
char buffer[BUFFER_SIZE];
//P ( message ) =
//#define buffer "<p> Red in µm photons/(m*s): <input type='number' name='red_0' min='0' max='2000' value='%i'>" <script> var r = document.getElementById("Rot"); var b = document.getElementById("Blau"); </script>
//server.write((uint8_t*)buffer,strlen(buffer));
//char js[512];
//snprintf(js, sizeof(js), "<script>r.value=%d;b.value=%d;</script></html>", red_0, blue_0);
//server.write((uint8_t*)js, strlen(js));
snprintf(buffer, BUFFER_SIZE, "<html><head><title>IAB Lightbox Control-Panel</title>"
"<body>"
"<h1>IAB Lightbox 5 Control-Panel</h1>"
"<form action='/box' method='POST'>"
"<p> Red in µm photons/(m²*s): <input type='number' name='red_0' min='0' max='2000' value='%i'>"
"Green in µm photons/(m²*s): <input type='number' name='green_0' min='0' max='2000'value='%i'>"
"Blue in µm photons/(m²*s): <input type='number' name='blue_0' min='0' max='2000' value='%i'>"
"Infrared in µm photons/(m²*s): <input type='number' name='infrared_0' min='0' max='2000' value='%i'>"
"White in µm photons/(m²*s): <input type='number' name='white_0' min='0' max='2000' value='%i'>"
"Timer in min: <input type='number' name='timer_0' min='0' max='600000' value='%i'> </p>"
"<p> Red in µm photons/(m²*s): <input type='number' name='red_1' min='0' max='2000' value='%i'>"
"Green in µm photons/(m²*s): <input type='number' name='green_1' min='0' max='2000' value='%i'>"
"Blue in µm photons/(m²*s): <input type='number' name='blue_1' min='0' max='2000' value='%i'>"
"Infrared in µm photons/(m²*s): <input type='number' name='infrared_1' min='0' max='2000' value='%i'>"
"White in µm photons/(m²*s): <input type='number' name='white_1' min='0' max='2000' value='%i'>"
"Timer in min: <input type='number' name='timer_1' min='0' max='600000' value='%i'></p>"
"<p> Red in µm photons/(m²*s): <input type='number' name='red_2' min='0' max='2000' value='%i'>"
"Green in µm photons/(m²*s): <input type='number' name='green_2' min='0' max='2000' value='%i'>"
"Blue in µm photons/(m²*s): <input type='number' name='blue_2' min='0' max='2000' value='%i'>"
"Infrared in µm photons/(m²*s): <input type='number' name='infrared_2' min='0' max='2000' value='%i'>"
"White in µm photons/(m²*s): <input type='number' name='white_2' min='0' max='2000' value='%i'>"
"Timer in min: <input type='number' name='timer_2' min='0' max='600000' value='%i'> </p>"
"<p> Red in µm photons/(m²*s): <input type='number' name='red_3' min='0' max='2000' value='%i'>"
"Green in µm photons/(m²*s): <input type='number' name='green_3' min='0' max='2000' value='%i'>"
"Blue in µm photons/(m²*s): <input type='number' name='blue_3' min='0' max='2000' value='%i'>"
"Infrared in µm photons/(m²*s): <input type='number' name='infrared_3' min='0' max='2000' value='%i'>"
"White in µm photons/(m²*s): <input type='number' name='white_3' min='0' max='2000' value='%i'>"
"Timer in min: <input type='number' name='timer_3' min='0' max='600000' value='%i'> </p> "
"<p> <button name='enable' value='0' onclick='window.location.reload();'>Reset</button>"
"<button name='enable' value='1' onclick='window.location.reload();'>Start</button> </p>"
"Repeat: <input type='number' name='repeat_0' min='0' max='1' value='%i'>"
"<p> Christian Streng & Christian Karle © 2019 </p>"
"</form></body></html>", red_h_0, green_h_0, blue_h_0, infrared_h_0, white_h_0, timer_0, red_h_1, green_h_1, blue_h_1, infrared_h_1, white_h_1, timer_1, red_h_2, green_h_2, blue_h_2, infrared_h_2, white_h_2, timer_2, red_h_3, green_h_3, blue_h_3, infrared_h_3, white_h_3, timer_3, repeat_0 ) ;
server.write((uint8_t *)buffer, strlen(buffer));
//server.printP ( message );
}
}
void setup ( ) {
WiFi.off ( );
IPAddress myAddress ( 192, 168, 5, 204 );
IPAddress gateway ( 192, 168, 5, 100 );
IPAddress netmask ( 255, 255, 255, 0 );
IPAddress dns ( 8, 8, 8, 8 );
WiFi.setStaticIP ( myAddress, netmask, gateway, dns );
WiFi.useStaticIP ( );
WiFi.on ( );
WiFi.connect ( );
waitUntil ( WiFi.ready );
LedDriver.begin ( );
LedDriver.setPWMFreq ( 300 );
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
updateTimer_0.SetCallback ( OnTimer_0 );
updateTimer_1.SetCallback ( OnTimer_1 );
updateTimer_2.SetCallback ( OnTimer_2 );
updateTimer_3.SetCallback ( OnTimer_3 );
webserver.setDefaultCommand ( &boxCmd );
webserver.begin ( );
}
void loop ( ) {
if ( enable == 1 ) {
while ( i == 0 ) {
updateTimer_0.SetTimeout ( 1000 * 60 * timer_0 );
updateTimer_1.SetTimeout ( 1000 * 60 * timer_1 );
updateTimer_2.SetTimeout ( 1000 * 60 * timer_2 );
updateTimer_3.SetTimeout ( 1000 * 60 * timer_3 );
LedDriver.setVal ( Red, red_0 );
LedDriver.setVal ( Green, green_0 );
LedDriver.setVal ( Blue, blue_0 );
LedDriver.setVal ( Infrared, infrared_0 );
LedDriver.setVal ( White, white_0 );
updateTimer_0.Reset ( );
i = 1;
timing_0 = 1;
}
updateTimer_0.Update ( );
updateTimer_1.Update ( );
updateTimer_2.Update ( );
updateTimer_3.Update ( );
}
if ( enable == 0 ) {
i = 0;
repeat_0 = 0;
updateTimer_0.Reset ( );
updateTimer_1.Reset ( );
updateTimer_2.Reset ( );
updateTimer_3.Reset ( );
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
red_0 = 0;
red_h_0 = 0;
red_1 = 0;
red_h_1 = 0;
red_2 = 0;
red_h_2 = 0;
red_3 = 0;
red_h_3 = 0;
blue_0 = 0;
blue_h_0 = 0;
blue_1 = 0;
blue_h_1 = 0;
blue_2 = 0;
blue_h_2 = 0;
blue_3 = 0;
blue_h_3 = 0;
green_0 = 0;
green_h_0 = 0;
green_1 = 0;
green_h_1 = 0;
green_2 = 0;
green_h_2 = 0;
green_3 = 0;
green_h_3 = 0;
infrared_0 = 0;
infrared_h_0 = 0;
infrared_1 = 0;
infrared_h_1 = 0;
infrared_2 = 0;
infrared_h_2 = 0;
infrared_3 = 0;
infrared_h_3 = 0;
white_0 = 0;
white_h_0 = 0;
white_1 = 0;
white_h_1 = 0;
white_2 = 0;
white_h_2 = 0;
white_3 = 0;
white_h_3 = 0;
timer_0 = 0;
timer_1 = 0;
timer_2 = 0;
timer_3 = 0;
timing_0 = 0;
timing_1 = 0;
timing_2 = 0;
timing_3 = 0;
}
webserver.processConnection ( );
}
void OnTimer_0 ( void ) {
if ( timing_0 == 1 ) {
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
LedDriver.setVal ( Red, red_1 );
LedDriver.setVal ( Green, green_1 );
LedDriver.setVal ( Blue, blue_1 );
LedDriver.setVal ( Infrared, infrared_1 );
LedDriver.setVal ( White, white_1 );
updateTimer_1.Reset ( );
timing_0 = 0;
timing_1 = 1;
}
}
void OnTimer_1 ( void ) {
if ( timing_1 == 1 ) {
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
LedDriver.setVal ( Red, red_2 );
LedDriver.setVal ( Green, green_2 );
LedDriver.setVal ( Blue, blue_2 );
LedDriver.setVal ( Infrared, infrared_2 );
LedDriver.setVal ( White, white_2 );
updateTimer_2.Reset ( );
timing_1 = 0;
timing_2 = 1;
}
}
void OnTimer_2 ( void ) {
if ( timing_2 == 1 ) {
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
LedDriver.setVal ( Red, red_3 );
LedDriver.setVal ( Green, green_3 );
LedDriver.setVal ( Blue, blue_3 );
LedDriver.setVal ( Infrared, infrared_3 );
LedDriver.setVal ( White, white_3 );
updateTimer_3.Reset ( );
timing_2 = 0;
timing_3 = 1;
}
}
void OnTimer_3 ( void ) {
if ( timing_3 == 1 ) {
LedDriver.setVal ( Red, 0 );
LedDriver.setVal ( Green, 0 );
LedDriver.setVal ( Blue, 0 );
LedDriver.setVal ( Infrared, 0 );
LedDriver.setVal ( White, 0 );
timing_3 = 0;
if ( repeat_0 == 1 ) {
i = 0;
}
}
}
If i change the code to by changing the equation:
if ( strcmp ( name, "red_0" ) == 0 ) {
red_0 = strtoul ( value, NULL, 10 );
red_h_0= red_0;
red_0 = ( int ) ( ( red_0 - 1.1121 ) / 0.0086 );
}
if ( strcmp ( name, "green_0" ) == 0 ) {
green_0 = strtoul ( value, NULL, 10 );
green_h_0 = green_0;
green_0 = ( int ) ( ( green_0 - 0.293 ) / 0.0099 );
}
if ( strcmp ( name, "blue_0" ) == 0 ) {
blue_0 = strtoul ( value, NULL, 10 );
blue_h_0 = blue_0;
blue_0 = ( int ) ( ( blue_0 - 0.1621 ) / 0.0197 );
}
if ( strcmp ( name, "infrared_0" ) == 0 ) {
infrared_0 = strtoul ( value, NULL, 10 );
infrared_h_0 = infrared_0;
infrared_0 = ( int ) ( ( infrared_0 - 0.6229 ) / 0.0264 );
}
if ( strcmp ( name, "white_0" ) == 0 ) {
white_0 = strtoul ( value, NULL, 10 );
white_h_0 = white_0;
white_0 = ( int ) ( ( white_0 - 4.7611 ) / 0.1155 );
}
it won’t work anymore. I’m adressing LED lights with it. So in the first version of the code the colors are adressed perfectly fine, but in the second all the colors are lighning up.
Thank you in advance. I hope someone can explain to me, since I’m totally stuck and don’t know why it does not work. Using float was also not effective. Also I didn’t receive any errors in the code.
Cheers,
Silenz