Hallo ich habe mir eine einfache GUI für meinem Arduino nach dem Tutorial von https://www.youtube.com/watch?v=1cQqYJCFm94
programmiert .
Nun habe ich das Problem das die LED nicht leuchtet wenn ich "On" drücke. Sondern das ich immer als Output "Off" bekomme. Das habe ich mit meinem Selbstgebauten Log gesehen.
Der Log von mir ist ein LCD was man auch im Code sieht.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
String dataCOM3;
char d1;
int pin = 13 ;
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hi hier ist ");
lcd.setCursor(2,1);
lcd.print("Jonathan :-)");
Serial.begin(9600);
pinMode(pin, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
if(Serial.available())
{
lcd.backlight();
lcd.clear();
lcd.setCursor(3,0);
dataCOM3 = Serial.readString();
d1 = dataCOM3.charAt(0);
if(d1 == "ON")
{
lcd.print("A");
digitalWrite(13, HIGH);
}
else if(d1 == "OFF");
{
lcd.print("a");
digitalWrite(13, LOW);
}
}
}
Der Code der GUI ist
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Arduino_GUI4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort1.Open();
}
private void On_Click(object sender, EventArgs e)
{
//Send Comand to the Arduino to turn Pin 13 on
serialPort1.Write("ON");
}
private void Off_Click(object sender, EventArgs e)
{
//Send Comand to the Arduino to turn Pin 13 OFF
serialPort1.Write("OFF");
}
}
}
Einen Timeout als Kommando Ende einzusetzen finde ich irgendwie seltsam.
char d1;
if(d1 == "ON")
Ein Buchstabe kann niemals 2 Buchstaben plus die Null sein.
Nein, man kann keine Zeiger auf Zeichenketten mit Buchstaben vergleichen.
Zumindest macht es keinen Sinn.
Das sollte es dir auch sagen, wenn du die Warnungen aktivierst.
Auch das eine Semikolon sitzt das falsch.
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino: In function 'void setup()':
sketch_oct28b:12:11: error: 'class LiquidCrystal_I2C' has no member named 'init'
12 | lcd.init(); // initialize the lcd
| ^~~~
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino: In function 'void loop()':
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino:34:16: warning: comparison with string literal results in unspecified behavior [-Waddress]
34 | if(d1 == "ON")
| ~~~^~~~~~~
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino:34:16: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino:40:21: warning: comparison with string literal results in unspecified behavior [-Waddress]
40 | else if(d1 == "OFF");
| ~~~^~~~~~~~
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino:40:21: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
E:\Programme\arduino\portable\sketchbook\sketch_oct28b\sketch_oct28b.ino:40:30: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
40 | else if(d1 == "OFF");
| ^
OK, der ": error: 'class LiquidCrystal_I2C' has no member named 'init'" geht auf mich.
Aber der Rest ist deins.
ok hast du Ideen warum ich immer nur ein Off Befehl bekomme und keinen On
oder eine Seite wo ich ein Funktionierendes GUI herunterladen kann
LG Jonathan
Was muss ich den an dem Code verändern das ich auch einen On Befehl bekomme?
Liegt es daran das ich oben "String" und "char" nutze und wie muss den Code verändern das ich keine Fehlermeldung mehr bekomme.
LG Jonathan
Ich glaube, um meine Antworten verstehen zu können, müsstest du erstmal die Sprache (C++) lernen, welche du verwendest und die Arduino Doku. Wenigstens in Ansätzen.
Was ist ein char
Was ist ein c-string
Was ist ein Arduino String
Dann wird dir auch klar, welchen Bock du da geschossen hast.
Aber ich versuchst trotzdem mal...
Du hast den Code eigenmächtig verändert.
Das ist eigentlich ok, aber nicht wenn man es so tut, dass nix mehr geht.
Also Rückbau auf Original, testen, und neu nachdenken.
Das formuliere ich nochmal anders:
Auf die Art Kommandos zu separieren wird nicht stabil funktionieren.
Das desynchronisiert irgendwann.
Es muss ein Protokoll erfunden werden.
Es muss ein Parser für genau das Protokoll erfunden werden.
z.B. gibt es auch fertige Protokolle und Parser, hier seien mal stellvertretend der CMDMessenger oder Firmata genannt
Auch gibts hier im Forum reichlich Beispiele für einfache Parser.
Ja, ich könnte dir da Änderungen einbauen.
Aber vermutlich verstehst du sie nicht. Wirst also kein Stück schlauer dadurch.
Das ist ganz sicher nicht mein Ziel.
Ich persönlich halte nicht viel von Videotutorials.
Dieser Thread bestätigt dieses Vorurteil.
Oftmals lernt man da, wie man es nicht machen sollte.
Selten wird dort ein Wort über die Grundlagen, das wie und warum, verloren.
so ich habe den Code jetzt mal so geändert das ich jetzt anstatt ON OFF 1 und 0 sende.
Wenn ich jetzt mir dataCOM3 ausgeben lasse bekomme ich für On 11 und für Off 0
Arduino Code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
String dataCOM3 ;
char d1;
int pin = 13 ;
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Hi hier ist ");
lcd.setCursor(2,1);
lcd.print("Jonathan :-)");
Serial.begin(9600);
pinMode(pin, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
if(Serial.available())
{
lcd.backlight();
lcd.clear();
lcd.setCursor(3,0);
dataCOM3 = Serial.readString();
d1 = dataCOM3.charAt(0);
if(d1 == '1')
{
lcd.print(dataCOM3);
digitalWrite(13, HIGH);
}
else if(d1 == '0');
{
lcd.print(dataCOM3);
digitalWrite(13, LOW);
}
}
}
Visual Studio Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Arduino_GUI4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort1.DtrEnable = false;
serialPort1.Open();
}
private void On_Click(object sender, EventArgs e)
{
//Send Comand to the Arduino to turn Pin 13 on
serialPort1.Write("1");
}
private void Off_Click(object sender, EventArgs e)
{
//Send Comand to the Arduino to turn Pin 13 OFF
serialPort1.Write("0");
}
}
}
Nein.
Ich lasse mich von Arduino Serial benachrichtigen, wenn ein neuer Buchstabe eingetroffen ist.
Eine Schleife ist das nicht.
Es ist eine ganz naive Form der "Ereignis gesteuerten/orientierten Programmierung" z.B. Wikipedia kann dir die Begriffe erklären.