Не пойму как сделать..
- Войдите на сайт для отправки комментариев
Пнд, 30/05/2016 - 08:46
Здраствуйте. С недавних пор заинтересовался Ардуино.
Пишу скетч под себя. Но вот появился вопрос. Как сделать, чтобы при получении единицы ( 1) выполнялся код который в скобках и переставал выполняться после получения двойки (2). Все это будет делаться через блюпуп. Вот кусок кода.. Подскажите в какую сторону копать. Ни как не могу понять, аж мозг закипает.
if (val == '1')// При символе "1" выполнялся код { // код для выполнения до отмены } if ( val == '0')// При символе "0" прекратить выполнение кода { //остановить выполнение кода }
Заранее спасибо!!! С уважением Игорь Пискунов.
Здраствуйте. С недавних пор заинтересовался Ардуино.
Пишу скетч под себя. Но вот появился вопрос. Как сделать, чтобы при получении единицы ( 1) выполнялся код который в скобках и переставал выполняться после получения двойки (2). Все это будет делаться через блюпуп. Вот кусок кода.. Подскажите в какую сторону копать. Ни как не могу понять, аж мозг закипает.
Заранее спасибо!!! С уважением Игорь Пискунов.
Ошибся.. при получении 0 а не 2, хотя, я думаю и так понятно, что хотел сказать.
Читаете символ блютуп, если он равер 1 - задаете значение глобальной переменной выполняющей роль тригера.
если он равен 0 - задаете другое значение глобальной переменной.
Сравниваете значение глобальной переменной с нужным - если равно - исполняете код.
Глобальная переменная должна быть задана за пределами функции loop(), так она будет сохранять свое значение.
А в функции loop() будет несколько операторов if - для обработки входящих данных из блютуп, обработки состояний глобальных переменных.
Читаете символ блютуп, если он равер 1 - задаете значение глобальной переменной выполняющей роль тригера.
если он равен 0 - задаете другое значение глобальной переменной.
Сравниваете значение глобальной переменной с нужным - если равно - исполняете код.
Глобальная переменная должна быть задана за пределами функции loop(), так она будет сохранять свое значение.
А в функции loop() будет несколько операторов if - для обработки входящих данных из блютуп, обработки состояний глобальных переменных.
Спасибо за быстрый ответ. Это я как бы понимаю, но ни как не могу понять как это сделать. Как бы переменную создал Правда не знаю, глабальная она или нет.
Потом слушаю блюпуп, если есть данные
при 1 выполняю код в скобках.
если 0 остановить выполнение кода.
Именно как остановить выполнение кода и не могу.
Грубо говоря, я хочу чтобы при 1 выполнялся вот этот код
как остановить при 0???
Если не сложно, чиркните кусочек кода...
программа выполняется последовательно, это и есть однозадачность. delay(1000) тормозит систему на секунду, то есть ничего не принимается и не анализируется в течении секунды. Нужно избавляться от delay если хотим что то делать или за чем то следить параллельно. Изучайте blink без delay. И соответственно нужно обнивлять состояние переменной постоянно во время выполнения вашего кода, если Вы хотите чтобы его выполнение прерывалось при поступлении нового значения. Если работайте с каким то кодом выкладывайте его целеком, даже если он не рабочий. Вам поправят, а писать код за Вас... пфф...
программа выполняется последовательно, это и есть однозадачность. delay(1000) тормозит систему на секунду, то есть ничего не принимается и не анализируется в течении секунды. Нужно избавляться от delay если хотим что то делать или за чем то следить параллельно. Изучайте blink без delay. И соответственно нужно обнивлять состояние переменной постоянно во время выполнения вашего кода, если Вы хотите чтобы его выполнение прерывалось при поступлении нового значения. Если работайте с каким то кодом выкладывайте его целеком, даже если он не рабочий. Вам поправят, а писать код за Вас... пфф...
Спасибо!! почти разьяснили. А писать за меня весь код я не просил.
Просто думал десять строк для примера не тяжелая ноша.
Ну раз так, и на этом спасибо большое за ответ.
Ну пускай мой код будет выглядеть вот так. Поправте меня- сам вопрос перед символами ??? :-)
В том то и дело, что светодиод будет мигать до тех пор пока выполняется условие: val == '1'. Как только условие перестанет выполняться - мигание прекратиться, никакой дополнительный код не нужен.
В том то и дело, что светодиод будет мигать до тех пор пока выполняется условие: val == '1'. Как только условие перестанет выполняться - мигание прекратиться, никакой дополнительный код не нужен.
вот отсюда по подробнее.
пришло в блюпуп 1- светодиод начал мигать- включился раз и выключился раз. Это все- или он будет мигать пока мигалка не устанет- вот в чем вопрос.
наверное объяняюсь неправильно. Мне нужно, чтобы код в скобках выполнялся постоянно( по кругу), пока не придет ноль (0)
В том виде, как есть сейчас, мигнет один раз, после получения "1". Если хотите чтобы мигалка включалась по "1" и мигала пока не придет "0", то код нужно слегка изменить.
CADAS,
В вашем примере условие if ( val == '0') не нужно вообще. Нет такого понятия, как принудительно "остановить код". Код в фигурных скобках первого условия будет выполняться, пока будет истинно условие if (val == '1'). Если это условие перестанет быть истинным (val будет равно чему угодно, кроме единицы) - код в фигурных скобках перестанет выполнятся.
наверное объяняюсь неправильно. Мне нужно, чтобы код в скобках выполнялся постоянно( по кругу), пока не придет ноль (0)
Тогда так:
Светодиод будет светить непрерывно (строчка "digitalWrite(LED, HIGH)" в setup) пока не придет "1".
CADAS,
В вашем примере условие if ( val == '0') не нужно вообще. Нет такого понятия, как принудительно "остановить код". Код в фигурных скобках первого условия будет выполняться, пока будет истинно условие if (val == '1'). Если это условие перестанет быть истинным (val будет равно чему угодно, кроме единицы) - код в фигурных скобках перестанет выполнятся.
То есть если я пошлю на блюпуп 1- то код вскобках будет выполняться покругу? Я имею ввиду так как сказал выше- включили диод на секунду, выключили диод на секунду и все- код закончиться, или будет мигать пока в блюпуп не придет другой символ?
CADAS,
Извиняюсь, я невнимательно прочитал что Вам нужно получить. По кругу выполняться не будет. В том коде светодиод будет мигать один раз при получении каждой 1, как сказал fogary.
наверное объяняюсь неправильно. Мне нужно, чтобы код в скобках выполнялся постоянно( по кругу), пока не придет ноль (0)
Тогда так:
Светодиод будет светить непрерывно (строчка "digitalWrite(LED, HIGH)" в setup) пока не придет "1".
нет. Это не главное. не проблема изменить на LOW. Для меня главное выполнение кода в скобках непрервно пока не придет другой символ по блюпупу..
CADAS,
Извиняюсь, я невнимательно прочитал что Вам нужно получить. По кругу выполняться не будет. Тот код будет мигать один раз при получении каждой 1, как сказал fogary.
Вот вот.. а как сделать, чтобы гонял по кругу?
Для меня главное выполнение кода в скобках непрервно пока не придет другой символ по блюпупу..
Так и будет, потому что условие if (val == '1') вынесено наружу из условия if (Serial.available()), а раньше оно было вложенным и выполнялось только когда что-то приходило по serial.
Вот вот.. а как сделать, чтобы гонял по кругу?
Код из поста #13
А присвоение переменной=0 в начале кода что нам дает?
получается меня тормозила скобка в 16 строке?
Там писать то что Вы хотели бы чтобы контроллер делал когда на Serial приходит значение "0". Вы хотите чтобы Arduino завершило работу и отключилось от питания? этого не выдет, хотя мы можем просто сказать ему ничего не делать, а ожидать изменений в сериал. Вот немного переделал и прокоментировал Ваш код...
Там писать то что Вы хотели бы чтобы контроллер делал когда на Serial приходит значение "0". Вы хотите чтобы Arduino завершило работу и отключилось от питания? этого не выдет, хотя мы можем просто сказать ему ничего не делать, а ожидать изменений в сериал. Вот немного переделал и прокоментировал Ваш код...
Убил на повал. Для меня очень сложно в понимании. Из 13 поста код легче.
Код с миганиями диодов добавил в свой для наглядности. Там будет другой кусок кода в скобках.
За огромный труд в написании кода- огромное спасибо!!! :-)
А присвоение переменной=0 в начале кода что нам дает?
Это просто инициализация переменой. Можно было и без "0" объявить, но так надёжней.
получается меня тормозила скобка в 16 строке?
Да, одно условие было вложено в другое.
А присвоение переменной=0 в начале кода что нам дает?
Это просто инициализация переменой. Можно было и без "0" объявить, но так надёжней.
То есть при каждом включении переменной будет присваиваться 0 ( типо пустая переменная)?
Человеку просто нужен ликбез по системе для начала.
секция setup() {} выполнится один раз при включении питания
секция loop() {} будет выполнятся много раз непрерывно пока не повалит синий дым :)
условие там где стоит serial.available выполняться будет если вы что-то прислали по ком порту
про delay() забудьте по возможности как дурной сон - он тормозит программу
Не пустая конечно, но в остальном правильно. Только, в данном случае, присваивается не 0, а код символа "0".
То есть при каждом включении переменной будет присваиваться 0 ( типо пустая переменная)?
Не, переменная не пустая. В ней не цифра 0, а символ '0' (код символа - 48).
Человеку просто нужен ликбез по системе для начала.
секция setup() {} выполнится один раз при включении питания
секция loop() {} будет выполнятся много раз непрерывно пока не повалит синий дым :)
условие там где стоит serial.available выполняться будет если вы что-то прислали по ком порту
про delay() забудьте по возможности как дурной сон - он тормозит программу
Спасибо за позновательный ликбез. Как раз на этом остановился в книге.
Про delay- ни ни... Чур меня. :-)
То есть при каждом включении переменной будет присваиваться 0 ( типо пустая переменная)?
Не, переменная не пустая. В ней не цифра 0, а символ '0' (код символа - 48).
Жека- спасибо!!! начинает все вставать на свои места.
получается я могу сколько угодно добавлять в код
присваивая 2,3,4 и выполнять код в скобках.
и так далее, а если пошлю отличный от 1,2,3,4 символ, то не будет выполняться ни один...???
Всё верно.
Кучу if 'ов можно заменить конструкцией switch...case
Всё верно.
Кучу if 'ов можно заменить конструкцией switch...case
Видел такую структуру, но пока до конца не понял. Есть у меня такая в скетче для датчика DHT.
Не могли бы Вы мне провести ликбез на этом примере.
Если я правильно понимаю, конструкция такова-
выполняем первый case. если ЛОЖ, то переходим к следующему. Если ИСТИНА- другие case игнорируем.
Так?
Хотелось бы увидеть как будет выглядеть код в моем случае с конструкцией switch...case..
Программа смотрит что находится в sensor1.read() и дальше сравнивает поочередно:
DHT_OK ? если да, то выполняем этот кусок
DHT_ERROR_CHECKSUM ? если да, то выполняем этот кусок
и так далее.
Для вашего случая:
А, да, еще default: если ни одно условие не прошло если не ошибаюсь.
И еще break заставляет не проверять условия дальше, а то мало ли вы изменили переменную и она сможет пройти по следующему условию :)
Программа смотрит что находится в sensor1.read() и дальше сравнивает поочередно:
DHT_OK ? если да, то выполняем этот кусок
DHT_ERROR_CHECKSUM ? если да, то выполняем этот кусок
и так далее.
Для вашего случая:
Ага, спасибо!!! Так себе все и представлял.
А теперь вопрос!!
Что мы выигрываем используя switch???
как сказали выше- мы избавимся от кучи if, но взамен получаем кучу case. Смысл тогда?
Код выглядит более компактно и просматривать проще
Код выглядит более компактно и просматривать проще
И все? Не особо весомый аргумент. Я то ожидал чего большего... ;-)
Как то так???
Да, все верно. Если код компилится не будет - перенесите break внутрь фигурных скобок.
Да, все верно. Если код компилится не будет - перенесите break внутрь фигурных скобок.
Компилируется. Проверить только не могу(с блюпупом) датчик еще не пришел. Через сериал порт вроде работает.
Еще вопрос.
Что менее ресурсо- ёмкое, глобальная переменная или локальная????
Локальная занимает ОЗУ в момент выполнения куска кода. Глобальная всегда висит в памяти.
С одной стороны глобальными оперировать проще - всегда известно что и как пользуется, но не выгодно в плане использования памяти. Компилятор сразу может подсчитать хватает ли памяти.
С другой если памяти не хватает использование локальных переменных может спасти ситуацию. Требует очень хорошего анализа кода поскольку компилятор не всегда может определить хватает ли памяти.
Когда скетч компилируется вам в комментариях выдается сколько занято ОЗУпри подсчете и сколько осталось на локальные переменные.
Локальная занимает ОЗУ в момент выполнения куска кода. Глобальная всегда висит в памяти.
С одной стороны глобальными оперировать проще - всегда известно что и как пользуется, но не выгодно в плане использования памяти. Компилятор сразу может подсчитать хватает ли памяти.
С другой если памяти не хватает использование локальных переменных может спасти ситуацию. Требует очень хорошего анализа кода поскольку компилятор не всегда может определить хватает ли памяти.
Когда скетч компилируется вам в комментариях выдается сколько занято ОЗУпри подсчете и сколько осталось на локальные переменные.
По этому и спросил. Видел в комментариях.
Как бы в моем случае выглядела локальная переменная val?
Тут нужно понимать что пример будет совсем некорректно работать поскольку переменная в каждом проходе loop будет создаваться заново:
Локальные переменные хороши когда вам например нужно куда-то сохранить промежуточный итог вычислений который будет использован несколько раз или при сложных вычислениях для удобства прочтения кода.
Тут нужно понимать что пример будет совсем некорректно работать поскольку переменная в каждом проходе loop будет создаваться заново:
Локальные переменные хороши когда вам например нужно куда-то сохранить промежуточный итог вычислений который будет использован несколько раз или при сложных вычислениях для удобства прочтения кода.
Спасибо. Все разъяснили..
Еще один комментарий:
Вы используете конструкцию
int
LED = 13;
для задания номера пина светодиода. Иногда выгоднее будет конструкция #define LED 13В этом случае там где компилятору встретится слово "LED" он его заменит на число 13. Так можно писать даже выражения:
Замечание по типам вполне справедливое, думаю ТС если попробовал код на выполнении конкретной задачи уже увидел этот недочет.
Спасибо за подсказку. Все поправил.
Замечание по типам вполне справедливое, думаю ТС если попробовал код на выполнении конкретной задачи уже увидел этот недочет.
так и есть.. все встало на свои места.
Спасибо за подсказку. Все поправил.
поправил 1 на "1" и 2 на "2". Не компилируется. выделяется срока с case "2"
invalid conversion from 'const char*' to 'int' [-fpermissive]