Язык программирования: с ++
Когда я компилирую свою программу, я получаю эту ошибку:
/Button.cpp:50:18: error: '_pin' was not declared in this scope
Это говорит мне, что переменная _pin
не был объявлен в объеме функции
bool longPush(unsigned log interval)
, но было объявлено, я даже использовал _pin
в другой функции без проблем.
Это файлы библиотеки Button
которые доставляют мне неприятности:
#ifndef Button_h
#define Button_h
#include <Arduino.h>
class Button
{
private:
byte _pin;
byte _anti_bounce;
bool _est_ant;
bool _push;
public:
enum PullRes : bool {FLOATING = false, PULLUP = true,};
Button(byte pin, byte anti_bounce, PullRes = FLOATING);
bool falling();
bool rissing();
bool check();
bool longPush(unsigned long interval);
};
#endif
#include <Arduino.h>
#include <Button.h>
#include <Timer.h>
Button::Button(byte pin, byte anti_bounce, PullRes mode = FLOATING) {
_pin = pin;
_anti_bounce = anti_bounce;
if(mode == PULLUP) pinMode(pin,INPUT_PULLUP);
else pinMode(pin,INPUT);
}
bool Button::rissing() { //Funcion que retorna un 1 cuando se detecta un rissing en el pin <_pin>
bool puls;
if ((digitalRead(_pin) == 1) && (_est_ant == 0)) {
puls = 1;
_est_ant = 1;
}
else {
puls = 0;
_est_ant = digitalRead(_pin);
}
delay(_anti_bounce);
return puls;
}
bool Button::falling() { //Funcion que retorna un 1 cuando se detecta un falling en el pin <_pin>
bool puls;
if ((digitalRead(_pin) == 0) && (_est_ant == 1)) {
puls = 1;
_est_ant = 0;
}
else {
puls = 0;
_est_ant = digitalRead(_pin);
}
delay(_anti_bounce);
return puls;
}
bool Button::check(){ //Funcion que retorna el estado actual del pin <_pin>
return digitalRead(_pin);
}
bool longPush(unsigned long interval){
static Timer timer(interval);
timer.setInterval(interval);
static bool released = true;
if(digitalRead(_pin)){
timer.end();
released = true;
return false;
} else if (!timer.isRunning() && released){
released = false;
timer.init();
return false;
} else if (timer.read()){
timer.end();
released = false;
return true;
}
return false;
}
Ошибка в файле .cpp:
bool longPush(unsigned long interval){
static Timer timer(interval);
timer.setInterval(interval);
static bool released = true;
////////////////////////////////////////
if(digitalRead(_pin)){// <--- right here
timer.end();
released = true;
return false;
} else if (!timer.isRunning() && released){
released = false;
timer.init();
return false;
} else if (timer.read()){
timer.end();
released = false;
return true;
}
return false;
}
_pin
является не глобальная переменная; это переменная-член.
Вы пытаетесь использовать его как глобальную переменную, потому что вы определяете longPush
(глобальная функция) вместо Button::longPush
(функция-член).
Вот:
bool Button::longPush(unsigned long interval){
// ^^^^^^^^
У вас нет этой проблемы с другими функциями, потому что их определения не имеют этой опечатки.
Однако сделать ошибку легко: я сделал это по крайней мере дважды только сегодня!
Других решений пока нет …