Как подключить данные индикаторы

bpg
Offline
Зарегистрирован: 09.12.2014

Прошу помощи , есть индикаторы от старой аппаратуры, гуглил, но нашел только похожее.

Эксперименты не увенчались успехом, перепробовал все.

1.

о весов

2 от старого ДВД

Radjah
Offline
Зарегистрирован: 06.08.2014

Попробуй второй индикатор как сдвиговый регистр подключить и срать в DAT рандомными байтами.

bpg
Offline
Зарегистрирован: 09.12.2014

Пробовал второй подключать по SPI интрефейсу, индикация была, но хаотичная, ничего не смог добиться, никакой логики не увидел.

Примеры пробовал и библиотеки от аналогичных микросхем PT6961 и TM1638 / TM1640, вот тема из которой хоть что то стало понятно

http://arduino.ru/forum/programmirovanie/spi-i-pt6961.

Вопрос, где почитать попонятнее про управление такими индикаторами, возможно ли как то узнать какие коды необходимо посылать для зажигания отдельных символов и цифр? Хотелось бы использовать данный индикатор для погодной станции и таймера.

А по первому нашел только одну тему, но опять же ничего не понял про подключение

http://pro-radio.ru/it-works/12123/

Заранее спасибо.

Radjah
Offline
Зарегистрирован: 06.08.2014

Я же говорю, что распиновка второго очень похожа на сдвиговый регистр или на MAX7219

5V - питание

GND - земля

DAT - данные

CLK - тактирование

STB - защелка

Попробуй подключить по распиновке в начале скетча:

#include <CyberLib.h>

#define LATCH  12  //pin 12 of BBFuino connect to RCK of 8x7segment module 
#define CLOCK  11  //pin 11 of BBFuino connect to SCK of 8x7segment module 
#define DATA   10  //pin 10 of BBFuino connect to DIO of 8x7segment module 
#define LEFT   0  // define the value for left justify
#define RIGHT  1  // define the value for right justify
#define  MultiplexDelay  1  //delay for multiplexing between digit on 8x7segment module

byte anode[8] = { 0b10000000,  //digit 1 from right
                  0b01000000,  //digit 2 from right
                  0b00100000,  //digit 3 from right
                  0b00010000,  //digit 4 from right
                  0b00001000,  //digit 5 from right
                  0b00000100,  //digit 6 from right
                  0b00000010,  //digit 7 from right
                  0b00000001   //digit 8 from right
                };

//array for decimal number, it is the cathode, please refer to the datasheet.
//therefore a logic low will activete the particular segment
//PGFEDCBA, segment on 7 segment, P is the dot
byte cathode[12] = {0b11000000,  // 0
                    0b11111001,  // 1
                    0b10100100,  // 2
                    0b10110000,  // 3
                    0b10011001,  // 4
                    0b10010010,  // 5
                    0b10000010,  // 6
                    0b11111000,  // 7
                    0b10000000,  // 8
                    0b10010000,  // 9
                    0b01111111,  //dot
                    0b11111111   //blank
                   };


void setup() {
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
  digitalWrite(LATCH, HIGH);
  //  delay_ms(1000);
}
//   1       0  01001001
//  6 2     0   12345678
//   7       0
//  5 3       0
//   4  8    0
void loop() {
  displayNumber8x7segment(RIGHT, millis());
}

void display8x7segment(byte datapin, byte clockpin, byte latchpin, byte digit, byte number)
{
  digitalWrite(latchpin, LOW);
  shiftOut(datapin, clockpin, MSBFIRST, digit); // clears the right display
  shiftOut(datapin, clockpin, MSBFIRST, number); // clears the left display
  digitalWrite(latchpin, HIGH);
}

void displayNumber8x7segment(byte justify, unsigned long value)
{
  byte decimal[8] = {0};
  value = value % 100000000;  //ensure the value is within 8 digits only
  decimal[7] = value / 10000000;  //extract digit 7 from value
  value = value % 10000000;       //extract the rest of 7 digit value
  decimal[6] = value / 1000000;
  value = value % 1000000;
  decimal[5] = value / 100000;
  value = value % 100000;
  decimal[4] = value / 10000;
  value = value % 10000;
  decimal[3] = value / 1000;
  value = value % 1000;
  decimal[2] = value / 100;
  value = value % 100;
  decimal[1] = value / 10;
  decimal[0] = value % 10;
  byte zero = 0;
  if (justify == RIGHT)
  {
    for (byte e = 8; e > 0 ; e --)
    {
      if (zero == 0)
      {
        if (decimal[e - 1] != 0)
        {
          display8x7segment(DATA, CLOCK, LATCH, anode[e - 1], cathode[decimal[e - 1]]);
          zero = 1;
        }
      }
      else display8x7segment(DATA, CLOCK, LATCH, anode[e - 1], cathode[decimal[e - 1]]);

      delay_ms(MultiplexDelay);
    }
  }
  else  //if justify == left
  {
    byte d = 0;
    for (byte e = 8; e > 0; e --)
    {
      if (zero == 0)
      {
        if (decimal[e - 1] != 0)
        {
          display8x7segment(DATA, CLOCK, LATCH, anode[7], cathode[decimal[e - 1]]);
          zero = 1;
          d ++;
          delay_ms(MultiplexDelay);
        }
      }
      else
      {
        display8x7segment(DATA, CLOCK, LATCH, anode[7 - d], cathode[decimal[e - 1]]);
        d ++;
        delay_ms(MultiplexDelay);
      }
    }
  }
}

 

