Display 7 sig // Бегает а не горит

PavelLevin
Offline
Зарегистрирован: 15.12.2019

Привет, не могу понять, делал по образцу, уже плату заказал и всё спаял.

Думал что в протеусе оперативы мало когда ццыфры не горели а бегали, оказалось что по факту тоже.

Подскажите что тут не так:

 

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

RTC_DS1307 rtc;      //create rtc object

int segs[] = {0, 1, 2, 3, 4, 5, 6, 7};//abcdefg. segments
int digits[] = {12, 13, 10, 11, 8, 9};        //number of digits
String num[]  = {"00000011", //0
                 "10011111", //1
                 "00100101", //2
                 "00001101", //3
                 "10011001", //4
                 "01001001", //5
                 "01000001", //6
                 "00011111", //7
                 "00000001", //8
                 "00001001"  //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 < 6; i++)
  {
    pinMode(digits[i], OUTPUT);//set digts as outputs

  }


}


void loop()

{

///rtc.adjust(DateTime(2019, 12, 23, 20, 04, 0));

  DateTime dob = DateTime(2010, 6, 27, 0, 0, 0);
  DateTime now = rtc.now();

  int t0 = dob.year() * 12 + dob.month() - 1;
  int t = now.year() * 12 + now.month() - 1;
  int dm = t - t0;
  int Y;
  int M;
  int D;

  if (now.day() >= dob.day()) {
    Y = floor(dm / 12);
    M = dm % 12;
    D = now.day() - dob.day();
  }
  else {
    dm--;
    t--;
    Y = floor(dm / 12);
    M = dm % 12;
    DateTime tmp = DateTime(floor(t / 12), (t % 12) + 1, dob.day(), 0, 0, 0);
    D = (now.unixtime() - tmp.unixtime()) / 60 / 60 / 24;
  }
  printTime(D, M, Y);
}



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 D, int M, int Y)
{
  int d[] = {floor(D / 10), D - 10 * floor(D / 10), floor(M / 10), M - 10 * floor(M / 10), floor(Y / 10), Y - 10 * floor(Y / 10)};

  for (int i = 0; i < 6; i++)
  {
    if (i != 0)
    {
      digitalWrite(digits[i - 1], LOW);
    }
    if (i == 0)
    {
      digitalWrite(digits[5], LOW);
    }
    if (i == 1)
    {
      //  state = true;
    }
    else
    {
      // state = false;
    }

    digitalWrite(digits[i], HIGH);
    printNum(d[i]);
    delay(1);
  }
}

 

PavelLevin
Offline
Зарегистрирован: 15.12.2019

Правда ещё и при прошивке ошибку кидает, но прошивает, это может влиять?

 

avrdude: warning: cannot set sck period. please check for usbasp firmware update.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, не может.

PavelLevin
Offline
Зарегистрирован: 15.12.2019

Умоляю подскажи чего он бегает, точнее как его остановить.. Ставлю в конце delay больше тогда не бегает а шагает с цыфры на цыфру. Вроде делал по какому то примему часов, но не могу понять что не так.

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделайте по другому примеру. Умоляю.

b707
Offline
Зарегистрирован: 26.05.2017

код, мягко говоря, замысловатый...

Зачем, спрашивается, при целочисленном делении использовать floor() ?

А кодировка сегментов строчками с поисками в них нулей и единиц функцией charAt() - это вообще вывих мозга. Так и хочется спросить ТС - "ну зачем так сложно???" - но только судя по всему, автор кода - не он, так что не ответит...

PavelLevin - явных ошибок я тут не вижу, но скорее всего не потому. что их тут нет - а потому что код переусложнен кучей ненужных "завитушек". Выкиньте из него все лишнее, сегменты закодируйте битами, а не строковым массивом - может проблема сама уйдет