error con condicional if

buenas amigos, que pena molestarlos, voy directo al grano, necesito hacer un control remoto para controlar 3 ajustes diferentes en el receptor, la idea es usar la librería virtualwire para enlazar este control usando los rf de 433. estoy probando el código para manejar las variables mediante un pulsador como selector, y un encoder rotativo como modificador, mi problema esta al usar el condicional if como llave para seleccionar la parte del código que modifica solo una variable a la vez mientras las otras 2 quedan con el ultimo valor definido sin que cambien, hasta de nuevo ser seleccionado con el pulsador, me sale este error:

Arduino:1.8.3 Hourly Build 2017/04/14 10:33 (Windows XP), Tarjeta:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

transmisor:53: error: expected unqualified-id before 'if'

if (selector = 0) 

^

exit status 1
expected unqualified-id before 'if'

acá pongo el código para ver si se puede hacer funcionar:

De antemano agradezco su valiosa ayuda.

#include <VirtualWire.h>


// Pines de lectura del encoder y del boton
int a = 3;
int b = 4;
int c = 5;
int tx = 6;
// declaracion de variables
int anterior;
int contador1;
int contador2;
int contador3;
int selector;
int txdato;

void setup()

{
  Serial.begin(9600);
  pinMode(a, INPUT);
  pinMode(b, INPUT);
  pinMode(c, INPUT);
  pinMode(tx, OUTPUT);
  vw_setup(4000); // velocidad de transmision: Bits por segundo
  vw_set_tx_pin(6); //Pin 6 como salida para el RF 

  // Inicializamos las variables
  anterior = 1;
  contador1 = 0;
  contador2 = 0;
  contador3 = 0;
  selector = 0;
  txdato = 0;

}

void loop()
{
  if (digitalRead(c) == LOW) // si lee bajo en el pulsador incrementa selector
  {
    if (selector < 1)
    {
      selector = selector++;
      if (selector > 2)
      {
        selector = 3;
        if (selector = 3)
        {
          selector = 0;
        }
      }
    }
  }

}

if (selector = 0) 

{ // Lectura de A, si es 0, volvemos a medir para asegurar el valor
  int actual = digitalRead(a);
    if (actual == 0) {
      delay(10);
      actual = digitalRead(a);
    }

    // Actuamos únicamente en el flanco descendente
    if (anterior == 1 & amp; &amp; actual == 0)
    {
      int valor_b = digitalRead(b);
      if (valor_b == 1) contador1++; // Si B = 1, aumentamos el contador
      else contador1--;  // Si B = 0, reducimos el contador

    }
    anterior = actual;
    Serial.print("     contador1=");
    Serial.print(contador1);
    Serial.print('\n');
    txdato = contador 1
    vw_send((uint8_t *)txdato, strlen(txdato));
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
    delay (100);
  }

  if selector = 1 
  
  { // Lectura de A, si es 0, volvemos a medir para asegurar el valor
  int actual = digitalRead(a);
    if (actual == 0) {
      delay(10);
      actual = digitalRead(a);
    }

    // Actuamos únicamente en el flanco descendente
    if (anterior == 1 & amp; &amp; actual == 0)
    {
      int valor_b = digitalRead(b);
      if (valor_b == 1) contador2++; // Si B = 1, aumentamos el contador
      else contador2--;  // Si B = 0, reducimos el contador

    }
    anterior = actual;
    Serial.print("     contador2=");
    Serial.print(contador2);
    Serial.print('\n');
    txdato = contador 2
    vw_send((uint8_t *)txdato, strlen(txdato));
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
    delay (100);
  }


  if selector = 2 
  
  { // Lectura de A, si es 0, volvemos a medir para asegurar el valor
  int actual = digitalRead(a);
    if (actual == 0) {
      delay(10);
      actual = digitalRead(a);
    }

    // Actuamos únicamente en el flanco descendente
    if (anterior == 1 & amp; &amp; actual == 0)
    {
      int valor_b = digitalRead(b);
      if (valor_b == 1) contador3++; // Si B = 1, aumentamos el contador
      else contador3--;  // Si B = 0, reducimos el contador

    }
    anterior = actual;
    Serial.print("     contador3=");
    Serial.print(contador3);
    Serial.print('\n');
    txdato = contador 3
    vw_send((uint8_t *)txdato, strlen(txdato));
    vw_wait_tx(); //Esperamos hasta que el mensaje se envie
  }
}

