Arduino在循环中读取循环中的输入

时间:2015-04-17 05:43:39

标签: arduino

我有一个传感器连接到arduino uno引脚5,它每秒读取传感器值并每1分钟发送一个短信。这很有效。

void loop() {
// read_sensor_and_store(5);
// increment_time_counter();
// if_time_counter is 60000 miliseconds then send the sms
delay(1000);
}

虽然这有效,但我想调用另一个函数,比如 read_another_sensor(pin,delay_0,count)。这将做什么是延迟'delay_0'读取特定引脚'计数'的次数。 (从根本上说,它将以给定的延迟运行for循环)。

现在,如果我有这样的东西

void loop() {
// read_sensor_and_store(5);
// read_another_sensor(7, 2000, 4);
// increment_time_counter();
// if_time_counter is 60000 miliseconds then send the sms
delay(1000);
}

这也可以工作,但是在执行read_another_sensor()时,时间会过去,我会错过很少的引脚5的读数。有没有办法并行或以任何其他方式执行这两个函数来达到“调用”的目的 read_another_sensor 不会影响 read_sensor_and_store 的连续定期功能“

欣赏有关此事的任何见解。 谢谢

2 个答案:

答案 0 :(得分:1)

扩展上述用户的答案,您可以执行以下操作,以允许您以任意(乘以50 mili)句点生成sensor2任务:

const int ONE_SECOND = 1000;
const int ONE_MINUTE = 60*ONE_SECOND;

// 50 mili - has to be upper bound of total execution time
//           has to be [GCD][1] of periods of all your tasks
const int BASIC_PERIOD = 50; 

// FRAMES*BASIC_PERIOD has to be [LCM][2] of periods of all your tasks
const int FRAMES = ONE_MINUTE / BASIC_PERIOD; 

void read_another_sensor(delay_0, count) { 
    g_delay = delay_0;
    g_count = count;
}

...

void loop() {

    if ((unsigned long)(millis() - previousMillis) >= BASIC_PERIOD) {
        previousMillis = millis();

        frame_counter = (frame_counter + 1) % FRAMES;

        if (frame_counter == 0)
           send_sms();
        if frame_counter % ((FRAMES * BASIC_PERIOD) / ONE_SECOND) == 0
           read_sensor();
        if frame_counter % ((FRAMES * BASIC_PERIOD) / g_delay) == 0
            if (count > 0) {
               count--;
               read_sensor_2():
            }
        }
    }
}

如果您需要使用期限不超过50 mili的周期性任务,您的系统会变得复杂,因为截止日期错过率很高,请阅读"循环管理人员"。

GCD

LCM

答案 1 :(得分:0)

通常,您可以使用比较代码的时间戳替换delay(1000)以达到目标。如果一个函数需要以不同于其他函数的间隔执行,或者如果要组合草图,则通常使用代码构造(见下文)。 Web和stackoverflow上已有多个来源(例如,请参阅arduino-combine-sketches)。

unsigned long interval=1000;  // the time we need to wait
unsigned long previousMillis=0; // millis() returns an unsigned long.

void setup() {
//...
}

void loop() {
 if ((unsigned long)(millis() - previousMillis) >= interval) {
 previousMillis = millis();
 // ... 
 }
}
//...

因此,在您的情况下,您需要类似下面的代码,我还没有测试过,但希望能让您了解如何无延迟地管理函数():

unsigned long interval=1000;  // the time we need to wait (read_another_sensor)
unsigned long previousMillis=0; // millis() returns an unsigned long.


void setup() {
//...
}

void loop() {

 // every 1000 millisecs (=delay(1000))...
 if ((unsigned long)(millis() - previousMillis) >= interval) {
    previousMillis = millis();
    read_another_sensor();
    //...
 }

 read_sensor_and_store() // continuous periodic 
 // ... 

}