Einsatz von mehr als zwei 0,96 Zoll OLED Display I²C mit 128×64

  • Servus,
    naja ... da Du das Projekt von JumpY als Lösungsansatz angepeilt hast: da läuft das halt über RS485 und mit Modbus als Protokoll, was ich persönlich nach wie vor als richtigen Weg sehe.
    Modbus halt deshalb, weil der Pi dann einfach nur einen nach dem anderen Arduino abklappert und die Register ausliest. Und der Arduino hat nichts weiter zu tun, als diese Register aktuell zu halten. Der Rest läuft quasi von selbst.
    Die Rückleitung, die wir bei JumpY zusätzlich eingebaut hatten, brauchst Du in Deinem Fall ja nicht, denn die Initiative geht ja immer vom Busmaster, also dem Raspi aus.
    Lediglich mit den IDs der slaves musst Du Dir was einfallen lassen. Die müssen eindeutig sein. JumpY hatte das mit DIP Schaltern gelöst.


    btw: irgendwas stimmt mit Deinem Link nicht ;)


    cu,
    -ds-

  • Hallo Masterkennie,



    Mein Versuch, dass wir nicht mehr so arg aneinander vorbei schreiben: Ich hab ja einige Parameter zum Bausaufbau, Leitungslängen, eingesetzte Hardware usw. schon weiter oben definiert. Genauso, wie ich nicht den USB-Port vom Nano nutzen möchte sondern die RX / TX Leitungen des GPIO vom Pi. Zur Not hängt in meiner Signatur das Pflichtenheft (derzeit nicht in der 100% aktuellen Version) zum Nachlesen (wen´s interessiert :D )


    eines vorweg: Dreamshader, Jar und ich, wir schätzen uns gegenseitig sehr, haben uns schon mehrfach in wechselnder Zusammensetzung irgendwo getroffen, bestens unterhalten etc. Jeder Vorschlag, der von einem von uns dreien kommt, ist durchdacht und funktioniert. Und egal, welche Lösung Du irgendwann einsetzen wirst: Auf dem Weg dorthin werden wir uns auch gegenseitig weiter befruchten. Und Du wirst die dann für Dich beste Lösung - egal mit welchem Vorschlag sie die meiste Ähnlichkeit haben mag - einsetzen.





    Wegen der Verdrahtung zwischen Pi und Nano: War ich jetzt auch davon ausgegangen, dass der RX vom Pi an den TX vom Arduino sowie der TX vom Pi an den RX vom Nano verdrahtet wird und dann sollte doch die Kommunikation zwischen den Beiden schon mal laufen :s Jeder weitere Teilnehmer (Slave=Nano) wird mit seinem RX parallel zu allen Anderen RX des Nanos und mit seinem TX parallel zu allen anderen TX des Nanos verdrahtet --- oder? So wie in diesem Projekt vom JumpY das ich mir eigentlich als Lösungsansatz ausgeguckt hatte.



    Prinzipiell ja. Achte aber auf die unterschiedlichen Pegel:
    RPi (TX) sendet auf 3,3V und erwartet (RX) auch 3,3 V
    Arduino macht's mit 5V-Pegel [EDIT: Von Ausnahmen abgesehen]
    Du brauchst hierfür also Pegelwandler oder Spannungsteiler. Die Pegelwandlung 3V3 auf 5V kann man - muss man aber nicht - machen.



    Du kannst prinzipiell beliebig viele Teilnehmer über die serielle Schnittstelle miteinander verbinden. Die Pegel müssen passen, die Parameter (Baudrate, Parität, Stopbits etc.) müssen aufeinander abgestimmt sein.



    Ich danke dir Andreas für diesen Ansatz! Könntest du mir mal genauer sagen wie die einzelnen Punkte genau aussehen? Wie sie die Kennung aus, wo wird sie abgelegt? Steht sie im Quelltext des Nanos und brauche ich dann für jeden Nano seinen eigenen Quelltext? Die von dir geannten Begriffe sind mir bekannt, nur hab ich noch keine Vorstellung davon wie sie in echt/Quelltext aussehen (können).




    Z.B.:
    RPi sendet eine Zeichenkette
    AB11KXX
    ==> Bedeutet: RPi mit der Kennung A sendet an Teilnehmer der Kennung B den ersten [die erste 1 ist hier als 8-Bit-Muster zu betrachten] Datensatz, der 1 Byte [dito] beinhaltet. Dieses eine Byte K entspricht dem Kommando, Klimadaten vom Empfänger anzufordern. XX sei die CRC. Der Empfänger empfängt wie alle anderen Teilnehmer auch diesen Datensatz. Im Gegensatz zu allen anderen weiß er, dass er gemeint ist. Dieser Datensatz bewirkt, dass die Sensoren ausgelesen werden. Teilnehmer B schickt dann z.B. zurück:
    BA1823,543,8XX
    ==> Bedeutet: Teilnehmer B sendet an Teilnehmer A die Antwort auf seine erste Anfrage. Die Daten sind 8 Bytes lang und beinhalten 23,5 [°C] und 43,8 [%rF]. XX sei wieder CRC. Teilnehmer A "weiß" jetzt, dass seine erste Anfrage beantwortet wurde.


    Mit der Aufnahme des Kommandos ist man später recht frei, Erweiterungen einzuführen. Z.B. F für Fensterstatus. Ist das Fenster offen oder geschlossen?
    Oder T für Tür ...



    Das wäre die allereinfachste Form eines Protokolls. Man kann jetzt z.B. die Kennungen bei Deiner Anzahl der Teilnehmer in 1 Byte (8 Bit) codieren, d.h. Bit7-4 codiert den Sender, Bit0-3 codiert den Empfänger. Ebenso kann man das mit dem fortlaufenden Index und der Datenmenge machen. Auf einem PC-Boliden macht das auch durchaus Sinn (Bit-Shiften etc.). Beim Raspbery Pi und den noch langsameren Arduinos ist mit der Einsparung an Bytes kein Zeitvorteil möglich. Das, was ich an Übertragungszeit einspare, kommt durch gesteigerten Aufwand bei der Aufbereitung vor dem Senden und Auswertung nach dem Empfangen (ggf. mehrfach) wieder drauf. Deswegen würde ich den Code so einfach und kurz wie nur irgend möglich gestalten und lieber ein paar Bytes mehr über die Leitungen jagen.


    Die Kennung kannst Du durch einen DIP-Schalter realisieren, wie Dreamshader es schreibt. Ich würde es mit einer "Perle" probieren. Hierbei handelt es sich um ein elektronisches Bauteil, dass in Kunststoff eingeschmolzen wird und an den Teilnehmer angeschlossen wird.
    Handelt es sich bei dem Bauteil um einen Widerstand, dann fällt an diesem eine Spannung ab, die über einen Analog-Eingang ausgelesen werden kann. Jeder deutlich voneinander unterschiedliche Widerstand führt dann zu einer anderen Kennung des Teilnehmers.
    Handelt es sich bei dem Bauteil um einen Kondensator, dann wird dort eine Spannung angelegt (Aufladung) und nach Erreichen des HIGH-Pegels entladen usw. Dabei entspricht die Zeit zwischen Entladung und Aufladung der Kennung etc. Stichwort t = RC...


    Der Rest dieser Auswertung ist vergleichsweise übersichtlich einfache Programmierung.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited 2 times, last by Andreas ().


  • eines vorweg: Dreamshader, Jar und ich, wir schätzen uns gegenseitig sehr


    das auf jeden Fall!



    Prinzipiell ja. Achte aber auf die unterschiedlichen Pegel:
    RPi (TX) sendet auf 3,3V und erwartet (RX) auch 3,3 V
    Arduino macht's mit 5V-Pegel.
    Du brauchst hierfür also Pegelwandler oder Spannungsteiler. Die Pegelwandlung 3V3 auf 5V kann man - muss man aber nicht - machen.


    es gibt auch Arduino miniPRO ATmega328p die mit 8MHz ausgeliefert werden, die laufen dann auch an 3,3V (bis 5V) und könnten mit 3,3V versorgt direkt an den PI gekoppelt werden ohne Pegelwandler!


    Aber direkte Kopplung am Nano von Rx und Tx zwischen dem ATmega328p und seinem USB Teil klappte bei mir mit billigen China Nano nicht weil eben der Rx vom Nano nicht auf low gezogen werden konnte, der USB Teil hielt es zuverlässig auf high.
    Das mag beim Orignial anders sein, weiss ich nicht!
    Beim miniPRO ist diese Problematik nicht mangels USB Teil und wer einen FTDI oder CH340/341g anhängt kann selber für einen R auf der Rx (ggffs + Tx) Leitung sorgen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi,
    vielleicht noch folgendes:



    ==> Bedeutet: Teilnehmer B sendet an Teilnehmer A die Antwort auf seine erste Anfrage. Die Daten sind 8 Bytes lang und beinhalten 23,5 [°C] und 43,8 [%rF]. ...


    das würde ich etwas "aufbohren" und die beiden Felder getrennt mit jeweils einer Längenangabe davor übermitteln. Oder zumindest die Werte durch z.B. einen Doppelpunkt trennen. Hintergrund: das Auslesen wäre ein klassischer Fall für sscanf mit "%f" ... Ohnr Trenner dazwischen "könnte" das etwas schwierig werden, weil der sscanf die Vorkommastellen des zweiten Wertes als weitere Nachkommestellen des ersten interpretiert. Kommen die Werte so rein "23,5:43,8" ist das eindeutig und kann mit "%f:%f" gelesen werden.



    ... es gibt auch Arduino miniPRO ... die laufen dann auch an 3,3V ...


    das, glaube ich, muss man ausprobieren. Mir ist schon lange kein Pro Mini mehr untergekommen, der explizit auch für 3V3 angeboten wurde. Das war vor ein paar Jahren noch anders.


    cheers,
    -ds-

  • das, glaube ich, muss man ausprobieren. Mir ist schon lange kein Pro Mini mehr untergekommen, der explizit auch für 3V3 angeboten wurde. Das war vor ein paar Jahren noch anders.


    sofort 2ter Treffer bei der Suche!
    http://www.ebay.de/itm/Neu-Min…fe50ed:g:7uoAAOSwVZNTmXJw


    oder in die Suche:


    arduino miniPRO 328 3,3V


    liefert alle 8M(Hz) Typen:
    http://www.ebay.de/sch/i.html?…niPRO+328+3%2C3V&_sacat=0

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo in die Runde,
    erst mal viele Dank für eure Unterstützung! Das motiviert mich und ich komme auch langsam Schritt für Schritt voran. Einzig das Umsetzen mancher Tipps von euch sind da noch böhmische Dörfer oder ich stehe vor dem unsichtbaren Baum im Wald :s


    jar: Danke dir für das Raussuchen der mini Pro´s :thumbs1: Aber:


    Als kurze Info wie mein aktueller Stand ist hänge ich mal zwei Bilder ran. Derweil wird es erst mal beim Nano mit 5V Ausgang bleiben - einfach weil ich ihn da hab und aktuell nicht 4-6Wochen auf eine neue Lieferung warten möchte. Deswegen hatte ich ja weiter oben schon erwähnt, dass mir das Thema 3,3V - 5V bewusst und erst mal per Spannungsteiler gelöst.


    Der Aufbau auf dem Schreibtisch sieht derzeit so aus:



    Ein Arduino an RX/TX vom Pi sendet jetzt schon mal fleißig Daten, jedoch ohne Zuruf bzw. ohne gefragt zu werden:



    Da ich aktuell nicht rumlöten kann hab ich mir gedacht ich erstelle auf dem Nano eine Konstante die ich mit einem ID-Wert initialisiere welcher dann vom Pi verwendet werden könnte :s Wenn dann der Versuch mit zwei Arduinos losgeht erstelle ich temporär ein zweiten Sketch und vergebe da einfach eine zweite ID. Das sollte doch für den Anfang erst mal reichen oder?


    Andreas: Kannst du mir evtl. ein Codeschnipsel als Inspiration geben wie die Kommunikation in Form von Quelltext dann aussehen würde? Da fehlt mir wieder mal der bekannte "Denkanstoß".


    Frage an die Erfahrenen: Welchen Skriptinterpreter könnt ihr mir für das serielle Datenempfangen/Senden auf dem Pi denn empfehlen - aus dem ich dann die vom Nano gelieferten Klimawerte in die Lokale MySQL des Pi´s bekomme?



    PS: Ich habe nicht die Absicht gehabt eurer Verhältnis zueinander in Frage zu stellen, sorry wenn das so rüber kam. Ganz im Gegenteil, ich bewundere diese geniale Zusammenarbeit und bin euch natürlich auch sehr dankbar für die "Befruchtung" :bravo2:

  • Moin in die Runde,


    so, nachem ich nun, einfach um mal was zu sehen, den falschen Weg verfolgt habe indem ich den Pi und einen Nano Seriell miteinander hab reden lassen, merke ich so langsam, dass das alles nicht so einfach hingeschi**en ist sondern auch stinken muss. Dabei war ich am Freitag letzter Woche schon in voller Euphorie als der Pi die Messdaten dann endlich empfing und per Pythonscript in seine lokale MySQL schrieb.


    Es hätte mir natürlich auch gleich einfallen können, dass über eine stinknormale, serielle Schnittstelle nur zwei Teilnehmer miteinander kommunizieren können. Zumindest wenn man die simplen RX/TX vom Pi und den Nano nimmt :wallbash:


    Ich verbuche das für dann mal unter zeitlichem Lehrgeld und weiß nun zumindest wie simple, serielle Kommunikation zwischen zwei Teilnehmern funzt.


    Da aber wie weiter oben ja geschrieben insgesamt sieben bzw. acht Teilnehmer mit Daten (Klimadaten) hantieren sollen schwenke ich dann jetzt auf die Realisierung der RS485 Kommunikation um.


    Nach jetzt einem Wochenende Recherche im Netz gibt es ja die unterschiedlichsten Beispiele um den Pi mit dem Nano per RS485 reden zu lassen, ich finde aber keinen richtigen Einstieg =(


    Nachdem ich das äußerst interessante Thema vom Jumpy studiert habe musste ich feststellen, dass das Ganze für mich nicht so ganz leicht ist - da fehlt es dann doch an reichlich Programmiererfahrung. Dazu kommt, dass ich ja keine RF-ID Daten lesen und auswerten muss, sondern je Arduino Nano ein Paket aus drei Daten --> Temperatur, Luftfeuchtigkeit, Heatindex (gefühlte Temperatur).


    Bei der Auswahl an Bibliotheken stehe ich jetzt vor der Qual der Wahl welche Lösung hier am geeignetsten sein könnte.


    Ich wäre nochmal sehr dankbar, wenn mir jemand von euch Profis ein paar weiterbringende Tipps zu meinen Fragen geben könnte:


    - Welche ArduinoLib benötige ich damit der Nano in der Lage ist auf Zuruf seine Klimadaten per RS485 zu übermitteln?


    - Welche Softwarepakete benötigt der RasPi um den Nano per RS485 anzusprechen und die Daten zu empfangen


    Die Fragen stelle ich deswegen, da es nach meinem Empfinden ein relatives hin und her zwischen verschiedenen Lib´s und Paketen für Nano und Pi gab indem ich etwas den Überblick verloren habe.


    Vorhandene Hardware für den Testaufbau: RasPi3B, 2x ArduinoNANO je mit DHT22, 2x Max485 zum Aufbau des Bussystem´s.


    Montagliche, höchst motivierte Grüße :danke_ATDE:


  • - Welche ArduinoLib benötige ich damit der Nano in der Lage ist auf Zuruf seine Klimadaten zu übermitteln?


    - Welche Softwarepakete benötigt der RasPi um den Nano anzusprechen und die Daten zu empfangen


    ???
    wieso Seriell.read und .write oder .print steckt doch in jedem Arduino!
    dito im PI


    Als Sprache kannst du doch alles verwenden was die Serielle anspricht oder empfängt.


    so ganz verstehe ich deine Frage nicht, Kommandos an den Arduino vom PI einfach seriell rausschicken,


    ich mache das z.B. im Terminal, kann aber auch automatisiert aus einem Programm erfolgen, C oder Python oder was so vorhanden ist, sogar ständig wiederkehrend aus bash und skript


    aus dem PI


    while(1)
    seriell.print Luftfeuchte?
    sleep(10000);


    keine Ahnung wie man das im bash oder python umstzt aber das wissen andere


    im Arduino
    while(1)
    if seriell data
    bin ich gemeint?
    evtl. optional sonst weiterleiten
    kenne ich das Kommando?
    Kommando ausführen



    natürlich kein fertiger Code aber so läufts

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Quote from jar

    ???
    wieso Seriell.read und .write oder .print steckt doch in jedem Arduino!
    dito im PI


    Als Sprache kannst du doch alles verwenden was die Serielle anspricht oder empfängt.


    Es hängen zukünftig sechs oder sieben Nanos am Pi. Simpel seriell fällt doch damit aus.


    Wenn du weiter oben schaust, dann ist mir das was du mir grad geschieben hast durchaus klar, sonst hätte ich ja kaum bereits Klimadaten von einem Nano auf dem Pi erhalten und bereits in die lokale MySQL schreiben können.


    Ich zweifele grad an mir selbst, drücke ich mich zu oft zu unklar aus? Oder lesen andere meine Postings nicht richtig, oder Beides :s :helpnew::D


    PS: Ich habe meine Fragestellung noch mal versucht zu konkretisieren. Ich habe wohl fläschlicherweise gedacht ein Leser könnte sich schon denken dass es ganz konkret um bis zu sieben Teilnehmer am RS485 handelt....


  • Es hängen zukünftig sechs oder sieben Nanos am Pi. Simpel seriell fällt doch damit aus.


    NEIN, entweder du reichst durch wie Andreas schrieb von einem Arduino zum nächsten als Kette ist auch seriell!
    oder du setzte Rx und Tx zu RS485 um, ist auch seriell!



    Ich zweifele grad an mir selbst, drücke ich mich zu oft zu unklar aus?


    ja und dazu noch mit Verständnisschwierigkeiten deinerseits was auch ausdrückt wie wenig Erfahrung du im parktischen bauen und programmieren hast!



    Ich habe wohl fläschlicherweise gedacht ein Leser könnte sich schon denken dass es ganz konkret um bis zu sieben Teilnehmer am RS485 handelt....


    ich habe das die ganze Zeit verstanden, Andreas auch, aber was nutzt das wenn.....



    Nee isser doch eben nicht, wenn die Trägerplatine dahinter weit über 50mm groß ist :s



    ich gebs auf
    Das Loch muss nur den Displaybereich umfassen, dahinter kann die Platine 1m² gross sein!


    &&&&



    - Welche ArduinoLib benötige ich
    - Welche Softwarepakete benötigt der RasPi

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Quote from jar


    ja und dazu noch mit Verständnisschwierigkeiten deinerseits was auch ausdrückt wie wenig Erfahrung du im parktischen bauen und programmieren hast!


    ... deswegen bin ich hier im Forum.... zumindest was die Erfahrung mit Programmieren und Linux+RaspberryPi angeht.


    ... welche Erfahrungen ich im praktischen Bauen habe kannst du nicht beurteilen also bitte werfe du jetzt nicht auch noch das Displaythema hier rein denn in den vergangenen Postings ist hier doch eh schon alles arg zerissen worden.


    Weist du, von mir wird offensichtlich grad verlangt sich alles haargenau durch zu lesen und dann alles zu bedenken. Wenn ich dann aber hier erfahre dass sich meine Aufgabenstellung bzw. Eckdaten zum Projekt nicht angeschaut werden und dann Dinge in den Raum geworfen werden oder meine Erfahrungen beurteilt werden weil ich Fragen stelle oder nicht 100%ig genau formuliere - fühle ich mich minimal ungerecht behandelt.


    Am besten ich fange einfach noch mal bei 0 an, denn seit heute komme ich ohnehin nicht weiter - zu viel zu durcheinander.... :sleepy:

  • Hallo Masterkennie,



    Nachdem ich das äußerst interessante Thema vom Jumpy studiert habe musste ich feststellen, dass das Ganze für mich nicht so ganz leicht ist - da fehlt es dann doch an reichlich Programmiererfahrung. Dazu kommt, dass ich ja keine RF-ID Daten lesen und auswerten muss, sondern je Arduino Nano ein Paket aus drei Daten --> Temperatur, Luftfeuchtigkeit, Heatindex (gefühlte Temperatur).


    Lerne zu abstrahieren:
    Du hast offensichtlich Jumpys Code angeschaut. Dort wird ein RFID-Sensor ausgelesen, der liefert einen Wert, der Wert wird übetragen und irgendwas geschieht mit dem Wert.
    Du hast nichts anderes. Du hast irgendeinen anderen Sensor, der irgendwie mit dem passenden Befehl ausgelesen wird, Du hast einen Wert, der WErt wird übertragen und irgendwas geschieht mit dem Wert.


    So ganz grob geschätzt: 85% Code-Übernahme für Dein Projekt.




    Bei der Auswahl an Bibliotheken stehe ich jetzt vor der Qual der Wahl welche Lösung hier am geeignetsten sein könnte.


    Mir stellt sich eine andere Frage: Warum brauchst Du überhaupt Bibliotheken? Für was? Was soll Dir erleichtert werden?


    Das hängt ja auch von der Programmiersprache ab. Die Programmiersprachen, die ich kenne, unterstützen das so:

    • Öffnen der seriellen Schnittstelle
    • Übergabe eines Datei-Handles
    • Abgleich der Parameter der seriellen Schnittstelle
    • Lesen bzw. Schreiben aus bzw. in diesen Datei-Handle
    • Irgendwann mal den Datei-Handle schließen


    Anmerkung: Je nach Programmiersprache können die Punkte 1 und 3 auch zusammenfallen.


    Dafür bedarf es fast nie einer Bibliothek. Deswegen verstehe ich Deine "Qual der Wahl" nicht. Was ich überhaupt nicht gebrauchen kann, bedarf keiner Entscheidung, was genau ich brauchen könnte.




    Ich wäre nochmal sehr dankbar, wenn mir jemand von euch Profis ein paar weiterbringende Tipps zu meinen Fragen geben könnte:
    - Welche ArduinoLib benötige ich damit der Nano in der Lage ist auf Zuruf seine Klimadaten per RS485 zu übermitteln?


    Mein Tip: nada




    - Welche Softwarepakete benötigt der RasPi um den Nano per RS485 anzusprechen und die Daten zu empfangen


    Mein Tip: nada



    In welcher Programmiersprache willst Du denn den RPi überhaupt programmieren? Von dieser Entscheidung hängt dann alles Weitere ab. Wenn Du nicht beabsichtigst, für dieses Projekt mehr als eine Programmiersprache zu lernen, dann würde ich auf dem Arduino dessen C++ nutzen und auf dem RPi Processing installieren. Das ist - von ganz kleinen Unterschieden abgesehen - weitgehend identisch mit Arduino-C++. Und Du kannst damit auch kleine graphische Oberflächen erstellen - solltest Du es mal benötigen.


    Die beiden integrierten Entwicklungsumgebungen (IDE) sind sehr ähnlich. Du kannst dann sogar auf dem RPi die Software für den Arduino erstellen und übertragen und mit der Processing-IDE die Anwendung für den RPi vorantreiben.




    Die Fragen stelle ich deswegen, da es nach meinem Empfinden ein relatives hin und her zwischen verschiedenen Lib´s und Paketen für Nano und Pi gab indem ich etwas den Überblick verloren habe.


    Ist mir jetzt nicht so als Problem begegnet.



    Wie weit bist Du denn jetzt mit der "Kennung" gekommen? Hast Du Dir mal Gedanken gemacht, welchen Datensatz welcher Teilnehmer in die Runde schickt und woran der vorgesehene Empfänger erkennen kann, das er und kein anderer gemeint ist?


    Das sind meiner Meinung nach die Probleme, die Du angehen solltest. Denn dies gehört in die Software, die auf den Arduinos laufen soll - und dito auch für den RPi.


    Faul, wie ich bin, würde ich auch den Anspruch haben, dass auf allen Arduinos die identische Software laufen sollte. Oder willst Du allen Ernstes bei einer klitzekleinen Änderung 7 mal je einen anderen Arduino an die Programmiereinheit (ggf. RPi) hängen, um dann die Änderung zzgl. der "eingehämmerten Kennung" vorzunehmen? Da sind Fehler vorprogrammiert. Sind zwei Arduinos der Ansicht, die gleiche Kennung zu tragen, dann wird's sicherlich lustig. Auch, wenn einer nicht gefunden wird. Auch dafür wurden Dir Vorschläge unterbreitet, die nicht reflektiert wurden.



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited once, last by Andreas ().

  • Servus,


    ...
    Du hast offensichtlich Jumpys Code angeschaut. ...
    ...
    So ganz grob geschätzt: 85% Code-Übernahme für Dein Projekt.


    Du brauchst sogar nur eine vereinfachte Version der Lösung von JumpY. Wir hatten damals noch eine zusätzlich Verbindung von jedem Arduino zum Raspi eingebaut. Grund war, dass die "Slaves" (also die Arduinos) den Raspi auffordern müssen, die Daten abzurufen.
    Dieser Part entfällt bei Dir komplett. Den Rest kannst Du ihmo 1:1 übernehmen. Die Daten stehen in den "Registern" und der Raspi fragt sie ab. Hat einer der Sensoren seine Daten noch nicht aktualisiert, dann bekommt der Raspi halt die vorherigen. So gesehen ist auch das Verfahren nochmal vereinfacht, weil Du keine Rücksicht darauf nehmen musst, ob ein Slave fertig mit dem Auslesen ist.
    Die Slave-Id Problematik hatte JumpY ebenfalls gelöst ... notfalls nimmst Du halt Lötbrücken statt eines Mäusklaviers ...


    Aber das alles hatte ich schon Seiten vorher mal angesprochen.
    Bis dann,
    -ds-

  • Moin ihr Beiden und erst mal ein Danke für die aufbauenden Worte!


    Der gestrige Tag hat mich dann doch etwas emotional werden lassen und ich hab die ganze Thematik erst mal in die Ecke geworfen und ´ne Nacht lang drüber geschlafen.



    Quote from Andreas


    Mir stellt sich eine andere Frage: Warum brauchst Du überhaupt Bibliotheken? Für was? Was soll Dir erleichtert werden?


    Mangels meiner Erfahrung bin ich bisher davon ausgegangen, dass ich eine Bibliothek benötige.


    Quote from Andreas


    In welcher Programmiersprache willst Du denn den RPi überhaupt programmieren? Von dieser Entscheidung hängt dann alles Weitere ab.


    Das ist eine gute Frage, meine ersten Gehversuche in denen Pi und Nano sich schon mal miteinander unterhalten haben sind auf dem Pi in Python und auf dem Nano mit der ArduinoIDE entstanden. Da ich den Umgang mit Python recht angenehm empfinde, und mir auch die ArduinoIDE zusagt kommen diese beiden am ehesten in Frage.


    Quote from Andreas


    Die beiden integrierten Entwicklungsumgebungen (IDE) sind sehr ähnlich. Du kannst dann sogar auf dem RPi die Software für den Arduino erstellen und übertragen und mit der Processing-IDE die Anwendung für den RPi vorantreiben.


    Ist das nicht auch unter Windows möglich? Mein Pi sitzt ohne Peripherie in der Unterverteilung in der auch die Leitungen aus den UP-Dosen ankommen. Die Programmierung über Remotedesktop ist dann doch etwas hakelig. Aber ich denke für mich ist nicht das Problem auf welcher Plattform programmiert wird, sondern was zu programmieren ist.



    Ich verstehe das (oder auch nicht?) so, extrem vereinfacht:


    Seitens des NANO:
    1. serial.open()
    2. --- keine Vorstellung ---
    3. --- keine Vorstellung ---
    4. --- serial.read(ID) ---> ID erkannt --> serial.write(Datenpaket)
    5. --- keine Ahnung ---


    Seitens des RasPi:
    1. serial.open()
    2. --- keine Vorstellung ---
    3. --- keine Vorstellung ---
    4. --- serial.write(ID) ---> Wartezeit --> serial.read(Datenpaket)
    5. --- keine Ahnung ---
    ...--- Daten, wenn Antwort überhaupt erfolgt und plausibel, in MySQL ablegen



    Quote from Andreas


    Wie weit bist Du denn jetzt mit der "Kennung" gekommen? Hast Du Dir mal Gedanken gemacht, welchen Datensatz welcher Teilnehmer in die Runde schickt und woran der vorgesehene Empfänger erkennen kann, das er und kein anderer gemeint ist?


    Nach etwas Überlegung von meiner Seite her hast du Recht und ich werde jedem Arduino von extern eine ID verpassen. Über die "Perle" habe ich mich noch nicht schlau gemacht da ich mich die letzten Tage zu sehr in die Programmierung einer simplen, direkten seriellen Verbindung zwischen einem NANO und dem Pi verkrochen hatte - einfach um mal was zu sehen. Immerhin hat der erste Gehversuch geklappt! Pi funkte ein "N" an den Nano und dieser hat dann seine Daten zeilenweise gesendet - der Pi hat diese Daten dann bereits in die lokale MySQL geschrieben. Allerdings geschah diese Übertragung Zeilenweise. Die Erarbeitung einer Lösung der Codierung hole ich bei Zeiten nach.


    Allerdings sagt mir die Ringtopologie nicht zu. Sollte einer der Nanos ausfallen fällt der ganze Ring aus. Deshalb habe ich mich für den RS485/EIA 485 entschieden, da zukünftig mit Sicherheit noch weitere Teilnehmer hinzukommen können/werden.


    Zum Datensatz: Die Arduinos sollen nur reden, wenn sie gefragt werden. D.h. der Abfragerythmus ist im Pi hinterlegt, z.B. alle 15Minuten fragt der Pi die Slaves der Reihe nach ab indem er zuerst die ID in den Bus schickt, der entsprechende Nano der seine ID erkennt antwortet dann mit den Daten Temperatur, Luftfeuchtigkeit und Heatindex --> Pi empfängt die Daten und legt sie in der lokalen MySQL Datenbank ab. Und dieses Prozedere dann der Reihe nach für jeden Nano der verfügbar ist. Ob jetzt erst alle Nanos zu Ende abgefragt werden und dann erst in die SQL-Datenbank geschriben wird oder jeder erhaltene Wert sofort in SQL abgelegt werden soll muss ich mal schauen. Damit keine unplausiblen Daten in der MySQL Datenbank abgelegt werden wäre es gut, wenn der Nano seine Daten nochmal schickt falls die erste Übertragung fehlgeschlagen sein sollte.


    Auch hier muss ich mir Gedanken machen wie reagiert werden soll wenn die Übertragung, keine Ahnung, mehr als drei mal fehl schlug, oder ein Nano bzw. eine ID gar nicht zurück antwortet - aber das ist ist noch Zukunftsmusik. Ein erstes Grobziel ist erst mal der Code auf dem Nano dass er Daten über RS485 sendet wenn er gefragt wird - und der Code auf dem Pi der sozusagen erst mal die Frage stellen muss.


    Quote from dreamshader


    Die Daten stehen in den "Registern" und der Raspi fragt sie ab. Hat einer der Sensoren seine Daten noch nicht aktualisiert, dann bekommt der Raspi halt die vorherigen. So gesehen ist auch das Verfahren nochmal vereinfacht, weil Du keine Rücksicht darauf nehmen musst, ob ein Slave fertig mit dem Auslesen ist.


    Mit dem Thema "Register" muss ich mich auch noch mal eingehend beschäftigen, das sind bisher noch mehr als böhmische Dörfer für mich....


    Ihr seht, ich hab offensichtlich reichlich Informationsbedarf bin aber durchaus gewillt mich in die Thematik fleißig einzuarbeiten. Und so komplett Laienhaft ist mein Umgang mit C++, PHP. MySQL auch nicht. Python ist komplett neu und etwas ungewohnt.

  • Hi,


    ... Mit dem Thema "Register" ...


    bevor Du da an der falschen Stelle suchst: diese "Register" hängen mit dem Modbus-Protokoll, das wir bei JumpY eingesetzt haben, zusammen und haben mit Registern in der/einer CPU nichts zu tun ...
    Das sind nichts anderes als aneinandergereihte Byte Werte.


    cu,
    -ds-

  • für den Arduino Senden und Befehle empfangen könnte ich was zeigen, falls ich das nicht schon hier gezeigt hatte.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Gebt mir etwas Zeit, ich schaue mir grad den Post vom Andreas noch mal an,



    RPi sendet eine Zeichenkette
    AB11KXX
    ==> Bedeutet: RPi mit der Kennung A sendet an Teilnehmer der Kennung B den ersten [die erste 1 ist hier als 8-Bit-Muster zu betrachten] Datensatz, der 1 Byte [dito] beinhaltet. Dieses eine Byte K entspricht dem Kommando, Klimadaten vom Empfänger anzufordern. XX sei die CRC. Der Empfänger empfängt wie alle anderen Teilnehmer auch diesen Datensatz. Im Gegensatz zu allen anderen weiß er, dass er gemeint ist. Dieser Datensatz bewirkt, dass die Sensoren ausgelesen werden. Teilnehmer B schickt dann z.B. zurück:
    BA1823,543,8XX
    ==> Bedeutet: Teilnehmer B sendet an Teilnehmer A die Antwort auf seine erste Anfrage. Die Daten sind 8 Bytes lang und beinhalten 23,5 [°C] und 43,8 [%rF]. XX sei wieder CRC. Teilnehmer A "weiß" jetzt, dass seine erste Anfrage beantwortet wurde.

    das hätte ich vieleicht tun sollen bevor ich meinen letzten Post losgelassen hab, sorry.


    @-ds- : OK, ich brauche bei meiner Anwendung also nicht die "Register" da die Daten bereits in der gesendeten Zeichenkette - siehe Vorschlag von Andreas - enthalten sind.... :thumbs1:

  • wie schon gesagt, es gibt verschiedene Wege das umzusetzen, entweder als Kette PI Tx an Ardu1 Rx, Ardu1 Tx an Ardu2 Rx usw. sogar auf Wunsch vom letzten Ardu Tx an PI Rx um zu sehen ob die Kette unterbrochen ist oder ob alles richtig durchgelaufen ist.
    Der PI sendet mit Adresse Ardu1 den Befehl, der erste liest, ist für ihn führt es aus, wenn nicht tut er nichts ausser es wieder weiterzuleiten


    oder als RS485 umsetzung alle hängen am Bus und nur der richtige Ardu fühlt sich angesprochen und antwortet.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • jar: Letzteres als Bus gefällt mir besser, die Wahl fällt also definitiv auf den RS485. Auf deinen Lösungsansatz für den Arduino Senden und Befehle empfangen käme ich hiermit gern noch mal zurück, nachdem ich meinen Trööt hier noch mal durchforstet hab konnte ich ihn nicht finden oder hab ihn übersehen :s



    [quote='Andreas']
    1. Öffnen der seriellen Schnittstelle
    2. Übergabe eines Datei-Handles
    3. Abgleich der Parameter der seriellen Schnittstelle
    4. Lesen bzw. Schreiben aus bzw. in diesen Datei-Handle
    5. Irgendwann mal den Datei-Handle schließen
    [/qoute]



    Nochmal für mein Verständnis (extrem vereinfacht Schleifen und Bedingungen lasse ich mal weg):


    Seitens des NANO:
    1. serial.open()
    2. serial.read(Kennung_Master | Kennung_Slave | fortlaufender_Index | Größe_Datenpaket | Kommando_SendeKlimadaten | CRC)
    3. --- keine Vorstellung ---
    4. serial.write(Kennung_Slave | Kennung_Master | fortlaufender_Index | Größe_Datenpaket | 12Byte_Datenpaket | CRC)
    5. serial.close() ?
    6. weiter Klimadaten messen und auf OLED darstellen


    Seitens des RasPi:
    1. serial.open()
    2. serial.write(Kennung_Master | Kennung_Slave | fortlaufender_Index | Größe_Datenpaket | Kommando_SendeKlimadaten | CRC)
    3. --- keine Vorstellung ---
    4. serial.read(Zeichenkette von Slave)
    5. serial.close() ?
    6. Daten, wenn Antwort überhaupt erfolgt und plausibel, in MySQL ablegen



    Meine Fragen dazu:


    - Wofür ist der fortlaufende Index in der Zeichenkette gedacht?
    - Wie sieht das/der CRC aus, mit der Polynomthematik bin ich nicht vertraut?
    - Müsste der Abgleich der Schnittstellenparameter nicht direkt nach serial.open() erfolgen?


    Ich hoffe dass ich die Zeichenkette, bis auf die kleinen Unklarheiten, damit richtig kapiert habe?


    PS: Ein nachträgliches Zitieren ist mit dieser Forumssoftware offensichtlich nicht möglich? :no_sad: :s


  • jar: Letzteres als Bus gefällt mir besser, die Wahl fällt also definitiv auf den RS485. Auf deinen Lösungsansatz für den Arduino Senden und Befehle empfangen käme ich hiermit gern noch mal zurück, nachdem ich meinen Trööt hier noch mal durchforstet hab konnte ich ihn nicht finden oder hab ihn übersehen :s


    Seitens des NANO:
    1. serial.open()


    open immer im setup EINMALIG

    Code
    void setup() 
    { 
      Serial.begin(19200);
      delay(500);
      // gib dem Zeit wachzuwerden, kann auch verkürzt werden, ist nur für die angeschlossenen Teile
      while(Serial.available() > 0) 
        Serial.read();
      // Reste leeren
    }



    2. serial.read(Kennung_Master | Kennung_Slave | fortlaufender_Index |


    ok, wer angesprochen werden soll



    Größe_Datenpaket | Kommando_SendeKlimadaten | CRC)
    3. --- keine Vorstellung ---


    entweder du hast feste Größen und der PI weiss das was wie kommt oder du machst es wie c-typisch mit Argumentenkette siehe sprintf oder scanf


    Beispiele gibts genug im Netz ABER du musst programmieren lernen, empfiehlt sich sowieso



    4. serial.write(Kennung_Slave | Kennung_Master | fortlaufender_Index | Größe_Datenpaket | 12Byte_Datenpaket | CRC)


    ich würde ja Seriell.print wählen (stark verkürzt zum Verständnis)



    5. serial.close() ?


    NIE ein Arduino sollte nie terminieren also das PRG hat kein Ende!

    Files

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)