Go Down

Topic: MCP23017 und 4x 7 Segmentdisplay (Read 1 time) previous topic - next topic

Gundelputz

Hallo zusammen,
für euch ist die Beantwortung der folgenden frage sicherlich recht einfach.
ich habe ein 4 stelliges 7-Segmentdisplay welches mit 12 Pin's versehen ist.
die ansteuerung mit folgendem Code ist auch rech unproblematisch:
Code: [Select]
#include "SevSeg.h" //Die vorher hinzugefügte Library laden
SevSeg sevseg; //Ein sieben Segment Objekt initialisieren

void setup()
{
byte numDigits = 4; //Hier wird die Anzahl der Ziffern angegeben
byte digitPins[] = {2, 3, 4, 5}; //Die Pins zu den Ziffern werden festgelegt
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //Die Pins zu den //Segmenten werden festgelegt
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); //In diesem
//Abschnitt kann man nun entweder testen welche Art von Display man besitzt oder
//wenn man es schon weiß angeben ob es sich um ein COMMON_CATHODE oder
//COMMON_ANODE Display handelt. Das Display funktioniert nur wenn die richtige
//Art eingetragen ist, ansonsten werden alle Segmente gleichzeitig leuchten.

}

void loop()
{
sevseg.setNumber(1234,3); //Hier können wir nun die gewünschte Zahl eintragen.
//Wir haben als Beispiel 1234 angegeben. Die Zahl hinter dem Komma steht für den
//Punkt hinter einer Ziffer. Hierbei ist 3 der Punkt neben der ersten Ziffer und
//0 wäre der Punkt ganz rechts neben der letzten Ziffer. Wenn man keinen Punkt
//mit angezeigt haben möcht kann man z.B. 4 angeben.
sevseg.refreshDisplay(); // Dieser Teil lässt die Nummer auf dem Display
//erscheinen.
sevseg.setBrightness(90); //Hier kann die Helligkeit des Displays angepasst
//werden. In einem Bereich von 0-100 wobei 100 das Hellste ist. 0 bedeutet
//jedoch nicht dass das Display komplett dunkel ist. Für die Anzeige einer Zahl
//ist allein die "sevseg.refreshDisplay();" Zeile verantwortlich
}


aber das leidige Thema ist halt das zu viele Ports belegt werden.
Nun habe ich mir gedacht: warum nicht über einen MCP23017 ansteuern
ist das möglich und wenn ja wie?


temucin

Hallo,

nur so als kleiner Tip. Du kannst auch die Analog Eingänge als Digitale Ein- und Ausgänge verwenden.

Gruss Temucin

Gundelputz

klar
das ist mir bekannt aber von dennen gibt es auch nicht all zu viele und der D1 hat nur einen
mir ist auch bekannt das ich hier auch mit einem Schieberegister arbeiten könnte
trotzdem Danke für den Hinweis

agmue

Nun habe ich mir gedacht: warum nicht über einen MCP23017 ansteuern
ist das möglich und wenn ja wie?
Ja, aber wohl nicht mit dieser Bibliothek.

Hast Du schon mal MAX7219 in Erwägung gezogen?

Gundelputz

ich suche schon den ganzen Tag nach einer passenden Bibliothek

die überlegung war die Arduinoports in : byte digitPins[] = {2, 3, 4, 5}; auszutauschen
also evtl. so: byte digitPins[] = {mcp_1.2, mcp_1.3, mcp_1.4, mcp_1.5};

im endefekt lautet die Frage auch wohl eher wie ich die Ausgänge zuweisen kann

wenn du eine besser Lib kennst währe es schön zu wissen welches dies ist bis jezt hab ich bei Github noch nichts passendes gefunden

combie

ich suche schon den ganzen Tag nach einer passenden Bibliothek
Dir ist schon klar, dass das keine Raketentechnik ist?

Warum baust du das nicht eben selber?
Du würdest sogar dabei lernen.

Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

Gundelputz

Warum baust du das nicht eben selber?

meinst du die lib oder die Hardware?

HotSystems

ich suche schon den ganzen Tag nach einer passenden Bibliothek
....
wenn du eine besser Lib kennst währe es schön zu wissen welches dies ist bis jezt hab ich bei Github noch nichts passendes gefunden
Ich bin mir nicht sicher, nach welcher Library du suchst, das verschweigst du uns ja.

Aber für den MCP23017 gibt es diese hier: MCP23017-Library

Wenn das nicht die richtige ist, sag uns endlich was du suchst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

Warum baust du das nicht eben selber?

meinst du die lib oder die Hardware?
Ja!
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

uwefed

Ich wiederhole den Ratschlag: Nimm einen MAX7219 und ein Display mit gemeinsamer Kathode.
Der MAX7219 übernimmt das gesamte Multiplexing der Anzeige.

Grüße Uwe

Gundelputz

der vollständigkeit halber hier meine ersten Versuche:
Code: [Select]
#include <SevSeg.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_MCP23017.h>

#define OLED_RESET LED_BUILTIN  //4
Adafruit_SSD1306 display(OLED_RESET);

