对于Arduino和C ++,我是一个新手。
我试图编写一个从模拟引脚零(POT)读取输入数据的程序。 读取值后,我希望它打印到串行监视器,但只打印一次。如果模拟引脚零值的值发生变化,我希望它将新值打印到串行监视器。我试图使用全局变量,但无济于事。任何帮助将不胜感激!
int entered=0;
int flag;
void setup()
{
Serial.begin(9600);
}
void loop() {
int potValue=analogRead(A0);
if (!entered){
entered=1;
Serial.println(potValue);
}
int flag=potValue;
if (flag!=flag){
entered=0;
}
}
答案 0 :(得分:2)
这非常接近。这一行是你的错误
int flag=potValue;
如上所述,它会创建一个新的局部变量 flag 。局部变量隐藏全局变量。因此,比较始终是对自己的,永远不会失败。将行更改为:
flag=potValue;
并且您的程序将按照需要运行。
您可以像这样保存一些内存和代码空间:
int g_lastValue = 0;
void loop() {
int nowValue = analogRead(A0);
if (nowValue != g_lastValue) {
Serial.println(nowValue);
g_lastValue = nowValue;
}
...
}
使用g_作为名称前缀是一个变量是全局的提示。我使用这个命名约定,因为它有助于在读取函数时知道非本地变量。如果没有名称提示,您需要扫描整个函数体以查看是否存在变量声明,并且只有查看函数并且不查找声明才能知道变量必须是全局的。在小函数上,并不是真正的问题,但随着代码的增长,您可能需要一些命名约定提供的自我文档。
答案 1 :(得分:1)
你正在路上,但是你在变量方面有点纠结。
它可以更简单:只需一个全局变量和一个条件检查。
int lastRead = -1; // init to value outside of possible range
void setup()
{
Serial.begin(9600);
}
void loop() {
// get current value
int currentRead = analogRead(0);
//compare and only print if !=
if (currentRead != lastRead){
lastRead = currentRead; // store
Serial.println(lastRead);
}
}