Nodemcu wifi

Dinozavr
Offline
Зарегистрирован: 11.10.2019

Здравствуйте дорогие друзья!

Не буду долго описывать, что и как я делал на ардуино до этого, опишу ситуацию, которая (по Кличко) есть.

Модуль 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 часов, простите сношений, так и не добился ничего.

Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла??? 

 

 

Dinozavr
Offline
Зарегистрирован: 11.10.2019

Из второй половины кода убраны каунтеры, блинки и прочее. Мне нужна сама функция постоянной проверки и прерывания цикла, до определенного момента.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Dinozavr пишет:
 Поэтому я переделал его на IF ELSE, примерно вот так:

кто нибудь видит отличие первого кода от второго?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Dinozavr пишет:

Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла??? 

Расписать конечный автомат.

Dinozavr
Offline
Зарегистрирован: 11.10.2019

Да, не то скопировал. Было с WHILE, сейчас не под рукой.

Dinozavr
Offline
Зарегистрирован: 11.10.2019

Как? Мне нужно не количество циклов, ни время. Просто все время мы должны находится в состоянии, грубо с итоговым delay(999999999999999999999999999999999999);

Но до этого в любой рандом момент исчезает вайфай и мы вуаля, снова ищем его, чтобы подключится.

Если я не так понял, обьясните, если не сложно.

Пока все это писал, подумал про функцию break, может ее можно использовать, но куда ее сувать-то?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я Вам уже сказал, распишите конечный автомат. Для разминки почитайте вот эту тему. Там, в №12 начинается объяснение, что такое автомат, а в №19 уже приведена готовая программа для автомата Мили. А так, по теме разбросаны очень серьёзные пояснения о ток как надо и как не надо проектировать программу. Почитайте, может потом захотите погуглить на эту тему.

Logik
Offline
Зарегистрирован: 05.08.2014

Dinozavr пишет:

Как сделать так, чтобы до загорания последнего диода при исчезновении сетки вайфая устройство переходило в первоначальное состояние без заканчивания цикла??? 

 

Вот завели Вы 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мин.