Forum: Mikrocontroller und Digitale Elektronik zwei Attiny's 85 über I2C


von Oly (Gast)


Lesenswert?

Hallo zusammen,

versucht seit Tagen eine ganz einfache Kommunikation zwischen zwei 
Attiny's 85 per I2C zur Übung hinzubekommen. Leider bekomme ich es nicht 
hin. Habe mehrere Beispiele und verschiedene Bibliotheken ausprobiert 
und da ich es nicht hinbekomme, vermute ich, das in meinen Code ein 
Fehler ist und ich ihn nicht finde. Ich hoffe das Ihr mir helfen könnt?

es soll eigentlich nur ein Byte vom Slave geholt werden um am Master die 
dementsprechende LED leuchten zu lassen, aber es tut sich nichts.

-Master-
https://github.com/lucullusTheOnly/TinyWire
1
#include <TinyWire.h>
2
3
void setup()
4
{
5
  pinMode(1,OUTPUT);
6
pinMode(3,OUTPUT);
7
pinMode(4,OUTPUT);
8
  TinyWire.begin(); 
9
}
10
11
unsigned long messungsticker = 0;   // alle 10 Sekunden eine Messung
12
unsigned long messticker = 0;       // 1 Sekunden für die Messung
13
boolean messunglaeuft = false;
14
15
16
17
void loop()
18
{
19
  // Messkommando schicken und Warteschleife steuern
20
  if ( (!messunglaeuft) && (millis()-messungsticker>10000) ) {
21
    TinyWire.beginTransmission(42); 
22
  
23
    TinyWire.write(0);
24
    boolean allesgut = TinyWire.endTransmission();    
25
//  
26
  messunglaeuft=true;
27
  messungsticker=millis();
28
  messticker=millis();
29
  }
30
  
31
  // Messzeit beendet, Datenübertragung initialisieren
32
  if ( (messunglaeuft) && (millis()-messticker>1000) ) {
33
    TinyWire.requestFrom(42,1);
34
    messunglaeuft=false;
35
  }
36
37
  // wenn Daten ankommen....  
38
   while ( TinyWire.available() )
39
   { 
40
     byte Nr = TinyWire.read();
41
42
   if (Nr==1) digitalWrite(1,HIGH);
43
   if (Nr==2) digitalWrite(3,HIGH);
44
   if(Nr==3) digitalWrite(4,HIGH);
45
   } 
46
}


-Slave-
https://github.com/rambo/TinyWire
1
#include <TinyWireS.h>
2
3
void setup()
4
{
5
  pinMode(1,OUTPUT);
6
  pinMode(3,OUTPUT);
7
  TinyWireS.begin(42); 
8
  TinyWireS.onReceive(receiveEvent);
9
  TinyWireS.onRequest(requestEvent); 
10
}
11
12
byte messergebnis;
13
14
void totalkompliziertemessroutine() {
15
  
16
  messergebnis=random(1,4);
17
}
18
19
boolean messen = false;
20
21
22
void loop()
23
{
24
  if (messen) {
25
    totalkompliziertemessroutine();
26
  messen=false;
27
  }
28
}
29
30
void requestEvent() {
31
  
32
  TinyWireS.write(messergebnis);
33
  digitalWrite(3,HIGH); //Kontroll LED wenn Daten angefordert werden
34
}
35
36
void receiveEvent(int anzahl)
37
{
38
  while (TinyWireS.available()){
39
    TinyWireS.read();
40
    digitalWrite(1,HIGH);//Kontroll LED wenn Daten empfangen werden
41
  } 
42
43
  messen=true;
44
}

hatte auch beide schonmal mit dieser Bibliothek getestet
https://github.com/lucullusTheOnly/TinyWire
habe es leider auch nicht hinbekommen.

Bin leider nur Gelegenheitsprogrammierer und finde den Fehler nicht, bin 
dankbar um jede Hilfe. DANKE!!!

von Stefan F. (Gast)


Lesenswert?

Scheitert es am Sender oder Empfänger, und was zeigen deine LEDs an?

Falls du es nicht hast, solltest du dir einen Logic Analyzer oder ein 
Oszilloskop besorgen.

von Cyblord -. (cyblord)


Lesenswert?

Ohne Not würde ich keinen I2C Slave selber implementieren. Schon gar 
nicht einfach zur Übung.
Übe in dem du einen I2C Master programmierst und mit einem fertigen I2C 
Baustein redest.
2 Controller können gut über UART miteinander reden.

von Stefan F. (Gast)


Lesenswert?

Ich hoffe du hast die richtigen I/O Pins verwendet und mit angemessenen 
Pull-Up Widerständen beschaltet.

von Cyblord -. (cyblord)


Lesenswert?

Dazu kommt dass man mit der Arduino Kacke immer voll im Blindflug 
unterwegs ist. 2 verkorkste Funktionsaufrufe und alles soll magisch 
funktionieren. Aber wehe es tut nicht.

Man würde einen I2C Slave eigentlich hauptsächlich Interrupt basiert 
implementieren. Wie das mit Arduino hier gehen soll weiß der Geier.

: Bearbeitet durch User
von Oly (Gast)


Lesenswert?

Hallo,

es passiert nichts. Egal ob Master oder Slave.
Habe unzählige Versuche gestartet und habe bei manchen Versuchen es 
geschafft, das mal am Slave bzw. Master eine LED blinkte(im Request bzw. 
Receive Funktion eingebaut zum testen). Aber habe es nie hinbekommen das 
im Master einer der drein LED leuchteten. Deshalb meine Vermutung, das 
im Code was falsch ist

von Stefan F. (Gast)


Lesenswert?

Cyblord -. schrieb:
> Wie das mit Arduino hier gehen soll weiß der Geier.

Schau doch in den Quelltext! Es wird mit Interrupts gemacht - was für 
eine Überraschung.

Beitrag #6681666 wurde vom Autor gelöscht.
von Cyblord -. (cyblord)


Lesenswert?

Stefan ⛄ F. schrieb:
> Cyblord -. schrieb:
>> Wie das mit Arduino hier gehen soll weiß der Geier.
>
> Schau doch in den Quelltext!

In Arduino Libs? Nein danke mir ist schon schlecht.

> Es wird mit Interrupts gemacht - was für
> eine Überraschung.

Mag sein. Hilft der Applikation aber wenig wenns nicht klappt.

von Oly (Gast)


Lesenswert?

verbunden sind Pin 7 und 5 untereinander mit jeweils einen 10k Ohm 
wiederstand als pullup

von Stefan F. (Gast)


Lesenswert?

Dann lege den Slave erstmal zur Seite und benutze nur den Master ganz 
alleine. Reduziere deinen Code auf ein Minimum, indem du z.B. einfach 
immer nur ein 0x55 and die Adresse 0xF0 sendet.

