Arduino Uno Uhr mit LED Streifen flackert .

Hallo

Kann sich jemand mal den Code anschauen und ggf. optimieren
der Code ist nicht von mir.
Die Uhr funktioniert aber das Multiplexen flackert .

Gruß

#include <Wire.h>    //Libraries to communicate with RTC
#include "RTClib.h"

RTC_DS1307 rtc;      //create rtc object

boolean state = false;
boolean state1 = false;
int setH;            //variable to store hours when setting
int setM;            //variable to store minutes when setting
int setD = 1;        //variable for day
int setMo = 1;       //variable for month
unsigned long t1;    //used for millis()
unsigned long t2;    //used for millis();

int segs[] = {2, 3, 4, 5, 6, 7, 8, 9};//abcdefg. segments
int digits[] = {10, 11, 12, 13};        //number of digits
String num[]  = {"11111100", //0
                 "01100000", //1
                 "11011010", //2
                 "11110010", //3
                 "01100110", //4
                 "10110110", //5
                 "10111110", //6
                 "11100000", //7
                 "11111110", //8
                 "11110110"  //9
                };

void setup()
{
  rtc.begin();//begin rtc communication
  for (int i = 0; i < 8; i++)
  {
    pinMode(segs[i], OUTPUT);//set segment pins output
  }
  for (int i = 0; i < 4; i++)
  {
    pinMode(digits[i], OUTPUT);//set digts as outputs
  }
  pinMode(14, INPUT_PULLUP);//set A0 as input for button1
  pinMode(15, INPUT_PULLUP);//set A1 as input for button2
}


void loop()
{
  
  
  DateTime now = rtc.now();//acquire date and time
  t1 = millis();//acquire millis time
  if(t1-t2 >= 5000)//if 5 seconds have passed change display
  {
    t2 = t1;
    state1 = !state1;
  }
  if(state1 == false)
  {
    printTime(now.hour(), now.minute());//show time
  }
   if(state1 == true)
  {
    printTime(now.day(), now.month());//show date
  }
  
  setTime();//function to set time 
}



void printNum(int number)//function to print number
{
  for (int i = 0; i < 8; i++)
  {
    if(state == true && state1 == true)//if date is displayed show decimal after day
    {
      num[number].setCharAt(7,'1');
    }
    if(state != true || state1 != true)//if not then no decimal
    {
      num[number].setCharAt(7,'0');
    }

    if (num[number].charAt(i) == '1')//set segment high
    {
      digitalWrite(segs[i], HIGH);
    }
    else
    {
      digitalWrite(segs[i], LOW);//set low
    }
  }
}
void printTime(int hour, int min)
{
  int d[] = {floor(hour / 10), hour - 10 * floor(hour / 10), floor(min / 10), min - 10 * floor(min / 10)};

  for (int i = 0; i < 4; i++)
  {
    if (i != 0)
    {
      digitalWrite(digits[i - 1], LOW);
    }
    if (i == 0)
    {
      digitalWrite(digits[3], LOW);
    }
    if(i == 1)
    {
      state = true;
    }
   else
   {
      state = false;
   }
    
    digitalWrite(digits[i], HIGH);
    printNum(d[i]);
    delay(5);
  }
}
void setTime()
{
  if (digitalRead(14) == LOW)
  {
    delay(500);
    while (digitalRead(14) == HIGH)
    {
      printTime(setH, setM);
      if (digitalRead(15) == LOW)
      {
        delay(200);
        setH++;
        if (setH == 24)
        {
          setH = 0;
        }


      }
    }
    delay(500);
    while (digitalRead(14) == HIGH)
    {

      printTime(setH, setM);
      if (digitalRead(15) == LOW)
      {
        delay(200);
        setM++;
        if (setM == 60)
        {
          setM = 0;
        }


      }
    }
    delay(500);
    while (digitalRead(14) == HIGH)
    {

      printTime(setD, setMo);
      if (digitalRead(15) == LOW)
      {
        delay(200);
        setD++;
        if (setD > 31)
        {
          setD = 1;
        }


      }
    }
    delay(500);
    while (digitalRead(14) == HIGH)
    {

      printTime(setD, setMo);
      if (digitalRead(15) == LOW)
      {
        delay(200);
        setMo++;
        if (setMo > 12)
        {
          setMo = 1;
        }


      }
    }
    delay(500);
    int i;
    while (digitalRead(14) == HIGH)
    {
  
      printTime(20,i);
      if (digitalRead(15) == LOW)
      {
        delay(200);
        i++;
      }
    }
    delay(500);
    rtc.adjust(DateTime(2000+i, setMo, setD, setH, setM, 0));
  }
}

Wallclock.ino (3.9 KB)

golo:
Hallo

Kann sich jemand mal den Code anschauen und ggf. optimieren
der Code ist nicht von mir.
Die Uhr funktioniert aber das Multiplexen flackert .

Gruß

Und warum fragst du nicht den Autor, der kennt seinen Sketch am Besten.
Damit alle den Sketch lesen können, solltest du den hier in Code-Tags posten.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *) direkt ins Forum.

delays haben in einem Multiplexer nichts verloren.

