Выводы светодиодов на Arduino не инициализируются при использовании классов

#arduino #arduino-c

#arduino #arduino-c

Вопрос:

Я пытаюсь реализовать классы в моей программе светофоров. Проблемы, с которыми я сталкиваюсь, заключаются в том, что индикаторы не мигают, и унаследованный класс, похоже, не работает. Как я могу их исправить?

 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);
}
  

Я ожидаю, что метод sensor вернет расстояние, но это происходит только в первый раз. Когда он вызывается как унаследованный метод, он возвращает 0.

Комментарии:

1. double sensor() { Sensors::sensor(); } отсутствует оператор return. double sensor() { return Sensors::sensor(); } Попробуйте. Я был бы удивлен, если компилятор не предупредит вас об этом. Если это не так, увеличьте уровень предупреждения.

2. На выходе по-прежнему 0, и индикаторы также не включаются. После повышения уровня предупреждения компилятор сообщает мне, что мои переменные не используются. Они используются в методах, поэтому я не уверен, почему это отображается.

3. Вероятно, это ошибка, которую выдает VTT. Если вы посмотрите на свой Mode::Mode конструктор, вы инициализируете кучу локальных переменных, которые никогда не используются. Эти локальные переменные затеняют Mode переменные-члены, заменяя их внутри конструктора, поэтому переменные-члены становятся неинициализированными. Вы также должны подумать о том, что Sensors::Sensors() { ECHOPIN; TRIGPIN; } делает.

Ответ №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
}