Se repite siempre el mismo println

Lo que pasa es que con este código:

#include<Servo.h>
#include<SoftwareSerial.h>

Servo myServo;
int ang = 90;

void setup(){
  Serial.begin(9600);  
}

void loop(){
  cifrado();
}

void cifrado(){
  Serial.println("Por favor, ingrese la contrasenia del dispositivo: ");
  int pass = Serial.read();
  if(pass==1){
    Serial.println("Correcto");
  }
}

El monitor serie me muestra "Por favor, ingrese la contrasenia del dispositivo: "(obviamente, sin comillas) una y otra vez, dentro del loop continuo.

PD: Como algo adicional, si me dicen como poner los caracteres utf-8, tambien se los agradecería.

PD2: La librería Servo.h está ahí por otras razones, no creo que cause problemas.

:o :o
Hola,

A tu código no le pasa nada, hace precisamente lo que tiene que hacer.

Loop es un bucle que se ejecuta indefinidamente, como dentro tienes la llama al método cifrado, este es llamado una y otra vez.

Cifrado, lo que hace es mostrar el mensaje, lee lo que hay en el puerto serie, comprueba si es un 1 y finaliza, retornando al loop que a su vez vuelve a ejecutar el método cifrado.

Por lo tanto para que tu programa funcione como quieres, tendrás que mantener la ejecución en el método cifrazo de alguna manera hasta que recibas el código, por ejemplo con un do....while.

También te aconsejo leas este enlace donde explica como recibir datos por el puerto serie correctamente, como lo estás haciendo no es la forma ideal.

Bien, tienes razón, no son óptimos mis métodos. Como se debe notar, soy nuevo en el lenguaje de Arduino, es decir, conozco C/C++ aunque nunca lo usé con microcontroladores. No logro entender bien cómo se usa, ¿Podrías darme un ejemplo de código para lo que quiero hacer? :smiley:

Es muy posible que sigo haciendo mal las cosas:

#include<SoftwareSerial.h>
#include<Servo.h>

Servo myServo;
int ang = 90;
int pass = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  cifrado();
}

void cifrado(){
  if(Serial.available() > 0){
    pass = Serial.read();
    Serial.print(pass);
    if(pass == 49){  //49 es el 1 en decimal ASCII.
      Serial.print("Correcto.");
    }else{
      Serial.print("Lo siento, la contrasenia es incorrecta");
    }
  }
}

Me pasa que en el monitor serie pongo 1 y luego debo apretar enter, lo cual envía un retorno de carro, o sea, 13 en decimal ASCII. Entonces, me manda al else y muestra lo siguiente:

49Correcto.
13Lo siento, la contrasenia es incorrecta.

13 es el código para LINE FEED o sea, tu escribes 1 pero no ves que cuando le das enter va un comando llamado LF que es salto de linea.

No esta mal, solo que te muestra el segundo comando oculto.
Lo que se hace es descartarlo o no prestarle atención, asi

void cifrado(){
 if(Serial.available() > 0){
   pass = Serial.read();
   if (pass != 13) {
       Serial.print(pass);
       if (pass == 49){  //49 es el 1 en decimal ASCII.
           Serial.print("Correcto.");
       }else{
           Serial.print("Lo siento, la contrasenia es incorrecta");
       }
   }
 }
}

Bien, ahora quisiera que se puedan escribir al menos 4 números, pero el programa sólo toma al primero.

Ya intenté pasar el tipo de dato de la variable 'pass' a char y a String, pero resulta que no hace caso porque el Arduino toma los caracteres uno por uno.

O sea que si pongo "1234" como contraseña, programa escribe:

1 - Lo siento, la contrasenia es incorrecta
2 - Lo siento, la contrasenia es incorrecta
3 - Lo siento, la contrasenia es incorrecta
4 - Lo siento, la contrasenia es incorrecta

Dejo el código que usé:

#include<SoftwareSerial.h>
#include<Servo.h>

Servo myServo;
int ang = 90;
String pass;

void setup(){
  Serial.begin(9600);
}

void loop(){
  cifrado();
}

void cifrado(){
 if(Serial.available() > 0){
   pass = Serial.readStringUntil('\n');
   if (pass != 13) {
       Serial.print(pass);
       if (pass == "1234"){
           Serial.println(" - Correcto.");
       }else{
           Serial.println(" - Lo siento, la contrasenia es incorrecta");
       }
   }
 }
}

Muchas gracias por toda la ayuda, luego de un momento para despejarme pude solucionar el problema. Reitero, gracias por su ayuda.