C# 使用麦克风传感器Arduino UNO的外部中断

C# 使用麦克风传感器Arduino UNO的外部中断,c#,arduino-uno,C#,Arduino Uno,你好,当我不使用我的Arduino时,我想让它进入睡眠状态,这样我可以节省电池电量。这是我现在的输出 我要醒了 我要醒了 我要睡觉了 当它睡觉的时候,当我拍手的时候,它不会再醒来 我用的是arduino uno和这个传感器 这是我的密码 #include <Servo.h> #include <avr/sleep.h> #define interruptPin 2 Servo myservo; int pos = 0; int soundSensor = 2; bo

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

当它睡觉的时候,当我拍手的时候,它不会再醒来

我用的是arduino uno和这个传感器

这是我的密码

#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();
      }

    }

  }

}
#包括
#包括
#定义中断引脚2
伺服myservo;
int pos=0;
int声音传感器=2;
布尔状态=假;
无效设置(){
Serial.begin(9600);
引脚模式(中断引脚、输入\ U上拉);
myservo.附件(7);
pinMode(声音传感器,输入);
}
无效进入睡眠(){
Serial.println(“我要睡觉了”);
延迟(5000);
sleep_enable();
连接中断(数字插针到中断(中断插针),唤醒,低电平);
设置睡眠模式(睡眠模式关闭);
sleep_cpu();
}
无效唤醒(){
睡眠禁用();
分离中断(0);
}
void循环(){
int SensorData=数字读取(声音传感器);
如果(传感器数据==1){
唤醒();
println(“我要醒了”);
如果(LEDStatus==false){
LEDStatus=true;
对于(pos=180;pos>=0;pos-=40){//从180度变为0度
//以1度的步长
myservo.write(pos);
延迟(15);//等待15毫秒,等待伺服到达该位置
}
}否则{
LEDStatus=false;

对于(pos=0;pos只是一个提示。您两次声明引脚2,首先声明为
中断引脚
,然后声明为
声音传感器
。这可能会导致ISR混淆和缺火

在中断函数内部,您应该将逻辑封装在
cli();
sei();
中,以避免在中断期间错误触发。不要使用
detachInterrupt()

查看
avr/sleep.h
()中的文档。正如它所述,您必须确保在将CPU发送到睡眠状态之前启用中断。我相信您在将CPU发送到睡眠状态之前缺少sei()

我建议您使用外部(强)上拉,以确保针脚2不会被触发,除非通过传感器触发

最后,请注意,根据您的逻辑,任何时候引脚变低时都会调用中断服务。这将覆盖
循环()内的条件中的
else
(至少在您第一次调用(错售)函数
Goint\u to\u sleep()
后会发生)

想一想另一种方法来实现你想要的。只是要小心你实施的ISR

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

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