Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 为什么可以';t X可以用作函数吗?_Arduino_Arduino C++ - Fatal编程技术网

Arduino 为什么可以';t X可以用作函数吗?

Arduino 为什么可以';t X可以用作函数吗?,arduino,arduino-c++,Arduino,Arduino C++,对不起,代码库太乱了。我是C++新手。 我正在尝试将循环和函数绑定在一起。(1) 湿度传感器和(2)伺服装置,用于根据湿度打开和关闭操纵杆 我收到一个错误,“伺服”不能用作函数。我尝试将伺服更改为其他名称。我没有在其他任何地方使用伺服,比如变量,所以这似乎不是问题所在 有人有其他建议吗 #include "Servo.h" Servo myservo; // create servo object to control a servo int pos = 0; // s

对不起,代码库太乱了。我是C++新手。

我正在尝试将循环和函数绑定在一起。(1) 湿度传感器和(2)伺服装置,用于根据湿度打开和关闭操纵杆

我收到一个错误,“伺服”不能用作函数。我尝试将伺服更改为其他名称。我没有在其他任何地方使用伺服,比如变量,所以这似乎不是问题所在

有人有其他建议吗

#include "Servo.h"

Servo myservo;  // create servo object to control a servo

int pos = 0; // servo position variable
#define SensorPin A0 
float sensorValue = 0; 
bool lever = 0; // soil moisture sensor variable; 0 = dry; 1 = wet;
bool pump = 0; // pump is set to 0, which = off

// servo function
void servo(bool);

void setup() {
  Serial.begin(9600); // soil moisture sensor setup
  myservo.attach(9); // servo setup
}

// soil moisture sensor loop
void loop() { 
  for (int i = 0; i <= 100; i++) { 
    sensorValue = sensorValue + analogRead(SensorPin); 
    delay(20);
  } 
  sensorValue = sensorValue/100.0; 
  Serial.print("Moisture level: ");
  Serial.print(sensorValue);
  Serial.print(";");
  
  if(sensorValue > 1000) {
    lever = 0; // dry
  }

  if(sensorValue < 1000) {
    lever = 1; // wet
  }

  switchOnOff(lever);
  
  delay(1000);
}

// define the servo function
void switchOnOff(bool lever) {
  Serial.print(" Lever: ");
  Serial.print(lever);
  Serial.print(";");

  Serial.print(" Pump: ");
  Serial.print(pump);
  Serial.println(";");
  
  if(lever == 0 && pump == 0) { // it is dry and pump is off, pump needs to be turned on
    for (pos = 90; pos <= 180; pos++) { // goes from 0 degrees to 90 degrees
      // in steps of 1 degree
      myservo.write(pos);             // tell servo to go to position in variable 'pos'
      delay(15);
    }
    delay(4000);
    for (pos = 180; pos >= 90; pos--) { // goes from 90 degrees to 0 degrees
      // in steps of 1 degree
      myservo.write(pos);             // tell servo to go to position in variable 'pos'
      delay(15);
    }
    pump = 1; // noting that pump is on
  }

  if(lever == 0 && pump == 1) { // it is dry and pump is on
    return; // do nothing, return
  }

  if(lever == 1 && pump == 1) { // it is wet and pump is on, pump needs to be turned off
    for (pos = 90; pos <= 180; pos++) { // goes from 90 degrees to 0 degrees
      // in steps of 1 degree
      myservo.write(pos);             // tell servo to go to position in variable 'pos'
      delay(15);
    }
    delay(4000);
    for (pos = 180; pos >= 90; pos--) { // goes from 0 degrees to 90 degrees
      // in steps of 1 degree
      myservo.write(pos);             // tell servo to go to position in variable 'pos'
      delay(15);
    }
    pump = 0; // noting that pump is off
  }

  if(lever == 1 && pump == 0) { // it is wet and pump is off
    return; // do nothing, return
  }
}
#包括“Servo.h”
伺服myservo;//创建伺服对象以控制伺服
int pos=0;//伺服位置变量
#定义传感器引脚A0
浮动传感器值=0;
布尔杠杆=0;//土壤水分传感器变量;0=干燥;1=湿的;
布尔泵=0;//泵设置为0,这表示关闭
//伺服功能
真空伺服(bool);
无效设置(){
Serial.begin(9600);//土壤湿度传感器设置
myservo.attach(9);//伺服设置
}
//土壤水分传感器回路
void loop(){
对于(int i=0;i 1000){
杠杆=0;//干燥
}
如果(传感器值<1000){
杠杆=1;//湿
}
开关断开(操纵杆);
延迟(1000);
}
//定义伺服功能
无效开关接通断开(bool控制杆){
串行打印(“杠杆:”);
串行打印(杠杆);
序列号。打印(“;”);
串行打印(“泵:”);
串行打印(泵);
Serial.println(“;”);
如果(操纵杆==0&&泵==0){//干燥且泵关闭,则需要打开泵
对于(pos=90;pos=90;pos--){//从90度变为0度
//以1度的步长
myservo.write(pos);//告诉伺服转到变量“pos”中的位置
延误(15);
}
泵=1;//注意泵已打开
}
如果(操纵杆==0&&泵==1){//它是干的,泵是开的
return;//什么也不做,return
}
如果(操纵杆==1&&泵==1){//它是湿的,且泵处于打开状态,则需要关闭泵
对于(pos=90;pos=90;pos--){//从0度到90度
//以1度的步长
myservo.write(pos);//告诉伺服转到变量“pos”中的位置
延误(15);
}
泵=0;//注意泵已关闭
}
如果(操纵杆==1&&泵==0){//它是湿的,泵关闭
return;//什么也不做,return
}
}

