ATtiny85, ARduino IDE, TinyDebug: Fehler beim Senden von int-Werten

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 intund 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?

Als Referenz: String();
Ist utoa();eine Option als Alternative für String(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.
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);:
@jippie - Meinst du nicht Serial.write(&sensorValue);? Oder können Sie das (Freaking C++) überspringen &.
@ConnorWolf, das ist nicht das, was in Christians Quelle steht. Ich runzelte die Stirn, als ich es entdeckte, und kopierte es von dort.
@jippie - Ah, derp, entweder ist das das Problem, oder ich weiß nicht, wie C++-Objekte funktionieren.

Antworten (2)

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, writescheint 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.cppoder TinyDebugSerial.htatsä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.

Ich stimme Ihrer Diagnose und Abhilfe zu. Was die Verbindung zwischen Serialund angeht Print: Serialist eigentlich ein Alias ​​von TinyDebugSerial, das erbt von Stream, das erbt von Print. Zur Kompilierzeit wird alles im relevanten Core/Variant-Verzeichnis automatisch kompiliert.
@microtherion - Ich dachte, es wäre eine seltsame Vererbungssache, und ich habe nicht so viel Zeit damit verbracht, es mir anzusehen. Ich weiß wirklich nicht viel C++ überhaupt. Ich benutze wirklich nur C und Python. Danke!

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.

Aus seiner Antwort geht hervor, dass er es versucht hat Serial.write(myString);und einen Compilerfehler erhalten hat. Sehen Sie sich das letzte Codesegment im OP an.
Shoot, keine leichte Wiederholung für mich heute :o(