Go Down

Topic: Cocktail Mischer (Read 1 time) previous topic - next topic

michael_x

Code: [Select]
int Alles = Serial.read();  // Alles enthält nun eine Zahl zwischen -1 und 255, aber nie eine 3000

Normalerweise ist es einfacher und üblich, über Serial Texte statt Binärdaten zu übertragen.

Quote
Der Uno bekommt von der Handy App Signale wie z.B. 3430 für: 3= Longdrink, 4= 400ml, 30=30% Alkohol.
Bekommt er den Text "3430" oder die zwei Bytes {0x66, 0x0D} oder 0d66, was der Zahl 3430 entspricht?
Bekommt er zusätzlich zum Text "3430" auch noch ein Zeilenende übertragen ?
(Dann musst du nicht warten, bis kein Zeichen mehr gekommen ist, musst das Zeilenende aber auch weglesen. Das sind dann 5 oder 6 Zeichen)
Oder sendet die App immer genau 4 Zeichen und dann sehr lange nichts?



Gundulf

Ich hatte jetzt vor 2 Bytes für die Zahl zu übertragen. Und es sind immer 4-stellige Ziffern. Ich könnte mir auch eine Übersetzung von Buchstaben zu Zahlen erstellen wenn das einfacher ist.
Mit atoi könnte ich dann Buchstabe für Buchstabe bzw. Zahl für Zahl auswerten oder? Die Zerlegung habe ich mir noch nicht angelesen weil ich dachte dass ich sie nicht brauche :D

Tommy56

Es wäre sinnvoll, wenn Du die gestellten Fragen beantwortest. Dann könnte Dir gezielter geholfen werden.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Gundulf

Entschuldigung, ich verstehe noch nicht alle Fragen und worauf ihr genau damit abziehlt, ich dachte ich hätte geantwortet.
Der arduino bekommt 0d66 für die Zahl "3430" übertragen und kein Zeilenende. Und ich übertrage immer 4stellige Zahlen und danach kommt eine Pause von min 10 Sekunden (Hier wollte ich ein Timeout nutzen)
Noch mal Danke für die echt schnelle und gute Hilfe :)

Tommy56

Da solltest Du dann das höherwertige Byte zuerst senden.
Beim Empfang setzt Du das in einen unsigned int und verschiebst es 8 Bitpositionewn nach links. Dann addierst Du das 2. Byte und Du hast Deine Zahl.
Pseudocode:
Code: [Select]

unsigned int zahl;
byte c = Serial.read();
zahl = c;
zahl = zahl <<8;
c = Serial.read();
zahl += c;


Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Gundulf

#20
Sep 30, 2018, 03:08 pm Last Edit: Sep 30, 2018, 03:22 pm by Gundulf
Ok, habe es mir jetzt etwas einfacher gemacht, weil ich einfach noch nicht genug kann. Dadurch wird der Code zwar länger aber (für mich) besser verständlich. Jetzt sende ich nur noch Zahlen bis knapp über 100 an meine UNO und so brauche ich auch nur einen byte oder? Aber bei mir ziehen die Relais bei gar keiner Zahl an und ich verstehe nicht wieso.

Ich habe in der App überprüft welche Zahlen raus gehen und die Zahlen passen alle zu den jeweiligen Kombinationen und die UNO empfängt auch Daten (TX-LED leuchtet auf), aber die Relais bleiben aus.
Habe ich irgendwo wieder einen grundlegenden Fehler gemacht? Wäre nett, wenn jemand mir da helfen könnte :)

Code: [Select]

#define Pumpe1 2

#define Pumpe2 3

#define Pumpe3 4

#define Pumpe4 5

#include <SoftwareSerial.h>  // Einbinden der Bibliothek für Software-UART

int Menge;
byte Alles;
float Anteil, Dauer1, Dauer2;


void setup()
{
  Serial.begin(38400);

  pinMode(Pumpe1, OUTPUT);

  pinMode(Pumpe2, OUTPUT);

  pinMode(Pumpe3, OUTPUT);

  pinMode(Pumpe4, OUTPUT);

  digitalWrite (Pumpe1, HIGH);

  digitalWrite (Pumpe2, HIGH);

  digitalWrite (Pumpe3, HIGH);

  digitalWrite (Pumpe4, HIGH);

  delay(1000); // Für die Relais
}

