Не меняется переменная - не найду причину

Тема в разделе "Arduino & Shields", создана пользователем Justasf, 10 июл 2023.

Метки:
  1. User248

    User248 Гик

    ТС пишет, что смотрит состояние через монитор порта. Если закрыть и снова открыть монитор порта Arduino IDE, то произойдёт перезапуск ардуины. Кто сомневается - проверьте.
     
    Ariadna-on-Line нравится это.
  2. b707

    b707 Гуру

    зависит от типа ардуины и того как подключена к порту.
    Но для штатного УСБ Уно, Нано, Меги - верно
     
  3. Justasf

    Justasf Нуб

    Нет, SIM800 не напрямую. Ардуина сразу вылетает... Схему приложил (схема общая для разных видов Arduino )
    На UNO этот код работает (с оговорками, без LOWER POWER(т.к. A328PB, и без отключения модема)).
     

    Вложения:

    Последнее редактирование: 12 июл 2023
  4. b707

    b707 Гуру

    если честно, это не код.
    То, что он глючит - совсем неудивительно. Удивительно было бы наоборот....

    Воспользуйтесь советом из поста #5
     
    Последнее редактирование: 12 июл 2023
    parovoZZ нравится это.
  5. Justasf

    Justasf Нуб

    А он не глючит... система работает по 3-4 суток c периодами сна по 15 минут и периодом отправки 35-36 сек. (больше не проверял). Единственное что заботит - почему значение переменной сбрасывается при новом витке loop.
     
  6. User248

    User248 Гик

    Уменьшите время сна до 8с и проверьте, будет ли сбрасываться.
    Код (C++):

      for (int i = 0; i < 1; i++) {
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
      }
     
     
  7. User248

    User248 Гик

    Согласно условию:
    Код (C++):
    if (readVcc() < battery_min)
    Только не понятно, как работает readVcc() и почему:
    Код (C++):
    #define battery_min 3600     // минимальный уровень заряда батареи
     
  8. Justasf

    Justasf Нуб

    Вижу определенно зависимость.
    Если модем не отрубать - то данные о переменной передаются... Т.е как только перестает работать
    Код (C++):
    SoftwareSerial SIM800(5, 6); // RX, TX
    обнуляется переменная...
    тут мои догадки заканчиваются..
    если только в EEPROM писать...так то ресурса на 6 лет хватит...
     

    Вложения:

  9. parovoZZ

    parovoZZ Гуру

    Я ж писал - читай регистр. Если действительно перезагрузка, то в разные участки кода пихай отладочный вывод в порт. Так узнаёшь из какого участка кода происходит вылет. В этом же регистре узнаешь - возможно вачдог ресетит, так как он здесь используется. Хрен знает как там библмотекари пишут свои библиотеки.
     
    DetSimen и Justasf нравится это.
  10. parovoZZ

    parovoZZ Гуру

    Если подключены только Rx и Tx - то хоть что делай, но МК не перезагрузится.
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Чего? Это ... сам-то понял?
     
    DetSimen нравится это.
  12. User248

    User248 Гик

    Мне другое не понятно. У микроконтроллера не задействован ни один аналоговый вход в качестве АЦП, но функция readVcc() каким-то образом замеряет напряжение питания.
     
  13. Asper Daffy

    Asper Daffy Иксперд

    А для чего задействовать аналоговые входы при измерении напряжения питания? Похоже, Вам не понятно, как питание замеряется. Разберитесь в этой функции, поймёте.
     
    DetSimen нравится это.
  14. User248

    User248 Гик

    Умеете вы объяснять. Сказали бы конкретнее, что если MUX3…MUX0 на ATmega328P равны 0b1110, то подключается дополнительный канал АЦП, который позволяет измерить внутреннее напряжение.
     
    Последнее редактирование: 14 июл 2023
  15. Asper Daffy

    Asper Daffy Иксперд

    Дык, 20 лет чтения лекций в университетах трёх разных стран! Худо-бедно, умею.
    Сказал бы, Вы б это через час забыли. А когда Вы сами нарыли, будете знать. В этом и заключается "умение".
     
    DetSimen нравится это.
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Источник образцового напряжения (1.1 вольт) внутри процессора можно и измерять, и использовать как референс для АЦП. АЦП для ЛЮБОГО входного напряжения РАВНОГО РЕФЕРЕНСУ выдает 1023 отсчета (Сэмпла). Если референс - шина питания, то -
    Vcc = (1.1V * 1023) / Sample. Эту формулу можно считать в обе стороны. Либо по известному референсу вычислять входное напряжение, либо по известному входному напряжению вычислять референс.
    ПС. В протеусе можно увидеть работу библы, меняя напряжения питания МК - Меню -Design - Configure Power Rails.
    ППС. Посмотрел библу - легко адаптируется для чтения внутреннего температурного сенсора в процессоре. Но жаль что симулятор не поддерживает его )))
     
    Последнее редактирование: 15 июл 2023
    User248 нравится это.
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Поимев отсчет, перевести его в милливольты не проблема. Проблема - пересчитать милливольты в температуру.
    Характеристика сенсора заметно нелинейная. Поэтому надо строить нелинейный график (полином).
    -45'C -- 242mV ; +25'C -- 314mV ; +85'C -- 380mV . Приведены типичные показания встроенного термо-сенсора AVR.
    Имеются три точки - можем построить полином второго порядка -
    T = A * U^2 + B * U + C
    Вопрос - у кого есть чем вычислить коэффициенты полинома ? То бишь решить систему уравнений относительно A,B,C.
    A * 242^2 + B * 242 + C = --45
    A * 314^2 + B * 314 + C = +25
    A * 380^2 + B * 380 + C = +85
    А то у меня с арифметикой плохо в последнее время. Желательно до 4го знака после запятой.
    С уважением.
     
    Последнее редактирование: 16 июл 2023
  18. Asper Daffy

    Asper Daffy Иксперд

    А что, у Вас нет MS Excell? Там это на раз делается.

    Можно Mapple, но это менее распространённая штука.
     
    ИгорьК нравится это.
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Как решать такие задачи в Excell не знаю. А учиться - поздно. Если там так просто - решите и выложьте значения сюды. Буду премного благодарен.
    ПС. Код для работы с температурным сенсором.
    Код (C++):
    float read_IntTemp() {
      // устанавливаем референс с внутреннего источника 1.1V
      // Читаем внутренний температурный сенсор
     
      #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
      ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX5) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
      #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
      ADMUX = _BV(REFS1)| _BV(MUX5) | _BV(MUX1);
      #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
      ADMUX = _BV(REFS1)| _BV(MUX3) | _BV(MUX2) | _BV(MUX1) | _BV(MUX0);
      #else
      ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);  // Вход - Встроенный сенсор температуры
    //  ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);  // Вход - Внутренний источник 1.1В
      #endif
      delay(2); // Wait for Vref to settle
      ADCSRA |= _BV(ADSC); // Start conversion
      while (bit_is_set(ADCSRA,ADSC)); // measuring
      uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
      uint8_t high = ADCH; // unlocks both
      long result = (high<<8) | low;  // Result in binary
      result = (1100L * result) / 1023; // Calculate V (in mV); 1100mV = 1.1V
      return result; // Voltage Termo-sensor in millivolts
    }
    Сделал сам. Тапками прошу не кидаться
     
    Последнее редактирование: 16 июл 2023
  20. User248

    User248 Гик

    Есть программа Advanced Grapher. Задаются X/Y координаты графика и программа ищет зависимость между ними.

    https://www.alentum.com/agrapher/
     
    Ariadna-on-Line нравится это.