Tritio
December 25, 2017, 10:07pm
1
Hola, trato de hacer un programa, que según el dato que reciba por puerto serie actuará sobre uno u otro relé.
El dato a enviar puede ser ireledosf, o ireletresf, así, cuando se reciba reledos actuará sobre el relé 2, y si es reletres, sobre el relé 3.
Sin embargo, no consigo que con ese dato pueda ejecutar la función.
Me da error de string y char, sé que no son compatibles, pero no sé cómo leer esa cadena para que se inicie la función.
#define RELE_PIN3 8
#define RELE_PIN2 9
void setup() {
pinMode(RELE_PIN2,OUTPUT);
digitalWrite (RELE_PIN2, HIGH);
pinMode(RELE_PIN3,OUTPUT);
digitalWrite (RELE_PIN3, HIGH);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
if (Serial.read ()=='i') {
String dato = Serial.readStringUntil('f');
if (Serial.read() == 'f');
{ funcion (dato);
}}}}
void funcion ( String dato) {
if (dato == 'reletres') {
digitalWrite (RELE_PIN3, LOW);
}
else if (dato == 'reledos') {
digitalWrite (RELE_PIN2, LOW);
}
else {
digitalWrite (RELE_PIN2, HIGH);
digitalWrite (RELE_PIN3, HIGH);
}}
Surbyte
December 25, 2017, 10:35pm
2
Debes usar string.equals en las comparaciones de strings
string.equals(string2)
Ahora tu método es complicado. comparas i, comparas f, y ademas comparas el interior.
A ver esta versión?
deja solo dos o tres y suficiente y espera retorno de carro o line feed = 0x0A o '\n'
Tritio
December 27, 2017, 7:56pm
3
He hecho las modificaciones, pero me sigue dando error.
#define RELE_PIN3 8
#define RELE_PIN2 9
void setup() {
pinMode(RELE_PIN2,OUTPUT);
digitalWrite (RELE_PIN2, HIGH);
pinMode(RELE_PIN3,OUTPUT);
digitalWrite (RELE_PIN3, HIGH);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
if (Serial.read ()=='i') {
String dato = Serial.readStringUntil('f');
if (Serial.read() == 'f');
{ funcion (dato);
}}}}
void funcion ( String dato) {
string.equals(dato,reletres);
digitalWrite (RELE_PIN3, LOW);
string.equals(dato,reledos);
digitalWrite (RELE_PIN2, LOW);
digitalWrite (RELE_PIN2, HIGH);
digitalWrite (RELE_PIN3, HIGH);
}
Surbyte
December 27, 2017, 8:00pm
4
Intenta concentrarte en el problema de reconocer la orden y deja de lado todo lo demás.
Mira el ejemplo readStringUntil
Y además de que equals retorna boolean ; o sea, se usa en la condición de un if o while .
Tritio
December 28, 2017, 6:57pm
6
Vale, creo que me voy acercando, aunque sigo con errores.
void setup() {
#define RELE_PIN3 8
#define RELE_PIN2 9
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
if (Serial.read ()=='i') {
String dato = Serial.readStringUntil('f');
if (Serial.read() == 'f');
}}
if (string.equals(dato,reletres) == true){
digitalWrite (RELE_PIN3, LOW);
}
else if (string.equals(dato,reledos) == true){
digitalWrite (RELE_PIN2, LOW);
}
else {
digitalWrite (RELE_PIN2, HIGH);
digitalWrite (RELE_PIN3, HIGH);
}}
Surbyte
December 28, 2017, 6:59pm
7
esto
if (string.equals(dato,reletres) == true){
es lo mismo que poner esto
if (string.equals(dato,reletres)){
aunque no cambia tu problema
Vamos de nuevo
reletres es una cadena!! si no la pones entre comillas no la toma, la busca como variable!!!
debe ser asi
if (string.equals(dato,"reletres")){
Tritio
December 28, 2017, 7:07pm
8
Pues aún haciendo las correcciones indicadas, me reporta esto:
sketch_dec28a.ino: In function ‘void loop()’:
sketch_dec28a.ino:18:8: error: ‘string’ was not declared in this scope
sketch_dec28a.ino:18:22: error: ‘dato’ was not declared in this scope
Hola,
String es con la S mayúscula y dato como lo declaras dentro del if una vez que el if finaliza la variable se destruye.
Surbyte
December 29, 2017, 12:12am
10
Te sugiero que busques un ejemplo de Serial.readStringUntil()
Prueba y vuelve a comenzar