секундомер с большими цифрами

Veleslav
Offline
Зарегистрирован: 28.07.2019

arduino uno и дисплей LCD2004A , по идее должны бежать большие секунд, вместо секунд на экране квадратики из точек меняются, подскажите где ошибка.

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 20, 4); 


void setup()
{
lcd.begin();
}

void loop(){
printSEC(millis()/1000); // вывод числа секунд после сброса
}


void printSEC(int rpm) {
int m , c, d, u, number;
number = rpm;
if (number > 999) {
m = (number - (number % 1000)) / 1000;
number = number % 1000;
} else {
m = 0;
} 

if (number > 99) {
c = (number - (number % 100)) / 100;
number = number % 100;
} else {
c = 0;
} 

if (number > 9) {
d = (number - (number % 10)) / 10;
number = number % 10;
} else {
d = 0;
} 

u = number;

lcd.setCursor(0, 0);
lcd.print("SEC:");
printNumber(m, 4);
printNumber(c, 7);
printNumber(d, 10);
printNumber(u, 13);

} 



void printNumber(int value, int col) {
if (value == 0) {
custom0(col);
} if (value == 1) {
custom1(col);
} if (value == 2) {
custom2(col);
} if (value == 3) {
custom3(col);
} if (value == 4) {
custom4(col);
} if (value == 5) {
custom5(col);
} if (value == 6) {
custom6(col);
} if (value == 7) {
custom7(col);
} if (value == 8) {
custom8(col);
} if (value == 9) {
custom9(col);
}     
} 






void custom0(int col)
{
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2); 
lcd.write(6); 
lcd.write(1);
}

void custom1(int col)
{
lcd.setCursor(col,0);
lcd.write(32);
lcd.write(32);
lcd.write(1);
lcd.setCursor(col,1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom2(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(6);
}

void custom3(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}

void custom4(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(6);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom5(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}

void custom6(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}

void custom7(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom8(int col)
{
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2); 
lcd.write(6); 
lcd.write(1);
}

void custom9(int col)
{
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7); 
lcd.write(6); 
lcd.write(1);
}



 

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

Сделайте сначала вывод одной цифры безо всякого бегания - статично. Потом вывод одного числа. Тоже статично. А там уж и бегать начнёте.

Veleslav
Offline
Зарегистрирован: 28.07.2019

это я уже пробовал

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); 
void setup()
{
lcd.begin();
lcd.setCursor(0, 0);
lcd.write(2); 
lcd.write(8);
lcd.write(1);
lcd.setCursor(0, 1);
lcd.write(2); 
lcd.write(6); 
lcd.write(1);
}


void loop()
{

}

результат тот же 8 рядов по 3 полосы длинной в символ

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

Так вот, сначала это отладьте. А пока не отладите, дальше не лезьте. Так всегда делается, никто не наваливает всё в одну кучу.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Не вижу где в скетче происходит определение символов, которые потом выводятся через write(...)

Veleslav
Offline
Зарегистрирован: 28.07.2019

уже исправился))) Работает все)))) Вот код если кому интересно

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); 


int sek = 0;
byte bar1[8] =
{
B11100,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11100
};
byte bar2[8] =
{
B00111,
B01111,
B01111,
B01111,
B01111,
B01111,
B01111,
B00111
};
byte bar3[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar4[8] =
{
B11110,
B11100,
B00000,
B00000,
B00000,
B00000,
B11000,
B11100
};
byte bar5[8] =
{
B01111,
B00111,
B00000,
B00000,
B00000,
B00000,
B00011,
B00111
};
byte bar6[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar7[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00111,
B01111
};
byte bar8[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};




void custom0(int col)
{ // uses segments to build the number 0
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2); 
lcd.write(6); 
lcd.write(1);
}

void custom1(int col)
{
lcd.setCursor(col,0);
lcd.write(32);
lcd.write(32);
lcd.write(1);
lcd.setCursor(col,1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom2(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(6);
}

void custom3(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}

void custom4(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(6);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom5(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}

void custom6(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}

void custom7(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}

void custom8(int col)
{
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2); 
lcd.write(6); 
lcd.write(1);
}

void custom9(int col)
{
lcd.setCursor(col, 0);
lcd.write(2); 
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7); 
lcd.write(6); 
lcd.write(1);
}




void printNumber(int value, int col) {
if (value == 0) {
custom0(col);
} if (value == 1) {
custom1(col);
} if (value == 2) {
custom2(col);
} if (value == 3) {
custom3(col);
} if (value == 4) {
custom4(col);
} if (value == 5) {
custom5(col);
} if (value == 6) {
custom6(col);
} if (value == 7) {
custom7(col);
} if (value == 8) {
custom8(col);
} if (value == 9) {
custom9(col);
}     
} 

void printSEK(int sek) {
int m , c, d, u, number;
number = sek;
if (number > 999) {
m = (number - (number % 1000)) / 1000;
number = number % 1000;
} else {
m = 0;
} 
if (number > 99) {
c = (number - (number % 100)) / 100;
number = number % 100;
} else {
c = 0;
} 


if (number > 9) {
d = (number - (number % 10)) / 10;
number = number % 10;
} else {
d = 0;
} 

u = number;

lcd.setCursor(0, 0);
printNumber(m, 0);
printNumber(c, 3);
printNumber(d, 6);
printNumber(u, 9);

} 







void setup()
{
lcd.begin();
lcd.createChar(1,bar1);
lcd.createChar(2,bar2);
lcd.createChar(3,bar3);
lcd.createChar(4,bar4);
lcd.createChar(5,bar5);
lcd.createChar(6,bar6);
lcd.createChar(7,bar7);
lcd.createChar(8,bar8);
}


void loop(){
    printSEK(millis()/1000); // вывод числа секунд после сброса
}