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 int
valor 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?
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 write
funció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.cpp
o TinyDebugSerial.h
está 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.
Serial
y Print
: Serial
es 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.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.
Serial.write(myString);
y obtuvo un error de compilación. Mire el último segmento de código en el OP.
yippie
yippie
utoa();
una opción como alternativa paraString(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.yippie
String myString = String(sensorValue);
solo para intentar imprimir el número entero en la siguiente líneaSerial.write(sensorValue);
:?connor lobo
Serial.write(&sensorValue);
? O puede omitir el&
(Freaking C ++).yippie
connor lobo