Сброс глубокого сна с датчиком удара

Я пытаюсь разработать схему, которая выводит мой ESP8266 (Wemos D1 Mini) из глубокого сна с помощью датчика удара. Я могу добиться этого с помощью вывода сброса, но мне нужно чтобы игнорировать дальнейшие запросы на сброс, чтобы дать ему время запустить код в моем скетче. При условии, что движение все еще есть, оно просто продолжит сбрасываться, что означает, что код запускается только после прекращения «шока». Я пробовал всевозможные вещи с конденсаторами и транзисторами, чтобы отложить последующие сбросы, но с очень ограниченным успехом. Может ли кто-нибудь указать мне правильное направление или предложить более простой способ сделать это? Заранее большое спасибо.

, 👍0

Обсуждение

Что за датчик "удара" и каким "ударам" вы его подвергаете?, @Majenko

Я использую датчик ky-002. Толчки будут от легкого движения., @Tinted

Используйте тот факт, что GPIO16 имеет НИЗКИЙ уровень в режиме глубокого сна и высокий в противном случае — например, если GPIO16 высокий, вы хотите, чтобы ваши *шоки* не влияли на вывод сброса — простой вентиль ИЛИ может быть всем, что вам нужно., @Jaromanda X

@Tinted, почему ты соглашаешься на JamesB?, @Juraj


1 ответ


1

На самом деле это несколько сложнее, чем могло показаться на первый взгляд.

Во-первых, "датчик удара" – это просто пружина внутри трубки. Это создаст множество триггеров во время "шока", что действительно беспорядок.

Во-вторых, вы хотите, чтобы эти разряды доходили до экстрасенсорного восприятия только тогда, когда вы находитесь в глубоком сне.

В-третьих, вы не хотите, чтобы то, что вы подключаете, неблагоприятно влияло или подвергалось влиянию других схем, подключенных к контакту сброса.

Итак, сначала вам действительно нужно «подготовить» выход вашего датчика, чтобы он выдавал чистый импульс, который может сбросить ESP8266. Затем вам нужно "заблокировать" этот сигнал, чтобы он мог проходить только тогда, когда плата спит.

Для формирования сигнала датчика удара я бы предпочел использовать таймер 55 в моностабильном режиме. Вы можете найти хорошую схему и описание здесь, который выглядит так:

Теперь, чтобы гейтировать этот сигнал (который активен на высоком уровне), вам нужен сигнал для гейтирования. Поскольку все GPIO ESP8266 «мертвы», когда он спит, вам нужно, чтобы он находился в состоянии «по умолчанию включено» и чтобы ESP8266 управлял сигналом «Я бодрствую», чтобы отключить выход. Таким образом, у вас будет подтягивающий резистор на GPIO, чтобы сделать его по умолчанию ВЫСОКИМ (для простоты, чтобы соответствовать триггерному импульсу), а затем использовать pinMode() и digitalWrite() как первые вещи после пробуждения (и в начале setup()), чтобы указать, что он не спит, установив его НИЗКИЙ уровень. Затем вы объединяете эти два сигнала:

  • Если триггер ВЫСОКИЙ и
  • Если сигнал стробирования ВЫСОКИЙ
  • Затем сбросьте НИЗКИЙ уровень
  • В противном случае не влияет на сброс.

Итак, вы составляете таблицу истинности:

Trig | Gate | Res
-----------------
  L  |  L   |  HiZ
  L  |  H   |  HiZ
  H  |  L   |  HiZ
  H  |  H   |  L

Сложным здесь является «HiZ» — это означает «высокий импеданс» — или, по сути, «вообще не влияет на контакт сброса».

Кроме того, таблица истинности для вентиля И-НЕ такова: если оба входа ВЫСОКИЕ, то выход НИЗКИЙ, иначе выход ВЫСОКИЙ. За исключением того, что мы хотим, чтобы HiZ не был ВЫСОКИМ.

Чтобы сделать HiZ, вы можете сделать две вещи:

  1. Используйте логический элемент И-НЕ с выходом "Открытый коллектор" (или "Открытый сток") или
  2. Используйте логический элемент И и создайте собственный «открытый коллектор», инвертирующий выходной сигнал путем добавления транзистора.

Для варианта 1 вы можете использовать 74AC01, который представляет собой «открытый коллектор с четырьмя входами NAND с четырьмя входами». Для варианта 2 можно использовать 74AC08 и любой NPN-транзистор (или N-канальный MOSFET с подходящим порогом).

схема

,