C# 使用麦克风传感器Arduino UNO的外部中断
你好,当我不使用我的Arduino时,我想让它进入睡眠状态,这样我可以节省电池电量。这是我现在的输出 我要醒了 我要醒了 我要睡觉了 当它睡觉的时候,当我拍手的时候,它不会再醒来 我用的是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
#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).话虽如此,您确定拍手时中断边缘检测应该是低的吗?我认为它必须是高的,在这种情况下,引脚应该拉低。您可以始终反转此逻辑,并使用外部晶体管放大信号,以将传感器的信号转换为足够的数字脉冲