Beiträge von Mi Ke

    Hallo Reiner,


    danke für die Info, das hatte ich auch so aus KaiR’s Beitrag verstanden und ich habe es jetzt auch so umgesetzt.

    Ich hatte sowie die unten aufgeführten Codebeispiele zeigen auch schon mit 2 Bussen gespielt. Nur scheinbar scheinen die Library’s dies nicht 100% zu unterstützen und versuchen trotzdem den 1. Bus, sprich den mit Wire bezeichneten anzusprechen was dann zum versagen einiger Komponenten führt.


    2 BME280 Sensoren konnte ich auch schon an 2 verschiedenen Bussen nutzen. Un im I2C Scann werden auch alle Adressen in den entsprechenden Bussen gefunden. In meinem Fall war glaube ich der RTC der Übeltäter.


    Die über den Link gezeigten Beispiele und Erklärungen sind gut verständlich gezeigt. Vielen Dank!

    Hallo KaiR,


    danke für deine ausführliche Darstellung.

    Daraufhin habe ich mal nachgemessen.


    Tatsächlich hat das RTC Modul einen 4.7kOhm anstatt eines 10k Widerstandes, was bei den 4 Modulen den Bus entsprechend belastet und natürlich Fehlverhalten durch redeten des Busses hervorruft.


    Da ich momentan keine Lösung für 2 I2C Busse sehe habe ich die Leitung der 4.7k Widerstände am RTC Modul unterbrochen. Damit funktioniert es erst einmal

    nach einigen Versuchen mit einem RTC Modul, zwei BME280, einem OLED Display und einerSD Karte an einem I2C Bus kamen mir einige Bedenken was den Abschluss des Busses über Pullup Widerstände angeht. Jedes dieser Module hat einen 10KOhm am SDA und SCL gegen VCC. Es funktioniert zwar aber ich möchte hier nicht unbedingt Gefahr laufen etwas zu beschädigen.


    Deshalb hatte ich über Wege nachgedacht 2 I2C Busse zu verwenden. Kein Problem dachte ich. Arduino bringt ja entsprechend über die Wire Library die Funktion TwoWire mit.

    Im Scan funktioniert das auch wir erwartet. Alle Member des Busses melden sich brav.


    als Ergebnis bekomme ich die gewünschten Adressen im entsprechenden Bus

    Code
    1. 2C scanner. Scanning bus 0...
    2. Found address: 76
    3. Found address: 77
    4. I2C scanner. Scanning bus 1...
    5. Found address: 3c
    6. Found address: 57
    7. Found address: 68
    8. I2C device check DONE.


    Ok, dann versuch ichmal Display und RTC am Wire2 zum laufen zu bringen, leider mit bescheidenem Erfolg ;(Das Datum wird zuerst ausgelesen und wechselt dann ständig .



    mit einer anderen Library habe ich schon gespielt, leider mit ähnlichem Erfolg



    Jetzt habe ich einige Fragen:


    1. wieviele Member kann ich gefahrlos in den Bus hängen?


    2. gibt es eine funktionierende Library für RTC (DS3231) wo ich SDA und SCL Pin zuweisen kann?


    3. gibt es eine solche für BME280?


    4. Hab ich einen Denkfehler im Code?


    5. kann man das auch anders lösen

    Hallo ihr Beiden,


    ich finde es super wie ihr euch einsetzt und versucht zu optimieren und Wege zu zeigen wie es gemacht werden kann und auch noch so das es Anfänger verstehen können, naja so gut wie ;).

    Mir hilft das sehr, weil ich das Gezeigte nachstellen kann, um so Schritt für Schritt verstehen zu lernen.

    Ich bin hier ehrlich, alles habe ich noch nicht zu 100% verstanden :S


    KaiR

    ich habe deine Umsetzung mal ausprobiert. Sie funktioniert perfekt.

    Funktioniert id Endlosschleife in void setup() weil die 1 immer 1 in while(1) ist?


    was bedeutet das ‚\x2D’ in memset(msbRFIDCode,'\x2D',LEN_DATA);

    @Pius

    danke für die Erklärung, ich glaube ich habe es verstanden :)


    KaiR

    habe ich noch nicht ganz verstanden, ich muß mir mir die Formel mal step boy step anschauen.

    Finde das Thema richtig spannend.

    Schön auch das du die Erkenntnis mit uns teilst:thumbup:

    Was bedeutet das genau? Die Grundumwandlung von Hex in Dec habe ich verstanden, diese war vorher auch in der Funktion vorhanden.
    Das Thema PreProzessor ist mir neu


    #define hex2int(C) \

    (((C) >= '0' && (C) <= '9' ) ? C-'0' : ((C) >= 'A' && (C) <= 'F') ? C -'A' + 10 : -1)


    Gilt das für jeden Char und muss ich bei der Anwendung irgendetwas beachten?

    Hab den Aufruf nicht direkt gelesen, ist mir nun klar;)

    Hallo Kai,


    super, man legt quasi nur die 64bit Variable fest und kann so entsprechend umrechnen.


    Und ja der Simulator ist super, so kann man auch am Tablet oder anderem Device Versuche anstellen, ohne den Mikrocontroller angeschlossen haben zu müssen. Hatte nach deinem Post mit dem C Simulator nach etwas für Arduino gesucht und bin dan auf den Erwähnten gestoßen :)


    Naja, scheinbar simuliert er nicht zu 100% denn der Serial.println Befehl geht auf Fehler:


    call of overloaded 'println(uint64_t&)' is ambiguous


    Ein kurzes Anwerfen von Google brachte aber eine Lösung. Hier gibt es fertige Klassen die 64bit integer serial ausgeben können.

    Z.B. How to Print uint64_t in Arduino
    Da ich gern auf verfügbare Bibliotheken die ich über Arduino finden und einbinden kann zurückgreife habe ich alternativ die printHelpersgefunden
    Nachdem ich diese eingebunden habe und den Print Befehl in Serial.println(print64(erg)); abgeändert habe, wird es ohne Probleme auch von der Arduino IDE kompiliert und auf den Controller übertragen. Das angezeigte Ergebnis stimmt.

    Herzlichen Dank für deine Arbeit und Zeit !!!!!!

    Ich habe mal versucht den Hex Wert auf eine sehr einfache Art umzurechnen.
    Wie Kai schon erwähnt hat ist das nicht so einfach


    Wenn ich das hier probiere wird der max Wert des Datentypes uint32 4294967295 angezeigt.
    Ich bräuchte somit einen typ uint64. Anscheinend kann das der Arduino nicht.

    Wäre eine andere Programmiersprache eine Alternative z.B. Micropython?

    unsigned long s=((3 * pow(16,9))+(10 * pow(16,8)) + (3 * pow(16,7))+(15 * pow(16,6)) + (2 * pow(16,5))+(9 * pow(16,4)) + (10 * pow(16,3)) +(1 * pow(16,2)) + (07 * pow(16,1))+ 1);

    Danke auch dir Pius, habe nach dem Schreiben meiner Antwort gesehen dass du geantwortet hast.

    Die Idee, Dinge direkt auszuschließen, finde ich gar nicht so verkehrt. Wenn man sich einen bestimmten Stil angewöhnt stolpert man vielleicht nicht so schnell und verringert das Risiko eine lange Fehlersuche durchführen zu müssen.


    Und ja, wenn man weiß wie sich eine Sprache verhält und wie man mit ihr umzugehen hat ...


    Tatsächlich habe ich das so ähnlich probiert
    Temp[11] = 0 - ich wollte den kompletten char mit Nullen füllen, was irgendwie nicht geklappt hat.

    Ich werde, um beide Varianten der Nullterminierung zu verstehen, Beide mal anwenden

    Jetzt habe ich sogar den unteren Teil deines Beitrages #19 übersehen. Hat mir mein Pad garnicht angezeigt.


    Danke für das Vereinfachen des Codes. ich hatte das schon über zwei verschachtelte For Schleifen probiert und bin erst einmal gescheitert. Ich war froh es hinbekommen zu haben. Dein Code hilft mir das Thema For Schleife besser zu verstehen. Hatte auch nicht gewusst mehrere Bedingungen einfügen zu können. In der Befehlsreferenz von Arduino steht es nur so


    for (initialization; condition; increment) {

    // statement(s);

    }


    Ich nehme mal an ich muss das noch etwas ändern
    for(int i=strlen(input)-1, int y=0; i > -1; --i, ++y){


    Zum Thema Hex to Dec:


    Du hast natürlich recht, für das reine Vergleichen der Chip ID mit der zugelassenen ID benötige ich keine dieser Umrechnungen. Ich könnte hier direkt bestimmen. Das Thema lässt mich halt nicht so los. Ein Nice to have ist zudem die Anzeige der Daten auf dem Display und vielleicht später das Speicher n in einer kleinen Datenbank. Auch wenn das total überdimensioniert ist.

    Diese Art von Projekten bringen mich dazu die Programmierung und den entsprechenden Hardwareteil besser zu verstehen.

    Hab ich schon gelesen, jedoch wohl nicht komplett verstanden bzw. ich hatte angenommen die abschließende NULL Terminierung funktioniert automatisch. Und scheinbar habe ich das hier überlesen:


    Zitat

    Es ist natürlich auch möglich einen String mit "memset" immer wieder mit Nullen zu füllen. Das dürfte aber länger dauern, als wenn nur ein stadt[7]= "\0" verwendet wird.


    Ich habe noch viel zu lernen ;(

    Deshalb klappt es manchmal und manchmal nicht da noch Reste im Speicher sind, richtig?
    Probier ich morgen mal aus. Vielen Dank Pius!


    Kannst du mir einen Tip geben wie ich wie in meinem letzten Post den Wert in Dezimal umrechnen kann?

    Je mehr ich mich damit beschäftige desto mehr verstehe ich. Jedoch passt die Ausgabe beim Ländercode noch nicht.

    Manchmal funktioniert sie und. zeigt den 4 stelligen Wert und dann wird die zuvor gelesene nId angehangen.


    230323430373346303233343833303031303030303030303030307B843

    Chip ID: 304073F023

    Ländercode: 48304073F023 <-- korrekt wäre 4830



    Um die richtige ID auszugeben muss ich sie in Dezimal umwandeln. Dies klappt leider nicht, die Funktionen die ich gefunden habe scheinen immer nur einzelne Bytes umzurechnen, um auf das richtige Ergebnis zu kommen muss der komplette Wert genutzt werden.

    Habt ihr eine Idee?


    Hier ein Beispiel wie ich die nId gedreht habe, geht wahrscheinlich eleganter ;)
    Code im Online Simulator

    Aus dem Hex Wert 171A9253A3 wird dann 3A3529A171. Der richtige Dezimalwert ist 250000023921.

    Jetzt stehe ich vor meiner nächsten Herausforderung 🤭


    Das Zerteilen und weiterverarbeiten eines Char ist mir jetzt soweit klar.

    Nun möchte ich den zuvor manuell gesetzten Wert seriell einlesen.


    Einlesen über seriell2 und ausgeben über seriell1 funktioniert gut über Seriell2.read() und Seriell.print().

    Wenn ich nun aber die Daten in die Variable speichern möchte funktioniert das nicht mehr.


    Muss ich hier Byteweise einlesen, meine Versuche scheitern hier?


    Code
    1. char input[];
    2. int i=0;
    3. for(i=0;(Serial2.available()>0);i++){
    4. input[i]=Serial2.read();
    5. }

    Als Hintergrund: Ich versuche für unsere Katzen eine Zugangskontrolle mit einem RFID Reader zu bauen und möchte kontrollieren, welche Katze Zugang hat und den Versuch auch zu protokollieren.

    Die auf den ersten Blick einfach erscheinende Aufgabe des einlesen in eine Variable …


    Das Modul ist ein WL-134

    Beschreibung auf Aliexpress

    Genial, warum auch immer tue ich mich mit dem Thema Stringverarbeitung in C etwas schwer.
    Eure beiden Beiträge helfen mir sehr dabei tiefer ins Thema einzusteigen!
    Ich werde damit mal ein wenig spielen


    Vielen HerzlichenDank!

    Hab es so probiert:



    Bekomme leider eine Fehlermeldung:


    Code
    1. Arduino: 1.8.13 (Windows 10), Board: "WiFi Kit 32, Disabled, 240MHz (WiFi/BT), 921600, None"
    2. ascii:8:7: error: expected constructor, destructor, or type conversion before '(' token
    3. memset(laenderCode, 0, sizeof(laenderCode)); // ganzes Array mit 0x00 füllen, klar eigentlich müsste man lediglich das letzte Zeichen mit 0x00 setzen
    4. ^
    5. ascii:9:7: error: expected constructor, destructor, or type conversion before '(' token
    6. memcpy(laenderCode, input + StartPos, Lenlaendercode); // kopieren
    7. exit status 1
    8. expected constructor, destructor, or type conversion before '(' token

    Hallo Pius,


    vielen lieben Dank für die ausführliche Erklärung!
    Ich versuche mal das umzusetzen. memcpy hatte ich gar nicht auf dem Schirm. Ist immer schwierig die richtigen Suchbegriffe für Google zu finden ☺️

    Werde mein Ergebnis später posten


    Grüße

    Mike

    Könnt ihr mir erklären wie ich einen Char in mehrere Variablen aufteilen kann?

    Ich möchte dies anhand der Position bzw. Stelle machen. Sprich ab Stelle x bis y wird in Variable Z gespeichert.

    Im Internet finde ich nur Beispiele und Funktionen wo nach einem Zeichen. gesucht wird welches dann als Trenner dient.


    Code
    1. char input[] = "231374139323533413333343833303130303";
    2. char laenderCode[9];
    3. char nId[19];

    231374139323533413333343833303130303


    31374139323533413333 = nID

    343833 = laenderCode