Pruebe el código de una manera estructurada y predecible. Simplifíquelo cuando sea posible. Imprimir todos los valores.
Publique programas completos (donde sea práctico) para que las personas puedan probarlos en sus máquinas. Los programas incompletos son difíciles de probar, por lo que es más difícil ayudar.
Primero, ¿qué es mySerial
? ¿Es una instancia o referencia a Serial
? Reemplace mySerial
con Serial
. Entonces está claro para todos lo que se está utilizando.
En segundo lugar, Serial.write(val)
literalmente imprime un byte binario, los 8 bits más bajos de un int. que será interpretado como un carácter ASCII por el monitor de serie de Arduin. Los valores binarios pueden ser muy difíciles de depurar.
En su lugar, utilice Serial.print(val)
o Serial.println(val)
. Esto convierte un número binario (por ejemplo, en un int) en un número 'legible por humanos', por defecto impreso como base 10, usando los dígitos '0' a '9' (consulte Documentación Arduino Serial )
Cuando se esté realizando una prueba y ocurra algo extraño, elimine todas las partes difíciles de controlar o predecir. 'Instrumento' con declaraciones impresas para ver qué está pasando. (o consigue un depurador)
Cambiar
int svalue(int analogVal){
if((analogVal > 135) && (analogVal < 200)){
a
int svalue(int analogVal){
Serial.print("entering svalue - analogVal=");
Serial.println(analogVal);
if((analogVal > 135) && (analogVal < 200)){
Para que podamos ver lo que está sucediendo dentro de svalue.
Para una aproximación razonable, analogRead (A1) genera números aleatorios con un rango desconocido.
Reemplázalo con un valor fijo o algo muy predecible, como un bucle for
.
Cambiar
void loop() {
int pval = svalue(analogRead(A1));
mySerial.write(pval);
}
Para:
void loop() {
int pval = analogRead(A1); // = svalue(analogRead(A1));
Serial.print("analogRead(A1)=");
Serial.println(pval);
int i;
for (i=0; i<1024; i+=10) { // print range of analogRead, in steps of 10
pval = svalue(i);
Serial.print(i);
Serial.print(" svalue(i)=");
Serial.print(pval); // mySerial.write(pval);
Serial.println();
}
}
Ahora tienes algo que se puede depurar más fácilmente.
Editar:
Se modificó el bucle for para usar los pasos de 10 para que sea más fácil ver lo que está sucediendo y se retuvo la impresión del valor analogRead(A1)
. Al menos este enfoque prueba svalue()
.
Es plausible que algo anda mal con esa entrada analógica, o que la electrónica conectada a A1 está rota, y por lo tanto, analogRead devuelve el disparate.
Pruebe cada entrada analógica diferente.
Intente usar algo simple y (en su mayoría) predecible como dos resistencias fijas (por ejemplo, 1K y 1K) para hacer un divisor de voltaje para la entrada analógica a medir. O pruebe algo controlable como un potenciómetro que le permita ver el voltaje que se está conduciendo en una dirección y pruebe la mayor parte del rango.
Si tiene una forma efectiva de probar valores binarios, y necesita que el valor de svalue()
se genere como un código de carácter binario, reemplace Serial.print(pval);
con Serial.write(pval);
.