Пару дней назад решил начать изучать ардуино, ибо всю свою сознательную жизнь я собирал устройства на мелкой логике. Но тут вот приспичило. А именно мне нужно как то осуществить такой проект. Есть для начала 2 сдвиговых регистра 74НС595 и есть ардуино уно р3
int dataPin = 9; //Пин подключен к DS входу 74HC595 int latchPin = 10; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW shiftOut(dataPin, clockPin, LSBFIRST, B01001100); // передаем последовательно на dataPin digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах }
void loop() {
}
На светодиодах высветилась комбинация 01001100. Ура, моя первая схема на микроконтроллере работает.
Далее дополнил схему ещё одним регистром сдвига, и добавил ещё 8 светодиодов.
int dataPin = 9; //Пин подключен к DS входу 74HC595 int latchPin = 10; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, B01001100); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, B10000111); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, во втором - B01001100 // и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах }
void loop() { }
Теперь на 16 светодиодах 01001100 10000111
Но мне надо чтоб был массив из десятка или двух вот таких двух байтовых комбинаций, и чтоб можно было каждую комбинацию выводить на светодиоды нажатием кнопки. То есть нажал кнопку, высветилась первая двухбайтовая комбинация на этих 16 светодиодах, нажал ещё раз, высветилась следующая , и так далее по порядку. Скетч подключения кнопки тоже нашёл интернете
Код:
// пины подключенных устройств int switchPin = 8; int ledPin = 11;
// переменные для хранения состояния кнопки и светодиода boolean lastButton = LOW; boolean currentButton = LOW; boolean ledOn = false;
Вот теперь пока как это всё связать не могу понять, да и в интернете аналогичного не нашёл. Есть всякие мигалки и бегающие лгоньки , но там всё по циклу повторяется. Знатоки ардуино помогите мне пожалуйста в освоении этой науки. Научусь азам дальше проще наверное будет. Заранее спасибо.
Заголовок сообщения: Re: Прошу помощи с ардуино и моим проектом
Добавлено: Вт дек 03, 2019 18:14:20
Я не ардуинщик, но могу подсказать логику работы… как один из вариантов… нужна некая переменная в которой будет производиться счёт нажатия кнопки… а так же некий массив из которого байты (в твоём случае 2 байта) будут отправляться в регистры… после очередного нажатия проверяется число в данной переменной… и в соответствии определённого числа необходимые 2 байта заносятся в выше указанный массив, а затем они из массива отправляются в регистры… затем ждёшь следующего нажатия… и так далее. Как то так.
Самсусамыч, спасибо. Но по теории я тоже понимаю что по нажатию кнопки должна запускаться некая функция отправляющая данные на светодиоды, потом кнопка переходит в режим ожидания до следующего нажатия и снова запускает функцию оправки данных на светодиоды...Примерно как вы объяснили. Но как скетч написать не знаю.
Заголовок сообщения: Re: Прошу помощи с ардуино и моим проектом
Добавлено: Вт дек 03, 2019 18:37:09
Чтобы писать что-то, наверное вначале необходимо изучить язык на котором хочется что-то писать, ну и изучить естественно МК для которого все эти инструкции предназначаются.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Чтобы писать что-то, наверное вначале необходимо изучить язык на котором хочется что-то писать, ну и изучить естественно МК для которого все эти инструкции предназначаются.
В приложении к адуринье изучение начинки МК не является первостепенным. А вот изучение возможностей "референса" (https://www.arduino.cc/reference/en/ или off line, установленный вместе со средой) и основ Си - ОБЯЗАТЕЛЬНО.
shiftOut() там совсем необязателен - оная функция у адуриньи организована программно и от самодельного НИЧЕМ отличаться не будет. Достаем даташит на 595й и какую-нить кнопу однако надо... А перебор "комбинаций в ожидании" на основе генератора случайных чисел с изменением состояния или по времени (delay(), millis()) или по конопе (там свои заморочки в зависимости от схемотехники и/или "хотелок").
int dataPin = 9; //Пин подключен к DS входу 74HC595 int latchPin = 10; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, B01001100); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, B10000111); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, во втором - B01001100 // и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах }
void loop() { }
как видите в прошивке есть пара байтов 01001100 и 10000111, при запуске схемы первый байт выводится на вторые восемь светодиодов, а второй байт на первые восемь светодиодов. Всё работает. Но мне мне нужно чтоб таких пар байтовых как эти было десять, двадцать, тридцать, и была кнопка. Нажал кнопку вывелась первая пара байтов из списка, нажал ещё раз вывелась следующая пара байтов и так по списку до конца. Имеется ардуинка и пара микросхем сдвиговых регистров 595.
Заранее заданные статические данные (массив из ПЗУ или ЕЕПРОМ, заданный автором по взгляду на потолок) или случайным образом полученный массив из ОЗУ/переменных)? И где кнопа?
Кроме прочего - учитесь рисовать в общепринятом стиле (splan хотя-бы) - рисунки в стиле "ранней автомобильной техники" тут большинство КОТОВ разбирать не станет.
Так в том то и дело что кнопки нет в этом примере, и в этом примере всего два байта, посмотрите код прошивки, в нём и есть эти два байта вот в этом куске:
Код:
// начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, B01001100); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, B10000111); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, во втором - B01001100
а у меня должен быть список по два байта примерно так
С простым инкрементом (или ГСЧ, простой "рециркуляцией по кольцу") особо проблем не будет Спойлер
Код:
int dataPin = 9; //Пин подключен к DS входу 74HC595 int latchPin = 10; //Пин подключен к ST_CP входу 74HC595 int clockPin = 11; //Пин подключен к SH_CP входу 74HC595 int data_buf; void outdata();
void setup() { // put your setup code here, to run once: //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW data_buf = word (B10000111, B01001100); }
void loop() { // put your main code here, to run repeatedly: outdata(); delay(1000); data_buf ++; }
//----------
void outdata() { // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, lowByte(data_buf)); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, highByte(data_buf)); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW }
А вот с заранее заданной таблицей - надо progmem вспоминать. Со строками символов ASCII там особо не сложно, а вот с простыми массивами без конспекта по памяти сложновато... С ЕЕПРОМкой чуток проще, но мне чего-то не слишком нравится (или на моей адуринье чего-то с той ЕЕПРОМ не совсем хорошо опосля "поджарки" ).
Последний раз редактировалось BOB51 Вт дек 03, 2019 19:53:18, всего редактировалось 1 раз.
А самому подумать? Работа с кнопками ничем не отличается от таковой для любой разновидности МК. Алгоритм: ждем изменения статуса линии выполняем задержку примерно 0,02 секунды выполняем контрольный опрос если состояние отличается - начинай сначала если совпадает - выполнить то, чего от конопы требуется и уйти в ожидание отпускания ожидание отпускания (аналогично ожиданию нажатия, только для другого логического уровня) при обнаружении отпускания возвращаемся в начало цикла (к контролю нажатия). Обработка на уровне буферной переменной (можно byte использовать), в которую копируется состояние вывода если имелось его рассогласование с ранее прочитанным.
Это ежли насчет "требуется помощь".
Альтернатива - "сделайте за меня" - там уже другие задачи - надо всю задачу ОТКРЫВАТЬ, а не наводяшши вопросы задавать. Где-то в дебрях https://radiokot.ru/forum/viewtopic.php?f=62&t=156720 был учебный секундомер на дисплейчике MAX7219 и емкостной кнопе (пуск-стоп-сброс) - искать ЛЕНЬ...
Alex-DJ, вам, вероятно, моего примера не достаточно было? Опрос кнопкиСпойлер
Код:
// считаем клики кнопки, как уже делали это раньше if (buttonWasUp && !digitalRead(BUTTON_PIN)) { delay(10); if (!digitalRead(BUTTON_PIN)) clicks = (clicks + 1) % 10; } buttonWasUp = digitalRead(BUTTON_PIN);
Вывод на индикаторСпойлер
Код:
byte H_byte[10] = { 0b01001100, 0b01000101 } byte L_byte[10] = { 0b10000111,0b010001010 } // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, H_byte[clicks]); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, L_byte[clicks]); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
Так автор ЕЩЕ НЕ ОПРЕДЕЛИЛСЯ ни с типом кнопки, ни с ее размещением в схеме. (механика/ бездребезговое и на каком выводе микросборки) Так чего ж обсуждать- помогать? Был бы предложен вариант исходника - тогда можно и посоветовать /скорректировать чего-то. (как ранее набросок одного из возможных вариантов я выложил). Посему ЖДЕМС...
ТС, сначала словами распиши что хочешь, а затем так и делай. Типа, горит то-то, нажал кнопку, загорелось то-то, нажал ещё раз... и т.д. Сначала у себя в голове сложи, а без этого никак.(
ТС, сначала словами распиши что хочешь, а затем так и делай. Типа, горит то-то, нажал кнопку, загорелось то-то, нажал ещё раз... и т.д. Сначала у себя в голове сложи, а без этого никак.(
Я же 4 раза уже написал, есть 16 светодиодов, есть два сдвиговых регистра 595...есть кнопка. Есть 20, 30, 40 двухбайтовых комбинаций
ну и так далее, для этих самых 16 светодиодов. Нажал кнопку высветилась первая двухбайтовая комбинация, нажал ещё раз высветилась следующая пара, и так до последней.
Alex-DJ, вам, вероятно, моего примера не достаточно было? Опрос кнопкиСпойлер
Код:
// считаем клики кнопки, как уже делали это раньше if (buttonWasUp && !digitalRead(BUTTON_PIN)) { delay(10); if (!digitalRead(BUTTON_PIN)) clicks = (clicks + 1) % 10; } buttonWasUp = digitalRead(BUTTON_PIN);
Вывод на индикаторСпойлер
Код:
byte H_byte[10] = { 0b01001100, 0b01000101 } byte L_byte[10] = { 0b10000111,0b010001010 } // начинаем "продавливать" данные по цепочке регистров, начиная с последнего shiftOut(dataPin, clockPin, LSBFIRST, H_byte[clicks]); // передаем последовательно на dataPin - в первом регистре значение B01001100 shiftOut(dataPin, clockPin, LSBFIRST, L_byte[clicks]); // "продавливаем" данные в следующий регистр - в первом регистре B10000111, // во втором - B01001100 и т.д. по количеству регистров digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым // устанавливая значения на выходах delayMicroseconds(5); digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
Здесь вроде счёт до десяти идёт, из того примера, и не могу понять где тут мой массив двух байтовых комбинаций
То есть Вам кнопкой нужно перебирать кучу комбинаций? Ну так, по каждому нажатию меняете комбинацию, к примеру от 0 до 9, которую передаёте на 595, какие вопросы? Для примера Вам даны 2 массива по 10 комбинаций для старшего и младшего байта. Только самое начало, дальше Вы уже сами должны дописать то что Вам хотелось бы видеть.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения