Deep Sleep NodeMCU с датчиком двери

У меня есть очень простой код датчика двери (магнитный), который дает результаты в 1 & 0 формат. Но я хочу запускать NodeMCU только тогда, когда дверь открыта или закрыта. Остальное время я хочу держать его в режиме глубокого сна. Вот мой код выглядит так:

int doorClosed = 1;

#define REED_SWITCH D5

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);
  pinMode(BUILTIN_LED, OUTPUT);
  digitalWrite(BUILTIN_LED, HIGH);

  pinMode(REED_SWITCH, INPUT_PULLUP); 
}

void loop() {
  // put your main code here, to run repeatedly

   Serial.println(digitalRead(REED_SWITCH));

    if ((digitalRead(REED_SWITCH) == HIGH) && (doorClosed == 1))
    {
      Serial.println("DOOR OPEN!!");
      doorClosed = 0;
      digitalWrite(BUILTIN_LED, LOW);
      ESP.deepSleep(0); 
    } 
    else if ((digitalRead(REED_SWITCH) == LOW) && (doorClosed == 0))
    {
      Serial.println("DOOR CLOSED!!");
      doorClosed = 1;
      digitalWrite(BUILTIN_LED, HIGH);
      ESP.deepSleep(0); 
    }
    delay(500);
}

Здесь я могу перевести NodeMCU в режим глубокого сна. Но никогда не просыпается. Как я могу разбудить свой чип. После подключения D0 с помощью RST я не получаю последовательные журналы. Я не уверен, что это за поведение. Если кто-то может помочь мне исправить этот код, будет здорово!

Спасибо!

, 👍1

Обсуждение

Согласно этому руководству (https://randomnerdtutorials.com/esp8266-deep-sleep-with-arduino-ide/) к RST должен быть подключен контакт D0, а не A0., @leoc7

Мне жаль, что это была опечатка. Я только что исправил это., @user3201500

После перехода в спящий режим проверьте мультиметром значение напряжения D0. Должно быть примерно до 0В., @leoc7

Если D0 не равен 0 В, подключите RST к GND и проверьте, просыпается ли микроконтроллер., @leoc7

Я просто проверяю напряжение D0, но кажется, что оно не достигает 0 В, оно показывает мне 3,25 В. Что означает, что он не уходит в глубокий сон? в мультиметре я касаюсь контактов D0 и GND, чтобы проверить напряжение., @user3201500

Прежде чем исследовать, почему D0 имеет высокий уровень, попробуйте подключить GND к контакту RST и проверьте, просыпается ли Arduino. В документации ESP8266 говорится, что для пробуждения достаточно низкого значения на выводе RST., @leoc7

@ leoc7 да, он просыпался. Но я не могу видеть какие-либо детали в последовательном мониторе, поэтому не знаю, как я могу это сделать., @user3201500

Вы не можете видеть никаких подробностей на мониторе последовательного порта, потому что esp8266 перезапускает программу, и вам нужно снова открыть монитор последовательного порта. Используйте светодиод вместо печати на серийном номере., @leoc7


2 ответа


Лучший ответ:

0

Согласно этому руководству:

Вывод RST ESP8266 всегда ВЫСОКИЙ, в то время как ESP8266 бег. Однако, когда вывод RST получает сигнал LOW, он перезапускается. микроконтроллер.

Если вы установили таймер глубокого сна с помощью ESP8266, после окончания таймера GPIO 16 посылает сигнал LOW. Это означает, что GPIO 16 при подключении к Вывод RST может пробуждать ESP8266 каждый раз, когда заканчивается таймер.

Единственный способ вывести ESP8266 из режима глубокого сна без таймера — установить сигнал LOW на вывод RST.

Пример без таймера:

ESP.deepSleep(0);

Подключение D0 (GPIO 16) к RST доступно, только когда ESP8266 находится в спящем режиме с таймером.

Пример с 30-секундным таймером:

ESP.deepSleep(30e6);

В вашем случае вы можете использовать режим глубокого сна с таймером и подключить датчик двери к D0, и он будет действовать как переключатель между RST и D0.

,

можно ли это сделать программно?, @user3201500

также, если он находится в режиме глубокого сна. Тогда как я могу отправить сигнал на него? Я использую датчик двери, сможет ли он считывать его значение в глубоком сне?, @user3201500

Вы не можете сделать это программно! Во время глубокого сна esp8266 отключается и не может выполнять никаких операций. Подход может состоять в том, чтобы установить режим глубокого сна с таймером (например, 30 секунд) и подключить D0 к RST. Каждые 30 секунд esp8266 просыпается, перезапускает программу и проверяет датчик двери., @leoc7

прерывание тоже не будет работать в этом случае?, @user3201500

Нет, если вы используете Deep Sleep, ESP8266 выключен, и единственный способ разбудить его — физически активировать пин RST. Попробуйте использовать другой тип режима сна (например, легкий сон) Взгляните на это руководство: https://www.losant.com/blog/making-the-esp8266-low-powered-with-deep-sleep, @leoc7

Хорошо, если я использую датчик двери тогда? Потому что датчик двери может работать снаружи при открытии и закрытии двери. Как я хочу подключиться к датчику двери., @user3201500

У меня это работает! Датчик двери может быть подключен к D0 и будет действовать как переключатель между RST и D0. С этой попыткой. Я могу исправить это. Если вы хотите, вы можете опубликовать это под ответом, я отмечу это правильно. :), @user3201500

Я изменил ответ :) Если хотите, можете пометить как решенный., @leoc7

я получил это разрешено до определенного предела. Дело в том, что я могу перезапустить его, установив высокое значение, но при закрытии двери я не перезапускаю его, так что теперь есть некоторая проблема., @user3201500


0

Мой ответ запоздал, но при этом мой опыт может быть полезен другим.

NodeMcu в глубоком сне будет просыпаться от внешнего источника при получении импульса от высокого до низкого уровня на выводе RST.

Акселерометр ADXL345 поднимает прерывание на ВЫСОКИЙ уровень при обнаружении движения и остается на высоком уровне до тех пор, пока (I2C) READ не позволит нескольким устройствам мешать друг другу

Следующий пост помог мне найти решение

https:/ /electronics.stackexchange.com/questions/158015/how-to-turn-continuous-signal-to-short-pulse-using-logic-gates

,