bpg
Offline
Зарегистрирован: 09.12.2014

попробовал, не работает, а что в итоге получиться должно было?

а по распиновке она очень похожа на PT6961

Radjah
Offline
Зарегистрирован: 06.08.2014

По идее должно было появиться что-то похожее на цифры.

PT6961 вроде как по SPI работает, а на втром ничего похожего на SPI не вижу. o_0

bpg
Offline
Зарегистрирован: 09.12.2014

Я же писал выше, что по SPI пробовалд, что то даже отображалось, в той теме, получилось даже что все сегменты горели, а второй скетч, где человек спрашивал о похожем индикаторе, у меня получилось отбразить 2 цифры:    11 и все, как не бился, не пойму как же туда цифры то заливать

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну ясен хрен, что он отображать что-то будет, если хаотично в порт писать.

bpg
Offline
Зарегистрирован: 09.12.2014

Ну яснен хрен, теперь то все понятно, помочь можете?

Писал не хаотично, записывал команды , посылал данные по циклу, перебирая все коды, но один хрен никакой закономерности не обнаружил. Никогда не работал со SPI дисплеями, не могу что то вникнуть как с ними работать

Radjah
Offline
Зарегистрирован: 06.08.2014

C чего ты взял, что там SPI?

SPI - это MOSI, MISO, SCK, CS. Там же я никакой обратной связи не вижу.

bpg
Offline
Зарегистрирован: 09.12.2014

вот этот код:

#include <SPI.h>

const int SSPin = 10;

void setup() {

  pinMode (SSPin, OUTPUT);

  SPI.begin();
  
  delay(200);
 
   SPI.setBitOrder(LSBFIRST);
   SPI.setDataMode(SPI_MODE0);
}

void loop() {
  
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b00000011); //command 1
  digitalWrite(SSPin,LOW);
  
  digitalWrite(SSPin,LOW);
  SPI.transfer(0b01001100); //command 2
  digitalWrite(SSPin,LOW);
  
  digitalWrite(SSPin,LOW); //command 3
    SPI.transfer(0xC0);
  for(int i=0; i<=11; i++){
      SPI.transfer(0x00);
  }
  digitalWrite(SSPin,HIGH);
  
  digitalWrite(SSPin,LOW); //command 4
  SPI.transfer(0x8F);
  digitalWrite(SSPin,HIGH);
  
 
  for(int i=0xc0; i<=0xcd; i++){
    for(int j=0x00;j<=0xff; j++){

      digitalWrite(SSPin,LOW);
      SPI.transfer(i);
      SPI.transfer(j);
      digitalWrite(SSPin,HIGH);
      delay(10);


      }
  }
}

по крайней мере перебирая в цикле посылку данных выводит на индикаторы нечто подобное цифрам, и как то странно, т.е если посылаешь 193, 194 то загораются верхние сегменты, но не все, а в хаотичном порядке, а потом начинает эран полностью заполняться зажжеными сегментами, потом они полностью все горят и начинается пляска, полный хаос и так по циклу.

Ну не въеду я никак в это SPI упрвление, что за чем посылать надо и куда

Radjah
Offline
Зарегистрирован: 06.08.2014

ГДЕ ТЫ НА ПЛАТЕ SPI УЗРЕЛ?!

bpg
Offline
Зарегистрирован: 09.12.2014

Я не знаю, что там, SPI или не SPI, есть там MOSI, MISO, SCK, CS или нет, но факт, код который Вы приводили ничем не помог, а вот код из темы которую я писал выше работает, но я не могу понять закономерности.

Если я приведу код, который точно зажигает например цифры 1, 6, 7, 8, 0 и т.д. в некоторых разрядах, Вы сможете помочь понять, что надо записывать или как можно автоматизировать поиск нужного кода??

Я уже МОГЗ сломал себе. Заранее спасибо.