C++ Can';t做嵌套函数,什么';有办法吗?
我正在使用ArduinoIDE,它不允许嵌套函数,或者在函数被声明之前调用它(它不会跳转找到它)。。 在我的代码中,我需要一个或另一个。。 此外,将所有功能都设置为一个大功能也不起作用,因为当我检查之前的传感器时,我必须一次又一次地写下“是”和“否”时该怎么办。 在这里,我试图感知光线,如果有光线,请转到PIR传感器,如果没有,请再次运行光线传感器。现在,如果PIR在3.5秒内两次感应到运动,请检查颜色,如果没有,请检查灯光。 现在颜色感知颜色并将其分类(RG或b)。现在它再次检查PIR,如果有移动,它再次检查颜色并再次检查PIR。现在,如果pir没有感觉到移动,它将发送到串行总线 我在使用函数(打印行)之前声明了一些函数,但其中一些函数不是因为我陷入了循环中。 当我检查light时,如果它为正值,我运行PIR,因此我需要在light之前声明PIR函数。但是在pir中,如果它是负数(没有移动),我运行light sensor,这意味着我应该在pir之前声明light sensor。 我被困在那个圈子里C++ Can';t做嵌套函数,什么';有办法吗?,c++,c,arduino,nested,C++,C,Arduino,Nested,我正在使用ArduinoIDE,它不允许嵌套函数,或者在函数被声明之前调用它(它不会跳转找到它)。。 在我的代码中,我需要一个或另一个。。 此外,将所有功能都设置为一个大功能也不起作用,因为当我检查之前的传感器时,我必须一次又一次地写下“是”和“否”时该怎么办。 在这里,我试图感知光线,如果有光线,请转到PIR传感器,如果没有,请再次运行光线传感器。现在,如果PIR在3.5秒内两次感应到运动,请检查颜色,如果没有,请检查灯光。 现在颜色感知颜色并将其分类(RG或b)。现在它再次检查PIR,如果有
int lightPin = A0;
int valLight = 0;
int ledTrans = 2;
int pirTrans = 3;
int pirPin = 4;
int pirState = LOW;
int CalTime = 30;
int colorTrans = 5;
int s2 = 6;
int s3 = 7;
int OUTpin= 8;
boolean RD= false;
boolean GD = false ;
boolean BD = false;
int rfPin = 9;
void setup() {
pinMode(A0,INPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,INPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,INPUT);
pinMode(9,OUTPUT);
Serial.begin(9600);
}
void printlines();
void pirSensor();
void colorSensor();
void pirSensor2();
void lightSensor() {
//light sensor
valLight = analogRead(A0);
delay(1000);
if (valLight >= 300) {
ledTrans = HIGH;
pirTrans = HIGH;
pirSensor();
} else {
delay(8000);
}
}
void pirSensor() {
// Calibration
for ( byte i = 0; i < 30; i++) {
delay(1000);
}
// Check PIR state
int pirState = digitalRead(2);
delay(1500);
pirState = digitalRead(2);
if (pirState == HIGH) {
colorTrans = HIGH;
colorSensor();
} else if (pirState == LOW) {
pirState = LOW;
lightSensor();
}
}
void colorSensor(){
//Check Color reads pulse for RGB
// void checkred
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
unsigned int RW = 255 - (pulseIn(OUTpin, LOW)/ 400 - 1); // turns into 0-255
delay(6000);
// void checkgreen
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
unsigned int GW = 255 - (pulseIn(OUTpin, LOW)/ 400 - 1);
delay(6000);
// void checkblue
digitalWrite(s2, HIGH);
digitalWrite( s3, HIGH);
unsigned int BW = 255 - (pulseIn(OUTpin, LOW) / 400 - 1);
delay(6000);
// seeing which color I got(r g or b)
if (RW > BW && RW > GW){
RD = true;
delay(7000);
} else if (GW > RW && GW > BW){
GD = true;
delay(7000);
} else if (BW > RW && BW > GW){
BD = true;
delay(4000);
}
}
void pirSensor2(){
pirState = digitalRead(2);
delay(1500);
pirState = digitalRead(2);
if(pirState = HIGH){
colorSensor();
}else{
printlines();
}
}
void printlines(){
if(RD){
Serial.print("RED DETECTED");
} else if(GD){
Serial.print("GREEN DETECTED");
}else if(BD){
Serial.print("BLUE DETECTED");
}else if(RD && GD){
Serial.print("RED & GREEN DETECTED");
}else if(RD && BD){
Serial.print("RED & BLUE DETECTED");
}else if(BD && GD){
Serial.print("GREEN & BLUE DETECTED");
}else if(RD && GD && BD){
Serial.print("RED, GREEN, BLUE DETECTED");
}
delay(7000);
}
int lightPin=A0;
int-valLight=0;
int-ledTrans=2;
int-pirTrans=3;
int-pirPin=4;
int状态=低;
int CalTime=30;
int-colorTrans=5;
int s2=6;
int s3=7;
int-OUTpin=8;
布尔RD=假;
布尔GD=假;
布尔BD=假;
int-rfPin=9;
无效设置(){
引脚模式(A0,输入);
pinMode(2,输出);
pinMode(3,输出);
pinMode(4,输入);
pinMode(5,输出);
pinMode(6,输出);
pinMode(7,输出);
pinMode(8,输入);
pinMode(9,输出);
Serial.begin(9600);
}
作废打印行();
真空传感器();
空隙颜色传感器();
空位2();
真空光传感器(){
//光传感器
valLight=模拟读数(A0);
延迟(1000);
如果(valLight>=300){
ledTrans=高;
pirTrans=高;
PIR传感器();
}否则{
延迟(8000);
}
}
真空传感器(){
//校准
用于(字节i=0;i<30;i++){
延迟(1000);
}
//检查PIR状态
int pirState=数字读取(2);
延迟(1500);
pirState=digitalRead(2);
如果(pirState==高){
colorTrans=高;
颜色传感器();
}否则如果(pirState==低){
皮尔斯塔=低;
光传感器();
}
}
void颜色传感器(){
//检查RGB的颜色读数脉冲
//无效勾选
数字写入(s2,低电平);
数字写入(s3,低电平);
无符号整数RW=255-(脉冲星(输出,低)/400-1);//变为0-255
延迟(6000);
//空格子绿
数字写入(s2,低电平);
数字写入(s3,高);
无符号整数GW=255-(脉冲星(输出端,低)/400-1);
延迟(6000);
//空格子蓝
数字写入(s2,高);
数字写入(s3,高);
无符号整数BW=255-(脉冲信号(输出端,低)/400-1);
延迟(6000);
//看看我得到了什么颜色(r g或b)
如果(RW>BW&&RW>GW){
RD=真;
延迟(7000);
}否则如果(GW>RW&&GW>BW){
GD=真;
延迟(7000);
}否则如果(BW>RW&&BW>GW){
BD=真;
延迟(4000);
}
}
void-2(){
pirState=digitalRead(2);
延迟(1500);
pirState=digitalRead(2);
如果(状态=高){
颜色传感器();
}否则{
打印线();
}
}
无效打印行(){
国际单项体育联合会(RD){
串行打印(“检测到红色”);
}否则,如果(GD){
串行打印(“绿色检测”);
}否则,如果(BD){
串行打印(“检测到蓝色”);
}否则如果(RD和GD){
串行打印(“检测到红色和绿色”);
}否则如果(RD和BD){
串行打印(“检测到红色和蓝色”);
}else if(BD&&GD){
串行打印(“检测到绿色和蓝色”);
}else if(RD&&GD&&BD){
串行打印(“检测到红色、绿色、蓝色”);
}
延迟(7000);
}
您可以在定义函数之前声明它:
void setup();
那么你可以称之为:
setup();
…然后在文件中的某个地方,您可以编写其定义:
void setup() {
// implementation here
}
为什么不在调用函数原型之前声明它呢?我用声明^^修复了它。。现在它说它可以;我不能编译。。有人能发现错误吗?我已经检查并重新检查了所有内容,包括{}..(检查更新的问题代码)@imarioofficer:错误消息会很有帮助。@SF。谢谢,但我只需要添加void loop(){}