Dann schaust du dir auf dem Oszilloskop oder Logic Analyzer an, ob das 
Signal korrekt aussieht. Falls du nicht weisst, wie das Signal ausseehen 
soll, lies den Wikipedia Artikel zu I²C und dann die Spezifikation 
https://www.nxp.com/docs/en/user-guide/UM10204.pdf

Wenn das klappt, versuchst du Cyblords Empfehlung, zum Beispiel einen 
PCF8574 anzusteuern.

Erst wenn das klappt, nimmst du deinen eigenen Slave dazu, lässt LED's 
aufleuchten.

Und erst danach solltest du es erwägen, die Messung wieder einzubauen.

Sonst hast du nämlich zu viele unbekannte Baustellen gleichzeitig und 
blickst nicht durch.

von Oly (Gast)


Lesenswert?

Bin auch gerne für eine andere Kommunikation unter den Attiny's 
einverstanden.
Ein Attiny soll dazu dienen Messerwerte aufzunehmen und zum anderen zu 
senden, der wiederum soll eine Pumpe steuern. Wobei es vom ersten 
mehrere geben wird.
so ungefähr der Plan

von Cyblord -. (cyblord)


Lesenswert?

Oly schrieb:
> Bin auch gerne für eine andere Kommunikation unter den Attiny's
> einverstanden.
> Ein Attiny soll dazu dienen Messerwerte aufzunehmen und zum anderen zu
> senden, der wiederum soll eine Pumpe steuern. Wobei es vom ersten
> mehrere geben wird.
> so ungefähr der Plan

Jaja immer das Gleiche. Anfänger gehen immer gleich voll auf 
Multi-Controller Architekturen. Und versagen. LASS ES! Das ist sehr 
anspruchsvoll. Es gibt selten einen Grund für sowas.
Wenn es wirklich einen Grund gibt, nehme einen fertigen Bus dafür, 
welcher auch das höhere Protokoll dafür, Adressierung, Fehlerbehandlung, 
Retrys usw. usw. mitbringt. Ein nackter I2C, SPI, UART übertragen nun 
mal nur Bytes. Ok I2C bringt mehr mit. Aber die Slaves zu programmieren 
ist grottig.
Als Anfänger kannst du diese Kommunikation unter vielen Teilnehmern 
nicht ordentlich koordinieren. Du müsstest wichtige Mechanismen neu 
erfinden die es in anderen (Feld)Bussen schon gibt.

Ich werfe mal Modbus in den Raum.

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

In der loop() vom Slave muss TinyWireS_stop_check() aufgerufen werden.

von Helmut -. (dc3yc)


Lesenswert?

Oly schrieb:
> verbunden sind Pin 7 und 5 untereinander mit jeweils einen 10k Ohm
> wiederstand als pullup

Wie wär's, wenn du statt zweier wiEderstände zwei Widerstände einbauen 
würdest?

von Cyblord -. (cyblord)


Lesenswert?

Mario M. schrieb:
> In der loop() vom Slave muss TinyWireS_stop_check() aufgerufen werden.

Und hier sieht man wie grottig die API ist.

von Stefan F. (Gast)


Lesenswert?

Mario M. schrieb:
> In der loop() vom Slave muss TinyWireS_stop_check() aufgerufen werden.

Cyblord -. schrieb:
> Und hier sieht man wie grottig die API ist.

Es wird immer peinlicher.

Du hast immer noch nicht in den Quelltext geschaut, über den du so grob 
lästerst. Sonst hättest du bemerkt, dass der Hinweis von Mario falsch 
ist. Die von ihm genannte Funktion existiert in der verwendeten 
Bibliothek nämlich gar nicht.

von Oly (Gast)


Lesenswert?

Ich versuche es mit I2C, weil man es mir in diesem Forum empfohlen hat. 
Wie gesagt, nehme gerne etwas einfacheres wenn es geht.
Es hängt jeweils ein 10k Wiederstand am SCL und am SDA.

TinyWireS_stop_check() werde ich ausprobieren, danke.

von Cyblord -. (cyblord)


Lesenswert?

Stefan ⛄ F. schrieb:
> Du hast immer noch nicht in den Quelltext geschaut, über den du so grob
> lästerst. Sonst hättest du bemerkt, dass der Hinweis von Mario falsch
> ist. Die von ihm genannte Funktion existiert in der verwendeten
> Bibliothek nämlich gar nicht.

Ich verlasse mich eben darauf dass ihr Arduino Spezialisten euch 
auskennt. Wie gesagt, ich werde sicher niemals in dieses grottige 
Framework schauen. Außer ich möchte mich mal für etwas ganz doll 
bestrafen. Dann habe ich die Wahl ob ich eine echt fiese Domina buche, 
oder mir den Arduino Quelltext reinziehe. Das entscheide ich dann 
spontan.

von Stefan F. (Gast)


Lesenswert?

Lass dich von Cyblord nicht verunsichern. Der hat wohl gerade einen Hass 
auf alles, was mit Arduino zu tun hat.

von Mario M. (thelonging)


Lesenswert?

Stefan ⛄ F. schrieb:
> Die von ihm genannte Funktion existiert in der verwendeten
> Bibliothek nämlich gar nicht.

Ach?

Oly schrieb:
> -Slave-
> https://github.com/rambo/TinyWire

von Stefan F. (Gast)


Lesenswert?

Jetzt wird es verwirrend. Ich habe in die 
https://github.com/lucullusTheOnly/TinyWire geschaut. Dachte das wäre 
nun der aktuelle Stand der Dinge, weil er diese zuletzt nannte.

von Cyblord -. (cyblord)


Lesenswert?

Stefan ⛄ F. schrieb:
> Jetzt wird es verwirrend. Ich habe in die
> https://github.com/lucullusTheOnly/TinyWire geschaut. Dachte das wäre
> nun der aktuelle Stand der Dinge, weil er diese zuletzt nannte.

Vielleicht reden wir jetzt nochmal über die grottige API in grottigen 
Libs die irgendwo auf github in irgendeiner Version liegen? Nein?

von Sebastian S. (amateur)


Lesenswert?

Ohne Not würde ich I²C nicht implementieren!
Das ist sinnvoll, wenn Du mit einem Baustein kommunizieren willst, der 
nichts anderes versteht/kann.
Ich würde ein einfacher zu kontrollierendes Verfahren wie z.B. RS232 
oder RS485, abhängig von der gewünschten Entfernung, Umgebung und dem 
Datenvolumen, verwenden.

von Stefan F. (Gast)


Lesenswert?

Cyblord -. schrieb:
> Vielleicht reden wir jetzt nochmal über die grottige API

