initial commit
This commit is contained in:
commit
30bfe969d7
4
README.md
Normal file
4
README.md
Normal file
@ -0,0 +1,4 @@
|
||||
# biciClock
|
||||
## A simple ws2812 WallClock that also displays citybike stations
|
||||
|
||||
This is a funny project, check it out
|
282
biciClock.ino
Normal file
282
biciClock.ino
Normal file
@ -0,0 +1,282 @@
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
#include <ArduinoJson.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266HTTPClient.h>
|
||||
|
||||
#include <DNSServer.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <WiFiManager.h>
|
||||
|
||||
|
||||
#define STATION_UID "93" // location id
|
||||
#define HOST "testing.lbsfilm.at"
|
||||
|
||||
|
||||
#define SEGLEN 5 // SegmentLength
|
||||
#define SEPLEN 2 // SeperatorLength
|
||||
#define NUM_LEDS 142 //SEGLEN * 4 * 7 + 2
|
||||
#define DATA_PIN D5 // Data pin for led comunication
|
||||
|
||||
Adafruit_NeoPixel clock = Adafruit_NeoPixel(NUM_LEDS, DATA_PIN, NEO_GRB + NEO_KHZ800);
|
||||
|
||||
byte digits[12][7] = {
|
||||
{ 0, 1, 1, 1, 1, 1, 1 }, // Digit 0
|
||||
{ 0, 1, 0, 0, 0, 0, 1 }, // Digit 1
|
||||
{ 1, 1, 1, 0, 1, 1, 0 }, // Digit 2
|
||||
{ 1, 1, 1, 0, 0, 1, 1 }, // Digit 3
|
||||
{ 1, 1, 0, 1, 0, 0, 1 }, // Digit 4
|
||||
{ 1, 0, 1, 1, 0, 1, 1 }, // Digit 5
|
||||
{ 1, 0, 1, 1, 1, 1, 1 }, // Digit 6
|
||||
{ 0, 1, 1, 0, 0, 0, 1 }, // Digit 7
|
||||
{ 1, 1, 1, 1, 1, 1, 1 }, // Digit 8
|
||||
{ 1, 1, 1, 1, 0, 1, 1 }, // Digit 9
|
||||
{ 1, 1, 1, 1, 0, 0, 0 }, // Digit *0
|
||||
{ 0, 0, 1, 1, 1, 1, 0 } // Digit C
|
||||
};
|
||||
|
||||
long oldTime = 0;
|
||||
String bicislots = "";
|
||||
String bicis = "";
|
||||
|
||||
String hours = "";
|
||||
String minutes = "";
|
||||
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
||||
WiFiManager wifiManager;
|
||||
wifiManager.autoConnect("ConfigureClock");
|
||||
|
||||
clock.begin();
|
||||
clock.show(); // Initialize all pixels to 'off'
|
||||
colon(clock.Color(255, 255, 255));
|
||||
delay(1000);
|
||||
colorWipe( clock.Color(0, 100, 150), 10);
|
||||
colorWipe( clock.Color(0, 0, 0), 5);
|
||||
getData();
|
||||
displayNumber("99:99", clock.Color(150, 150, 150));
|
||||
}
|
||||
|
||||
void displayNumber(String string, uint32_t color) {
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (i < 2) fillNumber(i, string[i] - 48, color);
|
||||
else fillNumber(i, string[i + 1] - 48, color);
|
||||
}
|
||||
|
||||
if (string[2] == ':') colon(color);
|
||||
else nocolon();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void colon(uint32_t color) {
|
||||
for (int led = 0; led < SEPLEN; led++) {
|
||||
int currentLed = SEGLEN * 14 + led;
|
||||
clock.setPixelColor(currentLed, color);
|
||||
}
|
||||
clock.show();
|
||||
}
|
||||
|
||||
void nocolon() {
|
||||
for (int led = 0; led < SEPLEN; led++) {
|
||||
int currentLed = SEGLEN * 14 + led;
|
||||
clock.setPixelColor(currentLed, 0);
|
||||
}
|
||||
clock.show();
|
||||
}
|
||||
|
||||
void fillNumber(int position, int digit, uint32_t color) {
|
||||
int offset = 0;
|
||||
if (position > 3)return;
|
||||
if (position < 0)return;
|
||||
if (position > 1) offset = SEPLEN;
|
||||
|
||||
for (int seg = 0; seg < 7; seg++) {
|
||||
for (int led = 0; led < SEGLEN; led++) {
|
||||
int currentLed = position * 5 * 7 + seg * 5 + led + offset;
|
||||
if (digits[digit][seg] == 1) {
|
||||
clock.setPixelColor(currentLed, color);
|
||||
} else {
|
||||
clock.setPixelColor(currentLed, clock.Color(0, 0, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void loop() // Main loop
|
||||
{
|
||||
// Check motion sensor
|
||||
// get data and time
|
||||
|
||||
uint32_t c = clock.Color(0, 100, 150);
|
||||
fillNumber(3, 0, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(0, 1, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(1, 2, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(2, 3, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(3, 4, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(0, 5, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(1, 6, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(2, 7, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(3, 8, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
fillNumber(0, 9, c);
|
||||
clock.show();
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
void getData() {
|
||||
HTTPClient https;
|
||||
|
||||
https.begin("https://testing.lbsfilm.at/stations?stationId=93", "1D:62:C5:06:5E:45:51:26:2F:56:A5:BD:E9:5E:F1:33:C8:6C:66:05"); //HTTPS
|
||||
int httpCode = https.GET();
|
||||
|
||||
if (httpCode > 0) {
|
||||
// HTTP header has been send and Server response header has been handled
|
||||
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
|
||||
|
||||
// file found at server
|
||||
if (httpCode == HTTP_CODE_OK) {
|
||||
String payload = https.getString();
|
||||
Serial.println(payload);
|
||||
// Compute optimal size of the JSON buffer according to what we need to parse.
|
||||
// See https://bblanchon.github.io/ArduinoJson/assistant/
|
||||
|
||||
// Allocate a temporary memory pool
|
||||
DynamicJsonBuffer jsonBuffer(650);
|
||||
|
||||
JsonObject& root = jsonBuffer.parseObject(payload);
|
||||
|
||||
if (!root.success()) {
|
||||
Serial.println("JSON parsing failed!");
|
||||
return;
|
||||
}
|
||||
|
||||
Serial.println("JSON parsing SUCCEDED!");
|
||||
const char* bicislotsChar = root["empty_slots"];
|
||||
bicislots = String(bicislotsChar);
|
||||
const char* bicisChar = root["free_bikes"];
|
||||
bicis = String(bicisChar);
|
||||
|
||||
}
|
||||
} else {
|
||||
Serial.printf("[HTTP] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
|
||||
}
|
||||
|
||||
https.end();
|
||||
|
||||
|
||||
oldTime = millis();
|
||||
}
|
||||
|
||||
|
||||
/* LED FX */
|
||||
|
||||
// Fill the dots one after the other with a color
|
||||
void colorWipe(uint32_t c, uint8_t wait) {
|
||||
for (uint16_t i = 0; i < clock.numPixels(); i++) {
|
||||
clock.setPixelColor(i, c);
|
||||
clock.show();
|
||||
delay(wait);
|
||||
}
|
||||
}
|
||||
|
||||
void rainbow(uint8_t wait) {
|
||||
uint16_t i, j;
|
||||
|
||||
for (j = 0; j < 256; j++) {
|
||||
for (i = 0; i < clock.numPixels(); i++) {
|
||||
clock.setPixelColor(i, Wheel((i + j) & 255));
|
||||
}
|
||||
clock.show();
|
||||
delay(wait);
|
||||
}
|
||||
}
|
||||
|
||||
// Slightly different, this makes the rainbow equally distributed throughout
|
||||
void rainbowCycle(uint8_t wait) {
|
||||
uint16_t i, j;
|
||||
|
||||
for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
|
||||
for (i = 0; i < clock.numPixels(); i++) {
|
||||
clock.setPixelColor(i, Wheel(((i * 256 / clock.numPixels()) + j) & 255));
|
||||
}
|
||||
clock.show();
|
||||
delay(wait);
|
||||
}
|
||||
}
|
||||
|
||||
//Theatre-style crawling lights.
|
||||
void theaterChase(uint32_t c, uint8_t wait) {
|
||||
for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
|
||||
for (int q = 0; q < 3; q++) {
|
||||
for (uint16_t i = 0; i < clock.numPixels(); i = i + 3) {
|
||||
clock.setPixelColor(i + q, c); //turn every third pixel on
|
||||
}
|
||||
clock.show();
|
||||
|
||||
delay(wait);
|
||||
|
||||
for (uint16_t i = 0; i < clock.numPixels(); i = i + 3) {
|
||||
clock.setPixelColor(i + q, 0); //turn every third pixel off
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Theatre-style crawling lights with rainbow effect
|
||||
void theaterChaseRainbow(uint8_t wait) {
|
||||
for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel
|
||||
for (int q = 0; q < 3; q++) {
|
||||
for (uint16_t i = 0; i < clock.numPixels(); i = i + 3) {
|
||||
clock.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
|
||||
}
|
||||
clock.show();
|
||||
|
||||
delay(wait);
|
||||
|
||||
for (uint16_t i = 0; i < clock.numPixels(); i = i + 3) {
|
||||
clock.setPixelColor(i + q, 0); //turn every third pixel off
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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 clock.Color(255 - WheelPos * 3, 0, WheelPos * 3);
|
||||
}
|
||||
if (WheelPos < 170) {
|
||||
WheelPos -= 85;
|
||||
return clock.Color(0, WheelPos * 3, 255 - WheelPos * 3);
|
||||
}
|
||||
WheelPos -= 170;
|
||||
return clock.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user