Прошу совета

Тема в разделе "Arduino & Shields", создана пользователем chemigrate, 13 фев 2015.

  1. chemigrate

    chemigrate Нуб

    Идея устройства такова: имеется кнопка1, подключенная через триггер Шмитта ко 2му пину ардуино, отвечающая за прерывания, 4 тактовых кнопки, 4 светодиода и пин отвечающий за питание устройства(мп3 плеера). Программа должна выполнять следующий алгоритм: ардуино спит, по первому нажатию кнопки1 - просыпается, 7 секунд ждет повторного нажатия, если оно не поступило засыпает. Если нажатие есть, то 30 сек ждет нажатия одной из 4х тактовых кнопок, если нажатия не происходит - ардуина засыпает, если же нажатие есть, то подает питание на мр3 плеер, через 3 сек мигает одним из светодиодов, ждет 12 сек, выключает питание, засыпает.

    Программа работает почти правильно, кроме одного момента: при отработке одного полного цикла ардуина засыпает, но уже при однократном нажатии кнопки1 начинает реагировать на тактовые кнопки.
    Никак не могу понять в чем проблема, подскажите пожалуйста.

    Код (Text):
    #include <avr/sleep.h>
    #include <avr/power.h>
    int pin = 2;//кнопка пробуждения

    const int buttonPin1 = 7;  //кнопки выбора
    const int buttonPin2 = 8;
    const int buttonPin3 = 9;
    const int buttonPin4 = 10;

    volatile int sleepState = 0;
    volatile int glassState = 0;

    const int ledPin1 =  3;
    const int ledPin2 =  4;
    const int ledPin3 =  5;
    const int ledPin4 =  6;

    int buttonState1 = 0;
    int buttonState2 = 0;
    int buttonState3 = 0;
    int buttonState4 = 0;

    int mp3Pin = 12;//выход на включение питания плеера

    unsigned long time;
    unsigned long time1;
    unsigned long delayButt=30000;
    unsigned long delayMp3 = 3000;
    unsigned long mp3Time=12000;
    unsigned long glassTime=7000;

    void mp3(int num);


    void wakeUp()
    {
      if(sleepState==1)
      {
        sleep_disable();
        sleepState=0;
      }
      else if( glassState ==0)
      {
        glassState = 1;
      }
    }

    void EnterSleep()
    {
      sleepState=1;
      glassState=0;
    attachInterrupt(0, wakeUp, FALLING);

      set_sleep_mode(SLEEP_MODE_PWR_DOWN);

      sleep_enable(); //Разрешаем спящий режим
      sleep_mode(); //Спим (Прерывания продолжают работать.) Программа останавливается.
     
    }
    void setup()
    {

    attachInterrupt(0, wakeUp, FALLING);
      pinMode(pin, INPUT);
    pinMode(ledPin1, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
    pinMode(ledPin4, OUTPUT);

    pinMode(buttonPin1, INPUT);
    pinMode(buttonPin2, INPUT);
    pinMode(buttonPin3, INPUT);
    pinMode(buttonPin4, INPUT);
    pinMode(mp3Pin, OUTPUT);
    }
    void loop()
    {
    glassState=0;

    time=millis();
      time1=time;
     
      while(time<time1+glassTime)//после пробуждения ждем 7 секундповторного нажатия кнопки
    {
      if(glassState==1) break;
      time=millis();
    }

    if(glassState==1)//Если повторное нажатие произошло, то в течении 30 сек ждем сигнала от кнопок управления
    {
    time=millis();
      time1=time;
      while(time<time1+delayButt)
      { buttonState1=0;
        buttonState2=0;
        buttonState3=0;
        buttonState4=0;
     
        buttonState1=digitalRead(buttonPin1);
        buttonState2=digitalRead(buttonPin2);
        buttonState3=digitalRead(buttonPin3);
        buttonState4=digitalRead(buttonPin4);
       
        if(buttonState1==HIGH)
          mp3(1);
        else if(buttonState2==HIGH)
        mp3(2);
        else if(buttonState3==HIGH)
        mp3(3);
        else if(buttonState4==HIGH)
        mp3(4);
        time=millis();
      }
    }
    EnterSleep(); //В противном случае засыпаем
    }

    void mp3(int num)
    {
        buttonState1=0;
        buttonState2=0;
        buttonState3=0;
        buttonState4=0;
      digitalWrite(mp3Pin, HIGH);//подали питание
      time=millis();
      time1=time;
      while(time<time1+delayMp3) //ждем 3 сек
      {time=millis();}

    switch(num)// подаем импульс на выбор трека
    {
    case 1:
    digitalWrite(ledPin1, HIGH);
    delay(100);
    digitalWrite(ledPin1, LOW);
    break;
    case 2:
    digitalWrite(ledPin2, HIGH);
    delay(100);
    digitalWrite(ledPin2, LOW);
    break;
    case 3:
    digitalWrite(ledPin3, HIGH);
    delay(100);
    digitalWrite(ledPin3, LOW);
    break;
    case 4:
    digitalWrite(ledPin4, HIGH);
    delay(100);
    digitalWrite(ledPin4, LOW);
    break;
    }
     
      time=millis();
      time1=time;
      while(time<time1+mp3Time) //ждем пока трек отыграет
      {time=millis();}
      digitalWrite(mp3Pin, LOW);//выключаем питание

      EnterSleep(); //спим
    }
     
  2. Unixon

    Unixon Оракул Модератор