Будет ли этот скетч в конечном итоге неудачным из-за проблемы с целочисленным ограничением?

Я новичок в программировании Arduino и настраиваю управляемую Arduino подводную камеру для покадровой съемки, чтобы делать снимки каждые 2 часа. Это уходит в океан на месяц, и я хочу быть уверен, что код не выйдет из строя из-за верхнего предела, который могут пройти обычные целые числа. Плата Arduino просто включает реле (подключенное к LED_PIN 11), а камера делает все остальное, используя скрипт с замечательного Canon Hackers Development Kit CHDK

Я пробовал несколько вариантов скетча, некоторые с простой задержкой, некоторые с миллисекундами, а некоторые со счетчиками, которые печатают приращение цикла.

Один из моих быстро выполняющихся тестовых скетчей, в котором использовался счетчик, преждевременно остановился, подозреваю, из-за достижения целочисленного предела, но я не уверен, что это произошло только из-за того, что в скетче был счетчик. Поэтому я вернулся к простейшему наброску, который смог найти, в надежде, что в нем не будет этой проблемы.

Кажется, я читал, что как только будет достигнуто целочисленное ограничение, скетч просто перезапустится. Или, может быть, он станет непредсказуемым. Лучше первое, чем второе.

Будем рады любым предложениям.

Я уверен, что есть много способов сделать это, но я ищу самый простой и надежный, который я могу найти, чтобы я мог легко настроить асинхронное время, т.е. цикл начинается Камера включена на 10 секунд Камера выключена на 2 часа Цикл повторяется

заранее спасибо за внимание

Вот скетч, который я сейчас тестирую.

#define LED_PIN 11
#define LED_OFF 7200000     // 2 часа в миллисекундах
#define LED_ON  8000       // 6 секунд в миллисекундах

unsigned long ms;        //время от millis()
unsigned long msLast;    //последний раз, когда светодиод изменил состояние
boolean ledState;        //текущее состояние светодиода

void setup(void)
{
    pinMode(LED_PIN, OUTPUT);
}

void loop(void)
{
    ms = millis();
    blinkLED();
}

void blinkLED(void)
{
    if (ms - msLast > (ledState ? LED_OFF : LED_ON)) {
        digitalWrite(LED_PIN, ledState = !ledState);
        msLast = ms;
    }
}

============================================== ====================

Хорошо, я придумал новый, гораздо более простой скетч, основанный на задержке. Может кто-нибудь сказать мне, является ли это более надежным с точки зрения непрерывного цикла в течение нескольких недель подряд?

#define LED_PIN 11

void setup()
{
   Serial.begin(9600);
   pinMode(LED_PIN, OUTPUT);
   digitalWrite(LED_PIN, HIGH);
}

void loop()
   {
       delay(7200000);                 // 2 часа в миллисекундах
       digitalWrite(LED_PIN, LOW);
       delay(8000);                    // 8 секунд в миллисекундах
       digitalWrite(LED_PIN, HIGH);

   }

, 👍1

Обсуждение

#define LED_ON 10000 // 1 секунда в миллисекундах ..... скажите мне, что значит милли? .... подсказка: это префикс, например, в миллиметрах, миллилитрах и миллисекундах, @jsotola

почему вы инициализируете Serial?, @jsotola

первые семь слов моего поста представляют меня как новичка.. Я взламываю и вырезаю отовсюду и постепенно заполняю пробелы в своих знаниях... Да, я, вероятно, должен потратить несколько дней на обучение, чтобы получить основы, но, я думаю, вы согласитесь, что это простая задача, поэтому я закатал рукава рубашки и погрузился в нее., @Hazy

Возможный дубликат Как обработать опрокидывание millis()?, @Juraj

@Juraj, речь идет о том, чтобы позволить Arduino работать долгое время. Я думаю, дубликатов нет. Хази, насколько я могу судить, оба скетча должны работать. При использовании больших чисел я предпочитаю использовать «52000UL». «UL» означает, что это длинное число без знака. Пожалуйста, обновите оба ваших скетча, а также напишите, сколько времени это занимает в комментариях под каждым большим числом. Например, «52000» — это 52 секунды. Как он питается? С батареей? Это продлится достаточно долго? Платы arduino предназначены для быстрого прототипирования, они не защищены от агрессивной среды., @Jot

Спасибо @Jot, я обновил скетчи до нужного интервала (не очень желательно для проверки ума). Это устройство будет находиться внутри подводного корпуса, прикрепленного к лотку для выращивания морских водорослей, примерно на 1,5 метра ниже поверхности Тихого океана, в 5 км от северного берега Бали. я, @Hazy