Adafruit_MCP23017 mcp_1;


SevSeg sevseg; //Ein sieben Segment Objekt initialisieren

#include "Meine_Variablen.h"
#include "Meine_Declarationen.h"

 String Text_1 = "Text 1";   

void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
 
  mcp_1.begin(0);
 
  mcp_1.pinMode(0, OUTPUT);
  mcp_1.pinMode(1, OUTPUT);
  mcp_1.pinMode(2, OUTPUT);
  mcp_1.pinMode(3, OUTPUT);
  mcp_1.pinMode(4, OUTPUT);
  mcp_1.pinMode(5, OUTPUT);
  mcp_1.pinMode(6, OUTPUT);
  mcp_1.pinMode(7, OUTPUT);
 
  mcp_1.pinMode(8, OUTPUT);
  mcp_1.pinMode(9, OUTPUT);
  mcp_1.pinMode(10, OUTPUT);
  mcp_1.pinMode(11, OUTPUT);
  mcp_1.pinMode(12, OUTPUT);
  mcp_1.pinMode(13, OUTPUT);
  mcp_1.pinMode(14, OUTPUT);
  mcp_1.pinMode(15, OUTPUT);
/*
  byte numDigits = 4;
  byte digitPins[] = {5 , 2, 1, 15}; //Die Pins zu den Ziffern werden festgelegt
  byte segmentPins[] = {4, 0, 13, 11, 10, 3, 14, 12};
  sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
*/
}
void loop()
{
  Text_anzeigen();
 /* sevseg.setNumber(1234,3);
  sevseg.refreshDisplay();
  sevseg.setBrightness(90);
*/ 
  mcp_1.digitalWrite(5, LOW);
  mcp_1.digitalWrite(12, HIGH);
}


Sicherlich ist der MAX7219 geeigneter aber dann auch wieder nicht.
mein Vorhaben ist eine 3-4 stellige Anzeige aus 5V RGB LED Streifen zu bauen
ich habe das ganze mit 12V WW LED Strips realisiert aber der Nachteil ist eine zweite Spannung, zwei zusätzliche IC's (Schieberegister und Leistungstreiber) pro Segment, ca. 6-12 facher Strombedarf und leider nur eine Farbe
der MCP hat 16 Ausgänge/Eingänge
7-8 für die Segmente
3-4 für die Element(Anode oder Katode)
2-3 für die Farbauswahl

Ich glaube es währe wirklich fast einfacher eine eigen "Library" zu erstellen. Adererseits muss mann auch nicht immer das Rad neu erfinden nur um dann festzustellen das 100 andere es bereit 1000x besser zu Wege gebracht haben.

Ich währe sehr Dankbar wenn da noch jemand einen hilfreichen Tip hat.

HotSystems

Ich währe sehr Dankbar wenn da noch jemand einen hilfreichen Tip hat.
Was brauchst du noch ?

Dir wurden schon reichlich Tipps genannt, du aber nennst nicht, welche Library du suchst.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Gundelputz

eigendlich suche ich einen Weg die MCP Port in die deklaration der 7 Segmentanzeige (byte digitPins[] = {5 , 2, 1, 15}; ) zu schreiben.
alternativ ginge auch eine andere Library mit der ich das Teil zum laufen bringen kann
momentan habe ich das Display aus diesem Beitrag https://funduino.de/nr-12-7-segment-anzeige zum testen am MCP

uwefed

Wenn Du "4x 7 Segmentdisplay" schreibst dann denkt man an fertige 7-Segment-Module. Die Antworten sind dementsprechend.

Wenn Du jetzt mit etwas anderem herauskommst dann sind die Antworten falsch.

Quote
mein Vorhaben ist eine 3-4 stellige Anzeige aus 5V RGB LED Streifen zu bauen
ich habe das ganze mit 12V WW LED Strips realisiert aber der Nachteil ist eine zweite Spannung, zwei zusätzliche IC's (Schieberegister und Leistungstreiber) pro Segment, ca. 6-12 facher Strombedarf und leider nur eine Farbe
der MCP hat 16 Ausgänge/Eingänge
Was nun? 5V oder 12V Streifen?

Du brauchst auch mit einem MCP statt der Schieberegister einen zusätzlichen Treiber. Außerdem kann der MCP kein PWM und darum wirst Du wenige Farben haben.

Wenn Du dir die 7-Segmentanzeige mittels RGB-LED-Streifen aufbauen willst, dann nimm gleich WS2812 Streifen.

Grüße Uwe

agmue

im endefekt lautet die Frage auch wohl eher wie ich die Ausgänge zuweisen kann
Diese Bibliothek möchte Arduino-Pins und keine von einem IC.

wenn du eine besser Lib kennst ...
Nein, leider nicht, aber ich kenne natürlich nicht alle Bibliotheken  ::)

Aber Du könntest die vorhandene Bibliothek umschreiben oder die Funktionalität in Dein Programm integrieren.

... dann nimm gleich WS2812 Streifen.
... oder APA102 oder baugleiche :)

Go Up