Go Down

Topic: Neopixel Uhr  (Read 807 times) previous topic - next topic

Mickat1427

Dec 11, 2017, 08:32 pm Last Edit: Dec 11, 2017, 08:38 pm by Mickat1427
Hallo,

Mein Name ist Micha und ich bin 30 Jahre alt.
Ich beschäftige mich schon einige Zeit mit Arduino und würde gerne mit einem Wemos D1 mini eine Neopixel Uhr mit NTP Anfrage basteln und benutze folgenden Code :

Code: [Select]



#include <NtpClientLib.h>

#include <ESP8266WiFi.h>

#include <DNSServer.h>

#include <ESP8266WebServer.h>

#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager WiFi Configuration Magic

#include <Adafruit_NeoPixel.h>


#define NUMPIXELS 60 // number of NeoPixel LEDs

#define PIN 2 // digital pin on ESP8266 for the NeoPixel data line

#define mirror_hands true // In case the NeoPixel ring is wired ant-clockwise.


byte hour_hand, minute_hand, second_hand, previous_second;


Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


// clear all the leds to off

void clearHands() {

  for (byte i=0; i<=NUMPIXELS;i++) {

    pixels.setPixelColor(i,pixels.Color(0,0,0));

  }

}


void drawHands(){

  clearHands();

  

  pixels.setPixelColor(hour_hand,pixels.Color(100,0,0));

  // if hour and minute are the same led, use a different color to show that

  if (hour_hand==minute_hand) {

    pixels.setPixelColor(minute_hand,pixels.Color(100,100,0));

  } else {

    pixels.setPixelColor(minute_hand,pixels.Color(0,100,0));

  }


  // draw the second LED, using medium brightness white

  pixels.setPixelColor(second_hand,pixels.Color(100,100,100));


  // show all the LED's, only the ones we have set with a color will be visible.

  pixels.show();


  // just a debug string, can be removed

  Serial.printf("hour:%d (%d), minute:%d second:%d (%d) \n",hour(),hour_hand,minute_hand,true_second,second_hand);

}


void setup() {

  Serial.begin(115200);

  WiFiManager wifiManager; // wifi configuration wizard

  wifiManager.autoConnect("NeoPixel_Clock", "secret"); // configuration for the access point, set your own secret.

  Serial.println("WiFi Client connected!)");

  NTP.begin("es.pool.ntp.org", -8, true); // get time from NTP server pool.

  NTP.setInterval(63);

  pixels.begin();

  pixels.setBrightness(254);

}


void loop() {

  byte hour_offset;

  

  minute_hand=minute();

  if (minute_hand>=10) {

    hour_offset=(minute_hand / 10)-1;

  }else

  {

    hour_offset=0;

  }

  

  if (hour() >= 12) {

    hour_hand = ((hour() - 12) * 5) + hour_offset;

  }

  else {

    hour_hand = (hour() * 5) + hour_offset;

  }

  

  if (mirror_hands) {

    hour_hand=60-hour_hand;

    minute_hand=60-minute_hand;

    second_hand=(60-second());

    if (second_hand==60) {

      second_hand=0;

    }

    if (minute_hand==60) {

      minute_hand=0;

    }

    if (hour_hand==60) {

      hour_hand=0;

    }

  } else {

    second_hand=second();

  }

  

  if (second_hand!=previous_second) {

    previous_second=second_hand;

    drawHands();

  }

}



Ich benutze ein 24er Neopixel Ring Clone.

Der Code läuft auch gut, allerdings ist er für ein 60er ring programmiert.

Ich würde gerne wissen wie man den Code ändern kann, das dieser auf mein 24er Ring richtig angezeigt wird.

Ich würde mich freuen wenn ihr mir helfen könntet.

Mit freundlichen Grüßen Micha.

Mickat1427

Danke für den Vorschlag.

Werde ich nachher mal testen wenn ich Zeit habe und werde dann Rückmeldung geben.

Mfg Micha

Mickat1427

#define NUMPIXELS 24 // number of NeoPixel LEDs



und probierst halt mal was passiert wenn

Code: [Select]
    hour_hand=60-hour_hand;

    minute_hand=60-minute_hand;

    second_hand=(60-second());



in

Code: [Select]
    hour_hand=24-hour_hand;

    minute_hand=24-minute_hand;

    second_hand=(24-second());



änderst.
Ich hab es mal getestet. Es fehlen immer noch 36 Sekunden.  Also er geht 24 Sekunden rum und dann ist dunkel und bei 0 Sekunden leuchtet er wieder.

Mickat1427

Wieder läuft der 60 LEDs ab statt 24...


