Direkte Serielle Kommunikation zwischen Attiny85 und Arduino UNO

Hallo Liebes Forum,

Da ich mich Zukünftig mehr mit dem Attiny85 auseinandersetzen möchte gerade im Batteriebetrieb, habe ich für den Attiny85 ein Sketch geschrieben, der der die Interne Referenz-Spannung misst und ohne ein HC-12 Modul über die direkte Serielle Kommunikation an den Arduino UNO sendet, für diesen habe ich einen Sketch geschrieben, der das vom Attiny85 liest und am Ser Mon anzeigt.

Nun habe ich das Problem, das die Darstellung auf den Ser Mon ganz oft nicht funktioniert und nur selten etwas brauchbares im Ser Mon steht.

Wenn jemand eine Lösung hat, wie ich das Problem angehen könnte Ware ich sehr dankbar.

ich könnte das zwar mit einem HC-12 machen wie in Vergangenheit auch, aber das wäre übertrieben und für das Messen der internen Referenzspannung überdimensioniert. Da ich auch die Möglichkeit zum Messen haben möchte ohne ein HC-12 als Kommunikation nutzen zu müssen. Ich habe es bereits schon mit anderen pinbelegungen für RX und TX probiert.

Der Attiny85 Code:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 3);  // RX = 4, TX = 3

const float VCC = 4.86; // Gemessen in Volt!

void readInternalRef11() 
{
  ADCSRA |= _BV(ADSC); // Start Umwandlung
  while (bit_is_set(ADCSRA,ADSC)); // Messen

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;
  float rvcc = 1.10 * 1024L / result;
  float internal1_1Ref = 1.1 * VCC / rvcc;

  mySerial.println(internal1_1Ref);
}

void setup() 
{
  mySerial.begin(9600);  // Starte die serielle Kommunikation mit dem Arduino über SoftwareSerial
  delay(100); // Kurze Verzögerung für die Stabilisierung von SoftwareSerial

  // Initialisiere ADC mit REFS[2:0] ist 0 = VCC als Ref,  MUX[3:0] 1100 = Vbg als Input,  
  ADMUX = _BV(MUX3) | _BV(MUX2); 
  delay(10);
}

void loop() {
  readInternalRef11();
  delay(1000);
}

Der Code für Arduino UNO:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 3); // RX, TX am HC-12 (anpassen, je nach Verkabelung)

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600); // Beginne die serielle Kommunikation mit dem ATtiny85
}

void loop() 
{
  if (mySerial.available() > 0)  // Überprüfe, ob Daten verfügbar sind
  {
    String receivedData = mySerial.readString();  // Lies die empfangenen Daten
    Serial.print("Interne Referenz: (1.1V), Tatsächliche Referenz: ");
    Serial.println(receivedData);
  }
}

EDIT:
Könnte es sein das diese Zeile probleme macht?

  if (mySerial.available() > 0)  // Überprüfe, ob Daten verfügbar sind

Schau Dir mal diesen Thread an.

Gruß Tommy

1 Like

Unnötig kompliziert!
Warum nicht einfach:

//uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
  //uint8_t high = ADCH; // unlocks both

//  long result = (high<<8) | low;
  long result = ADCW;

Keinerlei Protokoll!
Also auch keinerlei Chance zu prüfen ob die Daten korrekt sind.

Tipp:
Verwende I2C.
Da hast du diese Synchronisierungsprobleme nicht

Ist zwar schon lange her, aber muss man bei Serial-Komunikation nicht über kreuz verbinden .?

Gruß

Pucki

Besitzt der Arduino UNO an den Analogen Pins A0-A5 auch Pull-Up-Widerstände ? oder müssen die zusätzlich noch dazu ?

So wie es scheint sind da wohl keine Pull-Up-Widerstände vorhanden, die müssen dann für die I2C Kommunikation hinzugefügt werden

Ich hoffe mal du hast die Verbindung richtig verdrahtet sonst kommt da NIX oder nur müll an.

Siehe dazu Post 2. !!!

Gruß

Pucki

Richtig angeschlossen war alles, sonst hätte ich den Attiny ja nicht fläschen können

1 Like

Ja :wink:
Wen man die im pinMode() als INPUT_PULLUP deklariert.
Man kann die auch im dem Fall D14 bis D18 nennen, wie normale Digitalpins.
Vorsicht bei Nano R3 der hat noch dazu A6, A7, das sind reine Analogpins.
Bei Mega R3 kann man alle Analogpins als Digital nutzen

Oh achso, hätte ich mir denken können, ich war mir nur nicht sicher :joy: ich hatte im Schaltplan keine Physischen Widerstände gesehen/finden können

Sind wie bei den meisten intern

Die internen Pullup sind für I2C NICHT ausreichend.

Das Stimmt aller Dings.
Meine Antwort war nur auf die Frage ob es die gibt, nix mehr nix weniger.

Na ja. Beim Sender

 println();
 delay (1000);

und readString() beim Empfänger geht in die Richtung eines Protokolls.

Aber wenn man schon Endezeichen mitsendet, sollte der Empfänger auch darauf synchronisieren statt auf ein (zu großes) Timeout.

Es gibt auch noch den A5 der dann D19 ist.

Bei einem I2C Device, das wenige cm entfernt vom Arduino steht könnte es reichen.
Zur Sicherheit 2 externe Pullupwiderstände hinzuschalten ist sicher kein Problem / Aufwand.

Grüße Uwe

Mit EEPROM und FRAM an einem UNO, ohne externe Pullup
https://forum.arduino.cc/uploads/short-url/dU0b7SLVyTOAPfCV6ws5biZPdu9.pdf

Hast recht; so funktioniert das nicht.

Ich meinte nicht die Verbindung zum Flashen sondern die Verbindung zwischen UNO + ATiny85. Schau dir doch einfach den Link im Post 2 an. Besonders die Seriale Verbindung zwischen den beiden.

Gruß

Pucki

Kann man aber nicht wirklich vergleichen, dort wird eine Modifizierte Version des Arduino as ISP-Sketches gezeigt und DIE GLEICHE Verdrahtung, die auch zum flashen genutzt wird Plus eine Blaue Leitung für die Kommunikation.
Zudem ist der dort verlinkte Adapter NIRGENS im Internet zugänglich:

Ähnliche Adapter habe ich nicht finden können, und wenn ja, dann nur für Atmega
Wenn ich einen Schaltplan dazu finden würde, könnte ich den Adapter einfach nachbauen.

EDIT:
Dort wird auch SoftwareSerial genutzt