diff --git a/platformio.ini b/platformio.ini index c96ffcc..486a4ee 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,6 +17,7 @@ upload_port = /run/media/amelia/RPI-RP2/ monitor_speed = 115200 board_build.filesystem_size = 1m board_build.f_cpu = 133000000L -; board_flags = -DWIFICC=CYW43_COUNTRY_USA -lib_deps = - fastled/FastLED@^3.6.0 +build_flags = -O3 +; board_flags = -DWIFICC=CYW43_COUNTRY_USA +lib_deps = + https://github.com/FastLED/FastLED diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..3ea000b --- /dev/null +++ b/src/config.h @@ -0,0 +1,61 @@ +#pragma once +// User configurable settings + +#define DEBUG + +// Amount of color channels per pixel - i.e. RGB = 3, RGBW = 4 +#define PIXEL_SIZE 3 + +// Total LED count +// set to 128*8 for 4 channel, 170*8 for 3 channel +#define MAX_LEDS 170*8 + +// LED driver chip model - depends on strip +#define LED_TYPE WS2811 + +// RGB pin ordering - RGB, BGR, GBR, etc +#define RGB_ORDER GBR + +// Max number of LED strips connected +// 8 for ARGB Controller PCB +#define LED_STRIPS 8 + +// Define the data pin connection to each strip +// 0-7 for ARGB Controller PCB +#define STRIP1 0 +#define STRIP2 1 +#define STRIP3 2 +#define STRIP4 3 +#define STRIP5 4 +#define STRIP6 5 +#define STRIP7 6 +#define STRIP8 7 + +// enable pin, if any +// 8 on ARGB controller +#define ENABLEPIN 8 + +// define how many LEDs / zones are in each strip + + +#define ENABLE_NTP false +#define ntpserver "pool.ntp.org" // Address of NTP server. Example: pool.ntp.org + +// ethernet (w5500) or wifi (pico W cyw43) +#define INT_ETHERNET +//#define INT_WIFI + +#define ETH_SPI_SPD 10000000 + +// Temporary: network and universe settings + +// Will be replaced with WebUI + EEPROM config +// to allow for changing settings without recompiling +#define HOSTNAME "Lighting.1" +#define ETH_MODE "staticip" // comment out for DHCP +#define IP_ADDR IPAddress(192,168,50,2) +#define update_path "/update" +#define update_username "admin" +#define update_password "Password@123" + +#define START_UNIVERSE 1 diff --git a/src/e131.cpp b/src/e131.cpp index c32ded9..02a6be2 100644 --- a/src/e131.cpp +++ b/src/e131.cpp @@ -20,9 +20,11 @@ * */ + #include "e131.h" #include + /* E1.17 ACN Packet Identifier */ #ifdef ARDUINO_ARCH_AVR const PROGMEM byte E131::ACN_ID[12] = { 0x41, 0x53, 0x43, 0x2d, 0x45, 0x31, 0x2e, 0x31, 0x37, 0x00, 0x00, 0x00 }; @@ -199,21 +201,33 @@ int E131::begin() { int retval = 0; if (Serial) { - Serial.println(""); - Serial.println(F("Requesting Address via DHCP")); - Serial.println(""); + if(ETH_MODE == "staticip") { + Serial.println(""); + Serial.println("Setting static IP"); + Serial.println(""); + eth.config(IP_ADDR, INADDR_NONE); + } + else { + Serial.println(""); + Serial.println(F("Requesting Address via DHCP")); + Serial.println(""); + } + } SPI.setRX(16); SPI.setCS(17); SPI.setSCK(18); SPI.setTX(19); - //eth.setSPISpeed(30000000); - //lwipPollingPeriod(3); + eth.setSPISpeed(ETH_SPI_SPD); + lwipPollingPeriod(3); + eth.setHostname(HOSTNAME); + if (!eth.begin()) { Serial.println("No wired Ethernet hardware detected. Check pinouts, wiring."); return false; } + while (!eth.connected()) { Serial.print("."); delay(500); diff --git a/src/e131.h b/src/e131.h index 1cc84ae..69f9e5a 100644 --- a/src/e131.h +++ b/src/e131.h @@ -24,16 +24,21 @@ #define E131_H_ #include "Arduino.h" +#include "config.h" /* Network interface detection. WiFi for ESP8266 and Ethernet for AVR */ -//# include +#ifdef INT_WIFI + #include +#endif //# include //# include -# include +#ifdef INT_ETHERNET + #include +#endif # include # include # define _UDP WiFiUDP -# define INT_ETHERNET +//# define INT_ETHERNET #define NO_DOUBLE_BUFFER 1 diff --git a/src/main.cpp b/src/main.cpp index 5ce5c6c..b1e1993 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,47 +7,9 @@ #include #include "e131.h" #include +#include "config.h" -// User configurable - -//const char* ssid = "iPhone 14"; // WiFi SSID -//const char* password = "givemewifi"; // WiFi Password -const char* ntpserver = "pool.ntp.org"; // Address of NTP server. Example: pool.ntp.org -const char* HOSTNAME = "lighttest"; - -const char* update_path = "/firmware"; -const char* update_username = "admin"; -const char* update_password = "pico-stripper"; - -//Wiznet5500lwIP eth(1); - -//#define DEBUG -// Total LED count -#define MAX_LEDS 150 - -#define LED_TYPE WS2812B -// Amount of color channels per pixel - i.e. RGB = 3, RGBW = 4 -#define PIXEL_SIZE 3 - -// Number of LED strips connected -#define LED_STRIPS 1 - -// Define the data pin connection to each strip -// Only uncomment the strips you use -#define STRIP1 0 -//#define STRIP2 0 -//#define STRIP3 2 -//#define STRIP4 3 -//#define STRIP5 4 -//#define STRIP6 5 -//#define STRIP7 6 -//#define STRIP8 7 - -#define RGB_ORDER RGB - -// define how many LEDs / zones are in each strip -int strips[LED_STRIPS] = {150}; - +int strips[LED_STRIPS] = {170, 170, 170, 170, 170, 170, 170, 170}; // Begin code #ifdef DEBUG @@ -114,53 +76,84 @@ template T println(T in) { void write_universe(int universe, uint8_t data[]) { // universe starts at 0 - PRINTFUNC("Universe: "); - PRINTLNFUNC(universe); + //PRINTFUNC("Universe: "); + //PRINTLNFUNC(universe); int offset = calculate[universe]; - PRINTFUNC("Offset: "); - PRINTLNFUNC(offset); + //PRINTFUNC("Offset: "); + //PRINTLNFUNC(offset); int write_size = universes[universe]; - PRINTFUNC("Length: "); - PRINTLNFUNC(write_size); + //PRINTFUNC("Length: "); + //PRINTLNFUNC(write_size); status = 0; for (int i = 0; i < write_size; i++) { int j = i * PIXEL_SIZE + (CHANNEL_START - 1); - if(debug) { - PRINTFUNC(data[j]); - PRINTFUNC(" "); - PRINTFUNC(data[j+1]); - PRINTFUNC(" "); - PRINTFUNC(data[j+2]); - PRINTFUNC(" "); - } + //if(debug) { + // PRINTFUNC(data[j]); + // PRINTFUNC(" "); + // PRINTFUNC(data[j+1]); + // PRINTFUNC(" "); + // PRINTFUNC(data[j+2]); + // PRINTFUNC(" "); + //} ledstrip[offset + i] = CRGB(data[j], data[j+1], data[j+2]); //ledstrip[strip].setPixelColor(i + offset, data[j], data[j+1], data[j+2]); } status = 1; //FastLED.show(); - PRINTLNFUNC("Done writing."); + //PRINTLNFUNC("Done writing."); } +const char* PARAM_INPUT_1 = "ipaddr"; +const char* PARAM_INPUT_2 = "hostname"; +const char* PARAM_INPUT_3 = "universe"; + + +// HTML web page to handle 3 input fields (input1, input2, input3) +const char index_html[] PROGMEM = R"rawliteral( + + ESP Input Form + + + All settings below will save to EEPROM flash and won't get overridden by a firmware upgrade. + Settings will take effect after reboot. +
+ ipaddr: + +

