Как заменять функцию Делэй? (предотвращать сбои) в arduino

Кто-то знает, как заменять функцию Делэй, который вызывает долги, в arduino? Дело в том, что я пробую измерить дистанции с этим кодом, но одновременно не хочу, чтобы вся система "заснула" это время, хочу заставить несколько вещей измерять одновременно дистанции, и что смог продолжать властвовать, упорядочи в мою систему.

int Trig=4;
int Echo=3;

//Variable en la que se va a almacenar el valor correspondiente a la distancia
int Dist;

void setup() {
    pinMode (Trig, OUTPUT);
    pinMode (Echo, INPUT);
}

//Este módulo calcula y devuelve la distancia en cm.
void ultrasonido (int &Distancia){
    //Para estabilizar el valor del pin Trig se establece a LOW
    digitalWrite (Trig, LOW);
    delay(10);
    //Se lanzan los 8 pulsos
    digitalWrite (Trig, HIGH);
    delay(10);
    digitalWrite (Trig, LOW);
    Distancia= pulseIn (Echo, HIGH);
    Distancia=Distancia/58;
    Serial.println(Distancia);
    delay(100);
}

void loop() {
    ultrasonido(Dist);
    delay (250);
}
8
задан 12.01.2016, 09:38
3 ответа

Доказательство с этой освободило бы грушу датчики ультразвуков arduino

NewPing

Конечно он позволит тебе улучшать время ответа.

Пример страницы:

#include <NewPing.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin(115200);
}

void loop() {
  delay(50);
  int uS = sonar.ping();
  Serial.print("Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM);
  Serial.println("cm");
}

В случае, если ты захочешь удалить необходимость надеяться в датчик, например, что loop прокручивает изображение в окне до тех пор, пока датчик не будет располагать измерениями, тебе рекомендовал бы использовать датчик в автобусе i2c тип SRF10 или SRF08, который они позволят тебе подбирать измерение как только он был доступен без необходимости "delay".

Проверь следующую ссылку:

Датчик ультразвуки i2c

1
ответ дан 24.11.2019, 15:00

Может быть, немного следующего этому помогло, в зависимости от которого я захотел достичь на долгий срок или тот, который больше приспосабливается к Вашей необходимости:

Нет multi-threading даже мульти-процесса, В Arduino, по крайней мере, насколько я знаю, не поддерживают (хардвер) threading.

Вы можете стараться симулировать многообразные трэды с каким-то программным обеспечением / книжным магазином.

Например:

Protothreads, хотя существуют некоторые:

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

(соединение) Protothreads http://dunkels.com/adam/pt/

Или использовать прерывания, особенно хронометрированные. Возможно программировать temporizador, чтобы прерывать главную рутину каждое столько время (микро секунды), чтобы так симулировать то, что он ищет выполняя одну или другая рутина определяет. чтобы для так делать вещи пока делаются другие вещи

(соединение) https://www.arduino.cc/en/Reference/Interrupts


Я искал какой-то код, сходный с прокомментированным, чтобы показывать его и это тот, которого я нашел, может видеть это внизу с Вашим соединением в ответе пользователя electronics.stackexchange.com может быть, я этому помог.

https://electronics.stackexchange.com/questions/67089/how-can-i-control-things-without-using-d

В нижнем примере, LED моргает, не используя delay (). Когда он работает Timer1, ее называются рутина услуги прерывания (ISR) isrBlinker () меняя состояние LED между зажженным / приглушенным.

Чтобы доказывать, что другие вещи могут происходить одновременно, loop () напиши неоднократно foo / бар в последовательный порт, независимый от мерцающего LED.

#include "TimerOne.h" 

int led = 13;

void isrBlinker() {
  static bool on = false;
  digitalWrite( led, on ? HIGH : LOW );
  on = !on;
}

void setup() {                
  Serial.begin(9600);
  Serial.flush();
  Serial.println("Serial initialized");

  pinMode(led, OUTPUT);

  // initialize the ISR blinker
  Timer1.initialize(1000000);
  Timer1.attachInterrupt( isrBlinker );
}

void loop() {
  Serial.println("foo");
  delay(1000);
  Serial.println("bar");
  delay(1000);
}

видео, которые, может быть, могли бы помогать тебе

https://www.youtube.com/watch? v=oeP_NiajWME

4
ответ дан 24.11.2019, 15:00

Она funciГіn millis () вот то, в чем ты нуждаешься. Так как эта работает на времени с тех пор, как iniciГі arduino, с нею ты можешь "подделывать" delay (), не будучи должен "блокировать" процессор. Есть очень хороший руководитель на Вашем использовании в adafruit https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview
Удача:)

1
ответ дан 24.11.2019, 15:00