Nodemcu wifi
- Войдите на сайт для отправки комментариев
Здравствуйте дорогие друзья!
Не буду долго описывать, что и как я делал на ардуино до этого, опишу ситуацию, которая (по Кличко) есть.
Модуль NODEMCU v3 (якобы) - ситуация-то вобщем-то несложная (как мне казалось сначала), необходимо, чтобы при отсутсвии вайфай сигнала, мы мигали одним диодом, при нахождении и подключении к известному вайфай мы 5 минут (пускай 5, неважно) мигали другим диодом, потом еще 5 минут третим, и в конечном итоге зажигали последний, который бы горел все оставшееся время. Легко? - скажете вы. Вот и я так думал. А дополнительное условие было, чтобы если последний диод не зажегся а сигнал вайфая исчез, то все возращалось к изначальному состоянию "при отсутсвии сигнала".
Первоначальный код я написал вот такой:
#include <ESP8266WiFi.h> int status = WL_IDLE_STATUS; void setup() { pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(0, OUTPUT); pinMode(2, OUTPUT); Serial.begin(9600); Serial.println(); status = WiFi.begin("Test"); delay(100); Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay (100); Serial.println(WiFi.status()); if (WiFi.status() != WL_CONNECTED) { digitalWrite (5, HIGH); delay(300); digitalWrite (5, LOW); delay(300); } else { digitalWrite (2, HIGH); delay(2000); digitalWrite (2, LOW); delay(2000); } }
И он даже работал с встроенным диодом. Когда я стал приделал на другие порты диоды и лихо их туда вписал, происходило все что угодно, но только не то, что надо. Поэтому я переделал его на IF ELSE, примерно вот так:
#include <ESP8266WiFi.h> int status = WL_IDLE_STATUS; void setup() { pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(0, OUTPUT); pinMode(2, OUTPUT); Serial.begin(9600); Serial.println(); status = WiFi.begin("Test"); delay(100); Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); } void loop() { delay (100); Serial.println(WiFi.status()); if (WiFi.status() != WL_CONNECTED) { digitalWrite (5, HIGH); delay(300); digitalWrite (5, LOW); delay(300); } else { digitalWrite (2, HIGH); delay(2000); digitalWrite (2, LOW); delay(2000); } }
Но он работает только для двух стодиодов, при двух дополнительных "промежуточных" при исчезновение вайфая, он по принципу водопада, все равно доделывает цикл, и только потом переходит в начальное состояние. После 16 часов, простите сношений, так и не добился ничего.
Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла???
Из второй половины кода убраны каунтеры, блинки и прочее. Мне нужна сама функция постоянной проверки и прерывания цикла, до определенного момента.
кто нибудь видит отличие первого кода от второго?
Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла???
Расписать конечный автомат.
Да, не то скопировал. Было с WHILE, сейчас не под рукой.
Как? Мне нужно не количество циклов, ни время. Просто все время мы должны находится в состоянии, грубо с итоговым delay(999999999999999999999999999999999999);
Но до этого в любой рандом момент исчезает вайфай и мы вуаля, снова ищем его, чтобы подключится.
Если я не так понял, обьясните, если не сложно.
Пока все это писал, подумал про функцию break, может ее можно использовать, но куда ее сувать-то?
Я Вам уже сказал, распишите конечный автомат. Для разминки почитайте вот эту тему. Там, в №12 начинается объяснение, что такое автомат, а в №19 уже приведена готовая программа для автомата Мили. А так, по теме разбросаны очень серьёзные пояснения о ток как надо и как не надо проектировать программу. Почитайте, может потом захотите погуглить на эту тему.
Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла???
Вот завели Вы status, а чего же до использования дело не дошло? Как переходить в "в первоначальное состояние " я Вам даже скажу status = WL_IDLE_STATUS; (правда WL_IDLE_STATUS нигде не объявлен) Но для "в первоначальное состояние " Ваш код должен както проверять status. И реагировать на его значение. Короче изучаем блинкбезделея, как механизм формирования временных интервалов. Все мигания на нем, 5 минут тоже так отмеряется. Ваш луп будет выглядеть гдето так. 1.Контроль вайфая, у Вас я так понимаю наличие его должно контролироватся всегда не зависимо от состояния. Дальше две ветки кода, в коннекте мы и в дисконекте,в обоих п.2, но разные 2.проверка состояния лучше switch но и на нескольких if можно. Просто для каждого состояния смотрите что нужно делать. Например status равен WL_LED2_ON_STATUS - значить светодиод 2 светится, Если мы в ветке дисконекта это означает что коннект был но вот пропал и нужно сбросить статус т.е. status = WL_IDLE_STATUS, погасить светодиод и завершить луп. Если мы в ветке коннекта то коннект не пропал - проверяем по механизму блинкбезделея завершение временных интервалов для мигания и для 5 минут. При завершении - делаем действие требуемое по ситуации, меняем status и завершаем цикл. Цикл, т.е. луп, завершается всегда!! На каждом проходе!! Выкиньте из головы раз и на всегда мысль про его незавершение. Завершать всегда, просто после его завершения он тут же стартует снова.
ПС. Все это - по максимуму. Иногда можно упростить, например в начале лупа у вас пауза 100мсек. Значить если в каждом проходе менять состояние светодиода на противоположное то он будет мигать 5Гц. Если такое устроит - мигание упростится и временной интервал останется только один, т.е. 5мин.