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

La puesta en marcha:

Un ATtiny85 está programado usando el IDE de Arduino, se supone que debe leer la luz ambiental de un LDR y encender/apagar 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 la lectura a mi consola serial usando TinyDebug, una parte de las bibliotecas Arduino-on-ATtiny.

Aquí está el boceto 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 serial todo lo que recibo es basura:

l

x



x

l

{



t

n

z



u

l

|



q

m





n

o
(...)

Cambiando los códigos Serial.write(sensorValue);para que Serial.write("hello");se impriman bien

hello
hello
hello
(...)

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

Intentar convertir el intvalor 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 mi sensor a mi consola serie?

Para referencia: Cadena ();
Es utoa();una opción como alternativa para String(sensorValue);? Sin embargo, requiere que declare un búfer de antemano. Algunas bibliotecas o funciones no son compatibles con ATtiny, pero no se describe cuáles exactamente. Se propone prueba y error.
¿Por qué primero está convirtiendo el número entero en una cadena: String myString = String(sensorValue);solo para intentar imprimir el número entero en la siguiente línea Serial.write(sensorValue);:?
@jippie - ¿No querrás decir Serial.write(&sensorValue);? O puede omitir el &(Freaking C ++).
@ConnorWolf eso no es lo que está en la fuente de Christian. Fruncí el ceño cuando lo vi y lo copié desde allí.
@jippie - Ah, derp, ese es el problema o no sé cómo funcionan los objetos de C++.

Respuestas (2)

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

Por lo que puedo decir, la writefunción parece ser algo de nivel inferior, que solo funciona en cadenas. Lo que creo que está sucediendo es que estás pasando un int, y el tiny está tratando ese int como el puntero a una cadena terminada en cero, y está procediendo a imprimir el contenido de una dirección de memoria aleatoria hasta que finalmente llega a cero.

Como suele ser habitual, la solución pasa por acudir a la fuente .

Vale la pena señalar que no estoy seguro de cómo la biblioteca en serie real (ya sea HardwareSerial.cppo TinyDebugSerial.hestá realmente involucrada en el proceso de compilación. Sospecho que es algo hecho en un archivo MAKE o la herramienta arduino, pero no veo ninguna referencia directa de ninguno de los dos 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 compilació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.

Estoy de acuerdo con tu diagnóstico y remedio. En cuanto a la conexión entre Serialy Print: Seriales en realidad un alias de TinyDebugSerial, que hereda de Stream, que hereda de Print. En el momento de la compilación, todo lo que se encuentra en el directorio central/variante relevante se compila automáticamente.
@microtherion: pensé que era algo raro de herencia, y no pasé mucho tiempo mirándolo. Realmente no sé mucho C++ en absoluto. Realmente solo uso C y Python. ¡Gracias!

Causa : ¿Por qué primero está convirtiendo 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 : cambie la segunda línea a:

Serial.write(myString);

Y/o el control de la solución de @ConnorWolf Serial.print();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, pero no hay una lista formal que lo haga o no. Es más o menos una cosa de prueba y error, de ahí esta utoa();alternativa. He usado con éxito utoa en un ATtiny45, 85 y 2313.

Por su respuesta, parece que lo intentó Serial.write(myString);y obtuvo un error de compilación. Mire el último segmento de código en el OP.
Dispara, no es una repetición fácil para mí hoy :o(