2016-05-09 3 views
0

Мне нужно использовать классы в Arduino для многозадачности. Я нашел пример класса в here, но я хотел, чтобы мой основной код был чистым, поэтому я решил поместить класс в .h и .cpp файлов. После того, как немного прибегая к помощи это то, что я придумал: Work.h файл:Использование классов C++ в Arduino

/* 
* Work.h 
* 
* Created on: 2016-05-09 
*  Author: Secret 
*/ 

#ifndef WORK_H_ 
#define WORK_H_ 
int ledPin;  // the number of the LED pin 
unsigned long OnTime;  // milliseconds of on-time 
unsigned long OffTime; // milliseconds of off-time 

int ledState;     // ledState used to set the LED 
unsigned long previousMillis; // will store last time LED was updated 
class Work { 

public: 
    Work(int pin, long on, long off); 
    void Update(); 
}; 

#endif /* WORK_H_ */ 

Work.cpp файл:

/* 
* Work.cpp 
* 
* Created on: 2016-05-09 
*  Author: Secret 
*/ 

#include "Work.h" 
#include <Arduino.h> 

Work::Work(int pin, long on, long off) { 

    ledPin = pin; 
    pinMode(ledPin, OUTPUT); 

    OnTime = on; 
    OffTime = off; 

    ledState = LOW; 
    previousMillis = 0; 

} 
void Update() { 
    // check to see if it's time to change the state of the LED 
    unsigned long currentMillis = millis(); 

    if ((ledState == HIGH) && (currentMillis - previousMillis >= OnTime)) { 
     ledState = LOW; // Turn it off 
     previousMillis = currentMillis; // Remember the time 
     digitalWrite(ledPin, ledState); // Update the actual LED 
    } else if ((ledState == LOW) 
      && (currentMillis - previousMillis >= OffTime)) { 
     ledState = HIGH; // turn it on 
     previousMillis = currentMillis; // Remember the time 
     digitalWrite(ledPin, ledState); // Update the actual LED 
    } 
} 

Когда я попытался компиляции, я были получены ошибки в Work.cpp, метод Update() У меня есть несколько определений OnTime, OffTime, ledState, предыдущийMillis.
Что я делаю неправильно здесь и как это решить?

+0

Почему вы * определяете * эти переменные в файле заголовка глобально? Почему переменные * член * переменные в классе не являются? –

+0

A) вам не нужны классы для многозадачности, B) ваша проблема не связана с классами. – immibis

+0

A) насколько я читал, мне нужны классы для многозадачности. Проверьте статью, которую я связал. B) Как это не связано с классами, если я пишу класс C++ для Arduino? – Justin

ответ

2

Эта ошибка означает, что у вас есть эти переменные, появляющиеся в нескольких единицах перевода. По умолчанию глобальные переменные non const имеют внешнюю связь.

Чтобы сделать его внутренним, вы можете получить его с помощью static. Или вы можете просто переместить определения к вашему ЕП (.cpp файл)


Квалифицируйтесь static в Work.h

static int ledPin;  // the number of the LED pin 
static unsigned long OnTime;  // milliseconds of on-time 
static unsigned long OffTime; // milliseconds of off-time 

static int ledState;     // ledState used to set the LED 
static unsigned long previousMillis; // will store last time LED was updated 
class Work { 

public: 
    Work(int pin, long on, long off); 
    void Update(); 
}; 

Предпочтительно, чтобы переместить их в свои .cpp файлы, так как вы Арен» t используя их в вашем файле Work.h.

EDIT

Ошибка в результате вашей Update() функции в файле .cpp.

void Update() { .... 

^^, который определил новую функцию, и использует эти глобальные переменные ... Я считаю, что вы хотели сделать

void Work::Update() {.... 
+0

Благодарим вас за такой быстрый ответ. Я переместил переменные в файл Work.cpp. Также были внесены изменения в определение метода Update(), предложенного @Saad_Qureshi. Теперь все работает отлично! – Justin

0

Поскольку метод Update() является частью класса работы, он должен быть определен в рамках класса Work следующим образом:

void Work :: Update() {.... 
Смежные вопросы