Пару дней назад решил начать изучать ардуино, ибо всю свою сознательную жизнь я собирал устройства на мелкой логике. Но тут вот приспичило. А именно мне нужно как то осуществить такой проект. Есть для начала 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
Чтобы писать что-то, наверное вначале необходимо изучить язык на котором хочется что-то писать, ну и изучить естественно МК для которого все эти инструкции предназначаются.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания 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 комбинаций для старшего и младшего байта. Только самое начало, дальше Вы уже сами должны дописать то что Вам хотелось бы видеть.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения