GPRS Shield экономия электроэнергии

Тема в разделе "Проводная и беспроводная связь", создана пользователем OlegO, 12 июл 2019.

  1. OlegO

    OlegO Нуб

    Из описания с WIKI
    "Гнездо для батарейки CR1225, обеспечивающей работу встроенных часов реального времени. Нужна только при использовании команд, связанных с часами."
     
  2. OlegO

    OlegO Нуб

    Да шилд от Амперки. Идея проста, надо периодически, не часто (достаточно раз в четыре часа), делать замеры температуры и отправлять дистанционно. Так мудрено, потому что место труднодоступное и не имеет линий питания и связи. Так вот менял интервалы передачи сообщений от 1 часа до 12, автономность в целом почти не менялась. Поэтому пришел к выводу, что много тратится энергии при простоях. Ардуино же стоит зацикленная на проверке Миллис. Вот теперь думаю как ее отключать на 4 часа а потом включать. Примеров работы с часами не нашел, прошу помощи примером или советом.
     
  3. ИгорьК

    ИгорьК Гуру

    Часы не смогут что-то выключать и выключать. Они просто дают информацию о времени, которая вам, исходя из задачи, не нужна.
     
  4. OlegO

    OlegO Нуб

    GPRS Shield в программе усыпляется коммандой "gprs.powerOff();", но ардуино то остается в работе. И светодиод на шилде красный горит
     
  5. ИгорьК

    ИгорьК Гуру

    Шилд может отправляться в спячку, путем отправки на него АТ-команды. Если вы это делаете, больше ничего существенного из этой конструкции не получите.
     
  6. ИгорьК

    ИгорьК Гуру

    Выпаяйте светодиод.
     
  7. OlegO

    OlegO Нуб

    Про WDT читал в литературе, но показалось сложновато. Думал с часами легче. Если с часами не прокатит придется с вачдогом разбираться
     
  8. parovoZZ

    parovoZZ Гуру

    Штатно максимум - на 8 с.

    ничего сложного.
     
  9. ИгорьК

    ИгорьК Гуру

    Поясню глубже в стиле @parovoZZ :

    абсолютно ничего сложного, поскольку все просто. Яснее стало?
     
  10. ИгорьК

    ИгорьК Гуру

    И это полная чушь с точки зрения вопроса.

    Нет, не учился @parovoZZ в советской школе.
     
  11. OlegO

    OlegO Нуб

    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>
    // интервал между отправками данных в миллисекундах (5 минут)
    #define INTERVAL 14400000
    #define termPin1 A0 // датчик терморегулятора
    #define termPin2 A1
    #define termPin3 A2
    #define termPin4 A3
    #define termPin5 A4
    #define termPin6 A5
    // переменная для хранения времени работы программы
    // с последнего запуска отправки данных на сервер
    unsigned long previousMillis = 0;
    int temp1;
    int temp2;
    int temp3;
    int temp4;
    int temp5;
    int temp6;
    char t_temp1[4];
    char t_temp2[4];
    char t_temp3[4];
    char t_temp4[4];
    char t_temp5[4];
    char t_temp6[4];
    char sms[73];
    // создаём объект mySerial и передаём номера управляющих пинов RX и TX
    SoftwareSerial mySerial(10, 11);
    // создаём объект класса GPRS и передаём в него объект mySerial
    GPRS gprs(mySerial);

    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // открываем Serial-соединение с GPRS Shield
      mySerial.begin(9600);
    }
    void loop()
    {
      gprs.powerOn();
      // проверяем есть ли связь с GPRS устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке
        // процесс повторяется в цикле
        // пока не появится ответ от GPRS устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // выводим сообщение об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");

      delay (2000);
      float val1 = 0;
      float val2 = 0;
      float val3 = 0;
      float val4 = 0;
      float val5 = 0;
      float val6 = 0;
      for (int i=0; i<100; ++i) {
        val1 = val1+analogRead(termPin1);
        val2 = val2+analogRead(termPin2);
        val3 = val3+analogRead(termPin3);
        val4 = val4+analogRead(termPin4);
        val5 = val5+analogRead(termPin5);
        val6 = val6+analogRead(termPin6);
      }
      val1 = val1/100;
      val2 = val2/100;
      val3 = val3/100;
      val4 = val4/100;
      val5 = val5/100;
      val6 = val6/100;
      temp1 = val1*500/1023-50,0;
      temp2 = val2*500/1023-50,0;
      temp3 = val3*500/1023-50,0;
      temp4 = val4*500/1023-50,0;
      temp5 = val5*500/1023-50,0;
      temp6 = val6*500/1023-50,0;
       // из переменной temp1 в строковое представление в массив t_temp1[]
      itoa(temp1, t_temp1, 10);
      itoa(temp2, t_temp2, 10);
      itoa(temp3, t_temp3, 10);
      itoa(temp4, t_temp4, 10);
      itoa(temp5, t_temp5, 10);
      itoa(temp6, t_temp6, 10);
      strcat(sms, "T1 = ");
      strcat(sms, t_temp1);
      strcat(sms, " oC; ");
      strcat(sms, "T2 = ");
      strcat(sms, t_temp2);
      strcat(sms, " oC; ");
      strcat(sms, "T3 = ");
      strcat(sms, t_temp3);
      strcat(sms, " oC; ");
      strcat(sms, "T4 = ");
      strcat(sms, t_temp4);
      strcat(sms, " oC; ");
      strcat(sms, "T5 = ");
      strcat(sms, t_temp5);
      strcat(sms, " oC; ");
      strcat(sms, "T6 = ");
      strcat(sms, t_temp6);
      strcat(sms, " oC; ");
      delay (1000);
      Serial.println(sms);
      // отправляем сообщение по указанному номеру с заданным текстом
      gprs.sendSMS("+79101111111", sms);
      delay(5000);
      // выключаем GPRS-шилд
      gprs.powerOff();
      //очищаем строку sms
      for (int t = 0; t < 73; t++) {
        sms[t] = 0;
      }
      // проверяем не прошел ли нужный интервал времени
      while (millis() - previousMillis < INTERVAL) {
      // ждём XX минут
      }
      //если прошел, то сохраняем текущее время
      previousMillis = millis();
    }
    Вот листинг. Может что подскажете. За основу взял GPRS логгер для теплицы из WIKI Амперки, только с автономным питанием, вместо разных датчиков 6 датчиков температуры TMP36, и показания отправляются не в Народный монитор а SMSкой на телефон. Думаю постоянная проверка миллис с ИНТЕРВАЛОМ не очень энергоэффективна. Для логгера теплицы это не актуально, т.к. там питание стационарное. А в моем варианте думаю, что выключать и включать все таки будет лучше. Хотелось бы, чтобы дней 5 хотя бы работал.
     
  12. OlegO

    OlegO Нуб

    Всем, заранее спасибо!
     
  13. ИгорьК

    ИгорьК Гуру

    Ватчдог все что может сделать, перегрузить вашу плату, если в течение 7 секунд вы не дали на него определённую команду. К вашему вопросу он отношения не имеет.
     
  14. ИгорьК

    ИгорьК Гуру

    Ардуино не предназначена для отправки в спячку и пробуждения через определённое время.
     
  15. OlegO

    OlegO Нуб

    Может я неправильно выражаюсь, в режим "сна"
     
  16. ИгорьК

    ИгорьК Гуру

    На каком расстоянии от вашей теплицы есть электричество?
     
  17. OlegO

    OlegO Нуб

    В книге Ю.Ревича "Занимательная электроника" описывается такая возможность. Но, как я сказал для новичка выглядит сложновато, и хотелось бы конкретный пример устройства.
     
  18. OlegO

    OlegO Нуб

    Не хочу к электричеству привязываться, надо чтобы в "чистом поле" работало.
     
  19. parovoZZ

    parovoZZ Гуру

    Ещё вачдог умеет делать прерывание. Во взрослых AtMega можно выбрать режим - сброс или прерывание + сброс, в маленьких (Attiny) работает так - сперва прерывание. Если счетчик вачдога не сброшен, то следующее переполнение счетчика вызывает сброс кристалла.
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Однако КАМАЗовский аккумулятор нужен.И менять раз в месяц на новый свежезаряженый.Больше никак.Это по практическому опыту.GSM штука жручая что ввиде Шилда что в виде телефона.Старенького Сименс С-35 лучше всего подходящего под эту задачу.
    А что там у Ревича?Да есть idle режимы но это для голого МК Ардуино сам потребляет много.