Creo que para verificar igualdad entre dos valores, se hace con "==". No sé... digo yo... ::slight_smile:

Esto es incomprensible

    if (selector < 1)
    {
      selector = selector++;
      if (selector > 2)
      {
        selector = 3;
        if (selector = 3)
        {
          selector = 0;
        }
      }
    }

mira esta lógica
en el setup pones selector = 0
o sea que lo subes a 1 y se ejecuta un ciclo
luego nunca mas entra en la secuencia. No sube a 2 y menos a 3

Te lo he simplificado un poco a ver como se comporta. Podria fallar el valor de actual.

#include <VirtualWire.h>


// Pines de lectura del encoder y del boton
int a = 3;
int b = 4;
int c = 5;
int tx = 6;
// declaracion de variables
bool anterior, actual;
int contador1;
int contador2;
int contador3;
int selector;
int txdato;

void setup()
{
  Serial.begin(9600);
  pinMode(a, INPUT);
  pinMode(b, INPUT);
  pinMode(c, INPUT);
  pinMode(tx, OUTPUT);
  vw_setup(4000); // velocidad de transmision: Bits por segundo
  vw_set_tx_pin(6); //Pin 6 como salida para el RF 

  // Inicializamos las variables
  anterior  = 1;
  contador[2] = {0, 0, 0};
  selector  = 0;
  txdato    = 0;
}

void loop()
{
  if (digitalRead(c) == LOW) // si lee bajo en el pulsador incrementa selector
  {
    if (selector++ >= 3) 
        selector = 0;
  }
 
  opcionSelector(selector);
    
}

void opcionSelector(byte i) 
{ // Lectura de A, si es 0, volvemos a medir para asegurar el valor
  actual = digitalRead(a);
  if (!actual) {
      delay(10);
      actual = digitalRead(a);
  }

  // Actuamos únicamente en el flanco descendente
  if (anterior && !actual)
  {
    bool valor_b = digitalRead(b);
    if (valor_b) 
        contador[i]++; // Si B = 1, aumentamos el contador
    else 
        contador[i]--;  // Si B = 0, reducimos el contador

  }
  anterior = actual;
  char buffer[20];
  sprintf(buffer, "     contador%d=%d", i, contador[i] )
  Serial.println(buffer);
  Serial.print(contador1);

  txdato = contador[i];
  vw_send((uint8_t *)txdato, strlen(txdato));
  vw_wait_tx(); //Esperamos hasta que el mensaje se envie
  delay (100);
}

el codigo tiene un pequeño error,sin embargo me dio la pista para solucionar el error, ya el codigo me ha servido! gracias surbyte!

Hararion:
el codigo tiene un pequeño error,sin embargo me dio la pista para solucionar el error, ya el codigo me ha servido! gracias surbyte!

Consejo dado tus errores (si me lo permites) :
Aprender las bases de programación como los operadores de comparación y un poco más de lógica porque lo de los selectores y los if sin paréntesis y con un sólo = son errores de estar haciendo copy and paste porque es imposible hacer un RC sin saber hacer un condicional.
Tú lo llamas pequeño fallo pero es como decir 2+2 = 3 el fallo no es pequeño para nada, es de base.
No se trata de ir de profesor, que nadie nace aprendido, sino que si realmente te interesa programar debes aprender primero lo mínimo de sintaxis, porque me empieza a quedar claro que en Arduino entra mucha gente con noción CERO de programación.

**Las casas se construyen por los cimientos, antes de un RC, entendamos lo básico. Un saludo :open_mouth: **