Arduino waarde naar processing [OPGELOST!]

Hallo!

Ik ben op dit moment bezig met het bouwen van een morsecode installatie, met een knop. In arduino wordt dit verwerkt en in de Serial Monitor komen de letters tevoorschijn als er geklikt is op de knop. In processing wil ik de Serial Monitor lezen en deze weergeven in een scherm, maar hier gaat het fout. Ik krijg de letters niet te zien in het scherm.. Weten jullie misschien hoe ik dit werkend kan krijgen? Ik ben radeloos!

ARDUINO CODE

// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int i = 0;
int itw = 0;
String morseVar;

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  delay(buttonState + 100);

  if(buttonState == 1)
  {
    i++;
    itw = 0;
  }
  else
  {
    if (i == 1 || i == 2)
    {
     morseVar = morseVar + "K";
     i=0;
    }
    else if (i >= 3)
    {
     morseVar = morseVar + "G";
     i=0;
    }
  };
  
   if(buttonState == 0)
  {
    if(morseVar == ""){}
    else {itw++;};
    
    if (itw > 10)
    {
     morseVar = morseVar + "X";
     itw=0;
    }
  };
  
   if(morseVar.length() == 4)
  {
    if (morseVar == "KGXX")
    {
      Serial.println("A");
      morseVar = "";
    }
    else if (morseVar == "GKKK")
    {
      Serial.println("B");
      morseVar = "";
    }
    
    HET ALFABET --> ENZ...

    else if (morseVar == "GGKK")
    {
      Serial.println("Z");
      morseVar = "";
    }
    else
    {
      morseVar = "";
    }
  }
  
  if (buttonState == HIGH) {      
    digitalWrite(ledPin, HIGH); 
    tone(6, 10, 1000);
  } 
  else {
    digitalWrite(ledPin, LOW); 
    noTone(6);			
  }

}

PROCESSING CODE:

import processing.serial.*;

Serial port;
String input;
String zin;
int i = 0;

void setup() {
  // Setup the screen for output.
  textFont(createFont("Arial", 25));
  size(500, 300);
  background(0);
  fill(255);
  // List all the available serial ports:
  println(Serial.list());
  port = new Serial(this, Serial.list()[0], 9600);
  noLoop();
}

// Process a line of text from the serial port.
void serialEvent(Serial p) {
      input = (port.readString());
      if(input == null)
      {}
      else
      {
      
      zin = input;
      }
      loop();
}

void draw() {
  if(input== null)
  {}
  else{
  i++;  
  print(i);
    print(input);

    if(i==1)
    {text(input, 20, 60);noLoop();}
    if(i==2)
    {text(input, 37, 60);noLoop();}
  noLoop();
  }
}

Dag Renaldo90
Als ik je setup zo bekijk zie ik niet direct iets fout.
Wat ik me wel afvraag is waarom je arduino code en proicessing code hebt. Heb je zelf je serial montitor geschreven?
Indien zo heb je al eens geprobeerd met de arduino IDE bijgeleverde monitor?
Wat ik zou doen is de setup code vervangen door deze:

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  Serial.println("morse code sleutel is klaar voor gebruik");
}

Zo weet je zeker of serial werkt of niet.
Indien je de boodschap krijgt op je monitor zit het probleem in je morse code afhandeling. Anders zit het in je monitor setup.
Dan kan je best de IDE monitor proberen en zorg er zeker voor dat je daar ook 9600 gebruikt. Anders zie je ook niks.

Met vriendelijke groet
Jantje

Jantje:
Dag Renaldo90
Als ik je setup zo bekijk zie ik niet direct iets fout.
Wat ik me wel afvraag is waarom je arduino code en proicessing code hebt. Heb je zelf je serial montitor geschreven?
Indien zo heb je al eens geprobeerd met de arduino IDE bijgeleverde monitor?
Wat ik zou doen is de setup code vervangen door deze:

void setup() {

// initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);     
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

Serial.begin(9600);
  Serial.println("morse code sleutel is klaar voor gebruik");
}