Ich verstehe das nicht:(

Mickat1427

Ja das hab ich geändert ^^

Dennoch recht herzlichen Dank für deine mühe.

Der ring ist ja gegen den Uhrzeigersinn verkabelt. Aber der Sketch löst ja das problem.

MaHa76

Ich habe mal einen Code für eine solche Uhr selbst gebastelt, statt einen dieser abstrakten Vorlagen zu verwenden.

Als erstes mußt du dir überlegen, wie du die Stunden, Minuten und Sekunden umrechnen mußt, damit es dir entsprechend mit den 24 LEDs angezeigt werden kann.

Die Stunden hast du in 24h- Format vorliegen, willst sie aber wahrscheinlich in 12h Format anzeigen- da kannst du im ersten Schritt für alle Werte die größer als 12 sind einfach 12 abziehen.

Dann hast du noch alles auf deine 24- LEDs umrechnen, die Minuten und Sekunden springen also alle 2,5min/sek eine LED weiter, die Stunden alle 30min.

Das ganze kannst du in eine for- Schleife einbauen, wo du dann der jeweiligen LED eine Farbe zuordnen kannst.

nur mal sinngemäß:

Code: [Select]
for ( int i=0; 0<24; i++ )
        { if ( i == Sekunde/2.5 ) { leds[i] = CRGB(255,0,0); }
           if ( i == Minute/2.5 ) { leds[i] = CRGB(0,255,0); }
           if ( i == Stunde * 2 ) { leds[i] = CRGB(0,0,255); } }

agmue

#6
Dec 12, 2017, 06:13 pm Last Edit: Dec 13, 2017, 10:16 am by agmue
Anstelle ESP8266 nehme ich einen Nano mit millis() als Zeitbasis und Neopixel werden durch Dotstar (APA102) ersetzt. Dann ergibt sich aus vorangegangenen Anregungen folgender Testsketch:

Code: [Select]
#include <Adafruit_DotStar.h>
#include <SPI.h>         // COMMENT OUT THIS LINE FOR GEMMA OR TRINKET

#define NUMPIXELS 24 // Number of LEDs in strip
#define HELLIKKEIT 50
// 100 anstelle 1000 beschleunigt die Anzeige
#define TAUSEND 1000
// Hardware SPI is a little faster, but must be wired to specific pins
// (Arduino Uno = pin 11 for data, 13 for clock, other boards are different).
Adafruit_DotStar pixels = Adafruit_DotStar(NUMPIXELS, DOTSTAR_BRG);

#define mirror_hands true // In case the NeoPixel ring is wired ant-clockwise.
uint32_t aktmillis;
byte hour_hand, minute_hand, second_hand, previous_second;

// clear all the leds to off
void clearHands() {
  for (byte i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));
  }
}

void drawHands() {
  clearHands();
  pixels.setPixelColor(hour_hand, pixels.Color(HELLIKKEIT, 0, 0));
  // if hour and minute are the same led, use a different color to show that
  if (hour_hand == minute_hand) {
    pixels.setPixelColor(minute_hand, pixels.Color(HELLIKKEIT, HELLIKKEIT, 0));
  } else {
    pixels.setPixelColor(minute_hand, pixels.Color(0, HELLIKKEIT, 0));
  }
  // draw the second LED, using medium brightness white
  pixels.setPixelColor(second_hand, pixels.Color(HELLIKKEIT, HELLIKKEIT, HELLIKKEIT));
  // show all the LED's, only the ones we have set with a color will be visible.
  pixels.show();
  // just a debug string, can be removed
  char buf[70];
  snprintf(buf, sizeof(buf), "millis: %lu, hour:%d, minute:%d (%d), second:%d (%d)", aktmillis, hour_hand, minute(), minute_hand, second(), second_hand);
  Serial.println(buf); // print date and time
}

void setup() {
  Serial.begin(9600);
  pixels.begin();
  pixels.setBrightness(96);
  pixels.show();  // Turn all LEDs off ASAP
}

void loop() {
  aktmillis=millis();
  minute_hand = minute() / 2.5;
  if (hour() >= 12) {
    hour_hand = hour() - 12;
  } else {
    hour_hand = hour();
  }
  if (mirror_hands) {
    hour_hand = 23 - hour_hand;
    minute_hand = 23 - minute_hand;
    second_hand = (23 - second() / 2.5);
    /*
    if (second_hand == 24) {
      second_hand = 0;
    }
    if (minute_hand == 24) {
      minute_hand = 0;
    }
    if (hour_hand == 24) {
      hour_hand = 0;
    }
    */
  } else {
    second_hand = second() / 2.5;
  }
  if (second_hand != previous_second) {
    previous_second = second_hand;
    drawHands();
  }
}

byte second() {
  return byte( aktmillis / TAUSEND % 60);
}
byte minute() {
  return byte( aktmillis / TAUSEND / 60 % 60);
}
byte hour() {
  return byte( aktmillis / TAUSEND / 60 / 60 % 24);
}

Die Division durch 2.5 ergibt ein etwas unruhiges Bewegungsverhalten, sonst scheint der Sketch aber zu funktionieren und ich hoffe, er hilft Dir.

postmaster-ino

Hi

Man kann ja alle 500ms (oder kürzer) die nächste LED hochdimmen und die Aktuelle dafür runter.

MfG

Mickat1427

Vielen Dank für die Hilfe von euch. Werde es mal testen und dann Bescheid geben.


Wäre es noch hilfreich ein Pegelwandler zwischen den Wemos und den Neopixel zu hängen ?

Mfg Micha

Tommy56

Da Du nur zum Neopixel schreibst, ist das unkritisch. Der Pegel wird als High erkannt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Mickat1427

Genau am Wemos wird nur der Neopixel Ring betrieben.

Tommy56

Wenn NTP, dann sollte man den Pool der 4 de-Server nutzen, falls mal ein Server nicht da ist (habe ich schon gehabt).
Der Code ist beim Weihnachtsstern #476 verlinkt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Mickat1427

#12
Dec 13, 2017, 09:59 am Last Edit: Dec 13, 2017, 10:10 am by Mickat1427
Hallo,

habe mal den Sketch vom kulturbereicherer verwendet und ich muss sagen sie läuft!

Allerdings habe ich heute gesehen, das die Stunden Anzeige auch nicht ganz an ihrem Platz ist wo sie sein soll. Habe mal ein Foto angehangen.

Vielleicht hat jemand eine Idee wie man sie an ihrem Platz bekommt.

Mfg Micha


MaHa76

Wo ist sie denn und wo soll sie denn sein?

Mickat1427

Danke nochmal kulturbereicherer.

Werde noch ein bisschen basteln aber die Uhr läuft.

Wenn ich es fertig habe und es alles läuft wie es soll, stell ich den fertigen Sketch rein.

Go Up