Display 7 sig // Бегает а не горит
- Войдите на сайт для отправки комментариев
Пнд, 23/12/2019 - 22:26
Привет, не могу понять, делал по образцу, уже плату заказал и всё спаял.
Думал что в протеусе оперативы мало когда ццыфры не горели а бегали, оказалось что по факту тоже.
Подскажите что тут не так:
#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); } }
Правда ещё и при прошивке ошибку кидает, но прошивает, это может влиять?
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
Нет, не может.
Умоляю подскажи чего он бегает, точнее как его остановить.. Ставлю в конце delay больше тогда не бегает а шагает с цыфры на цыфру. Вроде делал по какому то примему часов, но не могу понять что не так.
Сделайте по другому примеру. Умоляю.
код, мягко говоря, замысловатый...
Зачем, спрашивается, при целочисленном делении использовать floor() ?
А кодировка сегментов строчками с поисками в них нулей и единиц функцией charAt() - это вообще вывих мозга. Так и хочется спросить ТС - "ну зачем так сложно???" - но только судя по всему, автор кода - не он, так что не ответит...
PavelLevin - явных ошибок я тут не вижу, но скорее всего не потому. что их тут нет - а потому что код переусложнен кучей ненужных "завитушек". Выкиньте из него все лишнее, сегменты закодируйте битами, а не строковым массивом - может проблема сама уйдет