Как заставить встроенный светодиод периодически мигать?

Я пытаюсь заставить встроенный светодиод на Arduino мигать каждую секунду во время записи данных и помещения их в EEPROM, но я не знаю, как это сделать. Я должен печатать данные в EEPROM каждую минуту, пока EEPROM не заполнится, и пока это происходит, мой встроенный светодиод должен мигать примерно 1 секунду. Моя проблема, похоже, заключается в том, что я устанавливаю задержку, чтобы задержать время хранения данных в EEPROM, но это также влияет на время, необходимое моему светодиоду, чтобы мигать, пока он ожидает мигания во время сохранения данных. Любая помощь будет оценена по достоинству, код ниже:

#include<EEPROM.h>
const int SWITCH = 4;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SWITCH, INPUT_PULLUP);

}

void loop() {
  // put your main code here, to run repeatedly:
  int addr = 0;
  int r = analogRead(0);

  if (digitalRead(SWITCH) == LOW) {
    Serial.println("----Recording----");
  }
  while (addr <= 1024) {
    digitalWrite(LED_BUILTIN, HIGH);
    delay (250);
    digitalWrite(LED_BUILTIN, LOW);
    delay(750);
    Serial.println(r);
    EEPROM.put(addr, r);
    addr = addr + 2;
    delay(600);
  }
  while (true);
}

, 👍-2

Обсуждение

Если сложить все задержки, вы получите 1600 мс. Удаление последней delay(600); сделает продолжительность цикла намного ближе к 1 секунде. Действительно, для другого кода потребуется немного времени, но я предполагаю, что это занимает всего 5 мс за цикл. В зависимости от вашего приложения этого может быть достаточно. Также может случиться так, что вам это нужно настолько точно, что точность кристалла, который использует Arduino, недостаточна., @Gerben


2 ответа


3

Не используйте задержку(). В качестве отправной точки используйте пример «Моргание без задержки».

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Найдите его в разделе «Примеры 02.Цифровой»

Простой код, такой как задержка(), называется кодом блокировки. Это предотвращает возникновение других вещей, пока время не закончится. Это приемлемо в очень последовательных линейных программах, где всегда происходит только одно событие. И вы обнаружили ограничение этого. Пришло время углубиться в программирование.

Пожалуйста, откройте пример и поиграйте с ним. Убедитесь, что вы это понимаете, прежде чем думать о том, как изменить свой код.

,

Сможете ли вы очистить мой код, чтобы сделать это? Я не уверен, как мне следует делать то, что ты сказал., @Thomas

Я добавил больше к ответу. Откройте пример и узнайте, что он делает. Пока не думайте о своей программе. Вам нужно учиться таким вещам, а не просто копировать чей-то код., @Rudy


1

Как Руди упоминает в своем ответе, не используйте delay() и начните с примера BlinkWithoutDelay, который поставляется с Arduino IDE. Вот скетч, с которого можно начать. Если вы сравните его с примером BlinkWithoutDelay, он очень похож, за исключением того, что я добавил код кнопки для «запуска» и «остановки» мигания светодиода.

const byte SWITCH = 4;
const byte ledPin = 13;
const unsigned long oneSecond = 1000;
unsigned long previousMillis = 0;
byte ledState = LOW;
byte recording = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(SWITCH, INPUT_PULLUP);
}

void loop(){

  unsigned long currentMillis = millis();

  if(digitalRead(SWITCH) == LOW){
    recording = 1;
  }
  else{
    recording = 0;
    digitalWrite(ledPin, LOW);
  }

  if(currentMillis - previousMillis >= oneSecond){

    previousMillis = currentMillis;

    if(recording){
      if(ledState == LOW){
        ledState = HIGH;
      }
      else{
        ledState = LOW;
      }
    }
    digitalWrite(ledPin, ledState);
  }
}
,

Я не опубликовал модифицированный код, потому что хочу, чтобы он понял, что происходит в примере, не продолжая работу над своей программой. Я считаю, что важнее учиться, чем просто получить ответ., @Rudy

Я согласен с тобой, Руди. Как я уже упоминал в своем ответе, этот эскиз почти идентичен примеру BlinkWithoutDelay, с добавлением «кода кнопки», который уже написал Томас. Я просто хотел, чтобы Томас начал двигаться в правильном направлении. Томасу еще предстоит придумать, как добавить в скетч «минутный» таймер, получить аналоговые показания и сохранить их в EEPROM. Это займет его на какое-то время :), @VE7JRO