Nein ganz sicher nicht. Und mit dir doppelt sicher nicht. Du willst 
nämlich gar nicht helfen.

von Peter D. (peda)


Lesenswert?

Man muß den Helfer nicht zusätzlich vergraulen, sondern kann ganz 
einfach das compilierbare Projekt inclusive aller Libs als ZIP anhängen.

: Bearbeitet durch User
von Cyblord -. (cyblord)


Lesenswert?

Stefan ⛄ F. schrieb:
> Nein ganz sicher nicht. Und mit dir doppelt sicher nicht. Du willst
> nämlich gar nicht helfen.

Ich habe bereits mehr als du geholfen. Ich habe eine brauchbare 
Alternative zu dem Wahnsinn I2C-Slave + Arduino aufgezeigt. Mit einem 
UART und Modbus RTU könnte man ohne viel Aufwand viele Slaves abfragen. 
Konsistent und immerhin Standardkonform. D.h. man kann sogar mit 3rd 
Party Clients drauf zugreifen. DAS ist ein sauberes vorgehen. Wenn man 
unbedingt eine Multi-Controller Architektur braucht.

Das hat auch Chance ein paar Jahre zu laufen. Im Gegensatz zum 
Vergewaltigen von I2C für längere Strecken. Plus grottige Slave 
Implementierung die nur zwischen 0 Uhr und Mitternacht auf dem 
Labortisch einmal kurz funktioniert.

: Bearbeitet durch User
von Oly (Gast)


Lesenswert?

jetzt mal ne Frage, ist der Quellcode soweit ok das er laufen müsste 
oder ist da schon etwas falsch?

von Stefan F. (Gast)


Lesenswert?

Oly schrieb:
> TinyWireS_stop_check() werde ich ausprobieren, danke.

Oly schrieb:
> jetzt mal ne Frage, ist der Quellcode soweit ok das er laufen müsste
> oder ist da schon etwas falsch?

Hängt davon ab, ob du den bereits gemeldeten Fehler korrigiert hast.

von Schlaumaier (Gast)


Lesenswert?

Der Atiny-85 ist für so Spielchen denkbar schlecht geeignet zum üben.

Wenn du denn so was üben willst, kauf dir 2 Nanos. Die kosten auch kaum 
die Welt, sind aber wegen ihren nicht zu "überhäuften" Pins viel besser 
zum Handhaben.

"überhäuften" Pins = Man hat sehr viele Funktionen auf einen Pin. Man 
muss ergo den Atiny erst mal in den passenden Modus setzen, damit die 
Pins die gewünschte Funktion haben. Bei Anfängern sehe ich da ein 
Problem.

Davon abgesehen ist meiner Meinung nach der i2c Bus (den ich liebe) 
grundsätzlich nicht das richtige Mittel um 2 Prozessoren miteinander 
reden zu lassen.

Der Bus ist Spitzenklasse um externe Teile aller Art mit 2 Drähten + 
Strom anzuschließen. Besonders mag ich ihn bei Displays die 160x mit 
i2c-Interface.

von Stefan F. (Gast)


Lesenswert?

Ich denke, dass die Variablen "messen" und "messergebnis" volatile sein 
müssen.

von Brain 2.0 (Gast)


Lesenswert?

Hallo Oly,

lass dich von dem Arduino-Gegner (Cyblord) nicht verunsichern.
Es wird auch mit dem ATtiny85 funktionieren.
Nur mit dem Multi-Master-System wirst du wohl Probleme bekommen.

Hier mal eine gute Seite, in der alles für Arduino beschrieben ist.
http://hlembke.de/arduinoablage/crate.php?20150411i2c
Du musst nur für den ATtiny einige Änderungen einbauen.

von Oly (Gast)


Lesenswert?

TinyWireS_stop_check();
brachte keine Änderung.

danke Brqin 2.0, werde es mir mal ansehen

von Cyblord -. (cyblord)


Lesenswert?

Brain 2.0 schrieb:
> Es wird auch mit dem ATtiny85 funktionieren.

Das ist nicht der Punkt. Du musst die Kritik am Vorhaben schon lesen und 
verstehen.

von Oly (Gast)


Lesenswert?

Brian, das sind die Beispiele nachdem ich gehe :)
das erste Beispiel davon klappt, nur die weiteren nicht mehr, z.B. der 
Slave sendet. Im Master habe ich die Serielle Ausgabe abgeändet so das 
eine LED leuchten müsste und das ist nicht der Fall.

von Brain 2.0 (Gast)


Lesenswert?

Oly schrieb:
> Brian, das sind die Beispiele nachdem ich gehe :)
> das erste Beispiel davon klappt, nur die weiteren nicht mehr, z.B. der
> Slave sendet. Im Master habe ich die Serielle Ausgabe abgeändet so das
> eine LED leuchten müsste und das ist nicht der Fall.

Was meinst du mit "der Slave sendet" ?
Normal sendet der Master und der Slave quittiert.

von Schlaumaier (Gast)


Lesenswert?

Brain 2.0 schrieb:
> Was meinst du mit "der Slave sendet" ?
> Normal sendet der Master und der Slave quittiert.

Er denkt das das eine Bi-Direktionale Verbindung ist.

von Cyblord -. (cyblord)


Lesenswert?

Brain 2.0 schrieb:
> Was meinst du mit "der Slave sendet" ?
> Normal sendet der Master und der Slave quittiert.

Überhaupt nicht. Der Slave kann auch senden.

> Er denkt das das eine Bi-Direktionale Verbindung ist.

Womit er völlig recht hat.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Cyblord -. schrieb:

> Überhaupt nicht. Der Slave kann auch senden.

Sicher. Nur halt nicht aus eigenem Antrieb, sondern nur dann, wenn der 
Master es ihm befiehlt.

Und genau auf dieses Verhalten muss halt auch die Software ausgelegt 
sein.

von Cyblord -. (cyblord)


Lesenswert?

c-hater schrieb:
> Cyblord -. schrieb:
>
>> Überhaupt nicht. Der Slave kann auch senden.
>
> Sicher. Nur halt nicht aus eigenem Antrieb, sondern nur dann, wenn der
> Master es ihm befiehlt.

Das hat auch niemand behauptet. Nur die Aussagen da oben sind schlicht 
falsch (kann nicht senden, keine Bidirektionale Verbindung).

von Schlaumaier (Gast)


Lesenswert?

Cyblord -. schrieb:
> (kann nicht senden, keine Bidirektionale Verbindung).

Ich habe nicht geschrieben das er KEINE Bidirektionale Verbindung 
möglich ist. Sonder nur das er DENKT er hat eine. Das ist ein 
Unterschied.

Wie nämlich schon geschrieben muss man das Initialisieren.

