[SOLUCIONADO] "INPUT" o "INPUT_PULLUP" como argumentos de un objeto

Buenas,
Me estoy metiendo en lo de programación orientada a objetos en Arduino, y me he atascado con un ejercicio (de los sencillos).

La idea es configurar el pin de entrada vinculado a una "función" de la clase, para ponerlo en modo INPUT normal o INPUT_PULLUP vía un argumento de uno de los métodos de la clase. No sé si me explico bien, ya que no domino el lenguaje en ese ámbito.

En un ejemplo del tutorial que sigo utiliza el tipo de variable "entero" al declarar la variable que recogería el valor INPUT o INPUT_PULLUP, pero al compilar me da error.

La clase tiene por objetivo detectar flanco de un pulsador. Pongo el código del archivo .h y del "ino":

class Boton{
	private:
		int pin;
		bool estado_ant;
		bool estado;
		bool reposo;
	public:
		Boton (int _pin){
			pin = _pin;
		}
		void inicia(int input) {
			pinMode(pin, input); 
			reposo = digitalRead(pin);
			estado_ant = reposo;
		}
		bool pulsado(){
			estado = digitalRead(pin);
			if (estado != estado_ant){
				estado_ant = estado;
				if (estado != reposo){
					return true;
				}
				else return false;
			}
			else return false;
		}
};

el programa ino:

#include <Contador.h>
#include <Boton.h>

Contador C1;
Boton B1(8);
Boton B2(9);

int A;
void setup() {

Serial.begin(9600);
C1.SetContador(0);
B1.inicia(INPUT_PULLUP);
B2.inicia(INPUT_PULLUP);

}

void loop() {
  if (B1.pulsado()=true){
     C1.Incrementar();
     Serial.print("A = ");
     Serial.println(C1.GetCont());
  }

  if (B2.pulsado() = true){
    C1.Decrementar();
    Serial.print("A = ");
    Serial.println(C1.GetCont());
  }
  
}

el código de Contador.h no lo pego porque no tengo problemas con él y no creo que sea relevante en esta duda.

En resumen mi duda es cómo usar INPUT_PULLUP como argumento (¿como qué tipo de variable lo declaro?)
Si es correcto usarlo a través de una variable entera, a ver en qué otro punto he metido la gamba?.

El error de compilación que me da es:

practica_obj_contador-boton:25:22: error: lvalue required as left operand of assignment

if (B2.pulsado() = true){

^~~~

exit status 1
request for member 'inicia' in '1', which is of non-class type 'int'

Gracias de antemano y un saludo,

Creo que te está dando el error de compilación porque has puesto = en lugar de == por lo que trata de asignar el valor true a la función (cosa que no se puede hacer) en lugar de comparar lo que retorna la función con el valor true.

Gracias!

Error de principiante!. Pero sigue sin compilar.

Tengo la impresión de que el miembro Boton.inicia() espera un entero como argumento y INPUT_PULLUP no le vale. Y mi pregunta era qué tipo de variable tendría que declarar para que me lo admita.

Podría no complicarme la vida y codificar el tipo de entrada digital con dos números o dos caracteres, pero quería ver si lo podía hacer así de manera directa...

Respecto a hacerlo programando orientado a objetos, antes que se me olvide, diré que los nombres de las clases suelen empezar en mayúsculas y el de los objetos, variables y funciones en minúsculas. Así que nada de B1 y B2. Mejor b1 y b2. Incluso mejor aún boton1 y boton2. De hecho, en las pruebas, me ha dado problemas el nombre de B1 para la variable, porque parece ser que en algún sitio hay definida una constante o macro B1. Sí, porque las macros y las constantes se suelen escribir todo en mayúsculas.

En cuanto a configurar el pin de entrada, en este caso, puedes prescindir de la función inicia() y usar el constructor de la clase Boton. Para ello elimina la función inicia() y las llamadas en el setup(). En su lugar define el constructor Boton() así:

		Boton (int _pin, uint8_t modo = INPUT) { // Si no se pone el parámetro modo su valor por defecto será INPUT
			pin = _pin;
                        pinMode(pin, modo);
                        reposo = digitalRead(pin);
                        estado_ant = reposo;
		}

Esto te permite definir los botones de tres formas distintas (he puesto los nombres con minúsculas):

Sin activar la resistencia pull-up:

Boton b1(8);
Boton b2(9);

Sin activar la resistencia pull-up:

Boton b1(8, INPUT);
Boton b2(9, INPUT);

Activando resistencia pull-up interna:

Boton b1(8, INPUT_PULLUP);
Boton b2(9, INPUT_PULLUP);

Las dos primeras son equivalentes, ya que si no se especifica el segundo parámetro del constructor, el valor de modo, su valor será INPUT. El tercer ejemplo es el que se ha de usar en el caso que has expuesto. El constructor se encarga ahora de hacer el trabajo que hacía la función inicia(). Así que ya no se necesita llamar a esta función.

Otro detalle. Hay gente que prefiere hacerlo comparándolo con true o false, pero lo habitual es no hacer la comparación si la función devuelve un boolean y su nombre "lo deja claro". En este caso:

  if (b1.pulsado() == true) {

Es lo mismo que:

  if (b1.pulsado()) {

Y si lo que se quiere es comprobar que es "falso":

  if (b1.pulsado() != true) {

Es lo mismo que:

  if (b1.pulsado() == false) {

Y también es lo mismo que:

  if (! b1.pulsado()) {

El valor por defecto de modo es el indicado en la declaración de la función Boton(). Nota: si la función se va a declarar primera e implementar aparte, sólo se ha de poner el valor por defecto en la declaración y no en la implementación. Si se olvidan de esto último, no se preocupen, el compilador nos lo recuerda amablemente fallando en la compilación.

El error que has puesto en tu consulta inicial hace referencia al signo =, no a nada de INPUT_PULLUP. Supongo que el error que dices es algo así como:

note: in expansion of macro 'B1'
 Boton B1(8, INPUT_PULLUP);
       ^

Si es este el error, es debido a que B1 está definido en alguna parte del entorno "Arduino" como una macro. Por eso mi recomendación de llamar los botones b1 o boton1.

Muchas gracias, además de por ayuda con el problema de compilación concreto, por los consejos.

Efectivamente, al cambiar B1 y B2 por minúsculas he podido compilar el programa (no lo he probado porque no tengo a mano el montaje con los pulsadores).

este caso se trataba de un programa muy sencillo que no tiene sentido resolver por objetos, pero a nivel didáctico me sirve para ir interiorizando aspectos básicos.

Seguramente acabaré volviendo por aquí con nuevas dudas.

Gracias mil de nuevo.

Si en la clase boton definiste:

void inicia(int input) {

Porque en el setsup() pones:

B1.inicia(INPUT_PULLUP);
B2.inicia(INPUT_PULLUP);

En todo caso debería ser el numero de pin.

El numero de pin lo definía a través del constructor al declarar el objeto de la clase Boton

public:
		Boton (int _pin){
			pin = _pin;
		}

y luego el metodo Boton.inicio lo utilizaba para poner el modo del input (y también para leer el estado de reposo del pulsador).

Habría sido más lógico hacerlo todo en el constructor, como ya me habían sugerido más arriba. Aunque el objetivo de este código era simplemente poner en práctica una primera lección de programación orientada a objetos (definir una clase y crear un '.h' para un pulsador igual es matar moscas a cañonazos).

saludos