Порог сигнала пробуждения

У меня есть скетч для перевода в спящий режим и пробуждения Arduino Pro Mini 5V, но проблема в том, что иногда при быстром перемещении он сам просыпается, чего я не хочу. Я настроил его для пробуждения на выводе 2 нарастающим сигналом с использованием прерывания:

#define wakePin 2        // вывод, используемый для пробуждения


void wakeUpNow()        // здесь прерывание обрабатывается после пробуждения
{
  // выполнить здесь код после пробуждения перед возвратом в функцию loop()
  // таймеры и код с использованием таймеров (serial.print и т. д.) здесь не работают.
  // нам действительно не нужно выполнять здесь какие-либо специальные функции, так как мы
  // просто хотим, чтобы вещь проснулась
}

void setup() 
{
  Serial.begin(115200);

  pinMode(RLEDPIN, OUTPUT);
  pinMode(GLEDPIN, OUTPUT);
  pinMode(BLEDPIN, OUTPUT);
  pinMode(wakePin, INPUT);

  attachInterrupt(0, wakeUpNow, RISING );
}

void sleepNow()         // здесь мы переводим arduino в режим сна
{

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // здесь устанавливается спящий режим

    sleep_enable();          // включает бит сна в регистре mcucr, // так что сон возможен. просто английская булавка

    attachInterrupt(0,wakeUpNow, RISING); // использовать прерывание 0 (вывод 2) и запустить функцию // wakeUpNow, когда вывод 2 получает НИЗКИЙ уровень

    sleep_mode();            // здесь устройство действительно усыплено!! // ПРОГРАММА ПРОДОЛЖАЕТСЯ С ЭТОГО ПОСЛЕ ПРОБУЖДЕНИЯ

    sleep_disable();         // первое, что нужно сделать после пробуждения от сна: // отключить сон...

    detachInterrupt(0);      // отключает прерывание 0 на контакте 2, поэтому // код wakeUpNow не будет выполняться // в обычное время работы.

}


void loop() 
{
    digitalWrite(GLEDPIN, HIGH); // устанавливаем зеленый светодиод на высокий уровень
    digitalWrite(BLEDPIN, HIGH); // устанавливаем синий светодиод на высокий уровень
    digitalWrite(RLEDPIN, HIGH); // устанавливаем красный светодиод на высокий уровень

  times = millis();

  if((times-times_f)>=12000)
  {
    times_f=times;
    Serial.println(times-times_f);
    digitalWrite(GLEDPIN, LOW); // Сброс светодиодов
    digitalWrite(BLEDPIN, LOW);
    digitalWrite(RLEDPIN, LOW);
    sleepNow();
  }
}

Я думаю, проблема в том, что сигнал немного нарастает во время движения, поэтому решение может состоять в том, чтобы установить порог приема сигнала. Можно ли это сделать?

, 👍0

Обсуждение

Вы имеете в виду при физическом перемещении Arduino? Вы используете макетную плату с перемычками или все припаяно?, @Wildman

@Wildman Да, когда я очень быстро перемещаю все это, оно перезагружается. Он спаян с кабелями., @Miguel Sanz Narrillos


1 ответ


1

Вы должны добавить подтягивающие резисторы, как правило, 10 кОм на выводе прерывания, это защитит от нежелательных сигналов на этом выводе.

,

Объясните, пожалуйста, как вы это делаете?, @Chetan Bhargava

Подтягивающие и подтягивающие резисторы используются для правильного смещения входов цифровых вентилей, чтобы они не плавали случайным образом при отсутствии входных условий., @Vaibhav