【问题标题】:external interrupt using microphone sensor Arduino UNO使用麦克风传感器 Arduino UNO 的外部中断
【发布时间】:2021-05-06 01:26:57
【问题描述】:

你好,当我不使用我的 Arduino 时,我希望它进入睡眠状态,这样我可以节省电池电量。这是我现在的输出 我要醒来 我要醒来 我要睡觉了

当它进入睡眠状态时,它不会在我拍手时再次醒来。

我正在使用 arduino uno 和这个传感器 https://www.auselectronicsdirect.com.au/audio-microphone-module-for-arduino-projects?gclid=CjwKCAjwhMmEBhBwEiwAXwFoEVAz-xxw7jaHoXDWixiTV1IHz8TF5i4tKr_1jjTK8s3JvowUDUDnCBoCxdgQAvD_BwE

这是我的代码

#include <Servo.h>
#include <avr/sleep.h>
#define interruptPin 2


Servo myservo;
int pos = 0;
int soundSensor = 2;

boolean LEDStatus = false;

void setup() {
  Serial.begin(9600);
  pinMode(interruptPin, INPUT_PULLUP);
  myservo.attach(7);

  pinMode(soundSensor, INPUT);

}
void Goint_to_Sleep() {
 Serial.println(" i am going to sleep");
 delay(5000);
  sleep_enable();
   attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUp, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_cpu();

}

void wakeUp() {

  sleep_disable();
  detachInterrupt(0);

}
void loop() {
  
  int SensorData = digitalRead(soundSensor);

 
  if (SensorData == 1) {
    wakeUp();
     Serial.println(" i am going to to wake up");
    if (LEDStatus == false) {

      LEDStatus = true;

      for (pos = 180; pos >= 0; pos -= 40) { // goes from 180 degrees to 0 degrees

        // in steps of 1 degree

        myservo.write(pos);

        delay(15); // waits 15ms for the servo to reach the position

      }

    } else {

      LEDStatus = false;

      for (pos = 0; pos <= 180; pos += 20) { // goes from 0 degrees to 180 degrees

        myservo.write(pos);
        delay(15); // waits 15ms for the servo to reach the position
 Goint_to_Sleep();
      }

    }

  }

}

【问题讨论】:

    标签: c# arduino-uno


    【解决方案1】:

    只是一个提示。您要声明 pin 2 两次,首先是 interruptPin,然后是 soundSensor。这可能容易导致 ISR 混乱和失火

    在你的中断函数中,你应该将你的逻辑包裹在cli();sei(); 中,以避免中断期间的错误触发。不要使用detachInterrupt()

    查看来自avr/sleep.h (here) 的文档。正如它所读的,您必须确保在让 CPU 进入睡眠状态之前启用中断。我相信您在让 CPU 进入睡眠状态之前缺少 sei()

    我建议您使用外部(强)上拉电阻来保证引脚 2 不会被触发,除非通过传感器。

    最后,请注意,根据您的逻辑,只要引脚变为低电平,就会调用中断服务。这将从loop() 中的条件覆盖else(至少这将在您第一次调用(拼写错误)函数Goint_to_sleep() 之后发生)。

    想想另一种方法来完成你想要的。请注意您实施的 ISR

    编辑:我忘了提一些非常重要的事情:

    您需要绝对确保您所连接的麦克风的输出信号高于数字信号的阈值 (~2.60-2.8V)。说了这么多,你确定拍手的时候中断边沿检测应该是LOW吗?我认为它必须很高,在这种情况下应该将引脚拉低。您始终可以反转此逻辑并使用外部晶体管放大信号,以将传感器的信号转换为足够的数字脉冲

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多