INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bluetooth CoronaClock mit WS2812b LED mit App für Android
17.02.2015, 14:42 (Dieser Beitrag wurde zuletzt bearbeitet: 27.03.2015 21:59 von Wampo.)
Beitrag #1
Big Grin Bluetooth CoronaClock mit WS2812b LED mit App für Android
Und wieder ein Projekt, solangsam werden es viele Baustellen. Smile

Darf ich Vorstellen:
NEO PIXEL CLOCK mit WS2812b LED´s

Das Projekt ist noch lange nicht beendet, sitze so ziemlich jeden Tag dran und Feile an dem Code. Dann mal wieder eine neue Idee zur Animation alle viertel Stunden und schon ist wieder ein Tag rum. Big Grin

Aktuell wird die Uhr nur durch eine DS1307 am laufen gehalten und natürlich durch nen UNO.
Eingegeben werden Uhrzeit und Datum über Serial Commands per Arduino´s SerialMonitor. Später folgt die Abfrage dann über einen DCF77 Empfänger oder manuell an der Uhr.
Die Helligkeit wird über einen LDR in einer Spannungsteilerschaltung gesteuert. AREF Pin benutze ich zum lesen der Referenzspannung 3.3V da 5V fürn Strip weggehen.
Bei den Späteren Updates des Codes werden noch Temperatur-, Barometer-, Datumsanimationen usw. folgen.

Hier noch ein kleines Video zu dem UHR-Prototypen:






Code:
/*
d24.12.2013 -> date: dd.mm.yyyy
t12:10 -> time: hh:mm
c0 -> clock mode: 0,1
o0,0,0 -> off color: r,g,b
h255,0,0 -> hour color: r,g,b
m0,255,0 -> minute color: r,g,b
s0,0,255 -> second color: r,g,b
M100,100,100 -> mark color: r,g,b
b5 -> brightness min: 0...255
B255 -> brightness max: 0...255
a0 -> analog min: 0...1023
A1023 -> analog max: 0...1023
*/
#include <Adafruit_NeoPixel.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307.h>
#include <avr/eeprom.h>
#define PIXEL_12OCLOCK 0 //first pixel (12 o'clock)
#define DATA_PIN 6 //data pin from stripe
#define NUM_PIXEL 60
#define LDR_READ_PIN A0

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float druck;
float temperature;

//Verfeinerung der gelesenen Werte
const int numReadings = 10;          // wieviel LDR Werte
int       readings[numReadings];     // analog input lesen
int       index = 0;                 // index der aktuellen lesung
int       total = 0;                 // Total Runs
int sensorValue = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);
DS1307 rtc; //RTC connected via I2C (SDA+SCL)
typedef struct
{
uint8_t r;
uint8_t g;
uint8_t b;
} COLOR;
typedef struct
{
uint8_t magic; //0xAA
uint8_t clock_mode;
COLOR hour;
COLOR minute;
COLOR second;
COLOR mark;
COLOR off;
uint8_t brightness_min;
uint8_t brightness_max;
uint16_t analog_min;
uint16_t analog_max;
} SETTINGS;
SETTINGS settings;


void setup()
{
Serial.begin(57600);
Serial.println("Go!");
strip.begin();
bmp.begin();
rtc.start();
pinMode(LDR_READ_PIN, INPUT);
analogReference(EXTERNAL);

//read settings from EEPROM
eeprom_read_block((void*)&settings, 0, sizeof(SETTINGS));
if((settings.magic != 0xAA) || (settings.brightness_min >= settings.brightness_max) || (settings.analog_min >= settings.analog_max))
{
//set default settings
settings.magic = 0xAA;
settings.clock_mode = 1;
settings.hour.r = 255;
settings.hour.g = 0;
settings.hour.b = 0;
settings.minute.r = 0;
settings.minute.g = 255;
settings.minute.b = 0;
settings.second.r = 0;
settings.second.g = 0;
settings.second.b = 255;
settings.mark.r = 255;
settings.mark.g = 255;
settings.mark.b = 255;
settings.off.r = 0;
settings.off.g = 0;
settings.off.b = 0;
settings.brightness_min = 10;
settings.brightness_max = 255;
settings.analog_min = 20;
settings.analog_max = 1020;
//write settings to EEPROM
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));

rtc.set(16, 55, 00, 16, 02, 2015); //12:00:00 24.12.2013 (sec, min, hour, day, month, year)
}

for(byte i=0; i<NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel((256 / NUM_PIXEL) * i));
    strip.show();
    delay(25);
  }
}