Прод... Я только что купил блок питания USB на 26 000 мАч, который будет его заряжать. Недавний 24-часовой тест, измерение на USB-ваттметре показало 0,74 Вт / ч, поэтому 26 Ач / 0,74 Вт / ч = 35,135 дней. Можно только догадываться, в какой момент у него не будет достаточного напряжения для питания камеры, но, к счастью, мы стремимся к тому, чтобы он работал, а не к определенному количеству дней., @Hazy

@Jot, речь идет о том, «Этот скетч в конечном итоге потерпит неудачу из-за проблемы с целым числом?». ответ - нет, потому что он правильно обрабатывает пролонгацию миллис, @Juraj

@Hazy, вам не следует сразу задавать больше вопросов, здесь, в SE https://arduino.stackexchange.com/tour, @Juraj

Если вам нужна какая-либо форма точности вашего времени, вы должны рассмотреть RTC. Внутренний метод millis() не особенно точен в течение длительных периодов времени., @Majenko

26 000mAh USB power bank... Удачи с этим... *лучшие* аккумуляторы 18650, которые вы можете приобрести в розницу (panasonic), имеют емкость 13400 мАч (4P, 3350/ячейка). Каждый стоит 70 фунтов, то есть около 18 фунтов за ячейку. Чтобы получить 26 000 мАч, вам понадобится 8 ячеек на общую сумму около 140 фунтов стерлингов. И это при исправном аккумуляторе. На eBay / Amazon вам повезет, если вы получите 2600 мАч от *всех* ячеек в нем. Типичная батарея eBay состоит из ячеек емкостью около 1000 мАч. Вам понадобится 20+ ячеек в вашей батарее, чтобы это добавить..., @Majenko

О, и если бы элементы были расположены бок о бок, как большинство аккумуляторов, их длина составила бы более фута., @Majenko

Есть причина, по которой USB-банки питания «большой емкости» на eBay такие дешевые — это не так. Высокая вместительность, т. Каждый продавец откровенно лжет о емкости. Обычно умножают на коэффициент 10 и более. Я видел блоки питания на 50 000 мАч с фактической емкостью всего 2600 мАч., @Majenko

@Majenko Я слышал вас о претензиях производителя к действительности, но это единственная батарея форм-фактора, которая поместится в моем корпусе. Я купил на Amazon, и вот довольно полный обзор YouTube, включая измерения заряда и разряда https://www.youtube.com/watch?v=AqIwb4395SY, @Hazy


1 ответ


2

Нет, скетчи не будут работать некорректно. Функция «delay()» Arduino вызывает функцию «micros()» для синхронизации. Функция "micros()" использует часы TIMER0 Atmel и ожидает 1000 микросекунд (1 миллисекунду) на каждой итерации. TIMER0 переполняется каждые 70 минут, но программный код, используемый в функции "delay()", корректно обрабатывает это переполнение.

,

На самом деле Таймер 0 переполняется каждые 1024 мкс., @Edgar Bonet

Вы несколько более правы, чем я (я смотрел на 16-битный Timer1), но на самом деле мы оба ошибаемся, поскольку переполнение таймеров зависит от настроек предварительного делителя. Тем не менее переполнение таймера не повлияет на возвращаемое значение micros() и, следовательно, не повлияет на ответ на исходный вопрос ., @Zanshin

На Arduino Uno (это то, что использует OP) код инициализации в основной библиотеке Arduino устанавливает предварительный делитель таймера 0 на 64. Если вы возитесь с этим предварительным делителем (это не делает OP), то все функции синхронизации Arduino будет выключен., @Edgar Bonet

вопрос был о милли-версии кода, а не о более поздней добавленной версии с задержкой(), @Juraj

Спасибо за ваш вклад .. Теперь я чувствую себя более уверенно, чтобы положить его в воду. @Juraj Извините, если кажется, что я задаю более одного вопроса. Я хотел задать только один, но теперь понимаю, что вопрос был не таким точным, как мог бы быть. Это должно было быть сформулировано так: «Должен ли я использовать подход« миллис »или« задержка », чтобы избежать каких-либо проблем с целочисленным ограничением» Ваше здоровье, @Hazy

@Hazy, вы когда-нибудь думали о переполнении delay()? потому что этот ответ об этом. о реализации delay() поверх micros(), @Juraj

@Juraj Я этого не делал, но полезные ответы Эдгара Бонета и Заншина сообщили мне о том, что задержка «переполняется», но, по-видимому, это не должно влиять на мой проект, потому что я не возился с предварительным масштабированием - что бы это ни было., @Hazy