Тонкости использования If и While операторов!
- Войдите на сайт для отправки комментариев
Вс, 18/09/2016 - 13:39
Доброго всем дня! Возникла такая проблема мне необходимо что бы при наступлении условия if переменная принимала значение контанты или булевого значения true или false Собственно есть такой код: необходимо что бы условие сохранялось постоянно а не только во время время (magnitude >= freq1 && magnitude <= spoon1 ) Как заставить переменную занять только одно значение при наступлении события в if (....) и больше его не менять? Спасибо! bool fr1 = true; if (magnitude >= freq1 && magnitude <= spoon1 ) digitalWrite(ledRed, HIGH);
#include <Goertzel.h> int sensorPin = A0; int led = 13; int ledRed = 5; int ledGreen = 4; int ledWhite = 3; float target_freq; float spoon1; float spoon2; float spoon3; float sampling_freq; float freq1; float freq2; float freq3; bool fr1; bool fr2; bool fr3; void setup() { pinMode(led, OUTPUT); pinMode(ledRed, OUTPUT); pinMode(ledGreen, OUTPUT); pinMode(ledWhite, OUTPUT); Serial.begin(9600); target_freq = 300.00; fr1 = false; fr2 = false; fr3 = false; } void loop() { float freq1 = 349.23; float freq2 = 329.63; float freq3 = 293.66; float spoon1 = freq1 + 4.0; float spoon2 = freq2 + 4.0; float spoon3 = freq3 + 4.0; static float pattern[] = { 587.33, 698.46, 775.33, 880.21 }; float n = 20.0; float sampling_freq = 9000; Goertzel goertzel = Goertzel(target_freq, n, sampling_freq); goertzel.sample(sensorPin); //Will take n samples float magnitude = goertzel.detect(); //check them for target_freq bool fr1 = true; if (magnitude >= freq1 && magnitude <= spoon1 ) { digitalWrite(ledRed, HIGH); } else { fr1 = false; } bool fr2 = true; if (magnitude >= freq2 && magnitude <= spoon2 ) { digitalWrite(ledGreen, HIGH); } else { fr2 = false; } bool fr3 = true; if (magnitude >= freq3 && magnitude <= spoon3 ) { digitalWrite(ledWhite, HIGH); } else { fr3 = false; } if (fr1 && fr2 && fr3 == true) { delay(1000); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, LOW); digitalWrite(ledWhite, LOW); delay(100); digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, HIGH); digitalWrite(ledWhite, HIGH); delay(100); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, LOW); digitalWrite(ledWhite, LOW); delay(100); digitalWrite(ledRed, HIGH); digitalWrite(ledGreen, HIGH); digitalWrite(ledWhite, HIGH); delay(100); digitalWrite(ledRed, LOW); digitalWrite(ledGreen, LOW); digitalWrite(ledWhite, LOW); delay(100); } Serial.println(magnitude); Serial.println(fr1); Serial.println(fr2); Serial.println(fr3); Serial.println("\r\n"); }
Перепубликуйте текст сообщения нормально - голову сломал его читаючи и так ничего и не понял.
Если нужно установить переменную только если она еще не установлена, при это проверять условия, то сначала нужно проверить установлена переменная или нет, а потом проверять условия установки, типа:
Правда понятия не имею, что имел в вдиу ТС, я так понял условие задачи;
Так постараюсь как можно проще.
Есть переменная magnitude это данные с датчика (микрофона) и сравнивает эти данные с искомой частотой (freq1, freq2, freq3) константа spoon1, spoon2, spoon3 служит для "вилки" условия if. Мне необходимо что бы при наступлении этого условия (bool fr1) принимала значение true навсегда! Однако сейчас это происходит только на мгновение исполнения условия if
<strong>
bool
fr1 =
true
;
053
if
(magnitude >= freq1 && magnitude <= spoon1 )
Чтобы переменная принимала некоторое значение навсегда, ее нельзя менять после того, как она приняла это значение.
Других вариантов не существует.
Правда, реализовать этот вариант можно тысячей разных способов, например, через инкапсуляцию. Но самый простой из них - просто никогда не менять переменную.
Ну и, строго говоря, такого поведения можно добиться только для статической или глобальной переменной, потому как все локальные переменные СУЩЕСТВУЮТ только на время выполнения содержащего их блока, а при СЛЕДУЮЩЕМ вхождении в этот же блок, строго говоря, под тем же именем будет уже другая переменная.
Хотя, с точки зрения локальной переменной - "навсегда" - это как раз до конца блока, т.е. до конца ее жизни.
PS. Чего конкретно хотите Вы, я из Вашего сообщения не понял, но могу предположить, что Вам следует убрать строку с повторным описанием булевой переменной (строка 52), добавить в условие "&& !fr1" (строка 53) и присвоение "fr1=true" (строка 55), а также убрать ветрку else (строки 58-60).
научите меня, что делает идентификатор <strong>
По сути у меня простая задача если fr1 fr2 fr3 = true то все светодиоды моргают, если хоть один из них = false то ждем пока усливие if(....) не будет выполнено. И весь косяк состоит в том что если условие и выполняется то на секунду а потом все по новой т.е. fr опять false. Было предложенно решение закинуть переменные которые должны будут стать константами ну т.е. "навсегда" в void setup но это тоже нифига не спасает, типо значение переменной в void setup "живет вечно"
Я просто не могу сообразить как присвоить fr1 fr2 fr3 значение true раз и навсегда до конца цикла?
<strong> это есть следствие копипаста кода для Ардуино из браузера. Он пихает их сам автоматически))
Если вставлять текст через Ctrl+Shift+V, то всё будет нормально. Форматирование текста и левые теги не вставляются, только чистый текст.
Я просто не могу сообразить как присвоить fr1 fr2 fr3 значение true раз и навсегда до конца цикла?
И больше их не трогать.
не могу сообразить как присвоить fr1 fr2 fr3 значение true раз и навсегда до конца цикла?
Т.е. Вам нужна переменная, которая типа одноразовая. Один раз ей можно что-то присвоить, а потом она становится константой, так? А что происходит. если попытаться присвоить ещё раз? Игнорируется и значение остаётся неизменным?
Если всё так, могу предложить самый (ой, блин, а вдруг кто ещё круче придумает? Ну, ладно) один из самых извращенских способо это сделать. Надо? :)
.
ДААААААААААААА именно так, а уже потом если вдруг мне будет нужно в самом конце цикла программы Я его тупо сброшу! Итак какой способ??? Мне главное эффективный ну и по возможности простой))
ДААААААААААААА именно так, а уже потом если вдруг мне будет нужно в самом конце цикла программы Я его тупо сброшу! Итак какой способ??? Мне главное эффективный ну и по возможности простой))
Если сделать так, как Вы хотите, "тупо сбросить" у Вас не получится. Не сбросится она. Останется true.
"Изращенно сбросить", правда, можно будет и в этом случае.
Но и от извращенного сбрасывания можно защититься.
Что-то мне кажется, Вам нужен вменяемый алгоитм, а не борьба с тем невменяемым, который у Вас сейчас есть, и который Вы вместо того, чтобы исправить, хотите сделать еще более невменяемым. Иначе этаборьба быстро исчерпает все ресурсы микроконтроллера.
Еще раз повторюсь: что Вам доподлинно нужно, я не понимаю, но, может, достаточно будет заменить это:
на это:
Ладно, извращённое решение будет завтра, уже поздно, а сейчас я Вам скажу по секрету самое простое.
Если у Вас есть переменная fr1, которая изначально false, а когда она станет true, то её уже нельзя менять, это делается очень просто. Просто никогда не присваивайте её false. зачем? Если она пока ещё итак false, так нахрена её этот же false ещё раз присваивать? А если она уже стала true, так значит false ей присваивать уже нельзя. Просто выбросьте из программы все присваивания этой перемнной false и будет Вам счастье.
Обещанное извращённое решение.
Определяем новый тип данных «bool-девственница». Для это пишет вот такой файл с названием "Virgin.h":
И пользуемся.
Вот пример использования. Пример и вышеприведённый файл нужно просто положить в одну папку. Название папки - как название файла-примера, только без ".ino" (ну, всё, как обычно). Пример:
Вот вариант с "девствинницей" прикольный, но Я нифига не понял как его применять))) а вот && !fr1 надо попробовать, очень интересно, но по ощущениям думаю нифига не выйдет))
Если кому то вдруг понадобится, проблему Я решил крайне просто и неожиданно, тупо выразив ее через int переменную. Получилось примерно так:
int K = 0;
бла, бла, бла....
if (freq1 >= magnitude && freq1 <= spoon1) {
K = 7;
}
bool fr1 = true
if (K = 7) {
}
else fr1 = false;
Вот и все, К принимает значение "7" и больше его не меняет пока не присвоят ему другое значение...
К принимает значение "7" и больше его не меняет пока не присвоят ему другое значение...
Глубоко!
.