ATtiny85, ARduino IDE, TinyDebug: Error al enviar los valores int

2

La configuración:

Se programa un ATtiny85 utilizando el IDE de Arduino, se supone que lee la luz ambiente de un LDR y enciende / apaga un LED en consecuencia. Para comprender mejor cuáles son las lecturas de mis sensores en diferentes situaciones de iluminación, me gustaría enviar las lecturas a mi consola serie utilizando TinyDebug , una parte de las bibliotecas Arduino-on-ATtiny.

Aquí está el bosquejo mínimo:

String myString;

void setup() {
  pinMode(0, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(2);
  String myString = String(sensorValue);
  Serial.write(sensorValue);
  Serial.write("\n\r");

  if (sensorValue > 500) {
    digitalWrite(0, HIGH);
  }
  else {
    digitalWrite(0, LOW);
  }

  delay(500);
}

En mi consola serie todo lo que recibo es basura:

l

x



x

l

{



t

n

z



u

l

|



q

m





n

o
(...)

Al cambiar los códigos Serial.write(sensorValue); a Serial.write("hello"); muy bien, se imprime

hello
hello
hello
(...)

así que supongo que la comunicación serial en sí misma funciona.

Al intentar convertir el valor int en una cadena y enviar esa cadena, es decir, Serial.write(myString); da un error de compilación:

(...)
sketch_may24b.ino: In function 'void loop()':
sketch_may24b:11: error: no matching function for call to 'TinyDebugSerial::write(String&)'
/Users/cts/Documents/Arduino/hardware/tiny/cores/tiny/TinyDebugSerial.h:728: note: candidates are: virtual size_t TinyDebugSerial::write(uint8_t)
/Users/cts/Documents/Arduino/hardware/tiny/cores/tiny/Print.h:75: note:                 virtual void Print::write(const uint8_t*, size_t)
/Users/cts/Documents/Arduino/hardware/tiny/cores/tiny/Print.h:74: note:                 virtual void Print::write(const char*)

¿Alguna idea de cómo puedo enviar los valores de mis sensores a mi consola serie?

    
pregunta Christian

2 respuestas

3

Suponiendo que está utilizando Arduino-Tiny con el puerto serie del hardware (y creo el puerto serie suave también), creo que la solución debería ser tan simple como cambiar su Serial.write(intVar) a Serial.print(intVar)

Por lo que puedo decir, la función write parece ser una cosa de nivel inferior, que solo funciona en cadenas. Lo que creo que está sucediendo es que estás pasando un int, y el minúsculo trata ese int como el puntero a una cadena terminada en cero, y continúa imprimiendo el contenido de una dirección de memoria aleatoria hasta que finalmente llega a cero.

Como de costumbre, la solución es ir a la fuente .

Vale la pena señalar que no estoy seguro de cómo la biblioteca serial real (ya sea HardwareSerial.cpp o TinyDebugSerial.h está realmente involucrada en el proceso de compilación. Sospecho que es algo que se hace en un archivo make o la herramienta arduino, pero no No veo ninguna referencia directa de ninguna de las bibliotecas en serie reales a la biblioteca de impresión, que creo que maneja el formato real de los argumentos antes de pasarlos a las bibliotecas en serie como un conjunto de bytes. Todo el proceso de construcción de arduino es muy confuso, y no he hecho mucho C ++ en absoluto, por lo que no estoy familiarizado con cómo funciona la herencia en él.

    
respondido por el Connor Wolf
1

Causa : ¿Por qué conviertes primero el número entero en una cadena?

String myString = String(sensorValue); 

Solo para intentar imprimir el entero en la siguiente línea:

Serial.write(sensorValue);

Solución : cambia la segunda línea a:

Serial.write(myString);

Y / o la comprobación de la solución Serial.print(); de @ ConnorWolf funciona.

Otra opción es:

#include <stdlib.h>
char myString[ 6 ] = { 0 };
utoa( sensorValue , myString , 10 };
Serial.write( myString );

Algunas funciones / bibliotecas de Arduino no funcionan en ATtiny's, pero no hay una lista formal que lo haga o no. Es casi una cuestión de prueba y error, por lo tanto, esta alternativa utoa(); . He utilizado con éxito utoa en un ATtiny45, 85 y 2313.

    
respondido por el jippie

Lea otras preguntas en las etiquetas