Сон и пробуждение ардуины

Тема в разделе "Arduino & Shields", создана пользователем Serg84, 27 дек 2019.

  1. Serg84

    Serg84 Нуб

    Всем доброго времени суток. скажу сразу, не силен в программировании, так что строго прошу не судить. Меня очень заинтересовала платформа ардуино своей функциональностью и относительной простотой реализации проектов. Задача стоит следующим образом: ардуино что-то делает, затем по команде от внешнего устройства(кнопка) уходит в сон, и просыпается тоже по команде от внешнего источника(звонок на GSM-модуль). Во время сна необходимо контролировать заряд батареи, и при низком заряде отправлять смс. Логика работы представленного скетча(на мой взгляд приемлима): при подаче сигнала на пин 11 ардуино засыпает, просыпаться должна от аппаратного прерывания(до него еще не дошел), во время сна просыпается по watchdog каждые 8 секунд, проверяет пин 11(импровизация заряда батареи) и при 1 выполнет некую функцию и засыпает, а при 0 засыпает дальше. Прошу Вас посмотреть и прокомментировать, той ли дорогой иду или нет? Или что-то нужно сделать иначе? Буду очень благодарен за советы и помощь.

    Код (C++):

    #include <avr/sleep.h>
    #include <avr/wdt.h>
    bool sl=false;
    volatile bool pr=0;
    bool slip=false;
    void setup()
      {
         Serial.begin(9600);
         pinMode(10, INPUT_PULLUP);
         pinMode(11, INPUT_PULLUP);
         pinMode(LED_BUILTIN, OUTPUT);
         set_sleep_mode(SLEEP_MODE_PWR_DOWN); //выбираем в качестве режима энергосбережения Power-Down mode
         digitalWrite(LED_BUILTIN, HIGH);
         //digitalWrite(10, LOW);
        Serial.println(sl);
      }
    void loop() {

      sl=!digitalRead(10);
      Serial.print("sl     ");
      Serial.println(sl);
      Serial.print("pr    ");
      Serial.println(pr);
      delay(1000);
      if(sl==true)
      {
        slp();
      }
    ///--------------------
    lable:
    if(slip==true)
    {
    pr=!digitalRead(11);
    if(pr==true)
      {
        digitalWrite(LED_BUILTIN, HIGH);
        logos();
        slip=false;
        slp();
      }
      else
      {
         slp();
        goto lable;
      }
    }
    }

    void slp()
    {
     
      digitalWrite(LED_BUILTIN, LOW);
      wdt_enable(WDTO_8S);
      WDTCSR |= (1 << WDIE); //разрешаем прерывание
      sleep_mode(); //переходим в режим сна, через 8 секунд попадаем в  функцию обработчика прерывания ISR (WDT_vect)
      sleep_cpu();
      }

    ISR (WDT_vect)
    {
      wdt_disable(); //прерывание сработало, отключаем таймер, после чего продолжается выполнение основной программы
      slip=true;
       }
    void logos()
      {  }
     
  2. asam

    asam Гик

    "Обычные" ардуины типа Уно, Мега, Нано итд устроены так, что усыпление контроллера не приводит к существенной экономии в потреблении. Так что заморачиваться со сном имеет смысл только при переделке схемы.
     
    DetSimen нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Если рядом стоит GSM-модуль, то во сне крошечного МК никакого смысла нет. Можно просто перевести в IDLE состояние, если уж так хочется. Ну и не забывать про регистр PRR, необходимость полного отключения АЦП и перевода всех ног на выход или вход с подтяжкой.
     
  4. Serg84

    Serg84 Нуб

    Добры день. Я хотел перевести ардуино в режим сна, по большей степени, для того, чтобы отключать OLED дисплей и датчики, которые планирую использовать, и не гонять попусту целиком цикл loop. Экономия энергии не столь важна, для этого и хочу сделать контроль уровня заряда, чтоб вовремя подключить источник питания. Да и заодно разобраться с режимами сна и прерываниями. В общем случае код имеет право на существование или все же не правильный?
     
  5. b707

    b707 Гуру

    для этого нет нужды загонять ардуину в сон, достаточно просто "отключать OLED дисплей и датчики"

    .
    бессмысленно, потребление энергии от этого не меняется
     
  6. Serg84

    Serg84 Нуб

    Дело не в потреблении энергии, думал что если просто отключить датчики, и продолжить работу с ними в цикле loop это может привести к ошибкам или сбоям. А на счет OLED дисплея: если его просто очистить командой clrScr() это ли не тоже самое что и отключить его программно?
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Так, не продолжай! Тебя суд что ли приговорил с ними работать?
     
  8. Serg84

    Serg84 Нуб

    Тогда прийдется дополнительное условие вводить ведь?
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Ну, можно вводить, а можно и не вводить, есть 100500 способов это организовать. Какой выберешь, так и сделаешь.
     
  10. asam

    asam Гик

    Использование режима сна, и особенно отладка в таком режеме, требует более высокой квалификаци, чем просто испльзовании дополнительного условия. И ошибок и сбоев можно словить гораздо больше. Со сном связыватьс имеет смысл только если требуется экономия энергии (но в случае обычной ардуины это не имеет смысла) или если надо померять аналоговый сигнал с минимально возможными шумами
     
  11. Serg84

    Serg84 Нуб

    Спасибо. То есть стоит опрос датчиков и вывод на экран реализовать в виде отдельных функций, а в loop организовать условия когда нужно их вызывать а когда нет?
     
  12. Serg84

    Serg84 Нуб

    Подскажите пожалуйста еще такой момент: приобрел самый дешевый GSM-шилд с модулем neoway n590, нашел описание модуля "https://radiolaba.ru/microcotrollers/gsm-modul-neoway-m590-opisanie-i-komandyi-upravleniya.html" там сказано что данный модуль умеет спать, для этого необходимо установить низкий логический уровень на линии SLEEP. Но прозвонка тестером контакта 9 модуля показала, что он замкнут на землю. Сталкивался ли кто с таким модулем? Умеет ли он спать? И если да, то как этого добиться?
     
  13. DIYMan

    DIYMan Guest

    Не мучайтесь, лучше возьмите SIM800.
     
    ostrov нравится это.
  14. Serg84

    Serg84 Нуб

    Спасибо. Уже рассматриваю этот вариант. Neoway брал по причине цены так как только начинаю осваивать ардуино, и брал дл обучения, теперь выбросить жалко, работает ведь
     
  15. asam

    asam Гик

    Ну, так всегда стоит поступать. Пихать все-все-все (ну кроме самих библиотек) в loop это плохой стиль. Желательно что бы каждая функция (и loop в том числе) не занимала больше одного экрана.
     
  16. parovoZZ

    parovoZZ Гуру

    а он в режиме сна сумеет принять СМС или звонок?
     
  17. Serg84

    Serg84 Нуб

    Написано умеет, но как я понял чтобы отправить его в сон нужно разрешить программно режим сна и подать низкий уровень на 9 ногу модуля, но у меня она звонится на землю. Вот я и интересуюсь, может кто с этим сталкивался? Это шилд такой или у меня косяк в монтаже?
     
  18. parovoZZ

    parovoZZ Гуру

    если умеет, тогда что он делает в рабочем режиме?
     
  19. Asper Daffy

    Asper Daffy Иксперд

    Как что? Корованы грабит. А ты что думал?
     
    DetSimen нравится это.