Zo weet je zeker of serial werkt of niet.
Indien je de boodschap krijgt op je monitor zit het probleem in je morse code afhandeling. Anders zit het in je monitor setup.
Dan kan je best de IDE monitor proberen en zorg er zeker voor dat je daar ook 9600 gebruikt. Anders zie je ook niks.

Met vriendelijke groet
Jantje

Beste Jantje,

Ik heb al veel tests uitgevoerd en ben erachter gekomen dat het probleem niet in de arduino code ligt, maar in de processing code. Ik heb inderdaad de code zelf geschreven. Het probleem is volgens mij dat de scope van de variable alleen in de functie void serialEvent(Serial p) blijft. Ik heb geen idee hoe ik deze variable globaal kan maken..

Renaldo
Heb je al getest met de arduino serial monitor.
Als het daar mee werkt weet je zeker dat het aan je code ligt.
Als het aan je code ligt zal je toch wat meer info moeten geven wat je gebruikt om die code te schrijven.
In welke tool/taal schrijf je die code? Op basis van de import lijkt het me java te zijn. Java heeft echter geen goede ondersteuning voor serial monitors. Ikzelf heb er uren aan gespendeerd om het aan het werk te krijgen.
Waarom wil je je eigen serial monitor schrijven?

Met vriendelijke groet.

Beste Jantje,

De code die ik gebruik is de code van arduino. Volgens mij zie ik iets over het hoofd of heb ik het verkeerd uitgelegd.

De serial monitor werkt goed. Als ik deze test, dan krijg ik in processing de letter die ik in arduino in de serial monitor heb gezet. Alleen verlies ik de letter (die in de variable input zit) als hij buiten de functie "void serialEvent(Serial p)" is. Ik heb de input bovenaan de code genoemd, dus het zou een globale variable moeten zijn, maar toch pakt hij het niet in de functie void draw(). Misschien ligt het aan de volgorde dat de scripts worden gelezen?? Bij void draw() gaat er dus iets fout.. Weet jij misschien wat hier precies aan de hand is?

Met vriendelijke groet,

Renaldo

Renaldo
Volgens mij heb je een java multythreading probleem. Ik kan je daar echter zelf niet mee helpen daar ik er niet genoeg vanaf ken.

Met vriendelijke groet
Jan

Hallo!

Ik heb het werkend gekregen. De code voor arduino heb ik niet aangepast. Voor processing heb ik deze code gebruikt:

import processing.serial.*;

Serial port;
PImage b;
String input = "";
String zin = "";

void setup() {
  // Setup the screen for output.
  textFont(createFont("Arial", 25));
  size(300, 460);
  b = loadImage("background.jpg");
  background(b);
  fill(255);
  // List all the available serial ports:
  println(Serial.list());
  port = new Serial(this, Serial.list()[0], 9600);
}

void draw() {  
  if(port.available() > 0)
    {
      b = loadImage("background.jpg");
      background(b);
      input = (port.readString());
      print(input);
      zin = zin + input;
      text(zin, 30, 40);
    }
    else
    {};
}

Renaldo

Renaldo
Blij te horen dat je het hebt op kunnen lossen.
Was het inderdaad een thread probleem?
Met vriendelijke groet.
Jantje

Jantje,
Ik weet niet zo goed wat een thread probleem is, maar het probleem was dat de functie die tussen setup en draw stond, niet goed gelezen werd. Ik heb nu de losse functie in draw gevoegd en werkt gelukkig nu!
Bedankt voor je tijd!

Renaldo

@renaldo90 als ik mag voorstellen om de titel van je oorspronkelijke post te wijzigen naar:

"Arduino waarde naar processing [SOLVED]"

zo weet iedereen meteen, dat je probleem werd opgelost. Probeer dit ook te doen in andere forum-secties.

veel Arduino plezier.

"Arduino waarde naar processing [SOLVED]"

[OPGELOST] ? :wink:

[OPGELOST]
Das de juiste spirit :smiley:

Met groeten uit vlaanderen
Jantje

[OPGELOST]
Das de juiste spirit

Met groeten uit vlaanderen
Jantje

jajaja, net wat ik bedoelde :*