void loop()
{

  if (Serial.available() > 0)     // Wenn min 1 byte empfangen werden
  {
    Alles = Serial.read(); // Speichere das empfangenen Byte in der Variable "Alles"

    if ((Alles > 10) && (Alles < 20))                                   // 100ml Longdrink, Zahlen von 11-18
    {
      Anteil = ((Alles / 10) - 1);  // 1.4 - 1 = 0.4
      Dauer1 = 100 * Anteil;
      Dauer2 = 100 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 20) && (Alles < 30))                                   // 200ml Longdrink
    {
      Anteil = ((Alles / 10) - 2);        //Zahlen von 21-28
      Dauer1 = 200 * Anteil;
      Dauer2 = 200 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(400);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(400);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 30) && (Alles < 40))                                   // 300ml Longdrink
    {
      Anteil = ((Alles / 10) - 3);        //Zahlen von 31-38
      Dauer1 = 300 * Anteil;
      Dauer2 = 300 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 40) && (Alles < 50))                                   // 400ml Longdrink
    {
      Anteil = ((Alles / 10) - 4);        //Zahlen von 41-48
      Dauer1 = 400 * Anteil;
      Dauer2 = 400 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 50) && (Alles < 60))                                   // 20cl Shot
    {
      Anteil = ((Alles / 10) - 5);        //Zahlen von 51-58
      Dauer1 = 20 * Anteil;
      Dauer2 = 20 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 60) && (Alles < 70))                                   // 40cl Shot
    {
      Anteil = ((Alles / 10) - 6);        //Zahlen von 61-68
      Dauer1 = 40 * Anteil;
      Dauer2 = 40 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if ((Alles > 70) && (Alles < 80))                                   // Random 2cl Shot
    {
      Anteil = ((Alles / 10) - 7);        //Zahlen von 71-76
      Dauer1 = 20 * Anteil;
      Dauer2 = 20 * (1 - Anteil);
      digitalWrite (Pumpe1, LOW);
      delay(Dauer1);
      digitalWrite (Pumpe1, HIGH);
      digitalWrite (Pumpe2, LOW);
      delay(Dauer2);
      digitalWrite (Pumpe2, HIGH);
      Alles = 0;
    }

    else if (Alles == 101)                                  //43 mit Milch
    {
      digitalWrite (Pumpe1, HIGH);
      delay(100);
      digitalWrite (Pumpe1, LOW);
      digitalWrite (Pumpe2, HIGH);
      delay(300);
      digitalWrite (Pumpe2, LOW);
      Alles = 0;
    }
    else if (Alles == 102)                                   //Adria Look
    {
      digitalWrite (Pumpe1, HIGH);
      delay(100);
      digitalWrite (Pumpe1, LOW);
      digitalWrite (Pumpe2, HIGH);
      delay(300);
      digitalWrite (Pumpe2, LOW);
      Alles = 0;
    }

  }
}

HotSystems

Würdest du bitte deinen Sketch in Code-Tags setzen, damit wir den alle vernünftig lesen können.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

HotSystems

Ok, so ist es besser. ;)

Hast du dir denn den Inhalt deiner übertragenen Werte mal auf dem seriellen Monitor angesehen ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Gundulf

Jap, habe ich jetzt gemacht. Da bekomme ich wenn ich zum Beispiel 37 als DEC übertrage:
120120
128128
128128
00
00
00

und wenn ich es als BIN übertrage:
00
248248
00
120120
00

Ich musste komischerweise bei meiner App  für die binäre '37' eine 4Byte-Übertragung nehmen. Bei dem Deca-System würde es auch mit einer 1Byte-Übertragung klappen. Ist es ein Fehler der App, dass die so viele Werte überträgt und deswegen mehrere Byte braucht?

postmaster-ino

Hi

120120 wird kein Byte sein - mit viel Liebe sind Das zwei Byte.
Gleiches bei 128128.
Was, bitte, empfängst Du Da?
12 01 20 ergibt auch keine '37' - oder wie soll ich hier rechnen?

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

uwefed

Hi

120120 wird kein Byte sein - mit viel Liebe sind Das zwei Byte.
Gleiches bei 128128.
Was, bitte, empfängst Du Da?
12 01 20 ergibt auch keine '37' - oder wie soll ich hier rechnen?

MfG
120 und 120 bzw 128 und 128 auch nicht.
Grüße Uwe

postmaster-ino

Hi

120 'passt' aber in ein Byte, Gleiches bei der 128.
Mir erschließt sich (immer noch) nicht, WAS Da empfangen wurde.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Gundulf

Ich habe heute das Programm neu auf mein Handy gezogen ohne was zu verändern und heute hat es wunderbar geklappt, keine Ahnung warum. Das Programm läuft bei mir jetzt so wie es soll und jetzt muss ich noch die Mechanik in einen Koffer einbauen und bin dann fertig.
Vielen Dank für all eure Hilfe, hätte es sonst niemals geschafft. Macht es Sinn nachher wenn ich fertig bin  ein Projekt dafür im ProjectHub anzulegen? Damit andere, die auch einen tragbaren Cocktail-Bot bauen wollen vielleicht ein paar Ideen sammeln können?

Danke nochmal und LG
Gundulf

Go Up