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 я не получаю последовательные журналы. Я не уверен, что это за поведение. Если кто-то может помочь мне исправить этот код, будет здорово!
Спасибо!
@user3201500, 👍1
Обсуждение2 ответа
Лучший ответ:
Согласно этому руководству:
Вывод 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
Мой ответ запоздал, но при этом мой опыт может быть полезен другим.
NodeMcu в глубоком сне будет просыпаться от внешнего источника при получении импульса от высокого до низкого уровня на выводе RST.
Акселерометр ADXL345 поднимает прерывание на ВЫСОКИЙ уровень при обнаружении движения и остается на высоком уровне до тех пор, пока (I2C) READ не позволит нескольким устройствам мешать друг другу
Следующий пост помог мне найти решение
https:/ /electronics.stackexchange.com/questions/158015/how-to-turn-continuous-signal-to-short-pulse-using-logic-gates
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
Согласно этому руководству (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