void set_pixel(uint8_t p, uint8_t r, uint8_t g, uint8_t b) //set pixel p (0...59) with color r,g,b
{
if(p == 255){ p = 59; }
else if(p == 60){ p = 0; }
p = p + PIXEL_12OCLOCK;
if(p >= 60)
{
p -= 60;
}
strip.setPixelColor(p, r, g, b);
}


void set_clock1(uint8_t s, uint8_t m, uint8_t h)
{
  if(h >= 12) { h -= 12; }
  clearStrip();

    
// Positionen berechnen und ausgeben...
    double doubleDisplaySeconds = s;
    setFloatPixelColor(doubleDisplaySeconds, settings.second.r, settings.second.g, settings.second.b);
  
    double doubleDisplayMinutes = (double) m + (doubleDisplaySeconds / 60.0);
    setFloatPixelColor(doubleDisplayMinutes, settings.minute.r, settings.minute.g, settings.minute.b);
  
    double doubleDisplayHours = doubleMap((double) (h * 60.0 + m), 0.0, 12.0 * 60.0, 0.0, 60.0);
    setFloatPixelColor(doubleDisplayHours,settings.hour.r, settings.hour.g, settings.hour.b);
    strip.show();
  }


/**
* Pixelfarben nicht nur auf ganze Pixel setzten, sonder auch "dazwischen".
*/
void setFloatPixelColor(float pos, byte r, byte g, byte b) {
  float anteil = 1.0 - (pos - (int) pos);
  strip.setPixelColor((byte) pos, (byte) ((float) r * anteil), (byte) ((float) g * anteil), (byte) ((float) b * anteil));
  if((byte) pos + 1 != NUM_PIXEL) {  
    strip.setPixelColor(1 + (byte) pos, (byte) ((float) r * (1.0 - anteil)), (byte) ((float) g * (1.0 - anteil)), (byte) ((float) b * (1.0 - anteil)));
  }
  else {
    strip.setPixelColor(0, (byte) ((float) r * (1.0 - anteil)), (byte) ((float) g * (1.0 - anteil)), (byte) ((float) b * (1.0 - anteil)));
  }
}


/**
* Map-Funktion fuer Double-Werte.
*/
double doubleMap(double x, double in_min, double in_max, double out_min, double out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}


void set_clock2(uint8_t s, uint8_t m, uint8_t h)
{
uint8_t i;
if(h >= 12) { h -= 12; }

clearStrip();

//set hour
for(i=0; i<60; i++)
{
if(i == ((h*5)+(m/12)))
{
set_pixel(i-1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
set_pixel(i+0, settings.hour.r, settings.hour.g, settings.hour.b);
set_pixel(i+1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
}
}

//set second and minute
for(int i=0; i<60; i += 15) {
        strip.setPixelColor(i, settings.mark.r/4, settings.mark.g/4,settings.mark.b/4);
      }
for(i=0; i<60; i++)
{
if(i == s)
{
set_pixel(i, settings.second.r, settings.second.g, settings.second.b);
}
else if(s == m)
{
set_pixel(s, (settings.second.r+settings.minute.r), (settings.second.g+settings.minute.g), (settings.second.b+settings.minute.b));
}
else if(i == m)
{
set_pixel(i, settings.minute.r, settings.minute.g, settings.minute.b);
}
}

strip.show();
}

void loop()
{
int c, i, r, g, b;
int s, m, h, day, month, year;
unsigned long ms;
static unsigned int last_analog=0;
static unsigned long ms_clock=0, ms_ldr=0;
char tmp[32];


if (( m == 15 || m == 30 || m == 45) && s == 0)
{

  int L;
  for(int j=0;j<(4*((m+1)/2));j++) {
    for(int i=0;i<(m+1);i++) {
      L=(m+1)-i-1;
      if ( ((i+j) % ((m+1)/2)*2) <(m+1)/2)
        strip.setPixelColor(L,0,0,255);
      else
        strip.setPixelColor(L,255,255,255);
       }
    strip.show();
    delay(25);
  }
}

else if ((m == 00 && s == 00))
{
  for(byte i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
  rainbowCycle(4,3); //durchläufe, geschwindigkeit
  
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
    delay(25);
  }
  for(byte i = 0; i < NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
}

//current milliseconds since power on
ms = millis();
//get time from RTC and set LEDs
if((ms - ms_clock) > 1000)
{
ms_clock = ms;
rtc.get(&s, &m, &h, &day, &month, &year);

if(settings.clock_mode == 0)
{
set_clock1(s, m, h);
}
else
{
set_clock2(s, m, h);
}
}

//check light intensity (LDR)
if((ms - ms_ldr) > 50) //every ??? msek
{
ms_ldr = ms;
total = total - readings[index];        
  readings[index] = analogRead(LDR_READ_PIN);
  // add the reading to the total:
  total = total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    
  // if we're at the end of the array...
  if (index >= numReadings)              
    // ...wrap around to the beginning:
    index = 0;                          
  // calculate the average:
  sensorValue = total / numReadings;
  i = map(sensorValue, 0, 1024, 0, 255);  
  
  
if(i < settings.analog_min)
{
i = settings.brightness_min;
}
else if(i > settings.analog_max)
{
i = settings.brightness_max;
}
else
{
i = ((i-settings.analog_min) / ((settings.analog_max-settings.analog_min)/(settings.brightness_max-settings.brightness_min))) + settings.brightness_min;
}
strip.setBrightness(i); //0...255
strip.show();
}

//check serial data
if(Serial.available() > 1)
{
//read serial data
for(i=0; (Serial.available()>0) && (i<31);)
{
tmp[i++] = Serial.read();
tmp[i] = 0;
delay(10); //wait to receive data
}
//get current time and date
rtc.get(&s, &m, &h, &day, &month, &year);
//interpret commands
c = 0;
switch(tmp[0])
{
case 'd': //date
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &day, &month, &year))
{
c = 1; //set rtc

}
break;
case 't': //time
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &h, &m, &s))
{
c = 1; //set rtc

}
break;
case 'o': //off color
case 'h': //hour color
case 'm': //minute color
case 's': //second color
case 'M': //mark color
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &r, &g, &b))
{
switch(tmp[0])
{
case 'o':
settings.off.r = r;
settings.off.g = g;
settings.off.b = b;
break;
case 'h':
settings.hour.r = r;
settings.hour.g = g;
settings.hour.b = b;
break;
case 'm':
settings.minute.r = r;
settings.minute.g = g;
settings.minute.b = b;
break;
case 's':
settings.second.r = r;
settings.second.g = g;
settings.second.b = b;
break;
case 'M':
settings.mark.r = r;
settings.mark.g = g;
settings.mark.b = b;
break;
}
c = 2; //save settings
}

