commit b88e971eed8b197085ab17961ab31f8a61da0983 Author: romain Date: Wed Jan 3 19:58:09 2024 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..8696fdf --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch +.travis.yml +.BROWSE* +lib/ \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100755 index 0000000..bca82dc --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100755 index 0000000..31cccbd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "terminal.integrated.env.windows": { + "PATH": "C:\\Users\\romain\\.platformio\\penv\\Scripts;C:\\Users\\romain\\.platformio\\penv;C:\\Program Files\\Oculus\\Support\\oculus-runtime;C:\\Program Files (x86)\\AdoptOpenJDK\\jdk-8.0.222.10-hotspot\\bin;C:\\Program Files (x86)\\AdoptOpenJDK\\jre-8.0.222.10-hotspot\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files\\PuTTY\\;C:\\Program Files\\Microsoft VS Code\\bin;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\dotnet\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\Program Files (x86)\\Windows Kits\\10\\Microsoft Application Virtualization\\Sequencer\\;C:\\Program Files\\Git\\cmd;C:\\Users\\romain\\AppData\\Local\\Microsoft\\WindowsApps;;C:\\Program Files\\Oculus\\Support\\oculus-runtime;C:\\Program Files (x86)\\AdoptOpenJDK\\jdk-8.0.222.10-hotspot\\bin;C:\\Program Files (x86)\\AdoptOpenJDK\\jre-8.0.222.10-hotspot\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files\\PuTTY\\;C:\\Program Files\\Microsoft VS Code\\bin;C:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\dotnet\\;C:\\Program Files\\Microsoft SQL Server\\130\\Tools\\Binn\\;C:\\Program Files\\Microsoft SQL Server\\Client SDK\\ODBC\\170\\Tools\\Binn\\;C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\;C:\\Program Files (x86)\\Windows Kits\\10\\Microsoft Application Virtualization\\Sequencer\\;C:\\Program Files\\Git\\cmd;C:\\Users\\romain\\AppData\\Local\\Microsoft\\WindowsApps;", + "PLATFORMIO_CALLER": "vscode" + }, + "files.associations": { + "functional": "cpp" + } +} \ No newline at end of file diff --git a/include/colors.h b/include/colors.h new file mode 100755 index 0000000..c191342 --- /dev/null +++ b/include/colors.h @@ -0,0 +1,152 @@ +typedef struct { + double r; // a fraction between 0 and 1 + double g; // a fraction between 0 and 1 + double b; // a fraction between 0 and 1 +} rgb; + +typedef struct { + double h; // angle in degrees + double s; // a fraction between 0 and 1 + double v; // a fraction between 0 and 1 +} hsv; + +static rgb int2rgb(uint32_t in); +static hsv rgb2hsv(rgb in); +static rgb hsv2rgb(hsv in); + +rgb int2rgb(uint32_t in) +{ + rgb out; + out.r = (in >> 16) & 255; + out.g = (in >> 8) & 255; + out.b = in & 255; + return out; +} + +hsv rgb2hsv(rgb in) +{ + hsv out; + double min, max, delta; + + min = in.r < in.g ? in.r : in.g; + min = min < in.b ? min : in.b; + + max = in.r > in.g ? in.r : in.g; + max = max > in.b ? max : in.b; + + out.v = max; + delta = max - min; + + if (delta < 0.00001) + { + out.s = 0; + out.h = 0; + return out; + } + if(max > 0.0) + { + out.s = (delta / max); + } + else + { + out.s = 0.0; + out.h = 0; + return out; + } + + if(in.r >= max) + out.h = ( in.g - in.b ) / delta; + else if(in.g >= max) + out.h = 2.0 + ( in.b - in.r ) / delta; + else + out.h = 4.0 + ( in.r - in.g ) / delta; + + out.h *= 60.0; + + if(out.h < 0.0) + out.h += 360.0; + + return out; +} + + +rgb hsv2rgb(hsv in) +{ + double hh, p, q, t, ff; + long i; + rgb out; + + if(in.s <= 0.0) + { + out.r = in.v; + out.g = in.v; + out.b = in.v; + return out; + } + hh = in.h; + + if(hh >= 360.0) + hh = 0.0; + + hh /= 60.0; + i = (long)hh; + ff = hh - i; + p = in.v * (1.0 - in.s); + q = in.v * (1.0 - (in.s * ff)); + t = in.v * (1.0 - (in.s * (1.0 - ff))); + + switch(i) + { + case 0: + out.r = in.v; + out.g = t; + out.b = p; + break; + case 1: + out.r = q; + out.g = in.v; + out.b = p; + break; + case 2: + out.r = p; + out.g = in.v; + out.b = t; + break; + + case 3: + out.r = p; + out.g = q; + out.b = in.v; + break; + case 4: + out.r = t; + out.g = p; + out.b = in.v; + break; + case 5: + default: + out.r = in.v; + out.g = p; + out.b = q; + break; + } + return out; +} + +rgb gradient(rgb start, rgb end, double ratio) +{ + if(ratio < 0) + ratio = 0; + if(ratio > 1) + ratio = 1; + + auto start_hsv = rgb2hsv(start); + auto end_hsv = rgb2hsv(end); + + hsv result; + result.h = start_hsv.h + ratio * (end_hsv.h - start_hsv.h); + result.s = start_hsv.s + ratio * (end_hsv.s - start_hsv.s); + result.v = start_hsv.v + ratio * (end_hsv.v - start_hsv.v); + + return hsv2rgb(result); +} \ No newline at end of file diff --git a/include/config.h b/include/config.h new file mode 100644 index 0000000..a93b16b --- /dev/null +++ b/include/config.h @@ -0,0 +1,22 @@ +#include + +#define SSID "Galaxy" +#define PASSWORD "changeme" + +#define NTP_SERVER "0.be.pool.ntp.org" + +#define PIN D4 +#define NUMPIXELS 20 + +const uint32_t PALETTES[] = +{ + 0xc43f1a, 0x75266f, 0x43aba3, + 0x542424, 0xe1b343, 0xefc988, + 0xAA5E47, 0xDDA254, 0x4D7A5C, + 0x034F4D, 0x53BD99, 0x1A8263, + 0xfb9568, 0x729575, 0x1eeac5, + 0x2F66C4, 0xF04F4F, 0x1EBA8B, + 0x428529, 0xFFCBB5, 0x767FA6 +}; + +const int PALETTE_COUNT = sizeof(PALETTES) / sizeof(uint32_t) / 3; \ No newline at end of file diff --git a/platformio.ini b/platformio.ini new file mode 100755 index 0000000..cd254f2 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,11 @@ +[env:d1_mini_lite] +platform = espressif8266 +board = d1_mini_lite +framework = arduino +build_flags = -fexceptions +build_unflags = -fno-exceptions +; upload_protocol = espota +; upload_port = 192.168.1.157 +; upload_speed = 115200 +lib_deps = Adafruit NeoPixel + NTPClient \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100755 index 0000000..ecb0286 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +#include "config.h" +#include "colors.h" + +Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); + +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP, NTP_SERVER, 60 * 60); + +const int LEDS_HOURS_1[] = { 2, 3, 4, 5 }; +const int LEDS_HOURS_2[] = { 1, 0 }; +const int LEDS_MINUTES_1[] = { 9, 10, 11, 12 }; +const int LEDS_MINUTES_2[] = { 8, 7, 6 }; +const int LEDS_SECONDS_1[] = { 16, 17, 18, 19 }; +const int LEDS_SECONDS_2[] = { 15, 14, 13 }; + +rgb start = int2rgb(0xff0000); +rgb end = int2rgb(0x49cb2c); + +void display_progress(int percentage) +{ + pixels.clear(); + int activeLedCount = (int)(NUMPIXELS / 100.0 * percentage); + + + for(int i=0; i= NUMPIXELS) + { + i = 0; + pixels.clear(); + } + } + + if(WiFi.isConnected()) + { + Serial.print(WiFi.localIP().toString()); + + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) + { + try + { + display_progress(progress / (total / 100.0)); + } + catch(const std::exception& e) + { + } + }); + ArduinoOTA.onEnd([]() + { + for(int i=0; i> 1; + if(isOn) + pixels.setPixelColor(leds[index], color); + index++; + } +} + +void loop() +{ + if(WiFi.isConnected()) + { + ArduinoOTA.handle(); + timeClient.update(); + } + + int seconds = timeClient.getSeconds(); + int minutes = timeClient.getMinutes(); + int hours = timeClient.getHours(); + int hours_1 = hours % 10; + int hours_2 = (hours / 10) % 10; + int minutes_1 = minutes % 10; + int minutes_2 = (minutes / 10) % 10; + int seconds_1 = seconds % 10; + int seconds_2 = (seconds / 10) % 10; + + int palette_index = hours % PALETTE_COUNT; + uint32_t color_hours = PALETTES[palette_index]; + uint32_t color_minutes = PALETTES[palette_index + 1]; + uint32_t color_seconds = PALETTES[palette_index + 2]; + + pixels.clear(); + + displayBinary(hours_1, &LEDS_HOURS_1[0], color_hours); + displayBinary(hours_2, &LEDS_HOURS_2[0], color_hours); + displayBinary(minutes_1, &LEDS_MINUTES_1[0], color_minutes); + displayBinary(minutes_2, &LEDS_MINUTES_2[0], color_minutes); + displayBinary(seconds_1, &LEDS_SECONDS_1[0], color_seconds); + displayBinary(seconds_2, &LEDS_SECONDS_2[0], color_seconds); + + pixels.show(); + + delay(100); +}