Как читать данные аналогового датчика с помощью разных таймеров в Arduino

У меня есть три аналоговых датчика, таких как напряжение, температура и давление. Мне нужно измерять напряжение и температуру каждые 10 мс, и мне нужно измерять только давление каждые 30 мс с помощью таймеров в Arduino.

Как я могу это сделать?

, 👍-1

Обсуждение

см. пример BlinkWithoutDelay в меню примеров Arduino IDE., @Juraj

Вы видели эту библиотеку? https://www.avdweb.nl/arduino/timing/virtualdelay, @VE7JRO

пожалуйста, добавьте свой код в свой пост, @jsotola

Для этого вам нужен только один таймер, который срабатывает каждые 10 мс. Затем считывайте давление только каждый третий раз. Или вы можете просто использовать millis() или micros() в зависимости от остальной части вашего кода. Пожалуйста, поделитесь этим кодом и объясните, что он должен делать, @chrisl

начните с BlinkWithoutDelay, как упоминал @Juraj ... не удаляйте никакую часть кода ... добавьте переменную счетчика и установите ее на ноль ... перейдите к той части программы, где обновляется светодиод ... добавьте функция измерения напряжения и температуры... если счетчик = 0, то измерить давление... приращение счетчика... если счетчик = 3, то установить счетчик на ноль... когда все заработает то изменить переменную задержки с 500 до 10, @jsotola

«…с помощью таймеров в Arduino». У вас есть несколько вариантов в зависимости от того, насколько глубоко вам нужно зайти в этом упражнении, перечисленные здесь в порядке возрастания сложности. (1) Простая запись времени начала события и проверка того, не истек ли его временной интервал, как в уже упомянутом скетче «мигание без задержки». (2) использование готовых библиотек таймеров, которые могут вызывать указанные пользователем функции через определенные промежутки времени и т. д. и (3) прямая настройка аппаратных таймеров для запуска процедур обслуживания прерываний, прямого управления контактами gpio и т. д., @6v6gt


1 ответ


1

Пусть это поможет в качестве отправной точки! Не проверено

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
}

unsigned long previousMillis1;
unsigned long previousMillis2;

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis1 >= 10) {
    int val1 = analogRead(A0);
    int val2 = analogRead(A1);
    Serial.print("Values from A0 and A1: ");
    Serial.print(val1);
    Serial.print(" ");
    Serial.println(val2);
    previousMillis1 = currentMillis;
  }

  if (currentMillis - previousMillis2 >= 30) {
    int val3 = analogRead(A2);
    Serial.print("Value from A2: ");
    Serial.println(val3);
    previousMillis2 = currentMillis;
  }
}
,

Спасибо за вашу любезную помощь, мистер Карлос Коста, но мне нужно использовать таймер 1 или 2. Без использования миллисекунд я должен прочитать данные датчика., @Pritha

Предположительно, это школьный проект. Разрешено ли вам использовать готовые библиотеки или вы должны использовать прямую настройку аппаратных регистров таймера? Какой Ардуино вы используете? В любом случае, техническое описание микроконтроллера — хорошее (но тяжелое) начало., @6v6gt