tm74hc595 + arduino uno r3 Проблема со скетчем

list
Offline
Зарегистрирован: 28.09.2016

Всем привет. У меня простая задачка для умеющих и сложная для меня) Выручайте.

Есть  первый скетч для arduino uno, который работает (он ниже). И есть второй скетч-пример в котором индикатор tm74hc595 и arduino uno работают нормально(еще ниже). Библиотека тоже есть.

Задача: Подправить первый скетч так, чтоб информация выводилась на индикатор tm74hc595 

Проблема: Я в этом не силён, но перепробовал вариантов 10.... устал... решил спросить)

 

00000000




uint8_t buf[8] = { 0 }; // байт с информацией о «нажатой» клавише

void setup() 
{
  Serial.begin(9600); // Устанавливаем скорость соединения
  pinMode(2, OUTPUT); // G
  pinMode(3, OUTPUT); // F
  pinMode(4, OUTPUT); // E
  pinMode(5, OUTPUT); // D
  pinMode(6, OUTPUT); // C
  pinMode(7, OUTPUT); // B
  pinMode(8, OUTPUT); // A
  pinMode(9, OUTPUT); // D4
  pinMode(10, OUTPUT); // D3
  pinMode(11, OUTPUT); // D2
  pinMode(12, OUTPUT); // D1

// Так как модуль сегментных индикаторов имеет общий анод, то для того, чтобы 
// светился сегмент, вывод Arduino должно быть в высокоимпедансном состоянии 
// и наоборот

// Выключаем все сегменты:

  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(2000); // Пауза, чтобы «клавиатура» успела определиться в системе
}

void loop() 
{
  int dig1, dig2, dig3, dig4; // Цифры, которые будут последовательно вводиться
  int keys[10] = { 39, 30, 31, 32, 33, 
  34, 35, 36, 37, 38 }; // Массив с ASCII кодами цифер от 0 до 9 соответственно

// Перебор с 0000 до 9999:

  for(dig1=0; dig1<10; dig1++)
  {
    for(dig2=0; dig2<10; dig2++)
    {
      for(dig3=0; dig3<10; dig3++)
      {
        for(dig4=0; dig4<10; dig4++)
        {
          pressKey(keys[dig1]);
          pressKey(keys[dig2]);
          pressKey(keys[dig3]);
          pressKey(keys[dig4]);
          pressKey(40); // Клавиша Enter

// Текущий пароль будет отображаться в течение примерно 15-ти секунд (чуть больше времени задержки ввода)

          for(int i=0; i<1200; i++)
          {
            digLED(12, dig1);
            digLED(11, dig2);
            digLED(10, dig3);
            digLED(9, dig4);
          }
        }
      }
    }
  }
}

void pressKey(int dig) // Функция ввода
{
  buf[2] = dig;
  Serial.write(buf, 8); // Нажать клавишу
  buf[0] = 0;
  buf[2] = 0;
  delay(20);
  Serial.write(buf, 8); // Отпустить клавишу
  delay(300);
}

// Возможно, существуют библиотеки для сегментных индикторов, но мне не захотелось с ними разбираться, 
// поэтому набросал свой алгоритм обхода сегментов индикатора

void digLED(int pin, int dig) // Функция отображения цифер на индикаторе
{
  digitalWrite(pin, LOW);
  switch(dig)
  {
  case 0:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, HIGH);
    break;
  case 1:
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    break;
  case 2:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    break;
  case 3:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    break;
  case 4:
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 5:
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 6:
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 7:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    break;
  case 8:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 9:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  }
  delay(3);
  digitalWrite(pin, HIGH);
}

 

list
Offline
Зарегистрирован: 28.09.2016
#include <TM74HC595Display.h>
#include <TimerOne.h>

int SCLK = 7;
int RCLK = 6;
int DIO = 5;

TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];

void setup() {
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9
  LED_0F[10] = 0x88; //A
  LED_0F[11] = 0x83; //b
  LED_0F[12] = 0xC6; //C
  LED_0F[13] = 0xA1; //d
  LED_0F[14] = 0x86; //E
  LED_0F[15] = 0x8E; //F
  LED_0F[16] = 0xC2; //G
  LED_0F[17] = 0x89; //H
  LED_0F[18] = 0xF9; //I
  LED_0F[19] = 0xF1; //J
  LED_0F[20] = 0xC3; //L
  LED_0F[21] = 0xA9; //n
  LED_0F[22] = 0xC0; //O
  LED_0F[23] = 0x8C; //P
  LED_0F[24] = 0x98; //q
  LED_0F[25] = 0x92; //S
  LED_0F[26] = 0xC1; //U
  LED_0F[27] = 0x91; //Y
  LED_0F[28] = 0xFE; //hight -

  
  Timer1.initialize(1500); // set a timer of length 1500
  Timer1.attachInterrupt(timerIsr); // attach the service routine here

}

