Например TDA7294

Форум РадиоКот • Просмотр темы - Подключение LED дисплея SHD0032 к ардуино - Arduino
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 10:14:44

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Вт окт 27, 2015 08:38:22 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Только начинаю разбираться с программированием и ардуино. Не получается нормально запустить дисплей http://www.chipdip.ru/product/shd0032g/ . Что не пробовал, цифры горят как минимум попарно, а как максимум абракадаброй. Спрашивал на разных форумах, но все темы затухли. Для начала моя цель - просто научится выводить на дисплей цифры которые захочу.
Самый рабочий вроде этот код
Код:
#define PIN_E 7 // enable
#define PIN_L 8 // latch
#define PIN_C 9 // clock
#define PIN_D 10// data
 
#define SYMBOLS_ARRAY_LENGTH 12 //Длина массива символов
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
  1,   // .
  2    // -
};
 
void setup()
{
  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); // тактовый сигнал вниз
}
 
void loop()
{
  // показываем на дисплее счетчик
  for(int i = 0; i < 10; i++)
  {
    unsigned long value = GetValue(i, i, i, i);
    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);        // защелку вниз
  delay(500);
}
 
// передаем числа, получаем на выходе код для их отображения
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);
}

Вот результат
https://youtu.be/fv6uQGRCmX0
Подскажите пожалуйста где может быть ошибка.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Вт окт 27, 2015 14:05:56 
Друг Кота
Аватар пользователя

Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26
Сообщений: 4732
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Вместо массива цифр, заведите всего 1 сегмент. Вместо цифры 0, сегмент a. Вместо цифры 1, сегмент b. И так далее. Потом вместо тела программы просто попробуйте выводить сегменты, все ли правильно загорается?
Если правильно, тогда приступаем к формированию цифр, таким же макаром, добиваемся правильного отображения цифр.
Далее проверяем алгоритм дробления числа на декады.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Ср окт 28, 2015 09:33:14 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Код:
#define PIN_E 7 // enable
#define PIN_L 8 // latch
#define PIN_C 9 // clock
#define PIN_D 10// data
 
#define SYMBOLS_ARRAY_LENGTH 12 //Длина массива символов
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
  1,   // .
  2    // -
};
 
void setup()
{
  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); // тактовый сигнал вниз
}
 
