我有一个传感器连接到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 的连续定期功能“
欣赏有关此事的任何见解。 谢谢
答案 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的周期性任务,您的系统会变得复杂,因为截止日期错过率很高,请阅读"循环管理人员"。
答案 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
// ...
}