Я установил простой скетч Arduino из Arduino IDE на плату Intel Galileo Gen 2.
Как остановить и удалить скетч?
Я использовал кнопку сброса и перезагрузки, отключил питание, но не сильно помог.
Vaibhav Vaghela 22 Фев 2015 в 08:09
2 ответа
Лучший ответ
Просто загрузите пустую программу.
void setup() < >void loop()
В вашей Arduino IDE скопируйте приведенный выше код и нажмите кнопку загрузки. Это остановит выполнение ранее выполненного эскиза.
Убедитесь, что вы подключены к плате Intel через micro USB и выбран соответствующий последовательный порт.
TorukMakto 22 Фев 2015 в 05:12
Эскизы запускаются командой clloader.
Clloader будет искать /sketch/sketch.elf и запускать его, если он найден. Вывод из скетча будет перенаправлен обратно в / dev / ttyGS0
Если clloader находится в состоянии HUP во время выполнения скетча, он завершит скетч и будет ждать команды. Если скетч завершится, загрузчик вернется в режим ожидания удаленной команды.
Это приводит к альтернативному подходу:
Урок 4. Что такое Reset на Arduino (кнопка Reset и её назначение, единоразовое выполнение кода)
- Удалите или переименуйте /sketch/sketch.elf
- Отправьте сигнал HUP процессу clloader (или вы также можете просто перезапустить плату)
Вот пример для наглядности.
Сначала убедитесь, что процесс эскиза запущен.
Найдите идентификатор процесса clloader, переименуйте исполняемый файл скетча и HUP загрузчик.
На этом этапе процесс эскиза больше не выполняется. Чтобы перезапустить скетч .
Обратите внимание, что идентификатор процесса clloader изменяется после перезапуска скрипта.
Источник: question-it.com
Arduino.ru
Здравствуйте, ардуино выполняет программу: опрашивает датчик и при удовлетворении условия выполняет действие.
1) как организовать опрос датчика с интервалом =1час
2) после выполнения действия остановить программу = 1 сутки
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:20
Программу нельзя остановить. Можно выполнять или не выполнять какие-либо действия при определенных условиях (например условие — прошло ли достаточно времени).
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 21:22
как тогда реализовать такие длительные задержки?
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:26
Уроки Arduino #4 — функции времени
Ну можно с помощью millis() время отсчитывать. Или модуль RTC использовать.
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:01
а на delay возможны такие большие торможения програмы? delay(10000000)?
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:25
Забудь за delay, и научись использовать millis.
А можно и RTC прикрутить.
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:32
Evgenii пишет:
как тогда реализовать такие длительные задержки?
Завести прерывание по таймеру для пробуждения и перейти в режим power down. Контроллер будет «спать» и ничего не делать.
Evgenii пишет:
а на delay возможны такие большие торможения програмы? delay(10000000)?
Возможны почти до двух месяцев, но лучше делать, как я сказал выше, т.к. в режиме power down контроллер почти не ест электроэнергии, а при выполнении delay кушает по полной программе.
Правда, чтобы реально получить выгоду от этого режима, нужно питать контроллер не через стабилизатор, а напрямую, подавая 5 вольт на соответствующий пин. Иначе на линейном стабилизаторе всё равно будет дофига отжираться.
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 22:37
думаю прикручивать RTC для такой простой задачи не целесообразно.
не сказал сразу, по питанию не критично, по этом не думал о «засыпании»
спасибо ребят, попробую на millis
- Войдите на сайт для отправки комментариев
Пт, 20/05/2016 — 23:35
inspiritus
Есть такая библиотека TimerOne ( ищется легко)
На ней можно запустить процессы с требуемой периодичностью
имеются некоторые допущения и противопоказания, требует испытаний для конкретных применений.
зы. Я использую, меня ( в основном) устраивает, чего и Вам желаю.
- Войдите на сайт для отправки комментариев
Ср, 25/05/2016 — 15:05
Люди добрые, покритикуйте код (честно найденый на форуме и изменен)
1)Раз в сутки включется датчик
2)Если датчик включен смотрим влажность почвы
3) Если почва сухая включаем насос на 2мин
//**********************************/работа датчика влажности/************************************* #define SENSOR_PIN 10 // Вывод подключения питания датчика #define TIME_ON_SENSOR 120000 // Время в течении которого на выводе «1» #define TIME_OFF_SENSOR 86400000 //Время в течении которого на выводе «0» boolean state_sensor = 0; // Переменная для хранения состояния вывода unsigned long new_millis_sensor = millis(); // Переменная для хранения времени //***********************************/работа водяной помпы/**************************************** #define NASOS_PIN 13 // Вывод подключения питания насоса #define TIME_ON_NASOS 140000 // Время в течении которого насос работает boolean state_nasos = 0; // Переменная для хранения состояния вывода unsigned long new_millis_nasos = millis(); // Переменная для хранения времени //************************************************************************************************** int sensorAnalog = A0; int sensorValue = 0; const int soil_min = 35; // Минимально сухая почва //******************************/Зададим начальную конфигурацию/************************************ void setup() < Serial.begin(9600); // Инициализация последовательного порта на скорость 9600 бод pinMode(NASOS_PIN, OUTPUT); // Установим вывод 13 как выход pinMode(SENSOR_PIN, OUTPUT); // Устанавливаем вывод 10 как выход pinMode(sensorAnalog, INPUT); >void loop() < if (millis() >new_millis_sensor) < state_sensor = ! state_sensor; // меняем состояние state_sensor на противоположное, если был 0, то меняем на 1 и наоборот. digitalWrite(SENSOR_PIN, state_sensor); // устанавливаем вывод в соответствующее состояние >if (state_sensor) // если state_svet равен 1 (больше нуля, истина. ), то < new_millis_sensor = millis() + TIME_ON_SENSOR; >else < new_millis_sensor = millis() + TIME_OFF_SENSOR; >//************************************************************************************************** if (state_sensor == HIGH) < sensorValue = analogRead(sensorAnalog); if ((sensorValue >soil_min) (millis() > new_millis_nasos)) < state_nasos = ! state_nasos; digitalWrite (NASOS_PIN, state_nasos); if (state_nasos) < new_millis_nasos = millis() + TIME_ON_SENSOR; >> > >
- Войдите на сайт для отправки комментариев
Источник: arduino.ru
Arduino — управляющие операторы
Каждый язык программирования имеет набор команд управления, обеспечивающих многократное выполнение одного и того же кода (цикл), выбор подходящего фрагмента кода (условия) и инструкции для выхода из текущего фрагмента кода.
Arduino IDE позаимствовал с C/C++ большинство необходимых элементов управления. Их синтаксис идентичен с C. Ниже мы в двух словах опишем их синтаксис.
Оператор if
Оператор if позволяет выполнить определенный фрагмент программы в зависимости от результата проверки определенного условия. Если условие выполняется, то код программы будет выполнен, если же условие не выполняется, то код программы будет пропущен. Синтаксис команды if выглядит следующим образом:
[slh lang=»php»] if(условие)
инструкция1;
инструкция2;
>
[/slh] Условием может быть любое сравнение переменной или значения, возвращаемое функцией. Основным критерием условия if является то, что ответ всегда должен быть или истина (true) или ложь (false). Примеры условий для оператора if:
[slh lang=»php»] if(a!=2)
>
if(x <10)
>
if(znak==’B’)
>
[/slh] Внутри скобок, которые прописаны внутри условия, можно выполнить код.
Люди, которые приступают к изучению программирования, часто делают ошибку, приравнивая значение указанной переменной с помощью одного знака «=». Такая запись однозначно указывает на присвоение значения переменно, и, следовательно, условие всегда будет «true», то есть выполняться. Проверка того, что переменная равна определенному значению, всегда обозначается двойным знаком равно (==).
В качестве условия можно использовать состояние функции, например:
[slh lang=»php»] if(init())
Serial.print(«ок»);
>
[/slh] Приведенный выше пример будет выполнен следующим образом: на первом этапе вызывается функция init(). Эта функция возвращает значение, которое будет интерпретировано как «true» или «false». В зависимости от результата сравнения будет отправлен текст «ок» или ничего не будет отправлено.
Оператор if…else
Расширенным оператором if является оператор if….else. Он обеспечивает выполнение одного фрагмента кода, когда условие выполняется (true), и выполнение второй фрагмент кода, если условие не выполняется (false). Синтаксис операторf if….else выглядит следующим образом:
[slh lang=»php»] if (условие)
// команда A
>
else
// команда B
>
[/slh] Команды «A» будут выполняться только в том случае, если условие выполнено, команда «B» будет выполняться, когда условие не выполнено. Одновременное выполнение команды «A» и «B» невозможно. Следующий пример показывает, как использовать синтаксис if…else:
[slh lang=»php»] if (init())
Serial.print(«ок»);
>
else
Serial.print(«ошибка»);
>
[/slh] Подобным образом можно проверить правильность выполнения функции и информировать об этом пользователя.
Обычной практикой является отрицание условия. Это связано с тем, что функция, которая выполнена правильно возвращает значение 0, а функция, которая отработала неверно по какой-то причине, возвращает ненулевое значение.
Объяснение такого «усложнения жизни» — просто. Если функция выполнена правильно, то это единственная информация, которая нам нужна. В случае же ошибки, стоит иногда понять, что пошло не так, почему функция не выполнена правильно. И здесь на помощь приходят числа, отличающиеся от нуля, т. е. с помощью цифровых кодов мы можем определить тип ошибки. Например, 1 — проблема с чтением какого-то значения, 2 — нет места в памяти или на диске и т. д.
В последнем измененном примере показано, как вызвать функцию, которая возвращает ноль при правильном выполнении:
[slh lang=»php»] if (!init())
Serial.print(«ок»);
>
else
Serial.print(«ошибка»);
>
[/slh]
Оператор switch case
Оператор if позволяет проверить только одно условие. Иногда необходимо выполнить одно из действий в зависимости от возвращаемого или прочитанного значения. Для этого идеально подходит оператор множественного выбора switch. Ниже показан синтаксис команды switch:
[slh lang=»php»] switch (var)
case 1:
//инструкция для var=1
break;
case 2:
// инструкция для var=2
break;
default:
// инструкция по умолчанию (если var отличается от 1 и 2)
>
[/slh] В зависимости от значения переменной var выполняются инструкции в определенных блоках. Метка case означает начало блока для указанного значения. Например, case 1: означает, что данный блок будет выполнен для значения переменной var, равной один.
Каждый блок должен быть завершен с помощью команды break. Он прерывает дальнейшее выполнение оператора switch. Если команду break пропустить, то инструкции будут выполняться и в последующих блоках до команды break. Метка default не является обязательной, как и else в команде if. Инструкции, расположенные в блоке default выполняются только тогда, когда значение переменной var не подходит ни к одному шаблону.
Часто бывает так, что одни и те же инструкции должны быть выполнены для одного из нескольких значений. Это можно достичь следующим образом:
[slh lang=»php»] switch (x)
case 1:
//инструкция для x=1
break;
case 2:
case 3:
case 5:
// инструкция для x=2 или 3 или 4
break;
case 4:
// инструкция для x=4
break;
case 6:
// инструкция для x=6
break;
default:
// инструкция по умолчанию (если х отличается от 1,2,3,4,5,6)
>
[/slh] В зависимости от значения переменной x будет выполнен соответствующий блок инструкций. Повторение case 2: case 3: case 5: информирует компилятор о том, что если переменная x имеет значение 2 или 3 или 5, то будет выполнен один и тот же фрагмент кода.
Оператор for
Оператор for используется для многократного выполнения одного и того же кода. Часто необходимо выполнить одни и те же инструкции, изменив только значение какой-то переменной. Для этого идеально подходит цикл for. Синтаксис команды выглядит следующим образом:
[slh lang=»php»] int i;
for(i=0;i <10;i++)
// инструкции для выполнения в цикле
>
[/slh] Первый параметр, приводимый в инструкции for — начальное значение переменной. Еще один элемент — это проверка условия о продолжении выполнения цикла. Цикл выполняется до тех пор, пока выполняется условие. Последний элемент — это изменение значения переменной. Чаще всего мы увеличиваем или уменьшаем ее значение (по необходимости).
В этом примере, инструкции, содержащиеся в цикле будут выполняться при i=0…9.
Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров.
Часто переменная, используемая в цикле объявляется там же:
[slh lang=»php»] for(int i=0;i <10;i++)
// инструкции для выполнения в цикле
>
[/slh] Переменная, которая используется для подсчета последующих шагов цикла, может использоваться внутри нее для вызова функции с соответствующими параметрами.
[slh lang=»php»] for(int i=10;i>0;i—)
Serial.print(i); // отправятся номера 10,9,8,7,6,5,4,3,2,1
>
[/slh]
Оператор while
Цикл for идеально подходит там, где мы хотим выполнить подсчет. В ситуации, когда необходимо выполнить определенные действия в результате какого-то события, которое не обязательно является предсказуемым (например, мы ждем нажатия кнопки), то мы можем использовать оператор while, который выполняет блок оператора до тех пор, пока выполняется условие. Синтаксис оператора while выглядит следующим образом:
[slh lang=»php»] while(условие)
// блок инструкций для выполнения
>
[/slh] Важно, чтобы проверка состояния происходила в начале цикла. Может случиться так, что инструкции внутри цикла while не исполняться никогда. Кроме того, возможно создание бесконечного цикла. Давайте посмотрим два примера:
[slh lang=»php»] int x=2;
while(x>5)
Serial.print(x);
>
—————————————-
int y=5;
while(y>0)
Serial.print(y);
>
[/slh] Первый блок операторов, расположенный внутри while не выполнится никогда. Переменная x имеет значение два и она не станет больше 5. Во втором примере мы имеем дело с бесконечным циклом. Переменная «y» имеет занчение 5, т. е. больше нуля. Внутри цикла не происходит никакого изменения переменной «y», поэтому цикл никогда не будет завершен.
Это распространенная ошибка, когда мы забываем об изменении параметра, вызывающего прекращение цикла. Ниже приведено два правильных примера применения цикла while:
[slh lang=»php»] int x=0;
while(x <10)
//блок инструкций
x++;
>
—————————————-
while(true)
if(условие) break;
// блок инструкций
>
[/slh] В первом примере мы позаботились об изменении значения переменной, которая проверяется в условии. В результате цикл когда-нибудь завершится. Во втором примере был преднамеренно создан бесконечный цикл. Этот цикл эквивалентен функции loop () в Arduino IDE. Кроме того, внутри цикла введена проверка условия, после выполнения которого цикл завершается командой break.
Оператор do…while
Разновидностью цикла while является цикл do…while. Кроме синтаксиса он отличается местом проверки условия. В случае do…while проверка условия производится после выполнения блока инструкций. Это означает, что блок инструкций в теле цикла выполнится хотя бы один раз. Ниже приведен синтаксис команды do…while:
[slh lang=»php»] do
// блок инструкций
>
while(условие)
[/slh] Все, что написано об операторе while относится также и к do…while. Ниже приведен пример использования цикла do…while:
[slh lang=»php»] int x=10;
do
// блок инструкций
x—;
>
while(x>0);
—————————————-
do
// блок инструкций
if(условие) break;
>
while(true);
[/slh]
Оператор break
Оператор break позволяет выйти из цикла (do…while, for, while) и выйти из опции switch. В следующем примере рассмотрим выполнение команды break:
[slh lang=»php»] for(i=0;i <10;i++)
if(i==5) break;
Serial.print(i);
>
[/slh] Цикл должен быть исполнен для чисел от 0 до 9, но для числа 5 выполняется условие, которое запускает оператор break. Это приведет к выходу из цикла. В результате в последовательный порт (Serial.print) будет отправлены только числа 0,1,2,3,4.
Оператор continue
Оператор continue вызывает прекращение выполнения инструкций цикла (do…while, for, while) для текущего значения и переход к выполнению следующего шага цикла. В следующем примере показано, как работает оператор continue:
[slh lang=»php»] for(i=0;i <10;i++)
if(i==5) continue;
Serial.print(i);
>
[/slh] Как не трудно заметить, цикл будет выполнен для значения от 0 до 9. Для значения 5 исполнится команда continue, в результате чего инструкции, находящиеся после этой команды выполнены не будут. В результате в последовательный порт (Serial.print) будут отправлены числа 0,1,2,3,4,6,7,8,9.
Оператор return
Оператор return завершает выполнение вызываемой функции и возвращает значение определенного типа. В качестве параметра команды можно указать число, символ или переменную определенного типа. Важно, чтобы возвращаемое значение соответствует типу заявленной функции. В следующем примере показано, как использовать оператор return:
[slh lang=»php»] int checkSensor() if (analogRead(0) > 400) < // чтение аналогового входа
return 1; // Для значений больше 400 возвращается 1
else return 0; // для других возвращается 0
>
>
[/slh] Как вы можете видеть, в одной функции можно использовать несколько операторов return, но сработает всегда только один из них. Допустимо использование оператора return без параметров. Это позволяет досрочно прекратить работу функции, которая не возвращает никакого значения.
[slh lang=»php»] void имя_функции()
инструкция1;
if(x==0) return;
инструкция2;
инструкция3;
>
[/slh] В приведенном выше примере инструкция1 будет выполнять всегда, когда вызывается функция. Выполнение же инструкция2 и инструкция3 зависит от результата команды if. Если условие будет выполнено (true), то будет выполнена команда return и функция завершит работу.
В случае, когда условие не выполнено команда return так же не выполняется, а выполняются инструкции инструкция2 и инструкция3, и после этого функция завершает свою работу.
Оператор goto
Из идеологических соображений необходимо пропустить это описание… Оператор goto является командой, которую не следует использовать в обычном программировании. Он вызывает усложнения кода и является плохой привычкой в программировании. Настоятельно рекомендуем не использовать эту команду в своих программах. Из-за того, что goto есть в официальной документации на сайте arduino.cc приведем его краткое описание. Синтаксис команды goto:
[slh lang=»php»] ….
goto metka; // перейдите на строку с надписью ‘metka’
…..
….
….
metka: // метка, с которой программа продолжит работу
…
[/slh] Команда позволяет переход к обозначенной метке, т. е. к месту в программе.
Источник: www.joyta.ru