void loop()

  {
    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" . Назначал по одному разряду, то же самое, в последних двух сегментах всё правильно, а в перфых восьмёрки или темнота


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Ср окт 28, 2015 10:03:24 
Первый раз сказал Мяу!

Карма: 4
Рейтинг сообщений: 11
Зарегистрирован: Ср окт 21, 2015 06:50:33
Сообщений: 21
Откуда: Киров
Рейтинг сообщения: 0
Попробуйте в функцию WriteReg передавать уже готовое число. Такое впечатление, что unsigned long длиной 2 байта. ИМХО, т.к. я не спец в с для Arduino


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Ср окт 28, 2015 13:36:50 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Записал нужные сектора вручную в обратном порядке в двоичное число, потом перевёл его в десятичное получил
Код:
void loop()

  {
    unsigned long value = 1624961638;
    WriteReg(value);
  }

теперь горит так как нужно. Только как всё это теперь автоматизировать. Не считать же вручную


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Ср окт 28, 2015 14:34:58 
Первый раз сказал Мяу!

Карма: 4
Рейтинг сообщений: 11
Зарегистрирован: Ср окт 21, 2015 06:50:33
Сообщений: 21
Откуда: Киров
Рейтинг сообщения: 0
Я бы сделал отдельно функцию вывода в регистр одного разряда, после вывода всех четырёх разрядов подаём сигнал защёлки. Похоже какая-то некорректность с работой 32-х разрядных чисел в функции GetValue


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Ср окт 28, 2015 15:19:43 
Друг Кота
Аватар пользователя

Карма: 117
Рейтинг сообщений: 1531
Зарегистрирован: Ср сен 18, 2013 10:08:26
Сообщений: 4732
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
В компиляторе есть настройка по представлению чисел, посмотрите, может там действительно беззнаковое длинное 2 байта.
Ненужно делить на столь мелкие функции, нужно это все запихать в одну, тогда уйдет сразу множество проблем
Отпадет надобность во временных переменных, соответственно отпадет и буферизация результатов через эти переменные. Оформление функции требует памяти, следовательно высвободится больше памяти.

****

Сам посмотрел, вообще странно, пишут что 4 байта
http://atmel.ucoz.ru/publ/unsigned_long/1-1-0-46

Операции сдвига не могут выпихивать число за пределы byte а потом присваивать его ulong?
Проверьте, поменяйте тип "unsigned char Symbols[SYMBOLS_ARRAY_LENGTH]={ // Массив символов индикатора" на ulong.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Вт ноя 03, 2015 00:49:54 
Держит паяльник хвостом

Карма: 10
Рейтинг сообщений: 99
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 940
Рейтинг сообщения: 0
Давеча УДАЛЁННО запустил человеку вышеуказанный дисплей.
Прилагаю требуемые файлы. Надеюсь разберётесь.


Вложения:
spi.h [3.01 KiB]
Скачиваний: 380
spi.c [1.11 KiB]
Скачиваний: 613
sled.h [368 байт]
Скачиваний: 648
sled.c [1.99 KiB]
Скачиваний: 691
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Чт ноя 05, 2015 13:11:06 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Покуда не разобрался, почему-то если сделать
Код:
{
    int i;
    i = 1624961638;
  unsigned long value = i;
  WriteReg(value);
}

то выходит 8.8.34
а если
Код:
{
  unsigned long value = 1624961638;
 WriteReg(value);
}

то 1234


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Чт ноя 05, 2015 14:42:54 
Друг Кота

Карма: 38
Рейтинг сообщений: 618
Зарегистрирован: Пн апр 06, 2015 11:01:53
Сообщений: 3092
Откуда: москва, уфа
Рейтинг сообщения: 0
дык 1624961638 в int не влазит


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Вт ноя 10, 2015 09:42:54 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Запустился как надо вот такой код. Сегменты по одному просто отсылать нужно было
Код:
#define PIN_E 7 // enable
#define PIN_L 8 // latch
#define PIN_C 9 // clock
#define PIN_D 10// data

#define SYMBOLS_ARRAY_LENGTH 18 //Длина массива символов
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
  1,   // .
  2    // -
};

void setup()
{
  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 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);      // тактовый сигнал вниз
    }
  }
}

// пишем защелку
void WriteLatch()
{
  digitalWrite(PIN_L, HIGH);       // защелку вверх
  digitalWrite(PIN_L, LOW);        // защелку вниз
  delay(1000);
}

Буду дальше придумывать как скорость расчитанную по датчику холла на него выводить. Чтобы горела точка (для показа десятых долей километра) нужно чтобы в третий сегмент всегда в первый бит значение 1 подставлялось. При любом числе.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Пт дек 15, 2017 11:47:05 
Первый раз сказал Мяу!

Зарегистрирован: Пт дек 05, 2014 09:28:39
Сообщений: 20
Рейтинг сообщения: 0
Спустя год снова занялся дисплеем и спидометром. Вобщем ошибок компиляции нет, дисплей работает корректно, но почему-то скорость выводить не хочет, думаю ошибка в
Код:
 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  // -
};

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);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение LED дисплея SHD0032 к ардуино - Arduino
СообщениеДобавлено: Пт дек 15, 2017 15:02:37 
Друг Кота

Карма: 38
Рейтинг сообщений: 618
Зарегистрирован: Пн апр 06, 2015 11:01:53
Сообщений: 3092
Откуда: москва, уфа
Рейтинг сообщения: 0
суйте портянки кода под спойлер

Код:
  MyStr = myStr8

нельзя просто так взять и присвоить значение переменной типа "указатель на чар" другой переменной с типом "объект String"
Код:
MyStr = String(myStr8)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y