Как заставить встроенный светодиод периодически мигать?
Я пытаюсь заставить встроенный светодиод на 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);
}
@Thomas, 👍-2
Обсуждение2 ответа
Не используйте задержку(). В качестве отправной точки используйте пример «Моргание без задержки».
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Найдите его в разделе «Примеры 02.Цифровой»
Простой код, такой как задержка(), называется кодом блокировки. Это предотвращает возникновение других вещей, пока время не закончится. Это приемлемо в очень последовательных линейных программах, где всегда происходит только одно событие. И вы обнаружили ограничение этого. Пришло время углубиться в программирование.
Пожалуйста, откройте пример и поиграйте с ним. Убедитесь, что вы это понимаете, прежде чем думать о том, как изменить свой код.
Сможете ли вы очистить мой код, чтобы сделать это? Я не уверен, как мне следует делать то, что ты сказал., @Thomas
Я добавил больше к ответу. Откройте пример и узнайте, что он делает. Пока не думайте о своей программе. Вам нужно учиться таким вещам, а не просто копировать чей-то код., @Rudy
Как Руди упоминает в своем ответе, не используйте 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Если сложить все задержки, вы получите 1600 мс. Удаление последней
delay(600);
сделает продолжительность цикла намного ближе к 1 секунде. Действительно, для другого кода потребуется немного времени, но я предполагаю, что это занимает всего 5 мс за цикл. В зависимости от вашего приложения этого может быть достаточно. Также может случиться так, что вам это нужно настолько точно, что точность кристалла, который использует Arduino, недостаточна., @Gerben