arduino работа с датчиками или проблема с прошивкой
- Войдите на сайт для отправки комментариев
Втр, 26/04/2016 - 12:24
Приветствую, требуется помощь новичку.Решил собрать схему для посудомойки на основе arduino uno http://ru.aliexpress.com/item/UNO-R3-MEGA328P-CH340-CH340G-for-Arduino-UNO-R3-USB-CABLE-Free-shiping/32490213684.html
В скетче три цикла мойки.Первый выполняется как надо, а вот второй и третий как попало.Когда первый раз заливаю скетч все идет хорошо и доходит до конца.После первой перезагрузки платы она глючит.
Все компоненты посудомойки подключены через 4 реле: на 12v, сами реле подклченны к unl2003AN
Вот прошивка:
int led5 = 9; // индикатор выполнения светодиод
int led4 = 10; // Слив
int led2 = 12; // Насос
int led3 = 11; // тен
int led1 = 13; // Клапан воды
int potPin = 19; // прекращение набора воды
int val = 0;
int val1 = 0;
int val2 = 0;
void setup()
{
delay(10000);
digitalWrite(10, HIGH);
delay(5000);
digitalWrite(10, LOW);
delay(3000);
digitalWrite(13, HIGH);
analogReference(DEFAULT);
int val = analogRead(potPin);
do
{
val = analogRead(potPin);
delay (1000);
}
while (val<1000);
digitalWrite(led1, LOW);
delay(3000);
digitalWrite(12, HIGH);
delay(100);
digitalWrite(11, HIGH);
delay(10000);
digitalWrite(11, LOW);
delay(10000);
digitalWrite(12, LOW);
delay(3000);
digitalWrite(10, HIGH);
delay(20000);
digitalWrite(10, LOW);
delay(5000);
digitalWrite(13, HIGH);
analogReference(DEFAULT);
int val1 = analogRead(potPin);
do
{
val1 = analogRead(potPin); // с этой строки программа лезет в начало
delay (1000);
} while (val1<1000);
digitalWrite(led1, LOW);
delay(3000);
digitalWrite(12, HIGH);
delay(100);
digitalWrite(11, HIGH);
delay(10000);
digitalWrite(11, LOW);
delay(10000);
digitalWrite(12, LOW);
delay(3000);
digitalWrite(10, HIGH);
delay(20000);
digitalWrite(10, LOW);
delay(5000);
digitalWrite(13, HIGH);
analogReference(DEFAULT);
int val2 = analogRead(potPin);
do
{
val2 = analogRead(potPin);
delay (1000);
} while (val2<1000);
digitalWrite(led1, LOW);
delay(3000);
digitalWrite(12, HIGH);
delay(10000);
digitalWrite(12, LOW);
delay(3000);
digitalWrite(10, HIGH);
delay(20000);
digitalWrite(10, LOW);
delay(10000);
digitalWrite(10, HIGH);
delay(5000);
digitalWrite(10, LOW);
delay(10000);
digitalWrite(9, HIGH); //
}
void loop(){}
Андрей 14 лет.
1. Пожалуйста вставляйте в посты код так, как описано здесь : http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
2. Бросается в глаза отсутствие в начале setup() команд pinMode() (http://arduino.ru/Reference/PinMode).
3. Фраза "После первой перезагрузки платы она глючит." малоинформативна.
Явно видны следы копи-пасты .. Вы уверены, что программа лезет в начало, а не исполняет скопированный участок? Ну и слегка отформатировал и дополнил комментарии, а также переименовал ваши определения ножек ввода-вывода .. там сразу возник вопрос про тели ножки везде использованы? Проверьте внимательней.
Да, и замечание про отсутствие pinMode() - совершенно верное. По умолчанию, при включении все ножки микроконтроллера настраиваются как ВХОДЫ, а не выходы ..
Андрей, в 14 лет похвально подобным заниматься, но уже поря бы по-врослому начинать.
1. Процедура setup(), в которую Вы поместили весь код, выполняется один раз при старте, далее по кругу выполнятеся процедура loop(). Если необходимо однократное выполнение loop(), то в конце можно либо примитивно повесить процессор бесконечным циклом, либо ждать нажатия клавиши, либо усыпить/остановить процессор.
2. Чтобы не писать прямым тексом весь алгоритм работы, лучше создать массив записей: нога, состояние, пауза и исполнять описанную в нём последовательность циклом.
3. В начале Вы описали константы номеров пинов, но потом в коде используете цифры для нумерации пинов - это нехорошо.
4. Вы уверены, что analogRead(potPin) должно давать именно уналоговый сигнал датчика уровня воды (насколько я понимаю) и этот сигнал приемлем для процессора?
5. За секунду паузы в цикле этот уровень не превысит критический? Из циклов провекри уровней паузу можно убрать, процессору не напряжно миллион раз в секунду проверять состояние датчика.
6. Как Вы определили, что программа "лезет в начало"? У Вас ведь нет никой диагностической информации. Поставьте, serial.print('Начато действие Х') и serial.print('Завершено действие Х') в интересных метах и смотрите в мониторе порта что происходит.
7. Настроить пины процессора необходимо в начале программы.
Вот переработал пока только один цикл, сможет ли контроллер правильно понять команду delay(10800000)?
Может. Если его нечем больше занять, то пойдет и так.
Прочитал команду:
Так тоже можно?
Конечно. Если Вы понимаете что это означает. В целом: "можно всё, что не запрещено явно". В т.ч. и "сломать шею", в смысле написать код, который будет работать не очевидно. :)
Пример из Вики:
#define if(p) if( rand(100)>50 && (p) )
.. и головная боль тестеру может быть обеспечена всеръез и надолго.
Прочитал команду:
Так тоже можно?
Можно, команда будет ждать нажатия кнопки. Это самый простой вариант, останавливающий работу программы, страдающий от дребезга контактов и проскакивающий при удержании кнопки нажатой на втором круге. В каком-то случае это не имеет значения, но на будущее подумайте.
Андрей, не надо спрашивать разрешения в данном случае. :) Компилируйте и проверяйте.
Пример из Вики:
#define if(p) if( rand(100)>50 && (p) )
.. и головная боль тестеру может быть обеспечена всеръез и надолго.
Уибил!!! :))))
Андрей, человек хотел сказать, что начинать лучше с полных конструкций.
while (digitalRead(Pin)!=1) {
};
В языке С и так много нечеловечного, даже тут Вы видите, что вместо нормального человеческого "<>" надо писать "!=". Далее ещё не раз попадётесь, я думаю, на if (a=b). Такой вот он С - язык закарючек и выпендрёжей. :)
Может быть, начните изучение программирования в т.ч. и дуни с mikroPascal, но подумав первоначально о том, что С после Паскаля часто будет вызывать, в лучшем случае, удивление, но Паскаль намного уступает С по распространённости и найти библиотеки, например, или какие-то примеры/решения на Паскале окажется намного сложнее, будете вынуждены вернуться к С или переводить библиотеки.
Сделайте сначала Вашу задачу не прямым перечислением операций, а по записанному в виде массива данных сценарию: чем управлять, какое состояние и сколько времени так его держать. Потом избавьтесь от того, что было названо уважаемым человекм "тут тупим" и занять процессор чем-то полезным, вместо банального простоя при выполнении delay(), например, выводите на экран название текущей операции и оставшееся время работы. Плюс, создайте кнопку прерывания работы (Reset не в счёт).
Кстати, господа, а ведь в С можно же объектные файлы создавать .obj? В среде МК это не принято для кросиспользования языков?
Подправил ваш код и слегка выровнял. Мне кажется так понятее и читать легче.
1. Если Вы определяете имена ножкам МК для своей программы, то используйте их всюду, а не "местами". В большом коде очень легко "наступить на грабли" забыв какая ножка с какой цифирькой связана.
2. Если у вас в коде ножки используются только явным способом, то определяйте их или так как я вам подправил - через маркопроцессор, или с ключевым словом const, чтобы компилятор догадался что это неизменяемое число и смог улучшить генерацию кода. Или чтобы в последствии (по мере освоения) перейти на компактные 1-командные операции digitalWrite() и т.п. Управление ножками и много чего иного, в этом МК делается ровно 1-2 командами
.. привыкайте к хорошему.
Да, именно это и хотел показать. Но не согласен. Учить надо сразу "С", и возможно далее "С++" .. но посмотрев последние релизы .. задумался "а надо ли учить молодых этой солянке"? Все остальные языки, наследники Алгол-68 надо учить и осваивать позже, в сравнении с "С" - будет значительно проще.
Это из моего давнего опыта обучения программированию. Практика показала, что детишки, начинавшие с Паскаль, позже на "С" толком и не переходили и С++ осваивали только на начальном уровне, стремясь программировать "по-паскалевски" .. слишком высок оказывался барьер паскалевских ограничений. А вот детишки, начинавшие с "С", потом становились классными программистами и сейчас уже сами рулят программистскими конторами, обучают людей, имеют ученые степени.. "полезный выхлоп" тут более 70%.
как-то так.
У Паскаля есть вполне достойные наследники: Модула-2, Оберон. Последний тоже "сильно покоцан" и не считаю его языком для серъезного программирования, но как показывает практика - тем не менее, используется и вполне успешно.
И опять же, как показала практика, "С" - позволяет заменить Ассемблер в программировании микроконтроллеров и прочих "мелких" систем. Факт того что "С" - единственный язык, который потеснил даже Ассемблер в этой сфере - упомянут в т.ч. и в Вики. Но, согласен - "сломать шею" на "С" тоже можно легко.
Требуется жесткая система приемов программирования, которая исключает такую возможность. Но .. тут, пока ещё, никто их не формализовал настолько же легко и доступно как Паронджанов для рисования блок-схем своими книжками для детей. Поэтому ТС-у, я настоятельно советую скачать книжку "Занимательная информатика" этого автора (drakon.su) и её прочить и усвоить. Это - "билет в профессию". :)
У языка С лишь удачный коммерческий успех, его выбрали однажды не особо задумываясь несколько т.с. лидеров и снежный ком покатился. Сам С и даже его расширение С++, ничем, собственно, не отличаются от Паскаля, если не использовать глупые выверты, вроде бы, дающие удобство программисту, но через месяц непонятные самому этому же программисту.
Язык сам по себе живёт, а вот его прикладное использование - это компиляторы, а компиляторы - это коммерческий продукт. Никто из комерсантов не будет двигать язык из большой любви. К тому же, и так уже поналепили разного дерьма, проде PHP, а ещё хлеще - Perl. Java прётся - вообще страх Божий! Дельфи есть ведь, но его успех ограничен, и они перешли в занятие сегмента.
В общем, се ля ви. Никто, сидя на горшке, не прозрел и не решил "буду писать на С", все выбрали этот язык по нужде под давлением внешней среды, слившись т.с. в стадо или мэйнстрим (кому как нравится). :) Формирование мэйнстримов, управление толпой, даже понимание стадности людей - это очень занятная и большая философская тема. :)
Про С, потеснивший Ассемблер странно слышать. Турбо Паскаль, старой версии, генерировавший COM файл всегда здорово теснил АSM. :) Опять же, не в языке дело, а в наличии средств использования этого языка. :)
:) Это реальный факт (вытеснение Ассемблера), и вот видимо представляю такое исключение из ваших "никто ..". потому как начинал программировать в автокодах к Минск-222М, затем Фортран-2, Фортран-4, Алгол, ПЛ/1, Кобол .. и ассемблер ЕС-1022 .. ЕС-1055, ассемблер PDP-11 .. далее, внезапно Бейсик и Паскаль (очень немного), а потом снова автокоды Д3-28 (много), Z80, i8080, motorolla 68000 и .. PDP-11. Для Д3-28, мною был сделан Ассемблер, который эксплуатировался вплоть до 2001г. без какого-либо изменения и сопровождения в ряде организаций тут у нас.. было сделано ядро ОС, в т.ч. позволяющее распараллеливать вычисления до 256 машин в качестве "кластера" (реально более 8 не пробовалось за неименением такого количества) .. была начата работа по компилятору АДА для Д3-28 (32кб ОЗУ!) в нем был сделан синт. и сем. анализ с построением AST .. и на этом работа была прекращена в связи со сменой места работы. А вовсе не из-за "нехватки ресурсов".. в то время, я истинно верил в то, что "программ больше 8 килобайт - не бывает". :)
.. а далее, как ни странно, я попал в "НИИ", где завлаб был "либералом" .. и ему было вовсе пофиг на чем ты пишешь .. попробовал решать задачи на том что знал .. Бейсик, Паскаль .. и пришел к С. Сам пришел, также как и сейчас "внезапно" наткнулся на ДРАКОН.
Вот никто "за уши" не тянул! :)
Это уже "потом" были и Пролог, и Паскаль с Дельфи и С++ .. всего не упомнишь, да и незачем.
P.S. Да и те самые "выверты С" .. как раз и позволяют заместить Ассемблер, практически для любого Фон Неймана, что и составляет главную достопримечательность этого языка - понимание архитектуры компьютера. Просто с ними аккуратно надо :)
P.S. Да и те самые "выверты С" .. как раз и позволяют заместить Ассемблер, практически для любого Фон Неймана, что и составляет главную достопримечательность этого языка - понимание архитектуры компьютера. Просто с ними аккуратно надо :)
Например, какие выверты?
Как С даёт понимание архитектуры разных процессоров с разной архитектурой одновременно? Я не понимаю... Работа процессора - да, но не аритектура же. :)
Нормальный С и Паскаль не далеки от ассемблера, по сути, другими словами пишется лишь код, более наглядным и часть библиотек по вычислениям есть, т.е. то, что каждый программист на ассемблере делал персонально. Причём, ТурбоПаскаль генерировал очень красивый код.
Большой вопрос, да и с Паскалем очень давно не возился .. на С/С++ до прошлого года был 17-и летний перерыв, постепенно компенсирую .. а тут "и того больше" :)
Вот вам, первое что попалось из обсуждения без срача: http://dxdy.ru/topic81056.html
Обратите внимание на теже самые фразы про програмирование микроконтроллеров и пр. устройств. Ну и, как понимаю, сейчас и Паскаль далеко не тот, которым я его помню .. :)
Большой вопрос, да и с Паскалем очень давно не возился .. на С/С++ до прошлого года был 17-и летний перерыв, постепенно компенсирую .. а тут "и того больше" :)
Вот вам, первое что попалось из обсуждения без срача: http://dxdy.ru/topic81056.html
Обратите внимание на теже самые фразы про програмирование микроконтроллеров и пр. устройств. Ну и, как понимаю, сейчас и Паскаль далеко не тот, которым я его помню .. :)
Да, Паскаль в виде ТурбоПаскаля и Дельфи вырос очень сильно в расширении синтаксиса, особенно в части ООП. Хотя, ООП по сути та же запись, очень легко и просто встроившаяся в язык. Появились и несвойственные логике Паскаля безразмерные массивы. Появились очень удобная конструкция try, например. Вот сейчас как бы вернулся назад - в микроПаскале нет ООП, нет нетипизированных указателей (с какого-то перепугу), нет перечислимого типа (тоже с какого-то перепугу). И, Вы знаете, как-то обидно стало. Успокаивает лишь то, что первоначально рвался на асм всё писать, и тут даже такой порезаный немного язык лучше будет на некритичную часть. Своих библиотек на асм для МК нет, нарабатывать их не особо надо - не думаю, что остро понадобятся. Да и процессор ещё не факт какой, возможно, STM32. Пока до уровня аппаратуры не дошло дело.
faeton, пишет: "Вот сейчас как бы вернулся назад - в микроПаскале нет ООП, нет нетипизированных указателей (с какого-то перепугу), нет перечислимого типа (тоже с какого-то перепугу). И, Вы знаете, как-то обидно стало."
Ну так этого ничего и НЕ ДОЛЖНО быть в виртовском Паскале, который он создавал исключительно с целью обучения! Все, что вам так стало абыдна .. есть в "С", что называется "с рождения" .. просто Вы привыкли к с-подобному варианту Паскаля и только. Переходите на С и будет вам "щастье". (все есть, и есть 100500 способов выразить то что вам надо ровно так как оно требуется в местном диалекте Ассемблера) :)
Да, и из реплик того форума: "Написать код на асме сейчас лучше чем это сделает компилятор С - ещё постараться надо" .. близко-близко к объяснению почему С вытеснил Ассемблер в МК. :)
faeton, пишет: "Вот сейчас как бы вернулся назад - в микроПаскале нет ООП, нет нетипизированных указателей (с какого-то перепугу), нет перечислимого типа (тоже с какого-то перепугу). И, Вы знаете, как-то обидно стало."
Ну так этого ничего и НЕ ДОЛЖНО быть в виртовском Паскале, который он создавал исключительно с целью обучения! Все, что вам так стало абыдна .. есть в "С", что называется "с рождения" .. просто Вы привыкли к с-подобному варианту Паскаля и только. Переходите на С и будет вам "щастье". (все есть, и есть 100500 способов выразить то что вам надо ровно так как оно требуется в местном диалекте Ассемблера) :)
Да, и из реплик того форума: "Написать код на асме сейчас лучше чем это сделает компилятор С - ещё постараться надо" .. близко-близко к объяснению почему С вытеснил Ассемблер в МК. :)
Перечислимый тип и нетипизироанные указатели в Паскале от рождения его Виртом. :) И опять, уже говорил как-то об этом, не язык С хорошо код генерируе, а компилятор. Компилятор ТурбоПаскаль тоже генерирует на заглядение красивый код. И компиляторы С бывают разные, и не все они код красиво генерят, например, читал обсуждение mikroC - несколько ляпов компилятора там люди заметили, не фатальных, не ошибок, а нехороший избыточный код в просто ситуации. :)