Arduino UnoR3 + LEDs + shift registers
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Тогда надо проверять по порядку:
1. Монтаж. Может где-то плохой контакт?
2. Живы ли выходы второго регистра. Поменяйте чипы местами и посмотрите, что получится.
3. Правильно ли подключены светодиоды. Проверьте полярность.
1. Монтаж. Может где-то плохой контакт?
2. Живы ли выходы второго регистра. Поменяйте чипы местами и посмотрите, что получится.
3. Правильно ли подключены светодиоды. Проверьте полярность.
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Григорий, уточните пожалуйста: при плохом контакте будут ли диоды включаться? Ведь они же включаются и выполняют программу (исходный скетч).
Поменяла чипы. Ситуация та же.
при неправильной полярности диоды же просто не загораются, а они загораются при выполнении исходного скетча. просто второй комплект (на втором регистре) загорается синхронно с первым.
Поменяла чипы. Ситуация та же.
при неправильной полярности диоды же просто не загораются, а они загораются при выполнении исходного скетча. просто второй комплект (на втором регистре) загорается синхронно с первым.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Какой скетч вы называете исходным? Покажите его здесь.
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
вот этот (в нем не прописан регистр, есть только функция):
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 8) numLEDSLit = 8;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Хорошо. Давайте разберем этот скетч.
1. В этом скетче для управления защелкой регистра используется пин 8 Arduino, а в описании вашей схемы вы указали, что этот вывод регистра подсоединен к пину 9 arduino. Измените скетч или схему.
2. В регистры записывается одинаковое значение по причине того, что в скетче данные для записи хранятся в одной переменной - leds, и используется только один вызов функции shiftOut(). Получается что сначала значение из переменной leds попадает в первый регистр, а затем, во время следующего вызова shiftOut(), переносится во второй регистр. Таким образом в оба регистра записывается одинаковое значение.
Попробуйте следующий скетч:
1. В этом скетче для управления защелкой регистра используется пин 8 Arduino, а в описании вашей схемы вы указали, что этот вывод регистра подсоединен к пину 9 arduino. Измените скетч или схему.
2. В регистры записывается одинаковое значение по причине того, что в скетче данные для записи хранятся в одной переменной - leds, и используется только один вызов функции shiftOut(). Получается что сначала значение из переменной leds попадает в первый регистр, а затем, во время следующего вызова shiftOut(), переносится во второй регистр. Таким образом в оба регистра записывается одинаковое значение.
Попробуйте следующий скетч:
Код: Выделить всё
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 16) numLEDSLit = 16;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
shiftOut(dataPin, clockPin, LSBFIRST, (leds>>8));
digitalWrite(latchPin, HIGH);
delay(50);
}
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
я меняла 9 в скетче на 8. потому что у меня в модели я использовала 8 цифровой вход.
ЗАРАБОТАЛА!!! СПАСИБО!!! ОТЛИЧНО!
пришлось правда подправить, чтобы свет шел от первого регистра ко второму и от 1го диода к 8му и далее
НО ВСЕ РАБОТАЕТ )) спасибо огромное.
а куда и как вписывать звуковую историю: нужно, чтобы после того, как будет загоратся последний диод в цепочке (16й) через некоторый промежуток времени (например через 3 секунды) должен звучать звуковой сигнал. у меня получилось два варианта: либо сигнал звучит постоянно, либо он звучит только в начале при загрузке скетча. а по идее проекта эта функция тоже должна быть зациклена, т.е. каждый раз когда будет становиться темно и будут зажигаться все лампочки до последней должен звучать этот звуковой сигнал
ЗАРАБОТАЛА!!! СПАСИБО!!! ОТЛИЧНО!
пришлось правда подправить, чтобы свет шел от первого регистра ко второму и от 1го диода к 8му и далее
НО ВСЕ РАБОТАЕТ )) спасибо огромное.
а куда и как вписывать звуковую историю: нужно, чтобы после того, как будет загоратся последний диод в цепочке (16й) через некоторый промежуток времени (например через 3 секунды) должен звучать звуковой сигнал. у меня получилось два варианта: либо сигнал звучит постоянно, либо он звучит только в начале при загрузке скетча. а по идее проекта эта функция тоже должна быть зациклена, т.е. каждый раз когда будет становиться темно и будут зажигаться все лампочки до последней должен звучать этот звуковой сигнал
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Я рад, что у вас получилось решить задачу п. 1. Теперь переходим к п. 2.
Для начала надо выяснить, к какому пину у вас подключена пищалка?
Для начала надо выяснить, к какому пину у вас подключена пищалка?
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Ок. Допустим, пищалка подключена к цифровому выводу 1. Тогда программа будет выглядеть следующим образом:
Код: Выделить всё
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int buzzerPin = 1;
int flagAlarm = 0;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 57; //1023 / 9 / 2
if (numLEDSLit > 16) numLEDSLit = 16;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
// Пищим при первом срабатывании flagAlarm
if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
flagAlarm == 1;
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
}
// Сбрасываем flagAlarm
if ((flagAlarm == 1) && (numLEDSLit < 14)) {
flagAlarm == 0;
}
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
shiftOut(dataPin, clockPin, LSBFIRST, (leds>>8));
digitalWrite(latchPin, HIGH);
delay(50);
}
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Григорий, спасибо большое Протестировала. Во-первых собрала схему с 4мя регистрами. Проблема в том. что при прописывании вот такой истории:
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 58; //1023 / 9 / 2
if (numLEDSLit > 32) numLEDSLit = 32;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>32));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>24));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>16));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>8));
shiftOut(dataPin, clockPin, MSBFIRST, leds);
digitalWrite(latchPin, HIGH);
delay(50);
}
срабатывает только два регистра. 3й и 4й не реагируют. они зажигаются в момент подключения питания, но когда загружается программа. то они не работают.
причем, когда было прописано только на 8 и 16, но собрана схема из 4х регистров, четвертый синхронился с первым, а третий не работал.
с сигналом история сработала, но он все время работает, когда загорается последний диод. как сделать так, чтобы последний диод загорался, а сигнал звучал только один раз? я вижу, что прописан сброс при срабатывании. но этого не происходит.
int lightPin = 0;
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(lightPin);
int numLEDSLit = reading / 58; //1023 / 9 / 2
if (numLEDSLit > 32) numLEDSLit = 32;
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>32));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>24));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>16));
shiftOut(dataPin, clockPin, MSBFIRST, (leds>>8));
shiftOut(dataPin, clockPin, MSBFIRST, leds);
digitalWrite(latchPin, HIGH);
delay(50);
}
срабатывает только два регистра. 3й и 4й не реагируют. они зажигаются в момент подключения питания, но когда загружается программа. то они не работают.
причем, когда было прописано только на 8 и 16, но собрана схема из 4х регистров, четвертый синхронился с первым, а третий не работал.
с сигналом история сработала, но он все время работает, когда загорается последний диод. как сделать так, чтобы последний диод загорался, а сигнал звучал только один раз? я вижу, что прописан сброс при срабатывании. но этого не происходит.
- Mr.Kubikus
- Сотрудник ПАКПАК
- Сообщения: 1020
- Зарегистрирован: 22 окт 2010, 23:57
Re: Arduino UnoR3 + LEDs + shift registers НЕ РАБОТАЕТ КАК О
Давайте по порядку. Разберемся сначала с пищалкой.
У меня в исходном коде была ошибка.
Замените:
на:
Ошибка в том месте, где я присваиваю переменной flagAlarm значение 1 и 0. После копирования я не заменил == на =.
У меня в исходном коде была ошибка.
Замените:
Код: Выделить всё
// Пищим при первом срабатывании flagAlarm
if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
flagAlarm == 1;
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
}
// Сбрасываем flagAlarm
if ((flagAlarm == 1) && (numLEDSLit < 14)) {
flagAlarm == 0;
}
Код: Выделить всё
// Пищим при первом срабатывании flagAlarm
if ((flagAlarm == 0) && (numLEDSLit >= 16)) {
flagAlarm = 1;
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
}
// Сбрасываем flagAlarm
if ((flagAlarm == 1) && (numLEDSLit < 14)) {
flagAlarm = 0;
}