Ant*_*nio 8 pthreads arduino sensor infrared
我正在做一个关于控制两个传感器(超声波和红外线)的项目,用Arduino管理它们.该IR接收器有一个过滤器系统内,所以它在接收到36千赫的频率.我使用模块srf04来处理超声波的东西.如果我做一个必须只控制一个传感器的程序,它就可以工作.但我必须将两个信号插入到一个结果中.所以我使用了protothreads!但它不起作用......错误是什么?
这是代码:
#include <pt.h>
int iro = 8, iri = 4, us = 12, distanza, us_vcc = 13, ir_vcc = 7;
long durata;
static struct pt pt1, pt2, pt3;
static int irthread(struct pt *pt) {
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, 1>0);
digitalWrite(iro, HIGH);
delayMicroseconds(9);
digitalWrite(iro, LOW);
delayMicroseconds(9);
}
PT_END(pt);
}
static int usthread(struct pt *pt) {
static unsigned long timer = 0;
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, millis() - timer > 200);
timer = millis();
pinMode(us, OUTPUT);
digitalWrite(us, LOW);
delayMicroseconds(5);
digitalWrite(us, HIGH);
delayMicroseconds(10);
digitalWrite(us, LOW);
pinMode(us, INPUT);
durata = pulseIn(us, HIGH);
distanza = durata/58;
}
PT_END(pt);
}
static int leggithread(struct pt *pt) {
static unsigned long timer = 0;
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, millis() - timer > 200);
timer = millis();
Serial.print(distanza);
Serial.print("cm ");
if (digitalRead(iri) == LOW)
Serial.println("ir si");
else
Serial.println("ir no");
}
PT_END(pt);
}
void setup() {
pinMode(iro, OUTPUT);
pinMode(iri, INPUT);
pinMode(us_vcc, OUTPUT);
digitalWrite(us_vcc, HIGH);
pinMode(ir_vcc, OUTPUT);
digitalWrite(ir_vcc, HIGH);
Serial.begin(9600);
PT_INIT(&pt1);
PT_INIT(&pt2);
PT_INIT(&pt3);
}
void loop() {
irthread(&pt1);
usthread(&pt2);
leggithread(&pt3);
}
Run Code Online (Sandbox Code Playgroud)
每个线程的代码的单个部分都有效.
更新
我解决了我的问题(已删除irthread()),代码现在是这样的:
#include <pt.h>
int iro = 8, iri = 4, us = 12, distanza, us_vcc = 13, ir_vcc = 7;
long durata;
static struct pt pt1, pt2;
static int usthread(struct pt *pt) {
static unsigned long timer = 0;
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, millis() - timer > 200);
timer = millis();
pinMode(us, OUTPUT);
digitalWrite(us, LOW);
delayMicroseconds(5);
digitalWrite(us, HIGH);
delayMicroseconds(10);
digitalWrite(us, LOW);
pinMode(us, INPUT);
durata = pulseIn(us, HIGH);
}
PT_END(pt);
}
static int leggithread(struct pt *pt) {
static unsigned long timer = 0;
PT_BEGIN(pt);
while(1) {
PT_WAIT_UNTIL(pt, millis() - timer > 200);
timer = millis();
distanza = durata/58;
Serial.print(distanza);
Serial.print("cm ");
if(digitalRead(iri) == LOW)
Serial.println("ir si");
else
Serial.println("ir no");
}
PT_END(pt);
}
void setup() {
pinMode(iro, OUTPUT);
tone(iro, 36000);
pinMode(iri, INPUT);
pinMode(us_vcc, OUTPUT);
digitalWrite(us_vcc, HIGH);
pinMode(ir_vcc, OUTPUT);
digitalWrite(ir_vcc, HIGH);
Serial.begin(9600);
PT_INIT(&pt1);
PT_INIT(&pt2);
}
void loop() {
usthread(&pt1);
leggithread(&pt2);
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是超声波传感器.如果我在没有protothreads的单个程序中控制它,它可以到达3米距离的物体.现在,即使我在1米处放置一些东西,"distanza"最大为15厘米.错误是什么?
在irthread()宏的第二个参数中,PT_WAIT_UNTIL总是求值为true:
PT_WAIT_UNTIL(pt, 1>0);
Run Code Online (Sandbox Code Playgroud)
因此程序将停留在irthread()的无限循环中,因为在这种情况下宏PT_WAIT_UNTIL的部分结果是这样的if(!(1>0)) return 0;; 声明return 0从未被调用过.
它适用于usthread()并且leggithread()因为第二个参数在前200毫秒内是假的并且变量被设置为因此在一次为真之后它将再次为假200毫秒.
一些背景信息在protothreads如何真正起作用.
| 归档时间: |
|
| 查看次数: |
6823 次 |
| 最近记录: |