tm74hc595 + arduino uno r3 Проблема со скетчем
- Войдите на сайт для отправки комментариев
Ср, 28/09/2016 - 19:28
Всем привет. У меня простая задачка для умеющих и сложная для меня) Выручайте.
Есть первый скетч для 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);
}
#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,
Вы привели два скетча под триста строк и даже не потрудились сказать что они делают (должны делать)! Вы действительно считаете, что сейчас все всё бросят и кинуться разбираться?
Прошу прощенья, но я не думал что это настолько сложно и что для этого нужно полностью изучать код. Я думал что достаточно в первый скетч добавить несколько строк из второго. Видимо ошибался.
Первый скетч - бутфорс пароля, 4 цифры, если это важно, из самого конца статьи https://habrahabr.ru/post/240291/
Второй скетч из примера, который лежал в папке с библиотекой индикатора.
Если это сложно, может хотя бы ссылку дадите на литературу, чтобы почитать и самому разобраться?
читай комменты к коду, там где к выводу на экран
// Возможно, существуют библиотеки для сегментных индикторов, но мне не захотелось с ними разбираться,вот инициализация твоего дисплея
#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(); }Часа два просидел. Склеить воедино у меня все равно не получается - программа ругается...
P.s. опыта в написании скетчей вообще не имею... наверное дело в этом
как именно ругается?
и код киньте
.