break;
case 'c': //clock mode
case 'b': //brightness min
case 'B': //brightness max
case 'a': //analog min
case 'A': //analog max
if(sscanf(&tmp[1], "%d", &i))
{
switch(tmp[0])
{
case 'c': settings.clock_mode = i; break;
case 'b': settings.brightness_min = i; break;
case 'B': settings.brightness_max = i; break;
case 'a': settings.analog_min = i; break;
case 'A': settings.analog_max = i; break;
}
c = 2; //save settings
}

break;
}

if(c == 1) //set RTC/clock
{
rtc.set(s, m, h, day, month, year);
}
else if(c == 2) //write settings to EEPROM
{
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));
}
//clear serial buffer
Serial.flush();
}
}



//Licht-Effekte-------------------------------------------------------------------
void CandyCane  (int sets,int width,int wait) {
  int L;
    for(int j=0;j<(sets*width);j++) {
    for(int i=0;i< strip.numPixels();i++) {
      L=strip.numPixels()-i-1;
      if ( ((i+j) % (width*2) )<width)
        strip.setPixelColor(L, 255, 0, 0);
      else
        strip.setPixelColor(L, 0 , 0, 255);
    }  
    strip.show();
    delay(wait);
  }
}

void rainbowCycle(uint8_t sets, uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*sets; j++) { //cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(strip.numPixels()-i-1, wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}


//-----------------------------------------------------------------------------------

//Unterprogramme---------------------------------------------------------------------
void tempdruck() {

  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure  + ( 509 / 8.5 ); // höhe 509
  bmp.getTemperature(&temperature);
  clearStrip();
  strip.show();
   int d = map(druck, 970, 1040, 0, 29);
    for(uint16_t R= 0; R<d; R++) {
      strip.setPixelColor(29-R,wheel(((R*3) & 255)));
   }
  int t = map(temperature, 10, 40, 0, 29);
    for(uint16_t L = 0; L<t; L++) {
      strip.setPixelColor(31+L,wheel(((165-(L*3)) & 255)));
  }
  strip.show();
    delay(5000);
}
//-----------------------------------------------------------------------------------

//R-G-B Farbrad-----------------------------------------------------------------------
uint32_t wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void clearStrip(){
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
  }
}