von Schlaumaier (Gast)


Lesenswert?

Kleine Hinweis nebenbei. Ich würde es bei 2 Atiny über die Serielle 
Verbindung machen. Das ist einfacher und belastet nicht den i2c Bus.

von Cyblord -. (cyblord)


Lesenswert?

Schlaumaier schrieb:
> Kleine Hinweis nebenbei. Ich würde es bei 2 Atiny über die Serielle
> Verbindung machen. Das ist einfacher und belastet nicht den i2c Bus.

Ist ja krass, hat ja noch niemand vorgeschlagen....

von Oly (Gast)


Lesenswert?

Brian,

im Beispielpunkt unter "Der Slave sendet!"

Verwende jetzt für beide https://github.com/lucullusTheOnly/TinyWire.

Habe es soweit hinbekommen, das beim Slave beide LED`s leuchten. Also 
empfangen und senden schein zu klappen. Doch beim Master leuchtet nichts 
auf :(

von Oly (Gast)


Lesenswert?

Schlaumaier, wenn ich es auch dann noch damit hinbekomme, wenn es ca 10 
Slaves werden und es funktioniert, bin ich nicht abgeneigt es zu 
probieren. Für ein kleines Beispiel wäre ich dankebar oder einer Seite 
wo es auf deutsch erklärt wird.

danke

von Schlaumaier (Gast)


Lesenswert?

Cyblord -. schrieb:
> Ist ja krass, hat ja noch niemand vorgeschlagen....

Ich lese nicht jeden Beitrag.

Ach und nur so nebenbei. Ich selbst würde es über 433 Mhz-Funk-Teil 
machen. Was ich auch schon Testweise mal gemacht habe. Das ist nämlich 
dann noch viel einfacher, und braucht kein Kabel. Und ich muss mich 
nicht wirklich an die 2-Teile Begrenzung halten, sondern nur jeden ein 
"Namen" geben.

von Oly (Gast)


Lesenswert?

Daran habe ich auch schonmal gedacht Schlaumaier. Aber für alle Module 
ein RC Modul zu besorgen, dachte ich mir das die Wire Methode erstmal 
besser ist.

von c-hater (Gast)


Lesenswert?

Schlaumaier schrieb:

> Ach und nur so nebenbei. Ich selbst würde es über 433 Mhz-Funk-Teil
> machen. Was ich auch schon Testweise mal gemacht habe. Das ist nämlich
> dann noch viel einfacher, und braucht kein Kabel. Und ich muss mich
> nicht wirklich an die 2-Teile Begrenzung halten, sondern nur jeden ein
> "Namen" geben.

Häh? Welche "2-Teile-Begrenzung"? I2C kann natürlich wesentlich mehr 
Peers ab als nur zwei. Und I2C kann auch tatsächlich gleichberechtigte 
bidirektionale Verbindungen schaffen. Nur ist das dann halt keine 
Master/Slave-Architektur mehr, sondern eine Multimaster-Architektur.

Die grundsätzlichen Probleme bei einer solchen I2C-Architektur sind 
übrigens lustigerweise genau dieselben wie bei einem Funknetz. Man hat 
de facto nur halbduplex-Verbindungen und man muss Kollisionen sinnvoll 
behandeln.

Genau genommen ist das bei I2C aber deutlich einfacher als bei einem 
Funknetz. Man hat nämlich zwei Vorteile: Erstens sieht das Protokoll 
bereits auf PHY-Level Kollisions-Detektion vor und zweitens: man hat nur 
mit seinen eigenen Sendern zu tun, nicht auch noch mit den Unmassen 
fremder Sender im selben Funkband...

von Oly (Gast)


Lesenswert?

Nochmals danke an allen die zum Thema beigetragen haben(ob sinnvoll oder 
nicht)

doch wie zu anfang gefragt, liegt der Fehler evtl am Code, wurde nicht 
beantwortet. Doch ich bin soweit das es am Code liegen muss, denn mit
1
  // wenn Daten ankommen....  
2
   while ( TinyWire.available() )
3
   { 
4
    digitalWrite(1,!digitalRead(1));
5
//     byte Nr = TinyWire.read();
6
//   if (Nr=1) digitalWrite(1,HIGH);
7
//   if (Nr=2) digitalWrite(3,HIGH);
8
//   if(Nr=3) digitalWrite(4,HIGH);
9
   }

flackert die LED, also kommen irgendwelche Daten an.
Mit den If Anweisungen kommt aber keine LED zum leuchten, wo ist der 
Fehler???

von Rainer V. (a_zip)


Lesenswert?

Oly schrieb:
> Ich versuche es mit I2C, weil man es mir in diesem Forum empfohlen hat.

Ehrlich, das mußt du jetzt aber mal verlinken! Dann ist der Abend 
wahrscheinlich gerettet...ich mach mal ein Bier auf...
Gruß Rainer

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Daran habe ich auch schonmal gedacht Schlaumaier. Aber für alle Module
> ein RC Modul zu besorgen, dachte ich mir das die Wire Methode erstmal
> besser ist.

Nicht 1 sonder 2. Du brauchst ein SENDER + ein EMPFÄNGER. Kosten im 5 er 
Pack (=5 Pärchen + Antenne !!!!) ca. 5 Euro aus China.

Hier auch einzeln. : https://www.ebay.de/itm/313508818040

Bedenke bitte das du PRO Arduino ein komplettes Paket brauchst wenn du 
eine Antwort erwartest. !!!!! = 1 Sender der was sendet, und das 
Empfangsmodul für die Antwort. Das sind 2 getrennte TEILE. !!!!

Die WIRE Methode ist (jedenfalls bei i2c) nicht gut. Es gibt hier im 
Forum jede Menge Threads die sich über die Reichweite einer i2c 
Verbindung und den damit verbundenen Stress auslassen.

Wenn du die Serielle Methode nutzt, ist die Reichweite bedeutet besser 
und die Verbindung sicherer.

Und ab einen Abstand von ca. 10 Metern kann es eh Problematisch werden.

von Oly (Gast)


Lesenswert?

Schlaumaier, es werden max. 3m sein aber bei ca 10 Slaves werde ich 
erstmal nichts mit Funk anfangen, danke.
Seriel weiß ich noch nicht, als letztes vielleicht wenn ich hiermit 
nicht weiter vorankomme. Doch der Ergeiz ist stärker das jetzt zu 
schaffen und scheinbar bin ich kurz vorm Ziel.

Ich muss eine Byte Variable in int umwandeln, das scheint das Problem zu 
sein. Mit ((int)Bytevariable) klappt es nicht :(

von c-hater (Gast)


Lesenswert?

Oly schrieb:

> Ich muss eine Byte Variable in int umwandeln, das scheint das Problem zu
> sein. Mit ((int)Bytevariable) klappt es nicht :(

Schwachsinn. Das klappt immer. Oder anders ausgedrückt: dein Problem ist 
schlicht wo anders...

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Seriel weiß ich noch nicht, als letztes vielleicht wenn ich hiermit
> nicht weiter vorankomme.

Seriell kannst du bei mehr als 2 Teilen i.d.R. vergessen.

Deshalb mag ich ja Funk. Der MASTER (z.b. ein Mega wegen mehr Speicher) 
kontrolliert alles . Er sendet den Text " ATINY-1, Status".  Alle hören 
mit, Atiny-1 auch. Atiny-1 hört sein Namen und antwortet.

Das kann ich rein theoretisch mit einer unbegrenzten Menge machen.

Alternativ wäre vielleicht ein ESP-8266-NOD via Wlan interessant. Aber 
das ist ne bessere + andere Baustelle. Und dient nur der Weiterbildung 
deines Wissens.

von Stefan F. (Gast)


Lesenswert?

Ich erinnere nochmal an:

Stefan ⛄ F. schrieb:
> Ich denke, dass die Variablen "messen" und "messergebnis" volatile sein
> müssen.

von Brain 2.0 (Gast)


Lesenswert?

Cyblord -. schrieb:
> Das hat auch niemand behauptet. Nur die Aussagen da oben sind schlicht
> falsch (kann nicht senden, keine Bidirektionale Verbindung).

Genau so falsch wie deine Aussage.
Es hat keiner geschrieben "kann nicht senden".

Hauptsache ordentlich rumstänkern.....

von Oly (Gast)


Lesenswert?

Möchte ich nicht ausschließen, doch verstehen tue ich gerade nichts.
1
 for (int zaehler=0; zaehler=3; zaehler = zaehler+1){
2
    digitalWrite(3, HIGH);
3
    delay(500);
4
    digitalWrite(3, LOW);
5
    delay(500);
6
  }

dieser Code klappt, die LED blikt wie verrückt.

Doch wenn ich "zaehler=3" mit ((int)messergebnis) ersetze (byte 
messergebnis=3) dann blinkt die LED nicht. Warum????

von Stefan F. (Gast)


Lesenswert?

Oly schrieb:
>  for (int zaehler=0; zaehler=3; zaehler = zaehler+1){

Ist dir klar, dass zaehler=3 eine Zuweisung und keine 
Vergleichs-Operation ist? Kein Wunder, dass diese For-Schleife endlos 
lange läuft.

Wegen den Messergebnissen möchte ich erneut an das "volatile" erinnern. 
Lies erstmal, wozu das gut ist, dann verstehst du auch, inwiefern es mit 
deinem Problem zusammen hängt.

Nach wie vor solltest du meine obigen Ratschläge bezüglich 
LogicAnalyzer/Oszilloskop und der strukturierten Vorgehensweise 
beachten. Sonst bekommst du es nur zufällig ans Laufen ohne wirklich zu 
lernen.

von c-hater (Gast)


Lesenswert?

Schlaumaier schrieb:

> Seriell kannst du bei mehr als 2 Teilen i.d.R. vergessen.

Wieder derselbe Unsinn. Man kann auch mit seriellen 
("USART")-Verbindungen einen Multimaster-Bus aufbauen. Mit genau 
denselben Problemen wie bei einem Multimaster-I2C-Bus und zusätzlich der 
Tatsache, dass Kollisions-Detektion zwar auf dem PHY-Level möglich wäre, 
aber von vielen physischen Schnittstellen nicht (oder nicht wirklich) 
unterstützt wird. Zusätzlich das Problem, dass es dafür keinen 
standardisierten Mechanismus zu Adressierung gibt. Oder: zu viele davon, 
was allerdings effektiv genauso wirkt, als gäbe es gar keinen...

> Deshalb mag ich ja Funk.

Wer Funk kennt, nimmt Kabel. Wo immer möglich.

von Oly (Gast)


Lesenswert?

Stefan, das war gar nicht meine Frage.

von Oly (Gast)


Lesenswert?

und noch etwas, die Messergebnisse sind eine Zufallszahl von 1-3 die in 
einer bytevariable gespeichert werden. Die umwandlung in ein Int klappt 
nicht, warum auch immer. Das mit der For-Schleife war ein Beispiel wo es 
mit einer direkten zuweisung klappt und mit der umwandlung von byte zu 
Int nicht.

von Schlaumaier (Gast)


Lesenswert?

c-hater schrieb:
> Wieder derselbe Unsinn.

Wann lernen manche Leute zu verstehen was sie lesen.

Bei dir ist ja ein Ansatz vorhanden. ;)

Immerhin beschreibst du sehr gut, die Gründe wieso man das vergessen 
kann bzw. sollte.

Aber zu deiner Erklärung meiner Schreibweise, Reihenfolge von gut nach 
böse.

1.) Kein Problem (kann jedes Kind, bzw. gibts Anleitungen im Netz ohne 
Ende)
2.) Ist einfach (gibt weniger Anleitungen)
3.) Ist machbar aber man muss dabei denken (gibt kaum Anleitungen wenn 
dann eher von Freaks)
4.) kannst du vergessen = mag gehen aber die Probleme übersteigen den 
Nutzen um ein vielfaches.
5.) Geht nicht.

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Möchte ich nicht ausschließen, doch verstehen tue ich gerade nichts.

Lass dir über den Seriellen Monitor einfach das Ergebnis anzeigen was 
ankommt. Danach kannst du über Umwandlungen etc. nachdenken.

Oder was ich immer als Alternative mache, hänge an den i2c ein 1602 
Display (16 Zeichen 2 Zeilen) via i2c Bus und gib darauf einfach während 
der Testphase das aus was du wissen willst.

von if(==) (Gast)


Lesenswert?

06.05.2021 14:06

  // wenn Daten ankommen....
   while ( TinyWire.available() )
   {
     byte Nr = TinyWire.read();
   if (Nr==1) digitalWrite(1,HIGH);
   if (Nr==2) digitalWrite(3,HIGH);
   if(Nr==3) digitalWrite(4,HIGH);
   }
}

06.05.2021 18:11

  // wenn Daten ankommen....
   while ( TinyWire.available() )
   {
    digitalWrite(1,!digitalRead(1));
//     byte Nr = TinyWire.read();
//   if (Nr=1) digitalWrite(1,HIGH);
//   if (Nr=2) digitalWrite(3,HIGH);
//   if(Nr=3) digitalWrite(4,HIGH);
   }

von Oly (Gast)


Lesenswert?

Schlaumaier, ich habe leider zwar ein Display, aber ohne I2C :(
wie ich das ganze noch über den Seriellen Monitor anschließen soll, weiß 
ich ehrich gesagt nicht.
Aber wenn ich eine Zahhl 3 z.B. übertrage, denke ich, das sie ankommt.
Wenn ich dann dieses wieder umwandel in int, damit die jeweilige LED 
ansprint, passiert leider nichts.


was möchtest Du mir damit sagen if(==)???

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> wie ich das ganze noch über den Seriellen Monitor anschließen soll, weiß
> ich ehrich gesagt nicht.

Das macht die IDE selbst. Allerdings habe ich aktuell den Pin.-Plan des 
Atiny nicht im Kopf, beim Nano muss ich der das nur sagen, und wenn es 
am USB-Port hängt bekomme ich das Ergebnis.

Wie gesagt. Bei Atiny sind die Pins "Überbelegt" deshalb ist der 
Schwerer zu Handhaben als der Nano + Co.

von Oly (Gast)


Lesenswert?

Stefan,

habe jetzt
1
  for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){
2
    digitalWrite(3, HIGH);
3
    delay(1000);
4
    digitalWrite(3, LOW);
5
    delay(1000);
6
  }
7
  TinyWire.write(messergebnis);

volatile byte messergenis genommen. jetzt sehe ich das die LED zweimal 
blinkt. Somit sollte die Zahl zwei übertragen werden. Doch am Master 
wird nichts angezeigt, auch wenn ich dort mit volatile arbeite.

von Schlaumaier (Gast)


Lesenswert?

Nachtrag :

https://www.christians-shop.de/Set-LCD-2004-I2C-Modul-20x4-Zeichen-Beleuchtung-Blau-I2C-Modul-fuer-Arduino

So was o.ä. solltest du dir anschaffen. Ist kinderleicht anzusteuern, 
gibt zwar "nur" Text aus in festen Zeilen aber das reicht meist völlig 
aus.

Wenn du das Foto betrachtest da ist ein kleines Modul drauf, das ist das 
i2c-to-Display Adapter-Platine.

So ein Set meinte ich. Mit der Adapter-Platine stellst du die Adresse 
ein, den Treiber/Libary (ist in der IDE mit drin) hast du das in 3 
Zeilen angesteuert.

Selbst wenn man es hinterher nicht mehr braucht, für Debugging ist es 
einfach klasse, besonders bei Atinys ;)

Ist aber nur meine Meinung.

Beitrag #6682206 wurde von einem Moderator gelöscht.
von if(==) (Gast)


Lesenswert?

> was möchtest Du mir damit sagen if(==)???

im oberen Code steht:
if (Nr==1) digitalWrite(1,HIGH);

später dann:
//   if (Nr=1) digitalWrite(1,HIGH);

ist zwar auskommentiert, könnte aber dazu geführt haben, daß die LED 
nicht flackert.

von Oly (Gast)


Lesenswert?

if(==)

ich wollte damit ( digitalWrite(1,!digitalRead(1));)  zeigen/sagen das 
definitiv Daten ankommen.

Das mit Nr=1 oder Nr ==1 waren jeweils nur Versuche. Aber bei beidem 
reagirte die LED nicht. Ich sende 1 Byte und zwar die Zahl 3 , nur am 
Master kommt wohl was anderes an oder ich konvertiere es falsch, ich 
habe keine Ahnung, doch da scheint das Problem zu liegen.

von Oly (Gast)


Lesenswert?

Schlaumaier,
würde gerne diese Display 
https://www.christians-shop.de/13-OLED-Display-128-x-64-SH1106-I2C-IIC-weiss 
verwenden wenn möglich?
Andere Frage dazu, wie bekomme ich die I2C Adresse von dem Display dann 
raus um es anzusteuern?

von Brain 2.0 (Gast)


Lesenswert?

Es gibt einen I2C-Scanner, einfach mal danach googeln.

von Peter D. (peda)


Lesenswert?


von Oly (Gast)


Lesenswert?

Guten Morgen zusammen,

habe jetzt den Master durch einen Arduino mini pro ersetzt und folgenden 
Code benutzt,
1
#include <Wire.h>
2
3
4
5
void setup()
6
{
7
  pinMode(1,OUTPUT);
8
pinMode(3,OUTPUT);
9
pinMode(4,OUTPUT);
10
  Wire.begin(); 
11
  Serial.begin(4800);
12
}
13
unsigned long messungsticker = 0;   // alle 10 Sekunden eine Messung
14
unsigned long messticker = 0;       // 1 Sekunden für die Messung
15
boolean messunglaeuft = false;
16
 volatile byte Nr;
17
void loop()
18
{
19
  // Messkommando schicken und Warteschleife steuern
20
  if ( (!messunglaeuft) && (millis()-messungsticker>1000) ) {
21
    Wire.beginTransmission(42); 
22
  
23
    Wire.write(0);
24
    boolean allesgut = Wire.endTransmission();    
25
//  
26
  messunglaeuft=true;
27
  messungsticker=millis();
28
  messticker=millis();
29
  }
30
  
31
  // Messzeit beendet, Datenübertragung initialisieren
32
  if ( (messunglaeuft) && (millis()-messticker>100) ) {
33
    Wire.requestFrom(42,1);
34
    messunglaeuft=false;
35
  }
36
  // wenn Daten ankommen....  
37
   while ( Wire.available() )
38
   { 
39
  //digitalWrite(1,!digitalRead(1));
40
 Nr = Wire.read();
41
//     if (Nr==1) digitalWrite(1,HIGH);
42
//   if (Nr==2) digitalWrite(3,HIGH);
43
//   if(Nr==3) digitalWrite(4,HIGH);
44
for(int zaehler=0;zaehler==Nr;zaehler=zaehler+1)
45
{digitalWrite(13,HIGH);
46
delay(1000);
47
digitalWrite(13,LOW);
48
delay(1000);
49
Serial.print((int)Nr);
50
   } 
51
   } 
52
}


der Slavecode sieht so aus
1
#include <TinyWire.h>
2
3
4
void setup()
5
{
6
  pinMode(1,OUTPUT);
7
  pinMode(3,OUTPUT);
8
  TinyWire.begin(42); 
9
  TinyWire.onReceive(receiveEvent);
10
  TinyWire.onRequest(requestEvent); 
11
}
12
volatile byte messergebnis;
13
void totalkompliziertemessroutine() {
14
  
15
  messergebnis=3;
16
}
17
boolean messen = false;
18
void loop()
19
{
20
  if (messen) {
21
    totalkompliziertemessroutine();
22
  messen=false;
23
  }
24
}
25
void requestEvent() {
26
   for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){
27
    digitalWrite(3, HIGH);
28
    delay(1000);
29
    digitalWrite(3, LOW);
30
    delay(1000);
31
  }
32
  TinyWire.write(messergebnis);
33
  digitalWrite(3,HIGH); //Kontroll LED wenn Daten angefordert werden
34
}
35
void receiveEvent(int anzahl)
36
{
37
  while (TinyWire.available()){
38
    TinyWire.read();
39
    digitalWrite(1,HIGH);//Kontroll LED wenn Daten empfangen werden
40
  } 
41
  messen=true;
42
}

scheint soweit alles zu funktionieren(LED's blinken), doch es wird immer 
"0" auf dem Seriellenmonitor ausgegeben. Müsste/solle ja "3" sein, wo 
liegt der Fehler?

von Stefan F. (Gast)


Lesenswert?

Mit einem Logic Analyzer/Oszilloskop könntest du sofort sehen, ob es am 
Master oder am Slave liegt.

Wie gesagt: Du hast da zu viele Baustellen gleichzeitig offen.

von Einer K. (Gast)


Lesenswert?

Oly schrieb:
> void requestEvent() {
>    for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){
>     digitalWrite(3, HIGH);
>     delay(1000);

Dein TiniWire ist mir nicht so bekannt.
Aber üblicher Weise (Wire) läuft requestEvent() im ISR Kontext.
Darum wird dein delay(1000) versagen, denn dessen Timer benötigt 
ebenfalls eine ISR.

von Stefan F. (Gast)


Lesenswert?

Eigentlich sollen I²C Anfragen vom Slave immer sofort beantwortet 
werden. Verzögerungen erfordern clock-stretching, was den ganzen I²C Bus 
so lange lahm legt. Dieses clock-stretching ist auf den Mastern manchmal 
gar nicht oder fehlerhaft implementiert.

Wenn dein Slave Anfragen nicht sofort beantworten kann, dann macht man 
das normalerweise in drei Stufen:

1) Master sendet einen Befehl "jetzt bitte messen!"
2) Master fragt wiederholt "bist du fertig?"
Wenn der Slave diese Frage mit "ja" beantwortet, dann
3) Master ruft das Messergebnis ab "gebe mir bitte das Messergebnis"

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Andere Frage dazu, wie bekomme ich die I2C Adresse von dem Display dann
> raus um es anzusteuern?

Ich empfehle dir trotzdem das andere 160* Display mit zu bestellen.

Das Problem bei deinen Display ist, das es von der Software her schwerer 
anzusteuern ist. Da es keine festen Zeilen besitzt. Was beim Atiny85 zu 
einen 2. Problem führt. Du brauchst mehr Speicher. Und der ist im 
Atiny85 knapper als z.b. im Nano.

Und da das andere Display MIT CONTROLLER nur knapp 5 Euro kostet, ist 
das eine gute Investition.

Kleiner Tipp für Testzwecke wenn kein Display vorgesehen ist. Einfach 
ein Steckboard-Kabel (Buchse - Buchse) durchschneiden und an den i2c-Bus 
anlöten. Dann kannst du mit 2 Buchse-Stecker Kabel das Display 
problemlos als Debugger anzeigen bei allen Projekten nutzen. ;)

Oly schrieb:
> scheint soweit alles zu funktionieren(LED's blinken), doch es wird immer
> "0" auf dem Seriellenmonitor ausgegeben. Müsste/solle ja "3" sein, wo
> liegt der Fehler?

Du machst ein Fehler im Code.
Du musst die Serielle Aufgabe DIREKT nach den Read machen. Am besten 2 
x.
Einmal schreibst du Serial.print("hier bin ich"); und DANN in der 
nächsten Zeile das was du willst. Dadurch weißt du genau WO der Wert der 
angezeigt wird ausgelesen wird.

Ach ja, der Serielle Monitor funktioniert NUR an den Arduino-Teil was 
mit USB verbunden ist mit der IDE.

Womit wir wieder beim Thema sind.  Ein Text-Display funktioniert immer 
;)

von Schlaumaier (Gast)


Lesenswert?

Schlaumaier schrieb:
> Und da das andere Display MIT CONTROLLER nur knapp 5 Euro kostet, ist
> das eine gute Investition.

Kleiner Tipp nebenbei. Kauf beide und ein Nano dazu. Dann kannst du mit 
den LCD-Display mit den Nano üben. Und glaub mir einfach. Du brauchst 
die Übung.

LCD-Displays haben i.d.R. kein Zeichensatz, im Gegensatz zu den 160x 
Displays.

Zu den Textdisplays. Wichtig ist das da Steht. "kompatibel mit HD44780".
Die Nr ist verschlüsselt.  die ersten 2 Ziffern geben die Anzahl der 
Zeichen an pro Zeile, die nächsten 2 Ziffern die Anzahl der Zeilen.
2004 = 20 Zeichen x 4 Zeilen.

Der Zeichensatz ist international. Was bedeutet solange die KEINE öäü 
etc. benutzt kannst du alles perfekt lesen. ;) Ich umgehe das Problem 
einfach in den ich mir ein Wort ohne Sonderzeichen einfallen lasse, oder 
Abkürzungen. Was auf Display's eh meist keine schlechte Idee ist. ;)

von Oly (Gast)


Lesenswert?

Hallo und Danke Schlaumaier für die ausführliche Info!

Ich habe mir bereits einen Arduiono mini Pro angeschlosssen und ihm den 
Code des Masters verpasst. Daher konnte ich im S.Monitor sehen was 
gesendet wird.
Komischerweise funktionierte es einwandfrei, nur halt mit dem Attiny 
nicht. Habe herrausbekommen das die verwendete Bibliothek nicht für den 
Master auf Attiny geeignet ist und fehlerhaft ist. Von daher benutze ich 
jetzt die von Adafruit und es läuft so wie es sein sollte.

Um auf das Display zurückzukommen, da werde ich den Mini an mein 
vorhandenes Display(ohne I2C) anschließen und diesen ins I2C netz mit 
einbinden so das er mir sagen kann, welche Daten fließen ;)

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Um auf das Display zurückzukommen, da werde ich den Mini an mein
> vorhandenes Display(ohne I2C) anschließen und diesen ins I2C netz mit
> einbinden so das er mir sagen kann, welche Daten fließen ;)

Solange du nicht an die Speichergrenze des Atiny triffst, wieso nicht ;)

von Stefan F. (Gast)


Lesenswert?

Schlaumaier schrieb:
> Solange du nicht an die Speichergrenze des Atiny triffst

Hoffentlich versteht er den ironischen Witz, bzw. die ernsthafte Warnung 
die darin verborgen liegt.

von Oly (Gast)


Lesenswert?

Das Display wird am Arduino Mini angeschlossen und diesen an I2C 
anschließen. Müsste ja dann Attinyspeicher frei bleiben :)

von Schlaumaier (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Hoffentlich versteht er den ironischen Witz, bzw. die ernsthafte Warnung
> die darin verborgen liegt.

Hoffe ich auch.

Immerhin muss alles in ca. 6 KBytes Speicher rein die ich bei ein 
Atiny85 nutzen kann, wenn ich das richtig im Kopf habe. Wogegen ein Nano 
ca. 30 Kbytes hat die ich nutzen kann.

Das LCD-Display braucht komplexere Ansteuerung ergo mehr Speicher als 
ein HD44780 Typ. Bei ein HD44780 brauche ich nur den meist eh genutzten 
i2c Treiber und eine billige Ansteuerung. Das spart Speicher ohne Ende 
im Atiny.

Was der Grund ist, wieso ich die HD44780 Teile lieber einsetze. Davon 
abgesehen kann ich sie meist besser ablesen.

von Schlaumaier (Gast)


Lesenswert?

Nachtrag : Ich nutze die Atiny-85 nur um die Beleuchtung meiner 
Modellautos zu steuern via i2c und PCF8574 und teilweise Fernbedienung 
(IR). Und das sogar OHNE Platine als SMD. 1:24 ist halt klein. ;)

Kann man schöne Beleuchtungseffekte machen, inkl. Warnblinker etc.

von Oly (Gast)


Lesenswert?

im Attiny wird nicht mehr stehen als angegeben und das Display wird 
nicht mit dem Attiny gesteuert.

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> m Attiny wird nicht mehr stehen als angegeben und das Display wird
> nicht mit dem Attiny gesteuert.

JA. Ist klar.

Ich meinte ja auch das es ein Unterschied zwischen "User-Mode" und 
Entwicklungsmodus gibt. Und im letztern ist ein Display mit Text eine 
schnelle + Speichersparende Möglichkeit für DEBUG-Infos angezeigt zu 
bekommen.

Ein Beispiel. JEDES meiner Programme zeigt im Debub-Modus als erster auf 
den Display "Programm gestartet".  Warum : Damit ich weiß das das sauber 
übertragen wurde, und der Chip gestartet ist.  Dann kommen da Debug 
infos.

Bei meinen Auto-Prg. z.b. wollte ich wissen welches Prg. im Programm 
gerade läuft. Also "Warnblinker, Blinker rechts / Links, Beleuchtung an, 
aus". Das war während der Entwicklungszeit wichtig.

Da das Display nicht ins Auto passt, habe ich die paar Zeilen für den 
Steuercode entfernt als es fertig war, und das war's.

Das coole halt ist. Ich drücke 1 auf der China-Fernbedienung aus meinen 
Starter-Set und das Auto macht die Front-Scheinwerfer (helle SMD-LED) 
an. ;)

Aber so was muss erst mal laufen. Und da mache ich jede Menge Fehler 
zwischendurch. ;) Testen tue ich die erste Runde eh auf ein Digipark 
Fertig-Platinchen direkt am AKTIVEN USB-HUB.

NIEMALS ein Arduino DIREKT am PC ANSCHLIESSEN. USB-PORTS sind fast immer 
irreparable auf den Mainboard.

von Oly (Gast)


Lesenswert?

das klingt sehr gut!
Mein Arduino wird über einen TTL Converter gespeist, von daher ist er 
nicht direkt angeschlossen.
Das Display was ich habe, ist ein 1602 und braucht noch ein paar 
Strippen mehr, da es kein I2C Modul besitzt. Daher dachte ich, das ich 
diese Kombi als Debugger über I2C später anschließen möchte

von Schlaumaier (Gast)


Lesenswert?

Oly schrieb:
> Das Display was ich habe, ist ein 1602 und braucht noch ein paar
> Strippen mehr, da es kein I2C Modul besitzt.

Das Modul gibt es einzeln. Kostet ca. 1.50

Und ist mega zu empfehlen.

1.) Die Ansteuerung ist um einiges leichter. Libs laden, Ini-Befehl , 
fertig.

2.) Man spart das wichtigstes was ein Arduino hat. PORTS = Anschlüsse.

https://www.christians-shop.de/I2C-IIC-Serielle-Schnittstelle-fuer-LCD-Display-1602-und-2004 
<- das das nackte Modul.

Hier mal ein Link für deine Weiterbildung.
http://www.sprut.de/electronic/lcd/

--- hier ein Code aus den Beispielen der IDE bei mir.
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 
16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd

  // Print a message to the LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}

void loop()
{
}

Das ist alles.  ->  lcd.print("Hello, world!");

Wenn du dein 1602 an i2c anklemmst.

von Schlaumaier (Gast)


Lesenswert?

Nachtrag:

https://funduino.de/nr-42-oled-display-ssd1306-128x64-128x32

So steuert man das Display an was du dir im Shop ausgesucht hast. ;)

Und die Addfruit-Libs ist viel größer als die LiquidCrystal_I2C.h

von Stefan F. (Gast)


Lesenswert?

Schlaumaier schrieb:
> Und die Addfruit-Libs ist viel größer als die LiquidCrystal_I2C.h

Sie kann halt auch einiges mehr und ist modular aufgebaut, mit viel 
wiederverwendbarem Code. Kann man mögen, muss man nicht.

Ich habe mir für diese SSD1306 Displays eine schlankere Variante 
gebastelt. Ich habe mich in das sanfte vertikale Scrollen verliebt :-)
http://stefanfrings.de/arduino_oled/index.html

Gibt es diese Displays eigentlich in größer? Nicht unbedingt mehr Pixel, 
aber mehr Zentimeter?

von C. U. (chriull)


Lesenswert?

Oly schrieb:
> for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){

Google mal nach "c++ for schleife" oder ähnlichem.
Eventuell solltest du mal mit kleinen Programmen/Tutorials beginnen?

Viel Glück!

von Schlaumaier (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Sie kann halt auch einiges mehr und ist modular aufgebaut, mit viel
> wiederverwendbarem Code. Kann man mögen, muss man nicht.
>
> Ich habe mir für diese SSD1306 Displays eine schlankere Variante
> gebastelt. Ich habe mich in das sanfte vertikale Scrollen verliebt :-)

Ich sag ja auch nicht das sie schlecht ist. Nur das ich sie nicht in 
einen Atiny stecken will. Die hat halt das Recht auf mehr Platz bei mir.

Mein "einziger" 1306er wird mit einen Mega angesteuert.

Und zum Debug reicht mir ein Display was mir was anzeigen kann.

von Oly (Gast)


Lesenswert?

Habe den Arduino+Display jetzt als Slave und Debbugmonitor erfolgreich 
eingebunden, klappt wunderbar. Danke für den tip!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.