【问题标题】:LED pins on Arduino aren't being initialized when using classes使用类时未初始化 Arduino 上的 LED 引脚
【发布时间】:2019-03-24 00:15:10
【问题描述】:

我正在尝试在我的红绿灯程序中实现类。我面临的问题是灯不闪烁,继承的类似乎不起作用。我该如何解决?

class Sensors {
    public:
        Sensors(int echopin, int trigpin);
    Sensors();
    void init();
    double light();
    double sensor();
    // protected:
    int ECHOPIN;
    int TRIGPIN;
};

class Mode: public Sensors
//Add the VARIABLES into the CLASSES from the FUNCTIONS
{
    public: Mode(int gled, int yled, int rled, int Delay1);
    void init();
    void mode1();
    void mode2();
    void mode3();
    double sensor() {
        Sensors::sensor();
    }
    private: int Gled;
    int Yled;
    int Rled;
    int Delay;
};
Sensors sense(3, 2);
Mode mode(13, 12, 11, 2000);
void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    sense.init();
    mode.init();
}

void loop() {
    double measure;
    double lightValue;
    double MAXDISTANCE = 10;
    double MAXLIGHT = 140;

    measure = sense.sensor();
    lightValue = sense.light();
    if (measure < MAXDISTANCE) {
        mode.mode2();
    } else if (lightValue < MAXLIGHT) {
        while (lightValue < MAXLIGHT) {
            mode.mode3();
            lightValue = sense.light();
        }
    } else {
        mode.mode1();
    }
}

Sensors::Sensors(int echopin, int trigpin) {
    ECHOPIN = echopin;
    TRIGPIN = trigpin;
}
Sensors::Sensors() {
    ECHOPIN;
    TRIGPIN;
}
double Sensors::light() {
    //LIGHT SENSOR
    int sensorPin = A0;
    unsigned int value = 0;
    value = analogRead(sensorPin);
    Serial.print("Light value is: ");
    Serial.println(value);
    return value;
}

double Sensors::sensor() {
    //Measure the distance for the RANGE FINDER
    double distance;
    double Time;

    digitalWrite(TRIGPIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIGPIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIGPIN, LOW);
    Time = pulseIn(ECHOPIN, HIGH);
    distance = (Time * 340) / 20000;
    Serial.print("Distance: ");
    Serial.print(distance);
    Serial.print(" cm \n");
    return distance;
}

void Sensors::init() {
    pinMode(ECHOPIN, INPUT);
    pinMode(TRIGPIN, OUTPUT);
}
Mode::Mode(int gled, int yled, int rled, int Delay1) {
    int Gled = gled;
    int Yled = yled;
    int Rled = rled;
    int Delay = Delay1;
}

void Mode::init() {
    pinMode(Gled, OUTPUT);
    pinMode(Yled, OUTPUT);
    pinMode(Rled, OUTPUT);
}

void Mode::mode1() {
    //First Mode
    digitalWrite(Gled, LOW);
    digitalWrite(Rled, HIGH); //RED ON
    delay(Delay);
    digitalWrite(Rled, LOW);
    digitalWrite(Yled, HIGH); //YELLOW ON
    Delay -= 1000;
    delay(Delay);

    digitalWrite(Yled, LOW);
    digitalWrite(Gled, HIGH); //GREEN ON
    Delay += 1000;
    delay(Delay);
    digitalWrite(Yled, HIGH); //YELLOW ON
    digitalWrite(Gled, LOW);
    Delay -= 1000;
    delay(Delay);
}

void Mode::mode2() {
    int DELAY = 100;
    int Y_LOOP = 10;
    int buzz = 4;

    pinMode(buzz, OUTPUT);
    for (int i = 0; i < Y_LOOP; i++) {

        tone(buzz, 20);
        digitalWrite(Yled, HIGH);
        delay(DELAY);
        digitalWrite(Yled, LOW);
        delay(DELAY);
    }
    noTone(buzz);
}

void Mode::mode3() {
    double measure;

    delay(1000);
    measure = sensor();
    if (measure < 10) {
        digitalWrite(Rled, LOW);
        digitalWrite(Gled, HIGH);
    } else {
        digitalWrite(Rled, HIGH);
        digitalWrite(Gled, LOW);
    }
    delay(1000);
}

我希望传感器方法返回一个距离,但它只是第一次这样做。当它作为继承方法调用时,它返回 0。

【问题讨论】:

  • double sensor() { Sensors::sensor(); } 缺少返回语句。试试double sensor() { return Sensors::sensor(); }。如果编译器没有警告您这一点,我会感到惊讶。如果不是,请提高警告级别。
  • 输出还是0,灯也不亮。提高警告级别后,编译器告诉我我的变量没有被使用。它们被用于方法中,所以我不确定为什么会显示。
  • 这很可能是 VTT 带来的错误。如果您查看 Mode::Mode 构造函数,您会初始化一堆从未使用过的局部变量。这些局部变量隐藏Mode 成员变量,在构造函数中替换它们,因此成员变量未初始化。您还应该考虑Sensors::Sensors() { ECHOPIN; TRIGPIN; } 做了什么。

标签: arduino arduino-c++


【解决方案1】:

这段代码可以简化为

struct foo
{
    int myX;

    foo(int x)
    {
        int myX = x;
    }
};

int main()
{
    foo f(42);
    //  f.myX is still garbage because in constuctor you initialize
    //  a local variable myX instead of object field
    return 0;
}

所以你应该在成员初始化列表中初始化类字段:

foo(int x): myX{x} 
{
     // empty
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2020-12-08
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多