Hallo,
ich habe ein Problem mit meinem Code. Normalerweise würde ich selber
daran Rum basteln bis es funktioniert. Aber das kann leider auch mal ein
paar Wochen dauern und so viel Zeit habe ich nicht. Jetzt zum Thema. Ich
möchte meiner Freundin zum Geburtstag (Morgen :( ) eine Selbstgemachte
Uhr schenken. Praktisch und technisch funktioniert eigentlich schon das
meiste. Ich habe ein Uhrmodul RTC DS1307) und möchte damit 4 große 7
Segment anzeigen (mithilfe der Shift-Display Library und zwei 74HC595)
ansteuern. Dazu sollen 60 LEDs mit WS2811 Chip quasi den Sekundenzeiger
darstellen. Dazu kann man die Uhr mit einer IR Fernbedienung anschalten
und die Zeit korrigieren ( hab erst zu spät gemerkt, das der RTC
ziemlicher misst ist). Ich habe aber leider noch ein Problem mit der
Software. Scheinbar vertragen sich die Schieberegister nicht mit dem
WS2811. Alleine funktionieren beide Problemlos, aber wenn ich Code die
beide Bauteile ansteuern zusammen laufen lasse blinken die 7 Segment
anzeigen nur noch schwach.
Hier mein Code und bitte nicht gleich Zerfleischen bin nicht gut im
Programmieren und "klaue" mehr so zusammen. Auch stehe ich Leider unter
Zeitdruck da ich natürlich viel zu Spät angefangen habe zu Basteln ;)
1
#include <CharacterEncoding.h>
2
#include <ShiftDisplay.h>
3
4
5
#include <Adafruit_NeoPixel.h>
6
7
8
#include <RTClib.h>
9
#include <Wire.h>
10
11
#include <boarddefs.h>
12
#include <IRremote.h>
13
#include <IRremoteInt.h>
14
#include <ir_Lego_PF_BitStreamEncoder.h>
15
16
#define PIXEL_PIN 9 // Digital IO pin connected to the NeoPixels.
17
18
#define PIXEL_COUNT 60
19
20
21
// Parameter 1 = number of pixels in strip, neopixel stick has 8
22
// Parameter 2 = pin number (most are valid)
23
// Parameter 3 = pixel type flags, add together as needed:
24
// NEO_RGB Pixels are wired for RGB bitstream
25
// NEO_GRB Pixels are wired for GRB bitstream, correct for neopixel stick
Der RTC ist über i2c Verbunden
Der IR Empfänger hängt an Pin 3
Der LED Strip an PIN 9
Die Schieberegister an Pin 6,4,5
Link zur Library:
https://github.com/MiguelPynto/ShiftDisplay/blob/master/README.md
Die Teile für sich funktionieren alle in eigenen Beispielen. Nur
Zusammen mögen sie sich nicht. Ich hoffe ihr könnt mir helfen den
Geburtstag morgen zu retten. Freue mich über jede Hilfe.
@ Niklas Krug (tech_nik)
>möchte meiner Freundin zum Geburtstag (Morgen :( ) eine Selbstgemachte
Aha, also 5 vor 12.
>darstellen. Dazu kann man die Uhr mit einer IR Fernbedienung anschalten>und die Zeit korrigieren ( hab erst zu spät gemerkt, das der RTC>ziemlicher misst ist).
Dann machst du was falsch. So eine RTC geht schon ganz gut.
> Ich habe aber leider noch ein Problem mit der>Software. Scheinbar vertragen sich die Schieberegister nicht mit dem>WS2811. Alleine funktionieren beide Problemlos, aber wenn ich Code die>beide Bauteile ansteuern zusammen laufen lasse blinken die 7 Segment>anzeigen nur noch schwach.>Hier mein Code und bitte nicht gleich Zerfleischen bin nicht gut im>Programmieren und "klaue" mehr so zusammen.
Aha.
> Auch stehe ich Leider unter>Zeitdruck da ich natürlich viel zu Spät angefangen habe zu Basteln ;)
Logisch.
Dein Quelltext ist sehr schlecht formatiert und SEHR damit schlecht
lesbar. Die Einrückungen sind Schrott! Außerdem gehören lange Quelltexte
ind den Anhang, siehe Netiquette.
Strukturierte Programmierung auf Mikrocontrollern
Ich war mal so frei, siehe Anhang.
Ich sehe keinen direkten Fehler, allerdings sehe ich auch keine Stelle,
wo auf dein Display neue Daten geschrieben werden. Das passiert nur
einmalig am Anfang in setup() mit display.set . . .
Alleine funktionieren beide Problemlos, aber wenn ich Code die
beide Bauteile ansteuern zusammen laufen lasse blinken die 7 Segment
anzeigen nur noch schwach.
Kann es sein, daß dein Netzteil zu schwach ist?
Danke schonmal für die Antworten. Tut mir leid das mit dem Quellcode
wusste ich nicht. Wird ab jetzt so gemacht. versprochen.
@Mick danke für den Tipp bin jetzt gerade dabei die Library zu
installieren und zu testen.
@Falk Nur unter Druck entstehen Diamante ;). Leider musste ich auf Teile
aus China warten und daher kam es zu einiger Verzögerung. Tut mir leid
wenn ich hier nicht alles richtig gemacht habe. Bin mehr der Stille
Leser und schreibe nur sehr selten einen Beitrag. Vielen Dank fürs
Formatieren.
Das display.set() im Setup{} war auch zu Versuchszwecken. Hat aber
keinen Einfluss auf das Problem. Es scheint so, dass sich die Librarys
nicht vertragen.
Am Netzteil liegt es nicht. Ist ein Labornetzteil mit bis zu 5A.
Vielen Dank schonmal für die Tipps und Hilfen.
@Niklas Krug (tech_nik)
>Das display.set() im Setup{} war auch zu Versuchszwecken. Hat aber>keinen Einfluss auf das Problem. Es scheint so, dass sich die Librarys>nicht vertragen.
Glaub ich nicht. Wie soll den das Display flackern, wenn es nicht
angesprochen wird? Dann müsste ja andere Software dort unzulässig an den
Pins wackeln. Glaub ich eher weniger. Prüfe mal deinen Aufbau. GGf.
schließ das LCD an andere Pins an.
>Am Netzteil liegt es nicht. Ist ein Labornetzteil mit bis zu 5A.
Strombegrenzung hochgedreht?
Strombegrenzung auf 150mA das sollte reichen
Die Sieben Segment Anzeigen funktionieren wenn ich nur einen einfachen
Test Code hochlade.
Nur Zusammen wollen sie nicht. Leider auch nicht mit der anderen
Library. Scheint wohl ein Timer Problem zu sein.
@ Niklas Krug (tech_nik)
>Strombegrenzung auf 150mA das sollte reichen
Hmm. Warum so wenig? Mach mal 500mA.
>Die Sieben Segment Anzeigen funktionieren wenn ich nur einen einfachen>Test Code hochlade.
Welchen?
>Nur Zusammen wollen sie nicht. Leider auch nicht mit der anderen>Library. Scheint wohl ein Timer Problem zu sein.
Jaja, es sind immer die Anderen Schuld ;-)
Nimm mal den Programm und kommentiere Schritt für Schritt Funktionen
aus. Dann solltest du was sehen.
War ein "Explosionsschutz"
Falk B. schrieb:> Nimm mal den Programm und kommentiere Schritt für Schritt Funktionen> aus. Dann solltest du was sehen.
Das habe ich die letzte Stunde gemacht und bin auf die Adafruit_NEO
PIXEL Library gestoßen. Wenn ich alles blockiere was mit ihr zu tun hat
läuft das 7 Segment Display einwandfrei.
habe meine Hoffnung etwas aufgegeben und bin gerade dabei zwei Arduinos
das Sprechen beizubringen. Muss mich da aber auch erst einlesen, hab ich
vorher noch nie gemacht.
Mein Plan ist jetzt : ein Arduino übernimmt die LEDs, die Uhr und den IR
Empfänger und der Andere bekommt vom 1. Arduino die Uhrezeit geschickt
und bringt sie auf das 7 Segment Display. Ist zwar nicht wunderschön
aber ich hoffe das es so funktioniert.
Der Code im Anhang funktioniert mit meinerSchaltung einwandfrei ( ist
ein Beispiel Code)
Danke für deine vielen Tipps Falk
@Niklas Krug (tech_nik)
>Das habe ich die letzte Stunde gemacht und bin auf die Adafruit_NEO>PIXEL Library gestoßen. Wenn ich alles blockiere was mit ihr zu tun hat>läuft das 7 Segment Display einwandfrei.
Hmm.
>habe meine Hoffnung etwas aufgegeben und bin gerade dabei zwei Arduinos>das Sprechen beizubringen. Muss mich da aber auch erst einlesen, hab ich>vorher noch nie gemacht.
Bitte nicht! Das ist russisch!
RTFM!
https://github.com/MiguelPynto/ShiftDisplay/blob/master/README.md> display.update()>Show on the display the stored value. For multiplexed drive, this must be >in a
loop; for static drive, the value is shown until update()/clear()
>/show() is called.
Das fehlt in deiner Loop!!!
Diese Displayansteuerung nutzt keinerlei Timer etc, nur periodische
Aufrufe aus der loop(). Also können die Neopixel nicht direkt Schaden
anrichten. Bestenfalls indirekt, wenn du die zu oft aktualisierst.
Du hast diesen Constructor kopiert.
ShiftDisplay display(6,4,5,COMMON_CATHODE, 4);
So ist der dokumentiert
ShiftDisplay display([latchPin, clockPin, dataPin, ]displayType,
displaySize[, displayDrive])
Den optionalen Parameter displayDrive hast du weggelassen. Der ist aber
displayDrive: constant MULTIPLEXED_DRIVE or STATIC_DRIVE, defining the
drive algorithm of the display; if is not specified, the default is
MULTIPLEXED_DRIVE.
Also ist deine Anzeige im Multiplex-Betrieb. D.h. du musst
display.update() möglichst oft aufrufen, nicht nur 1x pro Sekunde!
Lösung. Platziere
display.update();
direkt nach
IRReceiver();
in deiner loop(), ohne Bedingung etc.
Danke!! Das hat mich nen großen Schritt weiter gebracht. Ich darf nur so
selten wie möglich einen neuen Befehl an die LEDs schicken. Das dauert
immer eine Weile und währenddessen funktioniert das natürlich
Multiplexing nicht. Super jetzt schreibe ich mal den Code um und Schaue
das ich so Selten die LEDs aktualisiere wie es geht. Ich muss mal testen
ob ich die Strips in kleinere Teile a 10 LEDS aufteilen kann. Das immer
nur ein Befehl an den kurzen Teil Strip gegeben werden muss in dem
gerade der "Sekundenzeiger" ist.
Ich könnte dich küssen Falk vielen Dank für die mühe und deine Geduld
mit mir.
Wird noch ne lange Nacht :)
Ich denke, das wird so nichts, denn:
Die WS28xx benötigen eine Datenfrequenz von ca. 800 kHz. Das ist für
einen ATmega schon recht "sportlich".
Ich hatte (allerdins nicht für Arduino) auch Routinen für WS28xx
geschrieben gehabt und ohne Maschinen hätte ich es wohl gar nicht
hinbekommen.
Wenn eine Ausgabe auf WS28xx erfolgt mußte ich die Interrupts sperren,
damit ich das Timing einhalten konnte.
Niklas K. schrieb:> (mithilfe der Shift-Display Library und zwei 74HC595)
Hieraus entnehme ich, dass mit 2 Schieberegistern 4 7-Segmentanzeigen
zwingend gemultiplexd werden (höchstwahrscheinlich über einen
Timerinterrupt).
Für die Zeit in der die Ausgabe auf die Leuchtdiodenkette erfolgt, wird
die 7 Segmentanzeige nicht gemultiplext und bleibt für die Dauer der
Ausgabe auf die LEDs an einer Ziffernpostion hängen.
Hm, dein Programm sollte also die WS28xx LED-Reihe nur dann refreshen,
wenn eine Sekunde wirklich um ist.
Für diesen Fall hast du eine komplette Übertragung an die LEDs zu:
jeweils 8 (serielle) Bits für rot, grün und blau.
Sind 24 Bits pro LED.
60 LEDs * 24 Bit = 1440 Bits.
Getaktet mit 800 kHz ergbit das eine Verzögerung von 1,8 mS.
Niklas K. schrieb:> ( hab erst zu spät gemerkt, das der RTC> ziemlicher misst ist)
Der DS1307 reagiert "alergisch", wenn er permanent befeuert wird (sprich
durchgehend gelesen oder hohe Busaktivität auf dem I2C).
Abhilfe schaffen hier Serienbedämpfungswiderstände in den Leitungen zum
DS1307 von ca. 100 Ohm. Auf einmal war bei mir die Genauigkeit ein
Vielfaches höher als zuvor.
danke Ralph für die ausführlichen Informationen dann werde ich auf jeden
Fall noch 2x100 Ohm Widerstände in die Leitung hängen. Ich habe mein
Vorhaben jetzt etwas verkleinert und auf die IR-Fernbedienung
rausgeschmissen. Überlege vielleicht noch zwei Taster für die Zeit
Korrektur einzubauen sonst lasse ich es so wie es jetzt ist.
Jetzt gerade sitze ich noch am Löten und werde morgen wohl noch die Uni
schwänzen dann klappt hoffentlich alles. Wenn nicht noch grob was schief
läuft.
Wünsche allen eine schöne Nacht und nochmals Danke für die viele Hilfe
sieht momentan echt Vielversprechend aus.
Edit Im Anhang noch mein momentaner, sehr gekürzter, Code.
@ Niklas Krug (tech_nik)
>Danke!! Das hat mich nen großen Schritt weiter gebracht. Ich darf nur so>selten wie möglich einen neuen Befehl an die LEDs schicken.
Machst du doch so oder so nur einmal pro Sekunde. Das ist nix.
> Das dauert>immer eine Weile und währenddessen funktioniert das natürlich>Multiplexing nicht.
Das sind vielleicht 5ms, vergiss es.
> Super jetzt schreibe ich mal den Code um und Schaue>das ich so Selten die LEDs aktualisiere wie es geht. Ich muss mal testen>ob ich die Strips in kleinere Teile a 10 LEDS aufteilen kann.
Ist nicht nötig.
>Ich könnte dich küssen Falk
Aber nur Bruderkuss!
>Wird noch ne lange Nacht :)
Und morgen erst! ;-)
@Ralph S. (jjflash)
>Die WS28xx benötigen eine Datenfrequenz von ca. 800 kHz. Das ist für>einen ATmega schon recht "sportlich".
Und das sind sie wieder, die Reichsbedenkenträger. OMG!
Die Neopixel-Lib macht das schon richtig! Punkt!
>Hieraus entnehme ich, dass mit 2 Schieberegistern 4 7-Segmentanzeigen>zwingend gemultiplexd werden (höchstwahrscheinlich über einen>Timerinterrupt).
NEIN! Lies den Link!
>Für die Zeit in der die Ausgabe auf die Leuchtdiodenkette erfolgt, wird>die 7 Segmentanzeige nicht gemultiplext und bleibt für die Dauer der>Ausgabe auf die LEDs an einer Ziffernpostion hängen.
Genau, und dann geht die Welt unter.
>Hm, dein Programm sollte also die WS28xx LED-Reihe nur dann refreshen,>wenn eine Sekunde wirklich um ist.
Macht er schon, hat er richtig copy&pasted!
Falk B. schrieb:>>und die Zeit korrigieren ( hab erst zu spät gemerkt, das der RTC>>ziemlicher misst ist).>> Dann machst du was falsch. So eine RTC geht schon ganz gut.
die DS1307 die er hat ist Mist, die läuft schnell ungenau, aber er kann
mit demselben Code (fast) die genauere DS3231 ansteuern.
Die DS1307 braucht zum einstellen ein STOP und danach ein START
Kommando, die DE3231 eben nicht.
Ja so habe ich das auch gelesen. Der DS1307 soll bis zu mehrere Minuten
pro Woche Falsch gehen und der DS3231 deutlich genauer sein. Vielleicht
gibt es den ja zu Weihnachten. Also so weit ich beurteilen kann, läuft
die Schaltung auf dem Steckbrett. Ich muss mich nochmal über die
Korrekte Ansteuerung des RTC1307 belesen, das ich da auch alles wichtige
auf der Platine habe.
Nach ein paar Stündchen Schlaf mache ich mich morgen dann an die Platine
und wenn alles Klappt habe ich dann bald eine "mehr oder weniger " gute
Uhr. So weit der Plan.
Anstrengender Tag aber es ist soweit alles super gelaufen. Bin endlich
fertig und es sieht super aus. Vielen Dank an Falk und an alle anderen
die geholfen haben!! Ohne euch hätte ich es nicht geschafft. Im Anhang
ein paar Bilder von der fertigen Uhr.
Der Geburtstag kann kommen und mal sehen ob es ihr gefällt.
@ Niklas Krug (tech_nik)
> Johanna_GB_fertig_vorne.jpg>Anstrengender Tag aber es ist soweit alles super gelaufen. Bin endlich>fertig und es sieht super aus.
Herzlichen Glühstrumpf!
>ein paar Bilder von der fertigen Uhr.
Was sehe ich da? Was für James Bond seine Walter PPK, ist für den
Bastler seine Heißklebepistole! Und beide werden nur selten kalt. ;-)
Sehe ich das richtig? Diese LEDs gibe es auch als bedrahtete Bauteile?
und du hast die einfach direkt miteinander verbunden? Und es gibt an
KEINER LED einen Entkoppelkondensator? Und die funktionieren alle? Oder
haben die schon einen eingebaut?
https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator
Ich würde mal wenigstens alle 10 LEDs so ein Ding verlöten, das geht ja
nun schnell.
Es kann nur ein Mann auf die Idee kommen, ein selbstgebasteltes Uhr zu
schenken ;-) Ich hoffe es gefällt ihr. Und wenn es Ihr gefällt, dann
hast Du eine tolle Frau :-)