@poty,сейчас с работы приеду скину код который генерируется с помощью блоков FL prog
Расскажу о схеме по подробнее, семи сегменты не стандартные, а сделанные из светодиодной ленты, 4 разряда
У разрядов общий анод
Эти самые аноды управляются pnp транзисторами который в свою очередь управляется npn.
А катоды всех сегментов в паррадель
И на каждый сегмент от a до g стоит свой npn транзистор который подтягивает катоды к минусу
Схемы нету придумывал грубо говоря сам как по мне работоспособна
И ещё до подключения часов на i2c частота сигнала на базах транзисторов
была в пределах 70-ти Гц
После подключения возросла до ста
Яркость заметно упала и проявились мерцания
#include <Wire.h>
struct _I2CRealRimeClockTime
{
byte seconds = 0;
byte minutes = 0;
byte Hours = 0;
byte weekday = 0;
byte day = 0;
byte month = 0;
byte year = 0;
unsigned long startTime = 0;
}
;
_I2CRealRimeClockTime _RTC1;
int _sido1TB = 0;
String _sido1TSN;
bool _sido1a1 = 0;
bool _sido1b1 = 0;
bool _sido1c1 = 0;
bool _sido1d1 = 0;
bool _sido1e1 = 0;
bool _sido1f1 = 0;
bool _sido1g1 = 0;
bool _sido1dp = 0;
bool _sido1r1 = 0;
bool _sido1r2 = 0;
bool _sido1r3 = 0;
bool _sido1r4 = 0;
int _sido1Raz = 1;
unsigned long _sido1STi = 0UL;
bool _sido1Mod = 0;
String _RTC1_GetTime1_StrOut;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
pinMode(12, OUTPUT);
digitalWrite(12, 0);
pinMode(11, OUTPUT);
digitalWrite(11, 0);
pinMode(10, OUTPUT);
digitalWrite(10, 0);
pinMode(9, OUTPUT);
digitalWrite(9, 0);
pinMode(8, OUTPUT);
digitalWrite(8, 0);
pinMode(7, OUTPUT);
digitalWrite(7, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
pinMode(5, OUTPUT);
digitalWrite(5, 0);
pinMode(4, OUTPUT);
digitalWrite(4, 0);
pinMode(3, OUTPUT);
digitalWrite(3, 0);
Wire.begin();
delay(10);
Wire.beginTransmission(68);
Wire.write(0x0E);
Wire.write(B00000000);
Wire.write(B10001000);
Wire.endTransmission();
_RTC1.startTime = millis() - 1000;
}
void loop()
{
//Плата:1
get3231Date(0x68, &_RTC1);
_RTC1_GetTime1_StrOut = (_convertRealTimeClockNumberToString(_RTC1.Hours))+
String(":")+
(_convertRealTimeClockNumberToString(_RTC1.minutes));
if(_isTimer(_sido1STi, 1))
{
_sido1STi = millis();
if (_sido1Raz > 4)
{
_sido1Raz = 1;
}
if(_sido1Mod)
{
_sido1a1 =1;
_sido1b1 =1;
_sido1c1 =1;
_sido1d1 =1;
_sido1e1 =1;
_sido1f1 =1;
_sido1g1 =1;
_sido1r4 =0;
_sido1r3 =0;
_sido1r2 =0;
_sido1r1 =0;
_sido1Mod=0;
}
else
{
_sido1TSN = _RTC1_GetTime1_StrOut;
_sido1TB = _IntToSevenSegment(_charFromStringForIndex(_sido1TSN,_sido1Raz));
_sido1a1 =! bitRead(_sido1TB, 0);
_sido1b1 =! bitRead(_sido1TB, 1);
_sido1c1 =! bitRead(_sido1TB, 2);
_sido1d1 =! bitRead(_sido1TB, 3);
_sido1e1 =! bitRead(_sido1TB, 4);
_sido1f1 =! bitRead(_sido1TB, 5);
_sido1g1 =! bitRead(_sido1TB, 6);
_sido1r4 = (_sido1Raz==1);
_sido1r3 = (_sido1Raz==2);
_sido1r2 = (_sido1Raz==3);
_sido1r1 = (_sido1Raz==4);
if(_sido1Raz == 4)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 3)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 2)
{
_sido1dp = ! (0);
}
if(_sido1Raz == 1)
{
_sido1dp = ! (0);
}
_sido1Raz = _sido1Raz +1;
_sido1Mod=1;
}
}
digitalWrite(3, _sido1r4);
digitalWrite(4, _sido1r3);
digitalWrite(5, _sido1r2);
digitalWrite(6, _sido1r1);
digitalWrite(7, !(_sido1g1));
digitalWrite(8, !(_sido1f1));
digitalWrite(9, !(_sido1e1));
digitalWrite(10, !(_sido1d1));
digitalWrite(11, !(_sido1c1));
digitalWrite(12, !(_sido1b1));
digitalWrite(13, !(_sido1a1));
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
byte _IntToSevenSegment(int value)
{
if (value==48)
{
return 63;
}
if (value==49)
{
return 6;
}
if (value==50)
{
return 91;
}
if (value==51)
{
return 79;
}
if (value==52)
{
return 102;
}
if (value==53)
{
return 109;
}
if (value==54)
{
return 125;
}
if (value==55)
{
return 7;
}
if (value==56)
{
return 127;
}
if (value==57)
{
return 111;
}
if (value==45)
{
return 64;
}
if (value==65)
{
return 119;
}
if (value==67)
{
return 57;
}
if (value==99)
{
return 88;
}
if (value==100)
{
return 94;
}
if (value==69)
{
return 121;
}
if (value==70)
{
return 113;
}
if (value==72)
{
return 118;
}
if (value==104)
{
return 116;
}
if (value==76)
{
return 56;
}
if (value==79)
{
return 63;
}
if (value==111)
{
return 92;
}
if (value==80)
{
return 115;
}
if (value==114)
{
return 80;
}
if (value==83)
{
return 109;
}
if (value==116)
{
return 120;
}
if (value==85)
{
return 62;
}
if (value==117)
{
return 28;
}
if (value==110)
{
return 84;
}
return 0;
}
int _charFromStringForIndex(String val, int idx)
{
int lengt=val.length();
if(lengt < idx) return 0;
return val.charAt(lengt-idx);
}
void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct)
{
if (!(_isTimer ((timeStruct ->startTime), 250)))
{
return;
}
Wire.beginTransmission(addres);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(addres, 7);
if (Wire.available())
{
byte seconds = Wire.read();
byte minutes = Wire.read();
byte hours = Wire.read();
byte day = Wire.read();
byte date = Wire.read();
byte month = Wire.read();
byte year = Wire.read();
timeStruct -> seconds = (((seconds & B11110000) >> 4) * 10 + (seconds & B00001111));
timeStruct -> minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111));
timeStruct -> Hours = (((hours & B00110000) >> 4) * 10 + (hours & B00001111));
timeStruct -> weekday = (day & B00000111);
timeStruct -> day = (((date & B00110000) >> 4) * 10 + (date & B00001111));
timeStruct -> month = (((month & B00010000) >> 4) * 10 + (month & B00001111));
timeStruct -> year = (((year & B11110000) >> 4) * 10 + (year & B00001111));
}
timeStruct ->startTime = millis();
}
String _convertRealTimeClockNumberToString(byte value)
{
if (value > 9)
{
return String(value, DEC);
}
return (String("0") + String(value, DEC));
}