Die Einrichtung:
Ein ATtiny85 wird mit der Arduino IDE programmiert, es soll das Umgebungslicht von einem LDR lesen und eine LED entsprechend ein- und ausschalten. Um besser zu verstehen, was meine Sensorwerte in verschiedenen Beleuchtungssituationen sind, möchte ich den Messwert mit TinyDebug
, einem Teil der Arduino-on-ATtiny-Bibliotheken, an meine serielle Konsole senden.
Hier ist die minimale Skizze:
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);
}
Auf meiner seriellen Konsole erhalte ich nur Müll:
l
x
x
l
{
t
n
z
u
l
|
q
m
n
o
(...)
Das Ändern der Codes Serial.write(sensorValue);
in Serial.write("hello");
schöne Ausdrucke
hello
hello
hello
(...)
Ich nehme also an, dass die serielle Kommunikation selbst funktioniert.
Der Versuch, den Wert in eine Zeichenfolge zu konvertieren int
und diese Zeichenfolge zu senden, Serial.write(myString);
gibt einen Compilerfehler aus:
(...)
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*)
Irgendeine Idee, wie ich stattdessen meine Sensorwerte an meine serielle Konsole senden kann?
Angenommen, Sie verwenden Arduino-Tiny mit dem seriellen Hardware-Port (und ich denke auch dem Soft-Serial-Port), sollte die Lösung meiner Meinung nach so einfach sein wie der Wechsel Serial.write(intVar)
zuSerial.print(intVar)
Soweit ich das beurteilen kann, write
scheint die Funktion eine untergeordnete Sache zu sein, die nur mit Zeichenfolgen funktioniert. Was meiner Meinung nach passiert, ist, dass Sie ein int übergeben, und das Tiny behandelt dieses int als Zeiger auf eine nullterminierte Zeichenfolge und fährt fort, den Inhalt einer zufälligen Speicheradresse zu drucken, bis es schließlich eine Null trifft.
Wie üblich besteht die Lösung darin, zur Quelle zu gehen .
Es ist erwähnenswert, dass ich nicht sicher bin, wie die eigentliche serielle Bibliothek (entweder HardwareSerial.cpp
oder TinyDebugSerial.h
tatsächlich am Build-Prozess beteiligt ist. Ich vermute, dass es etwas ist, das in einem Makefile oder dem Arduino-Tool gemacht wird, aber ich sehe keinen direkten Verweis von beiden die eigentlichen seriellen Bibliotheken an die Druckbibliothek, von der ich glaube, dass sie die eigentliche Formatierung von Argumenten übernimmt, bevor sie als Bytes an die seriellen Bibliotheken weitergegeben werden.Der
gesamte Arduino-Build-Prozess ist sehr verwirrend, und ich habe überhaupt nicht viel C++ gemacht , daher bin ich nicht damit vertraut, wie Vererbung darin funktioniert.
Serial
und angeht Print
: Serial
ist eigentlich ein Alias von TinyDebugSerial
, das erbt von Stream
, das erbt von Print
. Zur Kompilierzeit wird alles im relevanten Core/Variant-Verzeichnis automatisch kompiliert.Ursache : Warum konvertieren Sie zuerst die Ganzzahl in eine Zeichenfolge:
String myString = String(sensorValue);
Nur um zu versuchen, die Ganzzahl selbst in der nächsten Zeile auszugeben:
Serial.write(sensorValue);
Lösung : Ändern Sie die zweite Zeile in:
Serial.write(myString);
Und/oder die Überprüfung der Lösung von @ConnorWolf Serial.print();
funktioniert.
Eine weitere Möglichkeit ist:
#include <stdlib.h>
char myString[ 6 ] = { 0 };
utoa( sensorValue , myString , 10 };
Serial.write( myString );
Einige Arduino-Funktionen/Bibliotheken funktionieren nicht auf ATtiny's, aber es gibt keine formale Liste, die dies tun oder nicht tun. Es ist so ziemlich eine Trial-and-Error-Sache, daher diese utoa();
Alternative. Ich habe utoa erfolgreich auf einem ATtiny45, 85 und 2313 verwendet.
Serial.write(myString);
und einen Compilerfehler erhalten hat. Sehen Sie sich das letzte Codesegment im OP an.
Jippie
Jippie
utoa();
eine Option als Alternative fürString(sensorValue);
? Es erfordert jedoch, dass Sie vorher einen Puffer deklarieren. Einige Bibliotheken oder Funktionen werden auf ATtiny nicht unterstützt, aber es wird nicht beschrieben, welche genau. Versuch und Irrtum wird vorgeschlagen.Jippie
String myString = String(sensorValue);
nur um zu versuchen, die Ganzzahl selbst in der nächsten Zeile auszugebenSerial.write(sensorValue);
:Connor Wolf
Serial.write(&sensorValue);
? Oder können Sie das (Freaking C++) überspringen&
.Jippie
Connor Wolf