Порог сигнала пробуждения
У меня есть скетч для перевода в спящий режим и пробуждения 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();
}
}
Я думаю, проблема в том, что сигнал немного нарастает во время движения, поэтому решение может состоять в том, чтобы установить порог приема сигнала. Можно ли это сделать?
1 ответ
Вы должны добавить подтягивающие резисторы, как правило, 10 кОм на выводе прерывания, это защитит от нежелательных сигналов на этом выводе.
Объясните, пожалуйста, как вы это делаете?, @Chetan Bhargava
Подтягивающие и подтягивающие резисторы используются для правильного смещения входов цифровых вентилей, чтобы они не плавали случайным образом при отсутствии входных условий., @Vaibhav
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Датчик PIR и сон (прерывание) на Mega2560
- POWER_MODE_IDLE пробуждается при любом изменении ввода?
- Как разбудить Arduino с помощью rtc?
- attiny85 сбрасывает себя вместо процедуры пробуждения
- Как одной кнопкой с прерыванием включать и отключать спящий режим?
- Светодиод не мигает - Arduino UNO+WiFi R3 ATmega328P+Плата ESP8266
- ATtiny85 со сном и последовательным портом
Вы имеете в виду при физическом перемещении Arduino? Вы используете макетную плату с перемычками или все припаяно?, @Wildman
@Wildman Да, когда я очень быстро перемещаю все это, оно перезагружается. Он спаян с кабелями., @Miguel Sanz Narrillos