Danke fürs Lesen und Bewerten Wink
Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 02:13 (Dieser Beitrag wurde zuletzt bearbeitet: 11.03.2015 02:14 von Wampo.)
Beitrag #2
Lightbulb RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
Ohhh jeee, was hab ich nur angestellt, ich hab nächte damit verbracht mir Sensoren für Arduino anzugucken. Big Grin

Ja und so wächst ein Projekt immer weiter. Die Uhr bleibt nicht die Uhr, das ding wird Komplexer als ich dachte.

Momentan ist ja nur ein RTC Modul und ein LDR verbaut, was ja im grunde genommen vollkommen aureichend für eine NORMALE Uhr ist.
Ja das liebe China weiß halt was ich alles noch so will, es werden jetzt noch einige sachen hinzukommen.

*DCF77 Funkmodul zum abfragen und stellen der Exakten Uhrzeit ( ca. 3 Uhr aufd nacht)
*Bluetooth Modul, kontrolle übers Handy (dazu dann eine Simple App geschrieben) und darüber verschiedene Programme anwählbar
*Soundsensor für ein VU Equalizer
*Luftqualitätsmodul, wie der name schon sagt, um die Luftqualität sich Anzeigen zu lassen
*BMP085 für Luftdruck und Temperaturanzeige

Bin selber gespannt wie ich das alles unterbring, ich hoffe doch mir platzt nicht der Speicher aus allen Pins Big Grin

Werde wieder weiter berichten sobald sich das hier weiterentwickelt. Das DCF77 modul hab ich bereits allerdings weiß ich noch nicht so recht wie ich die Abgefragte Zeit an die RTC übergeben kann das diese dann mit der DCF Zeit weiterläuft. HILFE ist erwünscht.

Am Interessantesten wird denke ich mal die Bluetoothanbindung.

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 09:34
Beitrag #3
RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
Ich kann Dir bei der Software nicht helfen, aber hätte noch einen Vorschlag zur Hardware:

http://www.elv.de/real-time-clock-dcf-mo...usatz.html

Auf der Seite wird auch eine Demo Software angeboten. Vielleicht kannst Du damit ja etwas anfangen?

Oder Man nimmt statt des DS1307 einen DS3231 und lässt das DCF77 Modul weg. Die sollen ziemlich genau gehen. Abweichung pro Jahr irgend etwas um 1 Minute.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 11:53
Beitrag #4
RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
Hy,

@Kurti:

ich muss ganz ehrlich sagen diese 1/4 Kreise von Adafruit sind preislich reiner wucher, was so ziemlich für alles von Adafruit zutrifft, vieles und in gleicher qualität kriegste aus dem besagtem Shenzhen (das Mekka der Elektronik) für lau!!! Funktionieren tut das mit den viertelkreisen natürlich auch, auch vom Datenprotokoll her ebenfalls alles das gleiche weil die gleichen LED Typen verbaut sind wie auf dem Strip.

Ich hab mich bei meiner Uhr für die WS2812b LED Strip mit 60LED´s/meter entschiedenen, weil ich nicht wollte das mich die LED´s wie bei dem Ring direkt anstrahlen sondern eher zur seite der Wand entlang. Aber das is ja jedem selber überlassen. Ich glaube auch das der 4/4 Led Ring nicht ganz so groß sein wird zum schluss, meine Uhr hat ca 32cm Durchmesser. Soll ja dann noch alles ein Plexiglas verpackt werden und pi pa po....


@ Gelegenheitsbastler:

das witzige an dem ganzen ist ja das ich bereits die RTC DS3231 verwende nur bin ich mit sämtlichen Library´s dafür gescheitert, keine hat wirklich funktioniert bzw. hat irgendwann faxen gemacht, also hab ich mich mal durch die verschiedenen libs probiert und die DS1307 Library im zusammenspiel mit der DS3231 RTC läuft alles gut und ich kann auch jegliche Keywords benutzen, was bei den anderen nicht möglich war.

Du hast mit dem weglassen der DCF teilweise recht, ich will einfach nicht wieder über den Serial Monitor die Uhr nachstellen (Zeitumstellung und so) wenn das teil mal an der Wand hängt und ausserdem wenn es DCF77 gibt dann wirds auch verbaut und genutzt, warum einfach wenns auch komplex geht Tongue.
Bei der DS3231 geb ich dir allerdings recht , einmal eingestellt und das teil läuft fast ohne abweichung, und wenn der saft mal weg ist dann hast immernoch ne Pufferbatterie drauf.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.03.2015, 20:25
Beitrag #5
RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
Okay, von welchem ebay händler sind deine ringstücke?

