Serielles Signal über Bluetooth als Text im MAX7219 darstellen

Hallo zusammen,

da Tommy mir eine große Hilfe geleistet hat und nun der Sender läuft, braucht es natürlich jetzt noch einen Empfänger, der die Signale auswertet.

Kurz zur Funktion die es haben soll:

Empfangen werden wieder die Zahl 0 oder 1.

Bei 1 => Darstellen von Text1 z. B. Frei.
Bei 0 => Darstellen von Text2 z. B. Besetzt.

und das ganze wieder von vorn. Hintergrund: 0 und 1 werden mit Hilfe eines Lichtsensores an das Bluetooth Modul gesendet.

Im Internet habe ich einen Sketch für mich abgewandelt, es zeigt aber keinen Text an. Was genau läuft hier falsch? Ich muss ja den Text sicherlich als [ ] schreiben.. Sprich wenn =='1' wird, zeige [Text1] an.. oder?

    /*
          8x8 LED Matrix MAX7219 Scrolling Text
              Android Control via Bluetooth
       by Dejan Nedelkovski, www.HowToMechatronics.com
       Based on the following library:
       GitHub | riyas-org/max7219  https://github.com/riyas-org/max7219
    */
    #include <MaxMatrix.h>
    #include <SoftwareSerial.h>
    #include <avr/pgmspace.h>
    PROGMEM const unsigned char CH[] = {
      3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
      4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
      4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
      4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
      4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
      3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
      4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
      3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
      3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
      

    };
    int dIn = 11;   // DIN pin of MAX7219 module
    int clk = 13;   // CLK pin of MAX7219 module
    int cs = 10;    // CS pin of MAX7219 module
    int maxInUse = 4;    // Number of MAX7219's connected
    MaxMatrix m(dIn, cs, clk, maxInUse);
    SoftwareSerial Bluetooth(8, 7); // Bluetooth
    byte buffer[10];
    char incomebyte;
    char text[100] = " "; // Initial text message
    int count = 0;
    char indicator;
    void setup() {
      m.init(); // MAX7219 initialization
      Bluetooth.begin(9600); // Default communication rate of the Bluetooth module
    }
    void loop() {
      // Printing the text
      
      if (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        if (indicator == '1') {
              text[count] = "Frei";
            
      }

Du solltest Dich mal mit Zeichenketten in C/C++ beschäftigen.

Gruß Tommy

Also wenn ich das jetzt richtig verstanden habe, brauche ich 2 Arrays? Eins für die Zahlenfolge Frei und eines für die Zahlenfolge Besetzt?

Sowas in der Art:

char text1 [] = "Frei"

char text2 [] = "Besetzt"

diese müsste ich dann natürlich noch definieren, da das ja in ein Text umgewandelt werden soll.. Deswegen ja auch das "PROGMEM", die ja dies umsetzen können? Ich müsste wahrscheinlich dann jedes einzelne ansteuern?

Ich gebe ja zu, dass mir hier das Verständnis fehlt. Aber vielleicht denke ich da auch zu kompliziert. Das ganze überfordert mich ein wenig, weil ich eben nicht weiß, welcher Weg zum Erfolg bringt.

Ich verstehe Deine Beschreibung nicht. Was willst Du erreichen?
Sowas?

char text[10];
...
if (indicator == '1') strcpy(text,"Frei");
else strcpy(text,"Besetzt");
Serial.println(text);

Gruß Tommy

Hallo ,

oder so. Stehst Du im Momnt im Wald und siehst die Bäume nicht ? :slight_smile:

if (indicator == '1') Serial.println("Frei");
else Serial.println("Besetzt");

Nachtrag

sorry ich hatte mich nur an dem Beitrag von Tommy orientiert. Du willst ja den Text auf der 8x8 Matrix zeichenweise scrolen lassen. Hab ich auch keine Ahnung von, Da wird aber doch Beispiele zu geben wie man Text da darstellen kann. Versuche doch erst mal nur so ein Beispiel und bau später den Rest dazu.

kleine schritte führen auch zum Ziel, bei grossen kommt man schon mal ins Stolpern

Heinz

kann gut sein.. ich sag ja, manchmal denkt man einfach zu kompliziert.

Funktioniert aber nicht. Es gibt mir im Monitor gar nicht aus, ob die 0 oder 1 überhaupt empfangen werden...

Mit dem einfachen Beispielsketch funktioniert es auch. Aber hier gebe ich ja den Text auch direkt ein und lade es hoch. Das funktioniert ja.

Das was jetzt nicht funktioniert, ist die Einbindung von Bluetooth.
In der Theorie etwa so:

Wenn du "das empfängst" => "zeige dies an".

Dann schau doch erst mal, was ankommt:

...
indicator = Bluetooth.read(); 
Serial.print("Indicator: ");
Serial.println(indicator,HEX);

Gruß Tommy

Es kommt nichts an.. irgendwo ist der Wurm drin :frowning:

Hallo,

ach so , das hat ja aber nichts mit Deinen Strings zu tun. Die 1 / 0 kommt nicht an , bzw du bekommst das nicht angezeigt ?

Na ja der codeschnipsel von Dir dazu ist ja auch nicht fertig. Dann lass dir doch einfach mal mit den von Tommy oder mir vorgeschlagenen Zeilen das Ergebniis von indicator anzeigen. Oder kommt da immer 0 an ?

Eventuell kommt ja auch mehr an als Du erwartets oder auch nix.

if (Bluetooth.available()) sollte die Anzahl der empfangenen Zeichen liefern

Serial.print(Bluetooth.read())

wäre mal ein erster Anlauf.

oder du lässt die den Hex code der zeichen ausgeben dann siehst Du auch die unsichtbaren Zeichen die ankommen. Wenn da nichts kommt musst Du wohl naoch mal an den Sender ran.

Heinz

Ok, muss aber dazu sagen, dass der Sender zum Test mein Handy dient.. Da kann ich ja auch Zahlen senden..

Hallo,

ok da wird mehr kommen als Du erwatest, oder er versteht Dein Handy nicht. Also Die Anzahl der Zeichenermitteln und alles auslesen und auf den Monitor und zus. Hex darstellen.

Heinz.

ok, also es kommen nun 0 und 1 an. Diese werden auch angezeigt.

Allerdings wird es so dargestellt: 0 1 und nicht wie gesendet wird 01. Mach das einen Unterschied?

Also liegt das problem daran, das er nicht weiß, was er damit machen soll.. Sprich Serialprint funktioniert nicht.

Wieso 01? Das sind 2 Zeichen. Rate mal, warum ich geschrieben habe, Du sollst Dir das in HEX anzeigen lassen?

Gruß Tommy

ja ok, anders ausgedrückt. 0 und 1 nur aben zusammengeschrieben. Hex sicherlich deswegen, um das empfangene als eine Dezimalzahl anzeigen zu lassen, da nur Binäre zahlen gesendet werden.. Kann das sein?

Schreibe mal in Deinen Loop:

while (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        Serial.println(indicator,HEX);
}

und stelle das, was da raus kommt hier ein.

Gruß Tommy

01010101010101010101010101

Das sieht nicht sehr gut aus.
Ändere mal:

while (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        Serial.print(" 0x"); 
        Serial.println(indicator,HEX);
}

Gruß Tommy

Aber warum ist das nicht gut? 0 und 1 werden ja gesendet. Und 0 und 1 empfangen.. versteh ich grad selber nicht.

Bei der Änderung kommt das gleiche Ergebnis raus.

Wenn da das gleiche Ergebnis raus kommt, machst Du was falsch.

Gruß Tommy

ok.. dann weiß ich nicht, was ich falsch mache..

so sieht der Code gerade aus:

    /*
          8x8 LED Matrix MAX7219 Scrolling Text
              Android Control via Bluetooth
       by Dejan Nedelkovski, www.HowToMechatronics.com
       Based on the following library:
       GitHub | riyas-org/max7219  https://github.com/riyas-org/max7219
    */
    #include <MaxMatrix.h>
    #include <SoftwareSerial.h>
    #include <avr/pgmspace.h>
    PROGMEM const unsigned char CH[] = {
      3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
      4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
      4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
      4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
      4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
      3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
      4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
      3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
      3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
      

    };
    int dIn = 11;   // DIN pin of MAX7219 module
    int clk = 13;   // CLK pin of MAX7219 module
    int cs = 10;    // CS pin of MAX7219 module
    int maxInUse = 4;    // Number of MAX7219's connected
    MaxMatrix m(dIn, cs, clk, maxInUse);
    SoftwareSerial Bluetooth(1, 0); // Bluetooth
    byte buffer[10];
    char incomebyte;
    char text[100] = " "; // Initial text message
    int count = 0;
    char indicator;
  
    void setup() {
      m.init(); // MAX7219 initialization
      Bluetooth.begin(9600); // Default communication rate of the Bluetooth module

    }
    void loop() {
      // Printing the text
      
      if (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();

while (Bluetooth.available()) {   // Checks whether data is comming from the serial port
        indicator = Bluetooth.read();   // Starts reading the serial port, the first byte from the incoming data
        Serial.print(" 0x");
        Serial.println(indicator,HEX);
}
}

      
if (indicator == '1') Serial.println("Frei");
else Serial.println("Besetzt");

      }