Gruß Tommy

Kann sich jemand mal den Code anschauen

Done!

Als erstes muss das multiplexen abgekoppelt werden.
z.B. in einen Timerinterrupt verlagern
Dann flackert nix mehr.

Auch scheinen mir die ganzen delays überflüssig.

und ggf. optimieren

Tue das!

Ausprobiert - aber bei mir flackert da nichts.

@TO: Ca so viel Informationsgehalt hatte dein Post.
Ergo: Link wo das her ist,
Schaltplan.
Echtfoto wie du es zusammengebaut hast um unterschiede zu erkennen.

Zauberwort mit zwei tt würde wäre auch nett gewesen.

Entschuldigung

Ich sitze gerade noch im Hotelzimmer weil ich auf Schulung bin und kann keine Unterlagen Fotos oder Schaltpläne schicken weil die alle zu Hause sind

Also die Uhr besteht aus sieben 15 cm lang LED Streifen pro Segment diese werden vom uno über einen ULN angesteuert.

Die multiplexing Ausgänge steuern 4 Transistor Stufen an.

Du hast also 4 Stellen 7 Segmentanzeigen mit 15cm LED-Streifen (nehme an mit 12V) pro Segment.
Du steuerst den Minuspol mit ULN2003 an und die + Pole mit einem Transistorstufen.

Grüße Uwe

Genau

wenn du das zu Fuß machen willst, würde ich mir ein dokumentiertes Beispiel im Netz suchen.
z.B. https://www.jameco.com/jameco/workshop/techtip/working-with-seven-segment-displays.html

Listening 2 scheint mir gut strukturiert zu sein.

Wenn das für deine Hardware klappt auf 4 erweitern und im letzten schritt den RTC dazunehmen.

Die Transistoren sind BJT oder MOSFETS?
Ein Schaltplan wäre nützlicher.

Bc 547 und bc 327

Ich habe jetzt mal die Zeit von 5ms auf 2ms
Gestellt
Jetzt flackert nichts mehr.
Aber jetzt glimmen die sekmente die nicht
An sind etwas.

golo:
Aber jetzt glimmen die sekmente die nicht An sind etwas.

Du machst folgendes: Du schaltest zur nächsten Stelle und änderst dann die Segmente. Für eine kurze Zeit leuchtet da die alte Zahl bevor Du die neue geschrieben hast.

Du mußt die aktuelle Stelle abschalten, die Segmente der nächsten Stelle setzen und dann die nächste Stelle einschalten.

So schlau bin ich nicht

Kann man das in dem programm ändern ?

golo:
Kann man das in dem programm ändern ?

Natürlich!

golo:
So schlau bin ich nicht

Das kannst du ändern.

Das bist Du schon.
Das ist wie wenn Du heimlich etwas machen willst aber den Vorhang erst zuziehst nachdem Du die Teile auf dem Tisch weggenommen hast. Dann ist es schwierig so zu tun als wie die Teile von alleine andere geworden wären.
Grüße Uwe

Also ich bin schon den ganzen Morgen dabei um das zu versuchen aber es klappt einfach nicht

Für einen kleinen Wink mit dem Zaunpfahl wäre ich sehr dankbar

Ich wünsche allen einen schönen Sonntag

Ich bin heute in der Firma und habe mir die Uhr noch mal angesehen

Es glimmen aber auch die Sekmente die schon länger nicht eingeschaltet worden sind.

also bei einer Zeit von 06.15 glimmen z.b. bei der 1 alle abgeschalteten Sekmente.

Gefällt dir das nicht?
Dann ändere es!

Aber Vorsicht dabei:
Es besteht die Gefahr, dass du irgendwann verstehst, was du da tust.

Wie schon gesagt....
Ich empfehle dir eine Grundrenovierung des Programms.

Als erstes muss das multiplexen abgekoppelt werden.
z.B. in einen Timerinterrupt verlagern
Dann flackert nix mehr.

Auch scheinen mir die ganzen delays überflüssig.

z.B. Dieses ist auch fürchterlich:

String num[]  = {"11111100", //0
                 "01100000", //1
                 "11011010", //2
                 "11110010", //3
                 "01100110", //4
                 "10110110", //5
                 "10111110", //6
                 "11100000", //7
                 "11111110", //8
                 "11110110"  //9
                }

;

Ich pfusche nicht in dem Code rum....
Auf mich macht der Code den Eindruck, als wäre es ein Berg benutzter Unterhosen, von fremden Leuten.

Ohne Not (meine Not), stecke ich da meine Finger nicht rein.


Auch kann ich kaum glauben, dass du an einer Lösung überhaupt interessiert bist...
Denn einen Schaltplan sehe ich bisher noch nicht.

combie:
...
z.B. Dieses ist auch fürchterlich:

String num[]  = {"11111100", //0

"01100000", //1
                "11011010", //2
                "11110010", //3
                "01100110", //4
                "10110110", //5
                "10111110", //6
                "11100000", //7
                "11111110", //8
                "11110110"  //9
                }

Was genau findest Du daran fürchterlich? Dass es eingerückt ist, kann's kaum sein.

Gruß

Gregor