Über shenzhen bei ebay hab da so meine spezialisten und ich wähle bei der suche generell nur ausland!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2015, 01:45 (Dieser Beitrag wurde zuletzt bearbeitet: 12.03.2015 01:57 von Wampo.)
Beitrag #6
RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
hehe, nein ein geheimniss nicht wirklich, aber warum soll ich das zeug in deutschland kaufen wenn ichs vom ausland aus teilweise 90% billiger bekomm.
Nur zum Bleistift:

shinestar2014 (Shenzhen)
lenantoday (Hong Kong)
either.deal

Meistens aktivier ich die Filter bei ebay im Vorraus schon das mir nur HK oder GB Artikel angezeigt werden. Bestelle nun schon ca. 4 jahre über solche Shops. Bei richtig harten zeiten kommen bei mir schon mal jeden tag eins zwei Luftpolsterumschläge an. Bis jetzt musste ich auch nur zwei mal beim Zoll antanzen, weils Falsch Deklariert war.

Kann nur gutes wieder geben, auch wenns mal kaputt ist oder nicht ankommt, die sind meistens so freundlich und schicken ohne große fragerei gleich nochmal eins raus.


Ahh sorry dachte du hattest die Adafruit weil ich die noch bei keinem anderen gesehen hab.
Bei Robothome kann ich nix bestellen da die nich nach DE liefern, wie auch immer.

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.03.2015, 15:05 (Dieser Beitrag wurde zuletzt bearbeitet: 12.03.2015 15:09 von Wampo.)
Beitrag #7
RE: Neo Pixel Blinken Clock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
Optisch verpacken werde ich die Uhr auf Sandgetrahltem Plexiglas, so das wirklich nur noch die Farben an der Wand sichtbar sind und leicht am Rand der Uhr aufs Plexiglas schimmern. Dazu werd ich ein Plexiglasstreifen warm machen und rund Biegen so das ich den Strip herrumkleben kann und oben drauf kommt nur die Gestrahlte runde Plexischeibe so das der Strip nicht mehr zu sehen ist.

So wie du die Uhr gerade siehst sieht se auch von hinten aus Wink die Drei kabel laufen gerade noch aufs Breadboard und sind nur fürn Strip da.

Wenn ich alles zusammen hab an Sensoren dann werd ich ne Lochraster zusammen Löten wo alles drauf ist und in die Uhr passt.

Ich werde die Uhr weder beschriften noch gravieren mit Ziffern, die soll wirklich komplett Clean bleiben.

Temperatur und Druck wird z.b. so Angezeigt:

Temperatur Links von unten nach oben, Farblicher übergang von Blau auf Rot (unterste LED bei MIN 31 = 15°C, oberste LED bei MIN 59 = 40°C)
Druck von Rechts unten nach oben, Farblicher übergang von Rot auf Grün (unterste LED bei MIN 29 = 980hPa, oberste LED bei MIN 01 = 1050hPa)

   

Hab mich gestern noch dran gesetzt und mir die Bluetooth App gebastelt mit der dann die verscheidenen Programme auf den Bluetoothempfänger übertragen werden und von der Uhr im Programm per String Command ausgewertet wird. Wie das im einzelnen dann aussieht weiß ich noch nicht, aber die App funktioniert schon mal tip top. Is zwar noch recht simpel aufgebaut, bekommt aber iwann wenn alles einwandfrei funktioniert noch n komplettes Redesign.
   

Wie gesagt keine Markierungen, ich hab über Software mir Viertel Std marker in Weiß und 1/4 Dunkler gesetzt.
   

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.03.2015, 21:55 (Dieser Beitrag wurde zuletzt bearbeitet: 28.03.2015 22:05 von Wampo.)
Beitrag #8
RE: Bluetooth CoronaClock mit WS2812b LED, Video im Beitrag, Nachbau erwünscht
So, endlich ist es soweit, Bluetooth ist integriert.
V1.0.5 is da, leider noch nicht alle Sensoren, da mir das aber zu lange dauert bis die kommen, schieb ich schon mal die Betaversion raus.

Es kann nun über Bluetooth das jeweilige Programm angewählt werden welches dann auf der CoronaClock Visualisiert wird.
Die dazugehörige App für Androidnutzer gibts auf Anfrage: daniel_agocs@yahoo.de

Hier ein paar ausschnitte oder auch Leckerbissen:

Die Android App
   

Verschiedene Modi
Normale Uhr mit 1/4 Std Marker
   

Stundenanimation und Moodlight
   

Temperatur(links) und Barometer(rechts)
   

und hier der Code

