Ankündigung

Einklappen
Keine Ankündigung bisher.

Arduino Code to PHP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Arduino Code to PHP

    Hallo Zusammen,

    ich bin durch einen Artikel in der c't auf das Thema Sharespresso gestoßen.

    Da wir aber schon ein funktionierendes Kaffeeabrechnungssystem mit RFID Cards auf PHP Basis haben, stellte sich mir die Frage, ob man den Arduino Code nicht auch mit PHP nachbilden könnte.

    Ich habe mir den entsprechenden Code auf der GitHub Seite zu Gemüte geführt. Leider habe ich noch keinen so richtigen Ansatz wie ich z.B. das hier:

    Code:
    void toCoffeemaker(String outputString)
    {
      for (byte a = 0; a < outputString.length(); a++){
        byte d0 = 255;
        byte d1 = 255;
        byte d2 = 255;
        byte d3 = 255;
        bitWrite(d0, 2, bitRead(outputString.charAt(a),0));
        bitWrite(d0, 5, bitRead(outputString.charAt(a),1));
        bitWrite(d1, 2, bitRead(outputString.charAt(a),2));
        bitWrite(d1, 5, bitRead(outputString.charAt(a),3));
        bitWrite(d2, 2, bitRead(outputString.charAt(a),4));
        bitWrite(d2, 5, bitRead(outputString.charAt(a),5));
        bitWrite(d3, 2, bitRead(outputString.charAt(a),6));
        bitWrite(d3, 5, bitRead(outputString.charAt(a),7));
        myCoffeemaker.write(d0);
        delay(1);
        myCoffeemaker.write(d1);
        delay(1);
        myCoffeemaker.write(d2);
        delay(1);
        myCoffeemaker.write(d3);
        delay(7);
      }
    }
    Sinnvoll per PHP abbilden kann. Hat hier jemand Erfahrung und/oder Tipps? Vorallem mit den Bitoperationen tue ich mich gerade bißchen schwer, das genau einzunorden.

    Danke im Voraus

    Bitte um Nachsicht, habe keine Arduino Erfahrung
    Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

    #2
    [Bitte ersten Post ignorieren, das war Unfug]
    Der eingegangene String wird zeichenweise zerlegt (Schleife über a), dann werden die 8 bit jedes Zeichens wie folgt auf 4 Byte verteilt:
    Bit 0 -> Byte 0, Bit 2
    Bit 1 -> Byte 0, Bit 5
    Bit 2 -> Byte 1, Bit 2
    ...
    Der Rest wird mit Einsen aufgefüllt. Dann werden die vier so entstandenen Bytes an die Kaffeemaschine gesendet.

    Wenn du das in PHP machen willst, brauchst du eine PHP-to-Serial-Lösung. Geht bestimmt. Willst du dann einen RPi in die Maschine montieren?

    Max
    Zuletzt geändert von l0wside; 03.06.2016, 13:56.

    Kommentar


      #3
      Hi, danke für die Bestätigung, genau so habe ich das auch interpretiert.

      Habe das nun wie folgt mit PHP umgesetzt.

      PHP-Code:
      function toCoffeemaker($serialcode){
       
      $length strlen($serialcode);
       
      $counter 0;
       
      //Umsetzung der einzelnen Ascii Werte als binary in ein Array
       
      while ($counter $length) {
        
      $serialcode_array[$counter] = str_pad(decbin(ord($serialcode[$counter])), 8"0"STR_PAD_LEFT);
        
      $counter++;
       }
       foreach (
      $serialcode_array as $a){

        
      $d0 decbin(255);
        
      $d1 decbin(255);
        
      $d2 decbin(255);
        
      $d3 decbin(255); 
        
        
      $d0[2] = $a[0];
        
      $d0[5] = $a[1];
        
        
      $d1[2] = $a[2];
        
      $d1[5] = $a[3];
        
        
      $d2[2] = $a[4];
        
      $d2[5] = $a[5];
        
        
      $d3[2] = $a[6];
        
      $d3[5] = $a[7];
        
        if (
      ser_isopen()){
         
      //echo "Ser is open!";
         
      ser_writebyte ($d0);
         
      usleep(1000);
         
      ser_writebyte($d1);
         
      usleep(1000);
         
      ser_writebyte($d2);
         
      usleep(1000);
         
      ser_writebyte($d3);
         
      usleep(7000); 
        } else {
         
      ser_open"COM2"96008"None""1""None" );
         
      //echo "Ser opened!";
         
      ser_writebyte ($d0);
         
      usleep(1000);
         
      ser_writebyte($d1);
         
      usleep(1000);
         
      ser_writebyte($d2);
         
      usleep(1000);
         
      ser_writebyte($d3);
         
      usleep(7000); 
        }
       }

      Jetzt muss ich das nur noch testen, ob die Kaffeemaschine auch darauf reagiert ;-)
      Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

      Kommentar


        #4
        Hi,

        habs erst gerade gesehen - wollte Dir aber meine Erfahrung mit einer Jura am Bus nicht vorenthalten.

        Da die Jura TTL braucht, war es für mich am einfachsten, einen Arduino Nano Klon per USB an meinen Server anzubinden. Anstelle nur TTL auf USB zu wandeln erledigt dieser auch noch die Umwandlung der Befehle und in meinem Fall einen Autostart inkl. Spülen der Maschine.

        Ich sende also per php lediglich die Klartext Kommandos an den Arduino - dieser erledigt den Rest.

        PHP-Code:
        <?PHP

        $fp 
        =fopen("/dev/ttyUSB1""w");
        sleep(2);
        //fwrite($fp, 'FA:02');
        //fwrite($fp, 'Autostart');
        fwrite($fp'AN:02');
        fclose($fp);

        ?>

        Arduino Programm:

        Code:
        /* This Arduino sketch is intended for use with coffeemakers with toptronic control (e.g. my Jura Impressa S95) and allows to communicate with the coffeemaker for diagnosis, testing and modifying purposes.
          and was written in December 2014 by Oliver Krohn. Serial console should be set to include CR and NL. Hardware needed: Arduino, 4 male/female jumper wires, coffeemaker with service port.
          
        Modified in 2016 by MSW for Autostart Jura ans Ascii Commands...
        
          Here are some commands (valid for Jura Impressa S90/95 only! Use at your own risk!):
        
          AN:01 switches coffeemaker on
          AN:02 switches coffeemaker off
          FA:04 small cup
          FA:05 two small cups
          FA:06 large cup
          FA:07 two large cups
          FA:08 steam
          FA:09 steam
          FA:0C XXL cup
          ?M1  Inkasso mode off
          ?M3  Inkasso mode on
        
        */
        
        #include <SoftwareSerial.h>
        
        SoftwareSerial mySerial(4, 5); // RX TX
        
        byte z0;
        byte z1;
        byte z2;
        byte z3;
        byte x0;
        byte x1;
        byte x2;
        byte x3;
        byte x4;
        byte intra = 1;
        byte inter = 7;
        
        void setup() {
          Serial.begin(9600);
          mySerial.begin(9600);
          // initialize digital pin 13 as an output.
          pinMode(13, OUTPUT);
        }
        
        void loop() {
          // read the sensor:
          if (Serial.available() > 0) {
            //int inByte = Serial.read();
            String Text = Serial.readString();
            //Serial.print("sss" + Text);
            toCoffeemaker(Text + "\r\n");
        
            if (Text == "Autostart") {
              //Autostart Text
              toCoffeemaker("AN:01\r\n");
              delay(10000);
              toCoffeemaker("FA:02\r\n");
            } else {
              //Text als Befehl
              toCoffeemaker(Text + "\r\n");  
            }
          }
        }
        
        
        
        void toCoffeemaker(String outputString)
        {
          for (byte a = 0; a < outputString.length(); a++) {
            byte d0 = 255;
            byte d1 = 255;
            byte d2 = 255;
            byte d3 = 255;
            bitWrite(d0, 2, bitRead(outputString.charAt(a), 0));
            bitWrite(d0, 5, bitRead(outputString.charAt(a), 1));
            bitWrite(d1, 2, bitRead(outputString.charAt(a), 2));
            bitWrite(d1, 5, bitRead(outputString.charAt(a), 3));
            bitWrite(d2, 2, bitRead(outputString.charAt(a), 4));
            bitWrite(d2, 5, bitRead(outputString.charAt(a), 5));
            bitWrite(d3, 2, bitRead(outputString.charAt(a), 6));
            bitWrite(d3, 5, bitRead(outputString.charAt(a), 7));
        
            mySerial.write(d0);
            delay(1);
            mySerial.write(d1);
            delay(1);
            mySerial.write(d2);
            delay(1);
            mySerial.write(d3);
            delay(7);
          }
        }

        Viel Erfolg.....

        Viele Grüße

        Marc

        Kommentar


          #5
          Wow danke Marc. Welchen Arduino Klon hast du benutzt? Unter welchem OS läuft die Anbindung?!

          Wie bekommst du die Rückmeldung, von der Maschine?
          Zuletzt geändert von magiczambo; 09.06.2016, 11:07.
          Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

          Kommentar


            #6
            Weiß jemand, ob das auch mit aktuellen Bosch-/Siemens-Geräten geht?

            Max

            Kommentar


              #7
              Hi magiczambo,

              Rückmeldung brauche ich nicht. Deshalb habe ich diese aus meinem Code entfernt.
              So spannend finde ich diese auch wieder nicht. Da sind die alten Juras einfach 10 Jahre alt und nicht so gesprächig. Mann kann nat. das ganze EEprom auslesen und z.B. die Bezüge und div. Einstellungen anzeigen und ändern.

              Meine Motivation war eigentlich nur die, dass ich morgens im OG die Kaffemaschine anschalten und spülen wollte um dann im EG direkt einen Kaffee zu zapfen.

              Der Klon ist dieser: http://www.e***.de/itm/172087220535 (ganz schön teuer geworden - 4,59€ :-)).

              Die Anbindung läuft dann (bei mir) unter Linux - um genau zu sein in Edomi - deshalb die php. Perl geht genauso in Richtung Cometvisu/Wiregate.
              Erste Tests habe ich mit Win10 und HTerm gemacht. Durch den CH340 auf dem Arduino ist dieser unproblematisch. Also quasi OS unabh.

              Was willst Du denn mit der Anbindung anstellen ? Dann kann ich besser helfen....

              Gruss

              ​​​​​​​Marc

              Kommentar


                #8
                Hi Marc,

                also im Grunde habe ich ein aktuelles funktionierende Kaffeemaschinen Programm auf PHP und MySQL Basis programmiert, welches anhand eines Legic Kartenlesers den jeweiligen Kaffee abbucht.

                Dies würde ich nun gerne so lösen, das nur, wenn die Karte an den Leser gehalten wird und des Besitzers Konto belastet wurde eine lokale Bedienung freigegeben wird (Inkasso Modus)

                Das ganze läuft auf XAMPP Basis unter Windows.

                Ich habe mir nun diesen Nano zugelegt. Im Grunde gibt es ja den Code in dem Arduino Sketch (from Coffeemaker) bereits. Nur wie könnte ich nun die Kommunikation zwischen dem Windows 7 PC per USB bidirektional sicherstellen? Hierzu fehlt mir gerade so ein bißchen der Ansatz.

                Danke im voraus.
                Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

                Kommentar


                  #9
                  Ohne mich mit dem Inkasso-Mode beschäftigt zu haben Könntest Du imo enweder:
                  * Den Inkasso Mode nach dem Abbuchen für x sec deaktivieren und danach wieder aktivieren (einfach zu lösen, mit dem delay aber nicht so sicher)
                  * Inkasso deaktivieren, anschließend in einem loop das EEprom auslesen - bis die Bezüge +1 anzeigen, dann inkasso wieder aktivieren (nach meinem Gefühl die kompizierteste Variante
                  * Inkasso einmalig aktivieren - Müsste M3 als Befehl sein. Dann über Dein Tool per php die Maschine anschalten, spülen, Kaffeearten (ggf. mit unterschiedl. Preis) starten... (mein Favorit - einfacher als V2)

                  Ob Windows oder Linux ist php im Prinzip egal. Ich denke Du musst nur mein ttyUSB1 gegen Deinen COMx ersetzen. Hänge Dir noch ein paar HTerm Dateien an. Mit dieser habe ich unterWin getestet. (im hts File sind ein paar Befehle schon hinterlegt)
                  Angehängte Dateien

                  Kommentar


                    #10
                    und so kannst Du dann das ganze einbauen:

                    Bildschirmfoto 2016-06-11 um 10.46.52.jpg

                    Hier in einer S95. Das Kabel liegt ungenutzt hinter dem Leistungsprint. Ich habs aber umgepinnt, damit ich direkt den Arduino anstecken kann.

                    Belegung (bei meinem Sketch):
                    5V ge n.V.
                    Rx or D5 - PIN 5
                    gnd ro GND - PIN 1
                    tx br D4 - PIN4

                    Kommentar


                      #11
                      @ l0side
                      hallo max,
                      hier werden auf der Hauptseite Bosch und Siemens aufgefuehrt. Vielleicht hilft auch Maschine aufmachen und nach der seriellen Schnittstelle zu suchen wie sie hier abgebildet sind

                      http://protocoljura.wiki-site.com/in...ial_interfaces

                      Kommentar


                        #12
                        MSW : Vielen Dank schonmal für deine Ausführungen. Ich habe eine Xs90 von Jura, die hat einen RS232 Stecker. Laut der Seite http://protocoljura.wiki-site.com/in...ial_interfaces

                        hat der Stecker folgende Belegung:
                        Pin 1 2 3 4 5 6 7 8 9
                        Signal TxD (out) GND RxD +5V nc nc nc nc nc
                        Sehe ich das richtig, dass ich nur die Pins 1 und 3 an den Nano anschließen muss? Da die Jungs von der C´t ja auch immer nur von 2 Pins sprechen, welche sie belegt haben.

                        Sprich ich lege Pin 1 vom RS 232 Stecker auf Pin 4 vom Nano und Pin 3 vom RS 232 auf Pin 5 vom Nano?! Oder muss der GND und 5V auch verbunden werden?

                        Wie hast du die Kommunikation von PHP zu deinem COM Port gelöst in deiner Testumgebung? Meines Wissens kann PHP den COM Port nicht nativ ansprechen nur mit entsprechenden "Erweiterungen" z.B. http://www.thebyteworks.com/phpserial/index.html

                        Vielen Dank im Voraus

                        Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

                        Kommentar


                          #13
                          Du musst GND noch zusammenbringen, da Du die +5V vom USB bekommst. Nach der Protokoll-Seite müsste dort auch der TTL Pegel liegen. Ansonsten müsste die XS90 auch den nicht verwendeten Stecker hinter der Leistungsplatine haben.

                          Ich würde schrittweise vorgehen:
                          1. Mit HTERM die Maschine Ein/Ausschalten, einen Kaffee machen (dann bist Du sicher dass HW-seitig alles läuft)
                          2. php testen (imo fopen(COM1,r) o.ä. - notfalls über ein shellexec - mit php und Win kann ich Dir aber ansonsten nicht helfen)

                          PHP hatte ich nie unter Win laufen. Nach Schritt 1 bin ich dann direkt in meine Linux-Testumgebung gewechselt.

                          Gib bescheid wenn 1 klappt.....

                          VG

                          Kommentar


                            #14
                            Ok Kommunikation funktioniert.....also mit hterm lässt sich die Maschine steuern. Aber einschalten geht nicht....nur ausschalten.

                            Jetzt werde ich nur noch in die PHP Umsetzung gehen müssen.
                            Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

                            Kommentar


                              #15
                              Erfolgsmeldung!

                              Funktioniert.

                              Nur die 5 Sekunden die einem im Inkassomodus zum bezahlen bleiben sind ein bißchen knapp! Aber damit muss man wohl leben.
                              Geniale Menschen sind selten ordentlich, ordentliche selten genial. (Albert Einstein)

                              Kommentar

                              Lädt...
                              X