Здравствуйте! Я только недавно начала просвещаться по тематике микроконтроллеров, и в том числе ардуино. Идея всего этого действа такая: на базе ардуино создать проводку на мот (свет, поворотники, стопы, стартер, то есть то, что не требует большого ума и опыта). Решено было сделать через резистивный делитель, начала я с поворотников и почти сразу же встряла. 1. По нажатию кнопки поворотника поворотник должен промигать 20 сек и отключиться автоматически, но так же он должен отключиться при повторном нажатии этого же поворотника. Как это сделать? Раз уж спрашиваю, задам кучу вопросов: 2. Достаточно ли программной защиты от дребезга кнопки, или нужна аппаратная защита, если да, то можно схему? 3. Как сделать так, что бы во время работы поворотника, к примеру, ардуино реагировала на нажатие на кнопку звукового сигнала? 4. Сама логика кода адекватна, или надо все было по другому сделать? Схему, расчеты и почти весь код я брала отсюда (где схема параллельного подключения) http://codius.ru/articles/Arduino_Подключение_нескольких_кнопок_к_одному_аналоговому_входу Код (C++): int pinIn = A0; int keyValue = 0; // Состояние покоя int TurnR = 1; int TurnL = 2; int light = 3; int hotn = 4; int pinTurnR = 11; int pinTurnL = 12; long prevMillis = 0; void setup() { pinMode(pinIn, INPUT); pinMode (pinTurnR, OUTPUT); pinMode (pinTurnL, OUTPUT); Serial.begin(9600); } void loop() { int newKeyValue = GetKeyValue(); // Получаем актуальное состояние кнопок с коррекцией дребезга, вызываем функцию описанную ниже if (keyValue != newKeyValue) { // Если новое значение не совпадает со старым - реагируем на него, сравниваем значения которое было, с которым появилось keyValue = newKeyValue; // Актуализируем переменную хранения состояния, приравниваем старую переменную к новому значение if (keyValue > 0) { // Если значение больше 0, значит кнопка нажата, если кнопка нажата, то сигнал больше 1 if (TurnR == keyValue){ Serial.println("TurnR " + String(keyValue));//выводим на экран номер нажатой кнопки int i = 0; while( i<=14) { newKeyValue = GetKeyValue(); if (newKeyValue !=0 && newKeyValue !=4 && newKeyValue !=3 && newKeyValue!=keyValue) break; keyValue = newKeyValue; digitalWrite (pinTurnR, 1);//мигание светодиода 20 сек("1" - 1 сек, "0" - 0,5сек) delay (1000); digitalWrite (pinTurnR, 0); delay (500); i++; } i = 0; } if (TurnL == keyValue){ Serial.println("TurnL " + String(keyValue)); int i = 0; while (i<=14 ) { newKeyValue = GetKeyValue(); if (newKeyValue != keyValue && newKeyValue!=0 ) break; keyValue = newKeyValue; digitalWrite (pinTurnL, 1);//мигание светодиода 20 сек("1" - 1 сек, "0" - 0,5сек) delay (1000); digitalWrite (pinTurnL, 0); delay (500); i++; } i = 0; } if (light == keyValue) Serial.println("light " + String(keyValue)); if (hotn == keyValue) Serial.println("hotn " + String(keyValue)); } else if (keyValue < 0) { // Если -1 - неизвестное состояние, незапрограммированное нажатие Serial.println("unknown pressed"); } else { // Если 0, то состояние покоя Serial.println("all keys are not pressed"); } } } int GetKeyValue(){ static int count = 0; //счетчик if (GetButtonNumberByValue(analogRead(pinIn)) > 0)// если есть сигнал на аналоговом входе то { if (millis() - prevMillis > 100) { prevMillis = millis(); count++; } } else count = 0; if (count >= 5) { return GetButtonNumberByValue(analogRead(pinIn)); } if (GetButtonNumberByValue(analogRead(pinIn)) == 0) return 0; if ((GetButtonNumberByValue(analogRead(pinIn)) < 0)) return -1; } int GetButtonNumberByValue(int value) { // Новая функция по преобразованию кода нажатой кнопки в её номер int values[5] = {0, 341, 511, 609, 769};// небольшой массив из значений, которые могут поступить от 4 кнопок на вход int error = 15; // Величина отклонения от значений - погрешность for (int i = 0; i <= 4; i++) { // Если значение в заданном диапазоне values[i]+/-error - считаем, что кнопка определена if (value <= values[i] + error && value >= values[i] - error) return i; } return -1; // Значение не принадлежит заданному диапазону }
Большинство знаний получается путем опыта, да и так интереснее во все это вникать. И может быть получиться общую массу проводки уменьшить
это вряд ли (с) Лампочки останутся на своих местах, значит и проводов надо столько же. Управлять лампами проще всего посредством реле, тем более что они уже там есть. Так что скорее увеличится - на массу ардуины как минимум Вы не ответили про резистивный делитель - зачем он там?...
Большинство знаний получается, когда с интересом, а не лишбыздать, читаешь умные книшки, например "Искусство схемотехники", или, на худойканец "Занимательная электроника".
"Мот" является средством повышенной опасности! А тут начинающий пытается что-то делать на микроконтроллере по управлению... Эл.помехи, тряска, вода, грязь... Ладно, если будет моргать фарой когда не нужно, а если на скорости включится стартер??? Оставьте эту затею!!!
вот народ, барышня мотык тюнингует, а вы вместо помощи критикуете деяние и книжки какие то предлагаете... кто то может начать ещё и о безопасности движения трындеть. Якутию это всё равно не остановит. Я.с. - перед публикацией могли бы смело всё на макете собрать и попробовать, а уже если что не так - вопросы задавать. да и код перед тем как народу показывать нужно отформатировать.
Отладочная информация в коде зачем? Где подробные комментарии в коде? Вчитываться в код здесь будут 1-2 человека, остальные пройдут мимо. МК не для тех, кто Для начала надо подтянуть знания в области электроники. Затем подучить основы программирования. Ну или готовить деньги и нанимать репетитора, который всё расскажет и даже сделает.
Если решили изучать Ардуину, изучите заодно и симулятор электронных схем - Протеус. Тут сильно не надо заморачиваться - нарисовал схему с Ардуиной, зуммером, кнопочками и лампочками. Даже не надо деталей, обязательных в реальной схеме - типа ограничительных резисторов, промежуточных реле и тд. - это же симуляшка. Задали виртуальному процессору файл прошивки - и смотрите результат работы именно вашей программы. Милое дело. А уж после - можете и на макетке собирать, и в реале - мотоцикл дербанить, если не жалко.
А во Вьетнаме вообще поворотники не включают и в зеркала не смотрят.Только бибикають.Услышал гудок справа прими влево иначе сшибут нах.И по теме-надо реально сделать на макетке помигать светодиодами вместо поворотников а потом понять-Оно тебе надо?Да и как тут сказали Ардуино не самый лучший способ.Грязь сырость итд.У меня раз в год задние фонари ВАЗ 21093 начинают жить своей жизнью а ведь там нет электроники и они типа закрыты от внешних условий.Во всем нужен здравый смысл.Хотите изучать Ардуино?На Амперке масса примеров в картинках и кодах.И даже некоторые можно применить в домашнем хозяйстве.