Code:
/*
Corona Clock by Daniel Agocs

V1.0: Fehler in der Ausgabe des Brightnesswertes = Wurde angepasst nun werden die vom LDR gelesenen Werte 0-1024 auf 0-255 richtig aufgerechnet
V1.0.5: Vorversion: Bluetoothverbindung & Eingabemöglichkeit über dafür geschriebene App (Android), App-Anfrage über: daniel_agocs@yahoo.de, kleine Bugfixes
*/


/*
d24.12.2013 -> date: dd.mm.yyyy
t12:10 -> time: hh:mm
c0 -> clock mode: 0,1,2,3,4,5,6
o0,0,0 -> off color: r,g,b
h255,0,0 -> hour color: r,g,b
m0,255,0 -> minute color: r,g,b
s0,0,255 -> second color: r,g,b
M100,100,100 -> mark color: r,g,b
b5 -> brightness min: 0...255
B255 -> brightness max: 0...255
a0 -> analog min: 0...1023
A1023 -> analog max: 0...1023
*/
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); //RX || TX
#include <Adafruit_NeoPixel.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307.h>
#include <avr/eeprom.h>
#define PIXEL_12OCLOCK 0 //first pixel (12 o'clock)
#define DATA_PIN 6 //data pin from stripe
#define NUM_PIXEL 60
#define LDR_READ_PIN A0
#define AIRQ_READ_PIN A1

Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float druck;
float temperature;

//Verfeinerung der gelesenen Werte
const int numReadings = 5;          // wieviel LDR Werte
int       readings[numReadings];     // analog input lesen
int       index = 0;                 // index der aktuellen lesung
int       total = 0;                 // Total Runs
int sensorValue = 0;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXEL, DATA_PIN, NEO_GRB + NEO_KHZ800);
DS1307 rtc; //RTC connected via I2C (SDA+SCL)
typedef struct
{
uint8_t r;
uint8_t g;
uint8_t b;
} COLOR;
typedef struct
{
uint8_t magic; //0xAA
uint8_t clock_mode;
COLOR hour;
COLOR minute;
COLOR second;
COLOR mark;
COLOR off;
uint8_t brightness_min;
uint8_t brightness_max;
uint16_t analog_min;
uint16_t analog_max;
} SETTINGS;
SETTINGS settings;


void setup()
{
BT.begin(9600);  
strip.begin();
bmp.begin();
rtc.start();
pinMode(LDR_READ_PIN, INPUT);
analogReference(EXTERNAL);

//read settings from EEPROM
eeprom_read_block((void*)&settings, 0, sizeof(SETTINGS));
if((settings.magic != 0xAA) || (settings.brightness_min >= settings.brightness_max) || (settings.analog_min >= settings.analog_max))
{
//set default settings
settings.magic = 0xAA;
settings.clock_mode = 1;
settings.hour.r = 255;
settings.hour.g = 0;
settings.hour.b = 0;
settings.minute.r = 0;
settings.minute.g = 255;
settings.minute.b = 0;
settings.second.r = 0;
settings.second.g = 0;
settings.second.b = 255;
settings.mark.r = 255;
settings.mark.g = 255;
settings.mark.b = 255;
settings.off.r = 0;
settings.off.g = 0;
settings.off.b = 0;
settings.brightness_min = 5;
settings.brightness_max = 255;
settings.analog_min = 20;
settings.analog_max = 1024;
//write settings to EEPROM
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));

rtc.set(16, 55, 00, 16, 02, 2015); //12:00:00 24.12.2013 (sec, min, hour, day, month, year)
}

for(byte i=0; i<NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel((256 / NUM_PIXEL) * i));
    strip.show();
    delay(25);
  }
}

void set_pixel(uint8_t p, uint8_t r, uint8_t g, uint8_t b) //set pixel p (0...59) with color r,g,b
{
if(p == 255){ p = 59; }
else if(p == 60){ p = 0; }
p = p + PIXEL_12OCLOCK;
if(p >= 60)
{
p -= 60;
}
strip.setPixelColor(p, r, g, b);
}

void set_clock1(uint8_t s, uint8_t m, uint8_t h)
{
uint8_t i;
if(h >= 12) { h -= 12; }

clearStrip();

//set hour
for(i=0; i<60; i++)
{
if(i == ((h*5)+(m/12)))
{
set_pixel(i-1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
set_pixel(i+0, settings.hour.r, settings.hour.g, settings.hour.b);
set_pixel(i+1, settings.hour.r/2, settings.hour.g/2, settings.hour.b/2);
}
}

//set second and minute
for(int i=0; i<60; i += 15) {
        strip.setPixelColor(i, settings.mark.r/4, settings.mark.g/4, settings.mark.b/4);
      }
for(i=0; i<60; i++)
{
if(i == s)
{
set_pixel(i, settings.second.r, settings.second.g, settings.second.b);
}
else if(s == m)
{
set_pixel(s, (settings.second.r+settings.minute.r), (settings.second.g+settings.minute.g), (settings.second.b+settings.minute.b));
}
else if(i == m)
{
set_pixel(i, settings.minute.r, settings.minute.g, settings.minute.b);
}
}

strip.show();
}

void loop()
{
int c, i, r, g, b;
int s, m, h, day, month, year;
unsigned long ms;
static unsigned int last_analog=0;
static unsigned long ms_clock=0, ms_ldr=0;
char tmp[32];



if (( m == 15 || m == 30 || m == 45) && s == 0)
{

  int L;
  for(int j=0;j<(4*((m+1)/2));j++) {
    for(int i=0;i<(m+1);i++) {
      L=(m+1)-i-1;
      if ( ((i+j) % ((m+1)/2)*2) <(m+1)/2)
        strip.setPixelColor(L,0,0,255);
      else
        strip.setPixelColor(L,255,255,255);
       }
    strip.show();
    delay(25);
  }
}

else if ((m == 00 && s == 00))
{
  for(byte i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
  rainbowCycle(4,3); //durchläufe, geschwindigkeit
  
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
    strip.show();
    delay(25);
  }
  for(byte i = 0; i < NUM_PIXEL; i++) {
    clearStrip();
    strip.setPixelColor(i, wheel(((256 / NUM_PIXEL)* i)*255)+5);
    strip.show();
    delay(25);
  }
}


//current milliseconds since power on
ms = millis();
//get time from RTC and set LEDs
if((ms - ms_clock) > 1000)
{
ms_clock = ms;
rtc.get(&s, &m, &h, &day, &month, &year);

//Programmauswahl was über BT angewählt wurde
switch(settings.clock_mode){

case 0:
clearStrip();   //Uhr aus, Strip hat keine Anzeige
break;

case 1:
set_clock1(s, m, h);   //Standart Uhr Anzeige
break;

case 2:
tempdruck();    //Temperatur und Druckanzeige
break;

case 3:
set_clock1(s, m, h);    //Luftqualitätsanzeige
break;

case 4:
CandyCane(10,10,26);     //VU Meter
break;

case 5:
rainbowCycle(1,15);            //Moodlight
break;
}
}

//check light intensity (LDR)
if((ms - ms_ldr) > 50) //every ??? msek
{
ms_ldr = ms;
total = total - readings[index];        
  readings[index] = analogRead(LDR_READ_PIN);
  // add the reading to the total:
  total = total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    
  // if we're at the end of the array...
  if (index >= numReadings) {            
    // ...wrap around to the beginning:
    index = 0; }                          
  // calculate the average:
  i = total / numReadings;
    
if(i < settings.analog_min)
{
i = settings.brightness_min;
}
else if(i > settings.analog_max)
{
i = settings.brightness_max;
}
else
{
i = ((i-settings.analog_min) / ((settings.analog_max-settings.analog_min)/(settings.brightness_max-settings.brightness_min))) + settings.brightness_min;
}
strip.setBrightness(i); //0...255
strip.show();
}


//check serial data
if(BT.available() > 1)
{
//read serial data
for(i=0; (BT.available()>0) && (i<31);)
{
tmp[i++] = BT.read();
tmp[i] = 0;
delay(5); //wait to receive data
}
//get current time and date
rtc.get(&s, &m, &h, &day, &month, &year);
//interpret commands
c = 0;
switch(tmp[0])
{
case 'd': //date
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &day, &month, &year))
{
c = 1; //set rtc

}
break;
case 't': //time
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &h, &m, &s))
{
c = 1; //set rtc

}
break;
case 'o': //off color
case 'h': //hour color
case 'm': //minute color
case 's': //second color
case 'M': //mark color
if(sscanf(&tmp[1], "%d%*c%d%*c%d", &r, &g, &b))
{
switch(tmp[0])
{
case 'o':
settings.off.r = r;
settings.off.g = g;
settings.off.b = b;
break;
case 'h':
settings.hour.r = r;
settings.hour.g = g;
settings.hour.b = b;
break;
case 'm':
settings.minute.r = r;
settings.minute.g = g;
settings.minute.b = b;
break;
case 's':
settings.second.r = r;
settings.second.g = g;
settings.second.b = b;
break;
case 'M':
settings.mark.r = r;
settings.mark.g = g;
settings.mark.b = b;
break;
}
c = 2; //save settings
}