+
+ hostname: + +

+
+ universe: + +
+)rawliteral"; + +//void notFound(AsyncWebServerRequest *request) { +// request->send(404, "text/plain", "Not found"); +//} + void setup() { pinMode(20, OUTPUT); - digitalWrite(20, LOW); // reset W5500 + digitalWrite(20, LOW); // reset W5500 ethernet delay(1); digitalWrite(20, HIGH); SPI.setRX(16); SPI.setCS(17); SPI.setSCK(18); SPI.setTX(19); - pinMode(8, OUTPUT); - digitalWrite(8, LOW); // Enable buffer output! + pinMode(ENABLEPIN, OUTPUT); + digitalWrite(ENABLEPIN, LOW); // Enable buffer output! //pinMode(0, OUTPUT); //digitalWrite(0, HIGH); Serial.begin(115200); delay(3000); - PRINTLNFUNC("========= PicoLighter v1.0 Initializing ========="); + println("========= PicoLighter v1.0 Initializing ========="); if (!e131.begin()) { - PRINTFUNC("Connection failed. Retrying."); + println("Connection failed. Retrying."); rp2040.reboot(); } while (ready == 0) { @@ -186,7 +179,7 @@ void setup() { calculate[currentsize] = offsetcount; PRINTFUNC(" Universe "); - PRINTFUNC(currentsize + 1); + PRINTFUNC(currentsize + 1 + START_UNIVERSE); PRINTFUNC(", Light count "); PRINTFUNC(MAX_PIXELS_PER_UNIVERSE); PRINTFUNC(", Size "); @@ -198,7 +191,7 @@ void setup() { universes[currentsize] = tmp; calculate[currentsize] = offsetcount; PRINTFUNC(" Universe "); - PRINTFUNC(currentsize + 1); + PRINTFUNC(currentsize + 1 + START_UNIVERSE); PRINTFUNC(", Light count "); PRINTFUNC(tmp); PRINTFUNC(", Size "); @@ -206,7 +199,7 @@ void setup() { offsetcount += tmp; currentsize += 1; } - PRINTLNFUNC("========= PicoLighter v1.0 Initialized ========="); + println("========= PicoLighter v1.0 Initialized ========="); initinfo += clientbuffer; //e131.beginMulticast(ssid, passphrase, UNIVERSE); ready = 0; @@ -251,42 +244,47 @@ void setup1() { #endif // Test all lights for (int i = 0; i < MAX_LEDS; i++) { - ledstrip[i] = CRGB(50, 50, 50); + ledstrip[i] = CRGB(0, 0, 50); FastLED.show(); - delay(30); + delay(1); ledstrip[i] = CRGB(0, 0, 0); } FastLED.show(); - delay(3000); - // WiFi.noLowPowerMode(); + //delay(3000); + #ifdef INT_WIFI + WiFi.noLowPowerMode(); + #endif ready = 1; while (ready == 1) { delay(100); } - PRINTLNFUNC("Starting mDNS client."); + // If we get here, then network is good to go + println("Starting mDNS client."); MDNS.begin(HOSTNAME); httpUpdater.setup(&httpServer, update_path, update_username, update_password); + httpServer.begin(); MDNS.addService("http", "tcp", 80); - PRINTFUNC("OTA Updates enabled. Open http://"); - PRINTFUNC(HOSTNAME); - PRINTFUNC(update_path); - PRINTFUNC(" in your browser and login with username "); - PRINTFUNC(update_username); - PRINTFUNC(" and password "); - PRINTLNFUNC(update_password); + print("OTA Updates enabled. Open http://"); + print(HOSTNAME); + print(update_path); + print(" in your browser and login with username "); + print(update_username); + print(" and password "); + println(update_password); server.begin(); - // If we get here, then WiFi is good to go - PRINTFUNC("Starting NTP client."); - NTP.begin(ntpserver); - NTP.waitSet([]() { PRINTFUNC("."); }, 15000); - time_t now = time(nullptr); - PRINTLNFUNC(""); - gmtime_r(&now, &timeinfo); - PRINTFUNC("Current time: "); - PRINTFUNC(asctime(&timeinfo)); - + + if(ENABLE_NTP) { + println("Starting NTP client."); + NTP.begin(ntpserver); + NTP.waitSet([]() { print("."); }, 15000); + time_t now = time(nullptr); + println(""); + gmtime_r(&now, &timeinfo); + print("Current time: "); + println(asctime(&timeinfo)); + } //rp2040.wdt_begin(8000); } @@ -295,7 +293,9 @@ void setup1() { void loop() { /* Parse a packet and update pixels */ if(e131.parsePacket()) { - write_universe(e131.universe - 1, e131.data); + // Offset by start universe + // as all local functions count from 0 + write_universe(e131.universe - START_UNIVERSE, e131.data); } else if (blankcount > 1000) { status = 0; @@ -322,7 +322,7 @@ void loop1() { //delay(50); float temp = analogReadTemp(); if (temp > 50.0) { - PRINTLNFUNC("ERROR: Overtemperature triggered!"); + println("ERROR: Overtemperature triggered!"); rp2040.reboot(); } WiFiClient client = server.available(); @@ -349,7 +349,7 @@ void loop1() { //delay(50); float temp = analogReadTemp(); // read temp in celsius if (temp > 50.0) { - PRINTLNFUNC("ERROR: Overtemperature triggered!"); + println("ERROR: Overtemperature triggered!"); rp2040.reboot(); } if(clientbuffer != (String) "") {