Спустя год снова занялся дисплеем и спидометром. Вобщем ошибок компиляции нет, дисплей работает корректно, но почему-то скорость выводить не хочет, думаю ошибка в
Код: Выделить всё
dtostrf(speed, 3, 1, myStr8); // выводим в строку myStr 3 до запятой, один разряд после запятой
MyStr = myStr8
, т.к даже если туда подставить значение дисплей показывает нули, а вот если прировнять
числу, то выведет его корректно.
Код: Выделить всё
#define PIN_E 7 // enable
#define PIN_L 8 // latch
#define PIN_C 9 // clock
#define PIN_D 10// data
unsigned long cur_ms = 0; //переменная для отслеживания натикавших миллисекунд с момента пуска МК
unsigned long prev_ms = 0; //переменная для вычисления отрезков времени
int ms = 0; //сам отрезок времени
int m = 0; //пройденное расстояние
int speed = 0; //переменная для хранения скорости
String MyStr;
char myStr8[10];
char c = myStr8[0];
char d = myStr8[1];
char e = myStr8[2];
char f = myStr8[3];
const byte Sect_Size = 4; // Четырёхразрядная секция индикатора
const byte Byte_Size = 8; // Число бит в байте
#define SYMBOLS_ARRAY_LENGTH 20 //Длина массива символов
unsigned char Symbols[SYMBOLS_ARRAY_LENGTH] = { // Массив символов индикатора
252, // 0
96, // 1
218, // 2
242, // 3
102, // 4
182, // 5
190, // 6
224, // 7
254, // 8
246, // 9
238, // A
62, // B
156, // C
122, // D
158, // E
142, // F
188, // G
110, // H
1, // .
2 // -
};
void setup()
{
pinMode(20, INPUT); //включаем 20й порт на Ардуино Мега2560 на чтение
digitalWrite(20, HIGH); //включаем подтягивающий резистор
attachInterrupt(3, odom, RISING); //включаем внешнее прерывание
pinMode(PIN_E, OUTPUT);
pinMode(PIN_L, OUTPUT);
pinMode(PIN_C, OUTPUT);
pinMode(PIN_D, OUTPUT);
digitalWrite(PIN_L, LOW); // сигнал защёлки вниз
digitalWrite(PIN_E, LOW); // включаем сегменты
digitalWrite(PIN_C, LOW); // тактовый сигнал вниз
Serial.begin(9600);
}
void odom() {
m++; //добавляем 1 при каждом срабатывании
}
void loop()
{
dtostrf(speed, 3, 1, myStr8); // выводим в строку myStr 3 до запятой, один разряд после запятой
MyStr = myStr8;
cur_ms = millis(); //сколько прошло мс с момента включения
ms = cur_ms - prev_ms; //сколько прошло мс с последнего расчета
if (ms > 500)
prev_ms = cur_ms; //ставим метку когда было срабатывание
speed = m * 3600 / ms; //вычисляем скорость км в час по кол-ву пройденных метров за отрезок времени ms
m = 0; //обнуляем пройденное расстояние
ms=0; //обнуляем отрезок времени
unsigned char Segments [Sect_Size];
byte Digit [Sect_Size];
for ( int i = 0; i < Sect_Size; i++ )
{
}
// показываем на дисплее счетчик
Digit [3] = c;
Digit [2] = d;
Digit [1] = e;
Digit [0] = f;
/* for ( int i = 0; i < Sect_Size; i++ )
{
Segments [i] = Symbols [ Digit [i] ];
} ;
Segments [3] = Segments [3] + 1;
*/
{
WriteReg( Digit [0], Digit [1], Digit [2], Digit [3] );
WriteLatch();
Serial.println(Digit [1]);
}
}
// пишем в регистр (Byte_Size = 8) разрядов
void WriteReg(byte s1, byte s2, byte s3, byte s4)
{
/*
byte shift = 16;
byte s[Sect_Size] = { Symbols [shift+0], Symbols [shift+1],
Symbols [shift+2], Symbols [shift+3] };
*/
byte s[Sect_Size] = {Symbols [s1], Symbols [s2], Symbols [s3], Symbols [s4]};
for ( int b = 0; b < Sect_Size; b++ )
{
byte value = s[b]; // | ( b == 0 ? 0x1 : 0x0 );
if (b == 1) value |= 0x1; // Позиция (b == 2) разделительной точки
for( int i = 0; i < Byte_Size; i++ ) // перебираем разряды
{
int data = (value >> i) & 0x1; // берём очередной разряд
digitalWrite(PIN_C, LOW); // тактовый сигнал вверх
digitalWrite(PIN_D, data); // устанавливаем сигнал данных
digitalWrite(PIN_C, HIGH); // тактовый сигнал вниз
}
}
}
// пишем защёлку
void WriteLatch()
{
digitalWrite(PIN_L, HIGH); // защёлку вверх
digitalWrite(PIN_L, LOW); // защёлку вниз
delay(1000);
}