break;
case 'c': //clock mode
case 'b': //brightness min
case 'B': //brightness max
case 'a': //analog min
case 'A': //analog max
if(sscanf(&tmp[1], "%d", &i))
{
switch(tmp[0])
{
case 'c': settings.clock_mode = i; break;
case 'b': settings.brightness_min = i; break;
case 'B': settings.brightness_max = i; break;
case 'a': settings.analog_min = i; break;
case 'A': settings.analog_max = i; break;
}
c = 2; //save settings
}

break;
}

if(c == 1) //set RTC/clock
{
rtc.set(s, m, h, day, month, year);
}
else if(c == 2) //write settings to EEPROM
{
eeprom_write_block((void*)&settings, 0, sizeof(SETTINGS));
}
//clear serial buffer
BT.flush();
}


}



//Licht-Effekte-------------------------------------------------------------------
void CandyCane  (int sets,int width,int wait) {
  int L;
    for(int j=0;j<(sets*width);j++) {
    for(int i=0;i< strip.numPixels();i++) {
      L=strip.numPixels()-i-1;
      if ( ((i+j) % (width*2) )<width)
        strip.setPixelColor(L, 0, 0, 255);
      else
        strip.setPixelColor(L, 255, 255, 255);
    }  
    strip.show();
    delay(wait);
  }
}

void rainbowCycle(uint8_t sets, uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*sets; j++) { //cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(strip.numPixels()-i-1, wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}


//-----------------------------------------------------------------------------------

//Unterprogramme---------------------------------------------------------------------
void tempdruck() {

  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure  + ( 509 / 8.5 ); // höhe 509
  bmp.getTemperature(&temperature);
  clearStrip();
   int d = map(druck, 970, 1040, 0, 29);
    for(uint16_t R= 0; R<d; R++) {
      strip.setPixelColor(29-R,wheel(((R*3) & 255)));
   }
  int t = map(temperature, 15, 35, 0, 29);
    for(uint16_t L = 0; L<t; L++) {
      strip.setPixelColor(31+L,wheel(((170+(L*6)) & 255)));
  }
  strip.setPixelColor(30, 255,255,255);
  strip.show();
  }
//-----------------------------------------------------------------------------------

//R-G-B Farbrad / Pixelhelpers-------------------------------------------------------
uint32_t wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

void clearStrip(){
  for(int i = 0; i < NUM_PIXEL; i++) {
    strip.setPixelColor(i, 0);
  }
}

Das Schwierigste kommt aber leider erst noch Sad jetzt muss das DCF77 Modul noch eingepflegt werden so das es auch ersten mit dem Funk Synchronisiert und nach dem erfolgreichen Syncen dann auch noch die Uhrzeit Exakt in die RTC schreibt. Nur hab ich da noch keine Ahnung wie genau das passieren soll. Huh

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  WS2812b Matrix CrazyHawk 9 1.343 31.08.2016 12:58
Letzter Beitrag: Binatone
  PS2/USB to Bluetooth Adapter für Tastatur und Maus tegg 5 1.479 17.09.2015 14:06
Letzter Beitrag: HaWe
  Hilfe bei Bluetooth Taster Street 14 2.812 11.09.2015 20:07
Letzter Beitrag: hotsystems
Rainbow neue Lib: generischer Android Controller für Arduino bachi76 6 2.091 10.07.2015 10:57
Letzter Beitrag: bachi76
  Hilfe bei Bluetooth controlled robot Arduino car usert23 5 2.622 11.06.2015 08:32
Letzter Beitrag: Thorsten Pferdekämper
Lightbulb LED Thermometer über WS2812b LED und Dallas DS18B20 Wampo 2 1.736 15.03.2015 17:45
Letzter Beitrag: Wampo
Lightbulb HC-SR4 Ultraschall Abstands Ampel mit WS2812b Pixel LED´s Wampo 0 1.743 14.03.2015 18:40
Letzter Beitrag: Wampo
  vorbereitung für spectrum analyzer speziell ws2812b nighty2006 16 4.450 28.02.2015 13:29
Letzter Beitrag: nighty2006
  Bluetooth und iphone Workout 1 1.364 26.01.2015 16:47
Letzter Beitrag: Thorsten Pferdekämper
Lightbulb Hexacopter LED mit RC Empfänger und WS2812B LED Wampo 9 3.379 02.01.2015 14:17
Letzter Beitrag: Wampo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste