Hola. Soy nuevo en Arduino y en el foro.
Tengo un problema con un pequeño código que lee un valor AnalogRead() y lo informa a un puerto serie mediante Serial.println().
El código originalmente funcionaba bien pero al estar contantemente enviando datos al puerto, cuando en mi software intentaba cerrar el puerto, mi programa se cerraba abruptamente, incluso el IDE del mismo. Descubrí que si el puerto no estaba transmitiendo esto no ocurría.
Decidí hacer que se envien datos sólo cuando lo requiero para poder dejar de recibirlos antes de cerrar el puerto. Desde entonces el programa no me envía correctamente los datos.
Mando el ejemplo que intento hacer andar
#define TOMILLIGAUSS 3.756010
#define NOFIELD 514L
// Define las salidas para los leds
int Azul = 6;
int Verde = 7;
int Rojo = 8;
String Estado = "OFF";
String Trans = "OFF";
void setup()
{
Serial.begin(9600);
pinMode(Azul, OUTPUT);
pinMode(Rojo, OUTPUT);
pinMode(Verde, OUTPUT);
}
void loop()
{
int raw = analogRead(0);
if (Trans == "ON"){
Serial.println(raw); // Acá pretendo hacer el println sólo si esta habilitada la transmisión
}
float gauss = (raw - NOFIELD) * TOMILLIGAUSS;
if (Estado == "ON"){ // Maneja los LEDS sólo si está en modo ON
if (gauss > 2)
{
digitalWrite(Verde, HIGH); // Enciende el led Verde
digitalWrite(Rojo, LOW); // Apaga el Rojo
}
else if (gauss < -2)
{
digitalWrite(Rojo, HIGH); // Enciende el led Rojo
digitalWrite(Verde, LOW); // Apaga el verde
}
else
{
digitalWrite(Rojo, LOW); // Apaga el Led Rojo
digitalWrite(Verde, LOW); // Apaga el Led Verde
}
}
if (Estado == "OFF") // Si está en OFF mantiene todo apagado
{
digitalWrite(Azul, LOW);
digitalWrite(Verde, LOW);
digitalWrite(Rojo, LOW);
}
// Si recibe un Valor desde el puerto serie
if (Serial.available() > 0) {
String incoming = Serial.readString();
//Si recibe un ON -> Enciende
if(incoming == "ON"){
digitalWrite(Azul, HIGH);
Serial.println(incoming);
incoming = "";
Estado = "ON";
}
//Si recibe un OFF -> Apaga
if(incoming == "OFF"){
digitalWrite(Azul, LOW);
digitalWrite(Verde, LOW);
digitalWrite(Rojo, LOW);
Serial.println(incoming);
incoming = "";
Estado = "OFF";
}
//Si recibe un DATAON -> Comienza a transmitir datos
if(incoming == "DATAON"){
Serial.println(incoming);
incoming = "";
Trans = "ON";
}
//Si recibe un DATAOFF -> Deja de transmitir datos
if(incoming == "DATAOFF"){
Serial.println(incoming);
incoming = "";
Trans = "OFF";
}
Serial.flush();
}
delay(400);
}
Agregué un "Serial.println(incoming);" para poder ver si está recibiendo el parámetro que le envio.
El procedimiento que hago es:
- Conecto al puerto
- Envio ON para encender los leds
- Envio DATAON para empezar a recibir datos, calculo e informo desde el soft..
- Envio DATAOFF para dejar de recibir....
- Envio OFF para apagar los leds
- Cierro el puerto
Desde el DATAOFF que ya no recibo más nada, pero el arduino parece recibir porque puede encender y apagar los leds con ON y OFF pero no recibo el informe de nada, ni valores de lectura ni el valor de "Incoming".
¿Hay algún error en el código que no esté viendo?
Utilizo Arduino Nano. Atmega328P (Old bootloader)
¡¡¡Desde ya muchas gracias!!!
EDITO:
Indudablemente hay algo raro que no estoy entendiendo.
Si en lugar de hacer la comparacion "Incoming == ON" hago "Incoming != OFF" el programa funciona perfectamente. Pero cuando desabilito el informe "Serial.println(incoming);" que hice para debugear, deja de informar absolutamente todo. Por el momento lo soluciono desde mi programa evitando hacer cálculos a valores no numéricos, pero me encantaría saber dónde está el error.
