diff --git a/vscode/LEDClock/._platformio.ini b/vscode/LEDClock/._platformio.ini new file mode 100644 index 0000000..047a6c4 Binary files /dev/null and b/vscode/LEDClock/._platformio.ini differ diff --git a/vscode/LEDClock/.gitignore b/vscode/LEDClock/.gitignore new file mode 100644 index 0000000..5762142 --- /dev/null +++ b/vscode/LEDClock/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/vscode/LEDClock/.travis.yml b/vscode/LEDClock/.travis.yml new file mode 100644 index 0000000..a8bbc57 --- /dev/null +++ b/vscode/LEDClock/.travis.yml @@ -0,0 +1,67 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < https://docs.platformio.org/page/ci/index.html > +# +# Documentation: +# +# * Travis CI Embedded Builds with PlatformIO +# < https://docs.travis-ci.com/user/integration/platformio/ > +# +# * PlatformIO integration with Travis CI +# < https://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < https://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choose one of the following templates (proposed below) and uncomment +# it (remove "# " before each line) or use own configuration according to the +# Travis CI documentation (see above). +# + + +# +# Template #1: General project. Test it using existing `platformio.ini`. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to be used as a library with examples. +# + +# language: python +# python: +# - "2.7" +# +# sudo: false +# cache: +# directories: +# - "~/.platformio" +# +# env: +# - PLATFORMIO_CI_SRC=path/to/test/file.c +# - PLATFORMIO_CI_SRC=examples/file.ino +# - PLATFORMIO_CI_SRC=path/to/test/directory +# +# install: +# - pip install -U platformio +# - platformio update +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/vscode/LEDClock/.vscode/extensions.json b/vscode/LEDClock/.vscode/extensions.json new file mode 100644 index 0000000..0f0d740 --- /dev/null +++ b/vscode/LEDClock/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ] +} diff --git a/vscode/LEDClock/include/README b/vscode/LEDClock/include/README new file mode 100644 index 0000000..45496b1 --- /dev/null +++ b/vscode/LEDClock/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/vscode/LEDClock/include/clockelements.hpp b/vscode/LEDClock/include/clockelements.hpp new file mode 100644 index 0000000..d760567 --- /dev/null +++ b/vscode/LEDClock/include/clockelements.hpp @@ -0,0 +1,25 @@ + +#include +#include "Adafruit_NeoPixel.h" + +class elements +{ +private: + /* data */ + #define BRIGHTNESS 128 + #define SATURATION 255 +public: + + unsigned int elements_fraction, element_first_pixel, element_last_pixel, element_number_pixels; + uint8_t elements_saturation, elements_brightness; + + bool element_outside2inside = false; + Adafruit_NeoPixel *element_pixels; + + void init(Adafruit_NeoPixel *pixels, unsigned int first_led, unsigned int number_leds, bool outside2inside); + void fill(uint16_t huecolor, uint8_t saturation = SATURATION, uint8_t brightness = BRIGHTNESS); + void clean(void); + void ffill(uint16_t huecolor, unsigned int fraction, uint8_t saturation = SATURATION, uint8_t brightness = BRIGHTNESS); +}; + + diff --git a/vscode/LEDClock/lib/README b/vscode/LEDClock/lib/README new file mode 100644 index 0000000..8c9c29c --- /dev/null +++ b/vscode/LEDClock/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/vscode/LEDClock/platformio.ini b/vscode/LEDClock/platformio.ini new file mode 100644 index 0000000..f266779 --- /dev/null +++ b/vscode/LEDClock/platformio.ini @@ -0,0 +1,15 @@ +;PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:uno] +platform = atmelavr +board = uno +framework = arduino + diff --git a/vscode/LEDClock/src/clockelements.cpp b/vscode/LEDClock/src/clockelements.cpp new file mode 100644 index 0000000..33de8d3 --- /dev/null +++ b/vscode/LEDClock/src/clockelements.cpp @@ -0,0 +1,47 @@ +#include "clockelements.hpp" + +void elements::init(Adafruit_NeoPixel *pixels, unsigned int first_led, unsigned int number_leds, bool outside2inside) +{ + element_pixels = pixels; + element_first_pixel = first_led; + element_number_pixels = number_leds; + element_last_pixel = first_led + number_leds; + element_outside2inside = outside2inside; +} + +void elements::clean(void) +{ + fill(0, 0, 0); +} + +void elements::fill(uint16_t huecolor, uint8_t saturation, uint8_t brightness) +{ + for(unsigned int nrpixel = element_first_pixel; nrpixel < element_last_pixel; nrpixel++) + { + element_pixels->setPixelColor(nrpixel, element_pixels->ColorHSV(huecolor,saturation, brightness)); + } +} + +void elements::ffill(uint16_t huecolor, unsigned int fraction, uint8_t saturation, uint8_t brightness) +{ + unsigned int fullpixels = element_number_pixels / fraction; + unsigned int partpixels = element_number_pixels % fraction; + elements_fraction = brightness / (60/element_number_pixels); + unsigned int part_brightness = elements_fraction * partpixels; + + unsigned int current_pixel = 0; + + for(unsigned int num = 0; num < fullpixels; num++) + { + current_pixel = element_outside2inside==true? element_last_pixel - num : element_first_pixel + num; + element_pixels->setPixelColor(current_pixel,element_pixels->ColorHSV(huecolor,saturation, brightness)); + } + + if(partpixels > 0) + { + current_pixel = element_outside2inside==true? element_last_pixel - fullpixels : element_first_pixel + fullpixels; + element_pixels->setPixelColor(current_pixel,element_pixels->ColorHSV(huecolor,saturation, part_brightness)); + } + +} + diff --git a/vscode/LEDClock/src/main.cpp b/vscode/LEDClock/src/main.cpp new file mode 100644 index 0000000..8f6e4ba --- /dev/null +++ b/vscode/LEDClock/src/main.cpp @@ -0,0 +1,90 @@ +#include +#include "clockelements.hpp" + +const unsigned int PIN_BUZZER = 9; + +const unsigned int PIN_PIXELS = 6; +const unsigned int NUM_RING_PIXELS = 180; +const unsigned int NUM_POINTER_PIXELS = 6; +const unsigned int NUM_POINTERS = 12; +const unsigned int NUM_POINTERS_PIXELS = NUM_POINTER_PIXELS * NUM_POINTERS; +const unsigned int NUM_NUMBERS = 12; +const unsigned int NUM_NUMPER_PIXELS[NUM_NUMBERS] = {2,4,4,4,4,4,4,4,4,4,4,5}; +const unsigned int NUM_NUMBERS_PIXELS = NUM_NUMPER_PIXELS[0] + NUM_NUMPER_PIXELS[1] + NUM_NUMPER_PIXELS[2]; +const unsigned int NUM_ALL_PIXELS = NUM_RING_PIXELS + NUM_POINTERS_PIXELS + NUM_NUMBERS_PIXELS; + +Adafruit_NeoPixel pixels(NUM_ALL_PIXELS, PIN_PIXELS, NEO_GRB + NEO_KHZ800); + +elements number[NUM_NUMBERS]; +elements pointer[NUM_POINTERS]; + +uint16_t color_numbers, color_pointers_hour = 0; + + +void init_numbers() { + // init all the numbers + unsigned int current_first_led = NUM_RING_PIXELS + NUM_POINTERS_PIXELS; + for(unsigned int num = 0; num < NUM_NUMBERS; num++) + { + //number[num] = new numbers(&pixels, current_first_led, NUM_NUMPER_PIXELS[num]); + number[num].init(&pixels, current_first_led, NUM_NUMPER_PIXELS[num],false); + number[num].clean(); + current_first_led =+ NUM_NUMPER_PIXELS[num]; + } +} + +void init_pointers() { + // init all the pointers - each as 6 leds, starts at 12,11,10 ... 1, each even is inversed (goes from outside into center) + unsigned int current_first_led = NUM_RING_PIXELS; + bool is_even = false; + for(unsigned int num = NUM_POINTERS-1; num >= 0; num--) + { + is_even = num%2==0? true:false; + pointer[num].init(&pixels, current_first_led, NUM_POINTER_PIXELS ,is_even); + pointer[num].clean(); + current_first_led =+ NUM_POINTER_PIXELS; + } +} + + +void setup() { + + Serial.begin(9600); + + // put your setup code here, to run once: + pixels.begin(); + pixels.clear(); + pixels.show(); +Serial.print("hallo"); + color_pointers_hour = 0; + color_numbers = 65535; + Serial.print("hallo"); + init_numbers(); +Serial.print("hallo"); + init_pointers(); +Serial.print("hallo"); + + +} + +void loop() { + unsigned int hour = 0; + for(unsigned int minute = 0; minute<60; minute++) + { + number[hour].fill(color_numbers,255,255); + //pointer[hour].fill(color_pointers_hour); + pointer[hour].ffill(color_pointers_hour, minute/(60/NUM_POINTER_PIXELS)); + pixels.show(); + tone(PIN_BUZZER, 1000, 100); + delay(50000); + number[hour].clean(); + pointer[hour].clean(); + pixels.show(); + + hour = minute == 59 ? hour+1 : hour; + hour = hour > 11 ? 0 : hour; + + Serial.println(hour); + Serial.println(minute); + } +} \ No newline at end of file diff --git a/vscode/LEDClock/test/README b/vscode/LEDClock/test/README new file mode 100644 index 0000000..c3b0ed6 --- /dev/null +++ b/vscode/LEDClock/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/vscode/clock/.vscode/tasks.json b/vscode/clock/.vscode/tasks.json new file mode 100644 index 0000000..6c28385 --- /dev/null +++ b/vscode/clock/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "echo", + "type": "shell", + "command": "echo Hello" + } + ] +} \ No newline at end of file diff --git a/vscode/clock/src/clock.cpp b/vscode/clock/src/clock.cpp index 2639e81..2a09a5a 100644 --- a/vscode/clock/src/clock.cpp +++ b/vscode/clock/src/clock.cpp @@ -3,16 +3,16 @@ #include void update_clock(); -void showseconds(); +void showpixel(float centerposf, int pixelwidth, unsigned long color); RtcDS3231 Rtc(Wire); #define PIN 6 // Which pin on the Arduino is connected to the NeoPixels? -const unsigned int NUMPIXELS = 83; // How many NeoPixels are attached to the Arduino? +const int NUMPIXELS = 83; // How many NeoPixels are attached to the Arduino? Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); -unsigned long color_on, color_off, color_sec, color_min, color_hour; +unsigned long color_on, color_off, color_sec, color_min, color_hour, color_hour_over; const float seconds2pixel = NUMPIXELS /60.0; @@ -25,8 +25,9 @@ void setup() { color_on = pixels.Color(0, 0, 255); color_off = pixels.Color(0, 0, 0); color_sec = pixels.Color(0, 255, 0); - color_min = pixels.Color(0, 255, 255); - color_hour = pixels.Color(255, 255, 0); + color_min = pixels.Color(0, 0, 255); + color_hour = pixels.Color(255, 0, 0); + color_hour_over = pixels.Color(128, 0, 0); pixels.fill(color_off); pixels.show(); @@ -53,47 +54,43 @@ void update_clock() last_second = second; // first delete all ... pixels.fill(color_off); - // second show seconds (^_^); - showseconds(); - // third show minutes + + for(int pixel = 1; pixel < hour; pixel++) + { + showpixel(seconds2pixel * pixel, 1, color_hour_over); + } + showpixel(seconds2pixel * hour, 3, color_hour); + showpixel(seconds2pixel * minute, 5, color_min); + showpixel(seconds2pixel * second, 3, color_sec); - // fourth show hour pixels.show(); // Send the updated pixel colors to the hardware. } } -void showseconds() +int pixel2numpixels(int pixel) { - int secondpixelpos1 = 0; - int secondpixelpos2 = 0; - int secondpixelpos3 = 0; + if(pixel >= NUMPIXELS) + { + pixel = pixel - NUMPIXELS; + } + return pixel; +} - float centerposf = seconds2pixel * second; - secondpixelpos2 = round(centerposf); - if(secondpixelpos2 == NUMPIXELS) - { - secondpixelpos1 = secondpixelpos2 - 1; - secondpixelpos3 = 0; - } - else if(secondpixelpos2 == 0) - { - secondpixelpos1 = NUMPIXELS; - secondpixelpos3 = secondpixelpos2 + 1; - } - else - { - secondpixelpos1 = secondpixelpos2 - 1; - secondpixelpos3 = secondpixelpos2 + 1; - } - Serial.println(secondpixelpos1); - Serial.println(secondpixelpos2); - Serial.println(secondpixelpos3); - - pixels.setPixelColor(secondpixelpos1, color_sec); - pixels.setPixelColor(secondpixelpos2, color_sec); - pixels.setPixelColor(secondpixelpos3, color_sec); +void showpixel(float centerposf, int pixelwidth, unsigned long color) +{ + int centerpixelpos = round(centerposf); + int pixelcenter = round((float)pixelwidth/2.0); + int pixelpos[pixelwidth] = {0}; + + for(int pixel = 0; pixel < pixelwidth; pixel++) + { + int pixeloffset = pixel - pixelcenter; + pixelpos[pixel] = pixel2numpixels(centerpixelpos + pixeloffset); + Serial.println(pixelpos[pixel]); + pixels.setPixelColor(pixelpos[pixel], color); + } } RtcDateTime now;