Официальный сайт компании Arduino по адресу arduino.cc
подскажите как остановить цикл For.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подскажите пож. как остановить цикл FOR
или временно его приостановить, чтобы выполнить другое действие.
Написал скетч, измерение температуры, и управление радио розетками.
Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла.
измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура.
приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.
OneWire oneWire(9); // вход датчиков 18b20
DallasTemperature ds(&oneWire);
DeviceAddress sensor1 = {0x28, 0x6D, 0x74, 0x23, 0x05, 0x0, 0x0, 0x28};
DeviceAddress sensor2 = {0x28, 0xB, 0x41, 0x23, 0x05, 0x0, 0x0, 0xF};
void setup()
{
Serial.begin(38400); //установка порта на скорость 9600 бит/сек
ds.begin();
}
void loop()
{
while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте
int val = Serial.read() - '0';
if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)
if (val == 2) transmit(RF2ON);
if (val == 8){
for (int i = 0; i < 25; i++){ // крутим цикл
ds.requestTemperatures(); // считываем температуру с датчиков
Serial.print("Temper1 ");
Serial.print(ds.getTempC(sensor1)); // отправляем температуру
Serial.println(" *C");
Serial.print("Temper2 ");
Serial.print(ds.getTempC(sensor2));
Serial.println(" *C");
Serial.println();
}
}
Поменять на while, останавливать правкой переменной условия (чтобы оно сработало).
Например
Переменная i должна быть глобальной.
А лучше
Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.
для остановки циклов есть оператор break;
пробовал break; не помогает.
Это странно....
>> подскажите как остановить
добавьте
while(1);
если заменить функцию For ?
у меня while (Serial.available() == 0); //функция проверяет что пришло из блютуз модуля
while (Serial.available() == 0); //функция делает проверку какую команду прислал блютуз модуль.
если 1, передача по радио вкл. радио розетку. 2 тожесамое но др. розетка. - 8 включить проверку датчиков температуры. запускает цикл, который не останавливается если нажать 1 или 2. значит я не могу отправить команду радио розеткам на вкл. или выкл. пока не кончится цикл проверки.
значит надо если придет любая другая команда 1 или 2 . останавливать цикл проверки. чтоб сработали эти команды.
и как мне остановить цикл. ???????
И как можно остановить бесконечный цикл через 1 илии 2 часа ??
TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .
TovBender, вы изначально ставите себе неверную задачу. Вам не нужен этот цикл вообще. Создайте отдельный флаг вместо цикла .
пишет ошибку
sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:56:15: error: 'serial_cicle' was not declared in this scope
sketch_apr12a.ino:58:5: error: 'serial_cicle' was not declared in this scope
sketch_apr12a.ino: At global scope:
sketch_apr12a.ino:81:1: error: expected declaration before '}' token
Ошибка компиляции.
std как мне это прикрутить или заменить у меня в коде.
Например
Переменная i должна быть глобальной.
А лучше
Тогда bStopFlag должна быть глобальной, а счётчик (i) может быть локальным.
товарищь Dimax
продекларировал теперь новая ошибка
sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:57:29: error: expected primary-expression before '=' token
sketch_apr12a.ino:59:18: error: expected primary-expression before ')' token
sketch_apr12a.ino:60:23: error: expected primary-expression before ';' token
Ошибка компиляции.
как обойтись без цикла.
если надо постоянный визуальный контроль за температурой.
а телефон на базе андроид сам контролирует привышение температуры.
как включить что либо пока идет цикл.
TovBender, я вам дал только фрагмент. Разумеется нужно объявить переменную, serial_cicle, компилятор как раз на это ругается. Помимо того нужно убрать ещё один while из скетча. while (Serial.available() == 0); Подобное выражение имеет очень ограниченное применение, потому что полностью застопоривает исполнение программы. Лучше вообще его никогда не использовать. Нужно либо отказаться от него вообще, либо перевести проверку на оператор if
а перенести проверку сериала в цикл ? или вообще убрать цикл опроса - луп сам цикл....
проверку 25-ти замеров можно и по другому организовать
Но вот затык, пока идет цикл измерения температуры, кнопки управления радио разетками не работают, до полного остановки цикла. измеряется температура в сауне, включён цикл чтобы чтобы видеть как повышается температура. приходит 8 по блютуз, измерения начанаются , и нельзя нажать 1 или 2(управление розетками), пока не закончится цикл. и остановить не возможно. как цикл остановился через 25 проверок, кнопки работают и розетки срабатывают.
Мне кажется, что для такой ситуации как раз и были придуманы прерывания. :)
С другой стороны, раз уж Вы взались автоматизировать, то, на мой взгляд, надо свести человеческие вмешательства к минимуму: пусть автоматика сама регулирует температуру - у нее это получится лучше.
мне не надо регулировать температуру. все само работает.
1 - void loop() как цикл у меня не работает.
пришлось дополнить цыклом опроса датчиков.
если убираю For цикл опроса датчиков void loop()
не хочет этого делать.
нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.
нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.
радио розетки исправно меня слушаются.
но если сам прописываю цикл For .... вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.
радио кнопки нужны для вкл выкл вентилятора в комноте, включить или выключить тены в сауне.
void loop()
{
while (Serial.available() == 0); //функция Serial.аvailable() проверяет, есть ли в COM порте
// доступные для чтения данные.
int val = Serial.read() - '0';
if (val == 1) transmit(RF1ON); //если с COM порта поступил символ (1), начинаем отправлять через пин №11 (там радио передатчик)
if (val == 2) transmit(RF2ON);
if (val == 3) transmit(RF3ON);
if (val == 4) transmit(RF4ON);
// if (val == 5) {transmit(RF1ON);transmit(RF2ON);transmit(RF3ON);}
if (val == 8){
// // for (int i = 0; i < 5; i++){ // крутим цикл
ds.requestTemperatures(); // считываем температуру с датчиков
Serial.print("Temper1 ");
Serial.print(ds.getTempC(sensor1)); // отправляем температуру
Serial.println(" *C");
Serial.print("Temper2 ");
Serial.print(ds.getTempC(sensor2));
Serial.println(" *C");
}
}
}
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
...свернуть и нумеровать
власть захватывает то блок while (Serial.available() == 0); , то блок for
если убираю For цикл опроса датчиков void loop()
не хочет этого делать.
нажимаю 1 или 2 включаются радио розетки, на них вентилятор и еще чтото.
нажимаю 8 на экран монит порта и на телефон приходит данные с температурой датчика только 1 раз и всё. нет цикла нет динамики роста температуры. нажать еще раз еще 1 раз придет температура. и опять тишина.
радио розетки исправно меня слушаются.
но если сам прописываю цикл For .... вот тогда вижу как меняеся температура. НО тогда не проходят команды к радио розеткам. пока цикл не закончится.
радио кнопки нужны для вкл выкл вентилятора в комноте, включить или выключить тены в сауне.
"8" - вкл/выкл передачи температуры... или по нажатию "8" нужно отослать 25 замеров температуры ?
TovBender, я же вам написал в сообщении #15 что нужно делать. В чём пролема? Кстати, когда обращаетесь к кому-то конкретно -пишите ник того человека, к кому обращаетесь. А то непонятно кому адресуются ваши высказывания.
dimax , и я просмртрел-пропустил..... прошу пардона :)
товарищь Dimax
всё попробовал всё равно пишет об ошибке
sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:73:16: error: expected primary-expression before ')' token
sketch_apr12a.ino:74:23: error: expected primary-expression before ';' token
Ошибка компиляции.
TovBender, вы неправильно вставляете скетч. Обратите вгнимание в верхнем правом углу объекта со скетчем есть всплывающее меню. там есть кнопка скопировать.
dimax
Ничего не работает по вашему скетчу пишет ошибку .
sketch_apr12a.ino: In function 'void loop()':
sketch_apr12a.ino:41:28: error: expected primary-expression before '=' token
sketch_apr12a.ino:44:16: error: expected primary-expression before ')' token
sketch_apr12a.ino:45:22: error: expected primary-expression before ';' token
Ошибка компиляции.
TovBender, вы не объявили переменную. Посмотрите 15 строку что это? Дожна быть переменная! Например так: byte serial_cicle;
товарищь Dimax
что в строчках 39 и 40 что за трансмит ???
TovBender, это не ко мне вопрос. Я скопировал ваши команды из первого сообщения.
тов Dimax
ваш скетч. заработал. но пока идет цикл чтения датчиков. опять ни чего нажать не возможно, пока цикл не дойдет до конца.
да извиняюсь, точно это из моего скетча. передача кода на радио розетки.
TovBender, зачем пакет из 25-ти замеров ?
товарищь Dimax
это было временно для проверки скетча, будет ли он останавливаться если нажать на отправку управления радио розеткой.
тов Dimax.
я делал скетч, чтоб видеть как менятся температура 4 датчиков. чтом они постоянно показывали температуру, это улица, дом и сауна, данные приходят на телефон.
НО если работают датчики , то кнопки управления розетками не работают.
вот я и искал разные варианты, если вкл. постоянный цикл, то выйти из него я не знаю как, вот и поставил временно 25. чтоб цыкл если все не правельно хоть иногда сам останавливался.
по настоящему мне нужно видеть температуру и управлять розетками, пусть даже с остановкой в показанях, от датчиков. но потом после вкл выкл розеток возобновить показания.
ничего не получается, 4 дня мучуюсь.
TovBender , в #23 убрать строки 11, 14 - будут постоянно опрашиваться приёмник команд и происходить отсылка значения температуры
...строки 14....23 - продублировать код для остальных двух датчиков
TovBender, по идее вам нужно опрос датчиков производить не на каждом круге loop, а по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.
да возможно вы правы
тов Dimax. Большое спасибо за советы. начинаю вникать в коды.
подскажите а как делать опрос датчиков по таймеру, и как вклинить ее в мой скетчь.
и еще может вы програмке в App Iventor разбираетесь ?
это написание програмулек для мобильных телефонов. под Андроид.
TovBender, по идее вам нужно опрос датчиков производить не на каждом круге loop, а по таймеру, и чем реже тем лучше, по крайней мере не чаще 1 раза в секунду. Тогда контроллер будет слабо загружен, и всё успеет.
Мои пять копеек, уйдите от библиотеки Далласа на Onewire и делайте на ней. Описание команд датчика. Одна секунда тоже слишком частый интервал, не меняется температура в объемах с такой скоростью. 30с-1мин вполне достаточно для помещения. Таймер делаете на основе этого . И не забудьте гистерезис сделать, иначе будете постоянно щелкать в граничной точке.
Алгоритм простой - взвели таймер, по достижении времени дали команду на конвертацию всех датчиков, взвели флаг и таймер на 750мС, по достижении провели считывание данных с датчиков, сбросили флаг, вернулись в начало. Все проверки в loop, if-ами.
Для спокойствия, можете еще CRC сверять, в стандартных примерах OneWire есть как.
bwn, вы сейчас к кому обращаетесь? Если к Т.С. то для него это слишком сложно :)
dimax, немного добавил в Вашим рекомендациям. Сам тоже чайник и в даллосовской библиотеке увяз глубже, чем в OneWire. В итоге напрямую все пошло сразу (там пять команд всего) и легко разбить на две функции (конвертация, считывание-пересчет).
От и говорю ТС, как чайник чайнику - OneWire проще. ИМХО.
bwn подскажите как пользоваться OneWire как добыть температуру
тов Dimax. Большое спасибо за советы. начинаю вникать в коды.
подскажите а как делать опрос датчиков по таймеру, и как вклинить ее в мой скетчь.
TovBender, про таймер вам написал bwn, посмотрите внимательно его фразу "таймер делаете на основе этого". Отказываться от библиотеки dallas я вам не советую, ваш уровень познания недостаточен что бы переделать полностью весь код. А делать это за вас мне не хочется :) Что бы удовлетворить любопытство посмотрите сюда Этот метод позволяет работать без тормозов используя только библу OneWire.
Попробуйте сперва сами, считывание адресов лучше сделать один раз в setup (потом вообще вставить их в программу), строка delay(1000); делит код на две части, перед ней идут команды на конвертацию, после нее считывание данных.
1 все кнопки у меня в телефоне. который управляет Ардвиной. через блютуз. вывод данных тоже смотрю на экране телефона. а не на дисплее приставленном к Ардвине, если успели заметить. вы значит не внимательно прочли мои вопросы. не видели весь скетч.
2 чтобы сделать опрос датчиков по времени НУЖЕН ? такой большой код ?
1 все кнопки у меня в телефоне. который управляет Ардвиной. через блютуз. вывод данных тоже смотрю на экране телефона. а не на дисплее приставленном к Ардвине, если успели заметить. вы значит не внимательно прочли мои вопросы. не видели весь скетч.
2 чтобы сделать опрос датчиков по времени НУЖЕН ? такой большой код ?
Если вы откомпиллируете два кода, с dallasTemperanure и тот который я дал, с удивлением обнаружите, что этот большой код занимает на 1,5К меньше места в памяти. 3/4 в этом примере вода, которую можно смело удалить. Если нет желания пробовать и анализировать, дело ваше.
Кстати опроса по времени там как раз нет.
товарищь Dimax . Большое спасибо за ваши советы. буду пробовать дальше. пока еще не во всем разобрался, но уже начинаю понимать в коде, (наверное) .
пока не разобрался как опрашивать датчики по времени . чтоб не исползовать For и Delay.
буду пробовать дальше.
я думаю, если датчики будут опрашиваться через какието интервалы во времени , то и остальные кнопки управления розетками будут работать в любое время.
Спасибо за ваши советы.