谢谢。

问题在于,在正确声明之前,您尝试使用
伺服()
函数。首先,您需要先声明一个函数,然后才能在代码中提及它。其次,您对
伺服()的定义不正确。
int伺服(操纵杆)
,其中
操纵杆
不是一种类型。您应该关注以下方面:
int伺服(bool杠杆)
,其中
杠杆
bool
类型的参数,
servo()
函数采用该参数

然后,您的函数不返回任何内容,它只具有一些“副作用”,例如
myservo.write(pos)。因此,它应该是
void

尝试以下安排:

#include "Servo.h"

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

// Declare the function
void servo(bool);

int pos = 0;    // variable to store the servo position
#define SensorPin A0 
float sensorValue = 0; 
bool lever = 0; // lever is global variable of type bool


void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object    
  Serial.begin(9600); 
}


void loop() { 
  for (int i = 0; i <= 100; i++) { 
    sensorValue = sensorValue + analogRead(SensorPin); 
    delay(1); 
  } 
  sensorValue = sensorValue/100.0; 
  Serial.println(sensorValue); 
  delay(30);
  
  if(analogRead(0 > 100)) {
    lever = 1;
  }

  if(analogRead(0 < 100)) {
    lever = 0;
  }

  servo(lever);
}


// Define the function
void servo(bool lever) {
  if(lever == 1) { // On
    for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
    }
  }
  if(lever == 0) { // Off
    for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
    } 
  }
}
#包括“Servo.h”
伺服myservo;//创建伺服对象以控制伺服
//大多数电路板上可以创建12个伺服对象
//声明函数
真空伺服(bool);
int pos=0;//变量来存储伺服位置
#定义传感器引脚A0
浮动传感器值=0;
布尔杠杆=0;//lever是bool类型的全局变量
无效设置(){
myservo.attach(9);//将针脚9上的伺服连接到伺服对象
Serial.begin(9600);
}
void loop(){
对于(int i=0;i 100)){
杠杆=1;
}
if(模拟读数(0<100)){
杠杆=0;
}
伺服(杠杆);
}
//定义函数
无效伺服(bool操纵杆){
如果(操纵杆==1){//On
对于(pos=0;pos=0;pos-=1){//从180度变为0度
myservo.write(pos);//告诉伺服转到变量“pos”中的位置
} 
}
}

另一方面,
setup()
在这里和那里被重新定义时也出现了混乱。

伺服.h
是否有
伺服
功能的声明或原型?您显示的是一个文件吗?假设
Servo.h
有一个原型,您需要在尝试使用它之前包含它,比如在文件的顶部。或者,您可以将函数的定义移动到您使用它的任何地方。
我还没有将代码库与INT预先和设置一起安排。
。为什么不先把代码组织起来呢?@hcheung合理的建议。完成。@peyo检查答案的最新编辑,有一些拼写错误需要更正。很抱歉,我不建议您将任何函数或变量命名为
servo
,因为您正在使用该名称的库。发生冲突的可能性很高。选择一个不太通用的名称。例如,
pumpServo
或任何准确描述它的东西。谢谢。代码现在可以编译了。我们在哪里添加
延迟(1800)重要吗?根据您的建议编辑了上述代码库。@peyo这很重要,但取决于您想要实现的逻辑。如果您想在
loop()
的每次迭代之前延迟控制器,那么只需将其放置在
loop()
的底部,就像您在问题编辑中所做的那样。