From bc45337d9d90625785b2817f3d8f7047703124ea Mon Sep 17 00:00:00 2001 From: Juergen Jung Date: Sat, 28 Jan 2017 23:29:51 +0100 Subject: [PATCH] Initial commit --- .gitignore | 4 + .travis.yml | 65 ++++++++++++++ data/homie/config.json | 16 ++++ data/homie/ui_bundle.gz | Bin 0 -> 49414 bytes lib/readme.txt | 36 ++++++++ platformio.ini | 28 ++++++ src/schild.ino | 188 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 337 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 data/homie/config.json create mode 100644 data/homie/ui_bundle.gz create mode 100644 lib/readme.txt create mode 100644 platformio.ini create mode 100644 src/schild.ino diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5dac9f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.pioenvs +.piolibdeps +.clang_complete +.gcc-flags.json diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2c4ff5c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,65 @@ +# Continuous Integration (CI) is the practice, in software +# engineering, of merging all developer working copies with a shared mainline +# several times a day < http://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 +# < http://docs.platformio.org/page/ci/travis.html > +# +# * User Guide for `platformio ci` command +# < http://docs.platformio.org/page/userguide/cmd_ci.html > +# +# +# Please choice 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 +# +# script: +# - platformio run + + +# +# Template #2: The project is intended to by 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 +# +# script: +# - platformio ci --lib="." --board=ID_1 --board=ID_2 --board=ID_N diff --git a/data/homie/config.json b/data/homie/config.json new file mode 100644 index 0000000..96f453c --- /dev/null +++ b/data/homie/config.json @@ -0,0 +1,16 @@ +{ + "name": "Homie CTDO Schild", + "device_id": "schild2", + "wifi": { + "ssid": "Nudel", + "password": "Unser WLAN ist sicher!" + }, + "mqtt": { + "host": "192.168.1.80", + "port": 1883, + "auth": false + }, + "ota": { + "enabled": false + } +} diff --git a/data/homie/ui_bundle.gz b/data/homie/ui_bundle.gz new file mode 100644 index 0000000000000000000000000000000000000000..26f2d21c50feddcf0809785ea843e21590249c61 GIT binary patch literal 49414 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 literal 0 HcmV?d00001 diff --git a/lib/readme.txt b/lib/readme.txt new file mode 100644 index 0000000..dbadc3d --- /dev/null +++ b/lib/readme.txt @@ -0,0 +1,36 @@ + +This directory is intended for the project specific (private) libraries. +PlatformIO will compile them to static libraries and link to executable file. + +The source code of each library should be placed in separate directory, like +"lib/private_lib/[here are source files]". + +For example, see how can be organized `Foo` and `Bar` libraries: + +|--lib +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| |--Foo +| | |- Foo.c +| | |- Foo.h +| |- readme.txt --> THIS FILE +|- platformio.ini +|--src + |- main.c + +Then in `src/main.c` you should use: + +#include +#include + +// rest H/C/CPP code + +PlatformIO will find your libraries automatically, configure preprocessor's +include paths and build them. + +More information about PlatformIO Library Dependency Finder +- http://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..c67b50e --- /dev/null +++ b/platformio.ini @@ -0,0 +1,28 @@ +; 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 +; http://docs.platformio.org/page/projectconf.html + +[env:d1_mini] +platform = espressif8266 +board = d1_mini +framework = arduino + +;upload_port = /dev/tty.wchusbserial410 +;upload_speed = 921600 +upload_port = schild.local +upload_flags = --auth=ctdo2342 + + +lib_deps = + https://github.com/marvinroger/homie-esp8266.git + ArduinoJson + Bounce2 + ESPAsyncTCP + AsyncMqttClient + Adafruit NeoPixel diff --git a/src/schild.ino b/src/schild.ino new file mode 100644 index 0000000..5ecb8be --- /dev/null +++ b/src/schild.ino @@ -0,0 +1,188 @@ +#include + +#include +#include +#include + +#define PIN D1 +#define NUMPIXELS 30 + +uint16_t i=0,j=0,wait = 50; +unsigned long lastCall = 0; +byte wPos = 0; + +Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); + +HomieNode stripNode("strip", "strip"); + +String effect = "none"; + +// Input a value 0 to 255 to get a color value. +// The colours are a transition r - g - b - back to r. +uint32_t wheel(byte wheelPos) { + wheelPos = 255 - wheelPos; + if(wheelPos < 85) { + return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3); + } + if(wheelPos < 170) { + wheelPos -= 85; + return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3); + } + wheelPos -= 170; + return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0); +} + +bool onSetPixel(const HomieRange& range, const String& value){ + if(!range.isRange){ + for(int i=0;i NUMPIXELS-1) { + return false; + } + effect == "none"; + pixels.setPixelColor(range.index, value.toInt()); + pixels.show(); + stripNode.setProperty("pixel_" + String(range.index)).send(value); +} + +bool onSetBrightness(const HomieRange& range, const String& value){ + long brightness= value.toInt(); + if (brightness < 0 || brightness > 255) { + return false; + } + pixels.setBrightness(brightness); + pixels.show(); + stripNode.setProperty("brightness").send(value); +} + +bool onSetEffect(const HomieRange& range, const String& value){ + effect = value; + i=0,j=0,wait=50; + stripNode.setProperty("effect").send(value); +} + +bool onSetClear(const HomieRange& range, const String& value){ + effect = "none"; + pixels.clear(); + pixels.show(); + stripNode.setProperty("clear").send(value); +} + + +void loopHandler() { + if (effect == "none"){ + return; + } + else if (effect == "larson") { + int SpeedDelay = 20; + int ReturnDelay = 50; + int EyeSize = 5; + for(int i = 0; i < pixels.numPixels()-EyeSize-2; i++) { + pixels.clear(); + pixels.show(); + pixels.setPixelColor(i, 255/10, 0, 0); + for(int j = 1; j <= EyeSize; j++) { + //pixels.setPixelColor(i+j, 255, 0, 0); + pixels.setPixelColor(i+j, wheel(wPos++)); + } + pixels.setPixelColor(i+EyeSize+1, 255/10, 0, 0); + pixels.show(); + delay(SpeedDelay); + } + delay(wait); + + for(int i = pixels.numPixels()-EyeSize-2; i > 0; i--) { + pixels.clear(); + pixels.show(); + pixels.setPixelColor(i, 255/10, 0, 0); + for(int j = 1; j <= EyeSize; j++) { + //pixels.setPixelColor(i+j, 255, 0, 0); + pixels.setPixelColor(i+j, wheel(wPos++)); + } + pixels.setPixelColor(i+EyeSize+1, 255/10, 0, 0); + pixels.show(); + delay(SpeedDelay); + } + delay(wait); + } + else if (effect == "randomfade") { + if(lastCall + wait > millis()){ + return; + } + lastCall = millis(); + for(int i=0;i= millis()){ + return; + } + if(j<256) { + if(i