Как разбудить Arduino M0 из глубокого сна, используя полученные значения - PullRequest
0 голосов
/ 29 февраля 2020

недавно я видел это интересное видео о снижении мощности arduino m0. https://www.youtube.com/watch?v=wmWqkJ97Zsc И я понял, что это действительно поможет моей станции контроля качества воздуха измерять гораздо больше времени. Мне нужно уложить мой Arduino в спящий режим после получения некоторого значения, например, если температура выше 20 градусов, Arduino сам уснет. В видео упоминается период бодрствования с помощью булавки или будильника. Я хочу использовать период пробуждения, используя часы rt c. Я прошу вашей помощи, потому что я не знаю, правильно ли я понимаю.

Я узнал (вероятно, правильно): код работает. Сначала настраиваются часы rt c, а затем и будильник (есть сигнал для пробуждения arduino из спящего режима). Во-вторых, наши часы rt c отсчитали до 10 секунд, поэтому будильник включился, и arduino пробудился => arduino находился в режиме ожидания в течение 10 секунд. В-третьих, включается светодиод, чтобы сообщать, что arduino не спит?

Пожалуйста, исправьте мое определение, если в нем есть ошибки.

Итак, как я упоминал ранее, я хочу разбудить Arduino после получения какое-то значение. Итак, мой последний вопрос: если я поставлю перед этой функцией будильника функцию «if» и снова со временем сброслю переменные, могу ли я получить то, что хотел?

Вот код для вас, ребята

#include <RTCZero.h>

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 00;
const byte hours = 00;

/* Change these values to set the current initial date */
const byte day = 24;
const byte month = 9;
const byte year = 16;

void setup() 
{
  delay(5000); //delay so we can see normal current draw
   pinMode(LED_BUILTIN, OUTPUT); //set LED pin to output
  digitalWrite(LED_BUILTIN, LOW); //turn LED off

  rtc.begin(); //Start RTC library, this is where the clock source is initialized

  rtc.setTime(hours, minutes, seconds); //set time
  rtc.setDate(day, month, year); //set date

  rtc.setAlarmTime(00, 00, 10); //set alarm time to go off in 10 seconds

  //following two lines enable alarm, comment both out if you want to do external interrupt
  rtc.enableAlarm(rtc.MATCH_HHMMSS); //set alarm
  rtc.attachInterrupt(ISR); //creates an interrupt that wakes the SAMD21 which is triggered by a FTC alarm
  //comment out the below line if you are using RTC alarm for interrupt
 // extInterrupt(A1); //creates an interrupt source on external pin

  //puts SAMD21 to sleep
  rtc.standbyMode(); //library call
  //samSleep(); //function to show how call works
}

void loop() 
{
  //do nothing in main loop
}

//interrupt service routine (ISR), called when interrupt is triggered 
//executes after MCU wakes up
void ISR()
{
  digitalWrite(LED_BUILTIN, HIGH);
}


//function that sets up external interrupt
void extInterrupt(int interruptPin) {
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(interruptPin, ISR, LOW);
}

//function to show how to put the 
void samSleep()
{
  // Set the sleep mode to standby
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  // SAMD sleep
  __WFI();
}
...