void loop() {  

  disp.set(LED_0F[0], 0);    //send digital "0" to 1st indicator
  delay(1000);
  disp.clear();   //clear display
  
  disp.set(LED_0F[3], 1);    //send digital "3" to 2nd indicator
  delay(1000);
  disp.clear();   //clear display
  
  disp.set(LED_0F[10], 2);    //send simbol "A" to 3rd indicators
  delay(1000);
  disp.clear();   //clear display
  
  disp.set(LED_0F[11], 3);    //send simbol "b" to 4rd indicators
  delay(1000);
  disp.clear();   //clear display

  disp.dispFloat(-1.32, 2); //send float indicators
  delay(1000);
  disp.clear();   //clear display


  for(int i = 0; i<=99; i++){
  disp.digit2(i, 0);               //send counter 0-99 in 1st and 2nd view ports
  delay(50);
  }

   disp.clear();

  for(int i = 0; i<=99; i++){
  disp.digit2(i, 1);               //send counter 0-99 in 3rd and 4rd view ports
  delay(50);
  }

  disp.clear();

  for(int i = 0; i<=100; i++){
  disp.digit4showZero(i);               //send counter 0-100 with zero
  delay(50);
  }
  disp.clear();

  for(int i = 0; i<=9999; i++){
  disp.digit4(i);               //send counter 0-9999 hide zero
  delay(10);
  }
  disp.clear();

}


void timerIsr()
{
  disp.timerIsr();
}


 

list
Offline
Зарегистрирован: 28.09.2016

Нолики лишние в самом начале)

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

list,

Вы привели два скетча под триста строк и даже не потрудились сказать что они делают (должны делать)! Вы действительно считаете, что сейчас все всё бросят и кинуться разбираться?

list
Offline
Зарегистрирован: 28.09.2016

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

Первый скетч - бутфорс пароля, 4 цифры, если это важно, из самого конца статьи https://habrahabr.ru/post/240291/

Второй скетч из примера, который лежал в папке с библиотекой индикатора.

list
Offline
Зарегистрирован: 28.09.2016

Если это сложно, может хотя бы ссылку дадите на литературу, чтобы почитать и самому разобраться?

James
Offline
Зарегистрирован: 26.02.2016

читай комменты к коду, там где к выводу на экран

// Возможно, существуют библиотеки для сегментных индикторов, но мне не захотелось с ними разбираться,
там dig - число, pin - номер экрана

вот инициализация твоего дисплея

#include <TM74HC595Display.h>
#include <TimerOne.h>

int SCLK = 7;
int RCLK = 6;
int DIO = 5;

TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];

void setup() {
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9
  LED_0F[10] = 0x88; //A
  LED_0F[11] = 0x83; //b
  LED_0F[12] = 0xC6; //C
  LED_0F[13] = 0xA1; //d
  LED_0F[14] = 0x86; //E
  LED_0F[15] = 0x8E; //F
  LED_0F[16] = 0xC2; //G
  LED_0F[17] = 0x89; //H
  LED_0F[18] = 0xF9; //I
  LED_0F[19] = 0xF1; //J
  LED_0F[20] = 0xC3; //L
  LED_0F[21] = 0xA9; //n
  LED_0F[22] = 0xC0; //O
  LED_0F[23] = 0x8C; //P
  LED_0F[24] = 0x98; //q
  LED_0F[25] = 0x92; //S
  LED_0F[26] = 0xC1; //U
  LED_0F[27] = 0x91; //Y
  LED_0F[28] = 0xFE; //hight -

  
  Timer1.initialize(1500); // set a timer of length 1500
  Timer1.attachInterrupt(timerIsr); // attach the service routine here

}

void loop() {  

  disp.set(LED_0F[0], 0);    //вот вывод где [0] -символ , 0-номер индикатора
  delay(1000);
  disp.clear();   //clear display
  
 


void timerIsr()
{
  disp.timerIsr();
}

 

list
Offline
Зарегистрирован: 28.09.2016

Часа два просидел. Склеить воедино у меня все равно не получается - программа ругается...

P.s. опыта в написании скетчей вообще не имею... наверное дело в этом

James
Offline
Зарегистрирован: 26.02.2016

как именно ругается?

 

James
Offline
Зарегистрирован: 26.02.2016

и код киньте

James
Offline
Зарегистрирован: 26.02.2016

.