Arduino 为什么可以';t X可以用作函数吗?
对不起,代码库太乱了。我是C++新手。 我正在尝试将循环和函数绑定在一起。(1) 湿度传感器和(2)伺服装置,用于根据湿度打开和关闭操纵杆 我收到一个错误,“伺服”不能用作函数。我尝试将伺服更改为其他名称。我没有在其他任何地方使用伺服,比如变量,所以这似乎不是问题所在 有人有其他建议吗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
#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()
的底部,就像您在问题编辑中所做的那样。