Только начинаю разбираться с программированием и ардуино. Не получается нормально запустить дисплей http://www.chipdip.ru/product/shd0032g/ . Что не пробовал, цифры горят как минимум попарно, а как максимум абракадаброй. Спрашивал на разных форумах, но все темы затухли. Для начала моя цель - просто научится выводить на дисплей цифры которые захочу. Самый рабочий вроде этот код
Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
Добавлено: Вт окт 27, 2015 14:05:56
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
Вместо массива цифр, заведите всего 1 сегмент. Вместо цифры 0, сегмент a. Вместо цифры 1, сегмент b. И так далее. Потом вместо тела программы просто попробуйте выводить сегменты, все ли правильно загорается? Если правильно, тогда приступаем к формированию цифр, таким же макаром, добиваемся правильного отображения цифр. Далее проверяем алгоритм дробления числа на декады.
{ unsigned long value = GetValue(4, 3, 2, 1); WriteReg(value); }
// пишем в регистр сразу 32 разряда // пишем в регистр сразу 32 разряда void WriteReg(unsigned long value) { for(int i = 0; i < 32; i++) // перебираем разряды { int data = (value >> i) & 0x1; // берем очередной разряд digitalWrite(PIN_C, LOW); // тактовый сигнал вверх digitalWrite(PIN_D, data); // устанавливаем сигнал данных digitalWrite(PIN_C, HIGH); // тактовый сигнал вниз } digitalWrite(PIN_L, HIGH); // защелку вверх digitalWrite(PIN_L, LOW); // защелку вниз
}
// передаем числа, получаем на выходе код для их отображения unsigned long GetValue(byte s1, byte s2, byte s3, byte s4) { return (unsigned long)(Symbols[s1] << 0) | (unsigned long)(Symbols[s2] << 8) | (unsigned long)(Symbols[s3] << 16) | (unsigned long)(Symbols[s4] << 24); }
Чтобы не делал, два первых сегмента либо вобще не горят-если на все подать единицу, либо с другими цифрами горят полностью все разряды. Этот код у меня выдаёт вместо 1234 - "8. 8.34" . Назначал по одному разряду, то же самое, в последних двух сегментах всё правильно, а в перфых восьмёрки или темнота
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Я бы сделал отдельно функцию вывода в регистр одного разряда, после вывода всех четырёх разрядов подаём сигнал защёлки. Похоже какая-то некорректность с работой 32-х разрядных чисел в функции GetValue
Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
Добавлено: Ср окт 28, 2015 15:19:43
Друг Кота
Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26 Сообщений: 4732 Откуда: Санкт-Петербург
Рейтинг сообщения:0
В компиляторе есть настройка по представлению чисел, посмотрите, может там действительно беззнаковое длинное 2 байта. Ненужно делить на столь мелкие функции, нужно это все запихать в одну, тогда уйдет сразу множество проблем Отпадет надобность во временных переменных, соответственно отпадет и буферизация результатов через эти переменные. Оформление функции требует памяти, следовательно высвободится больше памяти.
Операции сдвига не могут выпихивать число за пределы byte а потом присваивать его ulong? Проверьте, поменяйте тип "unsigned char Symbols[SYMBOLS_ARRAY_LENGTH]={ // Массив символов индикатора" на ulong.
void loop() { // показываем на дисплее счетчик for(int i = 0; i < SYMBOLS_ARRAY_LENGTH; i++) { WriteReg(i, i, i, i); WriteLatch(); Serial.println(i); } }
// пишем в регистр 8 разрядов void WriteReg(byte s1, byte s2, byte s3, byte s4) { byte s[4] = {Symbols[s1], Symbols[s2], Symbols[s3], Symbols[s4]}; for (int b = 0; b < 4; b++) { byte value = s[b]; for(int i = 0; i < 8; i++) // перебираем разряды { int data = (value >> i) & 0x1; // берем очередной разряд digitalWrite(PIN_C, LOW); // тактовый сигнал вверх digitalWrite(PIN_D, data); // устанавливаем сигнал данных digitalWrite(PIN_C, HIGH); // тактовый сигнал вниз } } }
Буду дальше придумывать как скорость расчитанную по датчику холла на него выводить. Чтобы горела точка (для показа десятых долей километра) нужно чтобы в третий сегмент всегда в первый бит значение 1 подставлялось. При любом числе.
Спустя год снова занялся дисплеем и спидометром. Вобщем ошибок компиляции нет, дисплей работает корректно, но почему-то скорость выводить не хочет, думаю ошибка в
Код:
dtostrf(speed, 3, 1, myStr8); // выводим в строку myStr 3 до запятой, один разряд после запятой MyStr = myStr8
, т.к даже если туда подставить значение дисплей показывает нули, а вот если прировнять
Код:
char c = myStr8[0];
числу, то выведет его корректно.
Код:
#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 // - };
{ 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; //обнуляем отрезок времени
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения