Nextion Tutorial #9 – Silder (Steppergeschwindigkeit) / LED Dimmen (Zahlen Eingabe)
Nextion Tutorial #9 – Silder (Steppergeschwindigkeit) / LED Dimmen (Zahlen Eingabe)
Hier in diesem Blog geht es um den Slider vom Nextion Display. Mit diesem soll bei einem Schrittmotor die Geschwindigkeit gesteuert werden. Dann auch noch wie man eine LED dimmt per Nummerneingabe.
Schaltplan
Erstellen des Nextion Programm.
Ich werde hier nicht genau drauf eingehen wie das Nextion Programm im Einzelnen Erstellt wurde. Ich erkläre nur die Funktionen. Das Programm könnt Ihr herunterladen.
Beim Slider kann der maxval und minval eingestellt werden und die val gibt an was der Standard Wert ist.
Der Code
covx h0.val,value.txt,4,0
sendString.txt="DATA-SPED"
sendString.txt+=value.txt
sendString.txt+="?"
prints sendString.txt,0
steht im Event Touch Release drin, das bedeutet dieses Event wird dann ausgefährt wenn der Button losgelassen wird. Will man die Werte direkt beim bewegen des Sliders übertragen muss man den Code in das Event Touch Move einfügen.
Was passiert im Nextion Code?
Covx wandelt Zahlen in Text (String) um. Mit covx h0.val,value.txt,4,0 wird die Zahl vom Slider h0 in den String value.txt mit 4 Zeichen geschrieben. Danach wird DATA-SPED in den String sendString in Text Form geschrieben sendString.txt=“DATA-SPED“. Nun kommt über das += noch der value Text (sendString.txt+=value.txt) dazu und das ? (sendString.txt+=“?“). Somit haben wir z.B. DATA-SPED150? im sendString drin stehen. Dieser wird dann über prints sendString.txt,0 ausgegeben.
Das Gleiche machen wir dann mit der LED.
Mehr gibt es zum Nextion Code nicht zu sagen, bei fragen gern in die Kommentare oder per Mail.
Der Arduino Code
Schauen wir uns erstmal den Haupt Code an. Hier wird nich die Library MobaTools benötig.
#include
#include
SoftwareSerial nextion(6, 5); // RX, TX
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String daten_display = "";
const int STEPS1_UMDREHUNG = 800;
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper1( STEPS1_UMDREHUNG, STEPDIR );
const byte dir1Pin = 4;
const byte step1Pin = 7;
const byte enaPin = 8;
int vspeed = 200; //Steppergeschwindigkeit in U/min*10
int ledDelay = 0;
int led = 11;
void setup(){
nextion.begin(9600);
Serial.begin(115200); while (!Serial);
myStepper1.attach( step1Pin, dir1Pin );
myStepper1.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper1.setSpeed( 200 );
myStepper1.setRampLen( 0 ); // Rampenlänge 100 Steps bei 20U/min
pinMode(led, OUTPUT);
}
void loop() {
if (nextion.available()) {
NextionInput();
}
analogWrite(led, ledDelay);
myStepper1.setSpeed(vspeed);
myStepper1.rotate(1);
if (daten_display.endsWith(endChar)) {
Serial.println(daten_display);
Serial.println("error");
daten_display = "";
}
}
Hier werden die Librarys eingebunden, einmal für den Stepper (MobaTools) und einmal für das SoftwareSerial. Dann werden noch die Pins vergeben wo die Serielle Schnittstelle für das Display drüber laufen soll. Zeile 7 -12 sind Einstellungen für den Stepper. Welche Pins für den Treiber verwendet werden. Int vspeed ist für die Geschwindigkeit des Stepper gedacht und int ledDelay gibt den Wert für die Dimm Funktion der LED an von 0-255. int led=11 ist der Pin an dem die LED angeschlossen wird.
#include
#include
SoftwareSerial nextion(6, 5); // RX, TX
String endChar = String(char(0xff)) + String(char(0xff)) + String(char(0xff));
String daten_display = "";
const int STEPS1_UMDREHUNG = 800;
//Stepper einrichten ( 800 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper1( STEPS1_UMDREHUNG, STEPDIR );
const byte dir1Pin = 4;
const byte step1Pin = 7;
const byte enaPin = 8;
int vspeed = 200; //Steppergeschwindigkeit in U/min*10
int ledDelay = 0;
int led = 11;
Im Setupteil wird in Zeile 2 die Serielle Schnittstelle für das Display mit 9600 Baut aktiviert. In Zeile 3 die Serielle Schnittstelle für den Seriellen Monitor, braucht man an der Stelle nicht unbedingt. Dann in Zeile 4 wird der Stepper aktiviert mit den jeweiligen Pins, in Zeile 5 wir der Enable gesetzt. Zeile 6 gibt eine Geschwindigkeit schon vor, kann man auch auf 0 setzten. Zeile 7, hier kann eine Anfahrrampe eingestellt werden und in Zeile 8 wird der LED Pin aus Ausgang definiert.
void setup(){
nextion.begin(9600);
Serial.begin(115200); while (!Serial);
myStepper1.attach( step1Pin, dir1Pin );
myStepper1.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper1.setSpeed( 200 );
myStepper1.setRampLen( 0 ); // Rampenlänge 100 Steps bei 20U/min
pinMode(led, OUTPUT);
}
Im Loopteil wird das Display in Zeile 2-4 ausgelesen. In Zeile 5 wird die LED mit dem Wert für das Dimmen gesetzt. Zeile 6 wird dem Motor die Geschwindigkeit zugewiesen und Zeile 7 sagt mit der 1 das der Motor sich dauerhaft drehen soll mit 0 bleibt er stehen. Zeile 9-13 ist ein Errorhändling für das Display und Fehlinformation zu vermeiden.
void loop() {
if (nextion.available()) {
NextionInput();
}
analogWrite(led, ledDelay);
myStepper1.setSpeed(vspeed);
myStepper1.rotate(1);
if (daten_display.endsWith(endChar)) {
Serial.println(daten_display);
Serial.println("error");
daten_display = "";
}
}
Die NextionInPut Datei
Hier wurde nur das Auslesen des Displays ausgelagert.
void NextionInput() {
daten_display += char(nextion.read());
if (daten_display.length() > 5 && daten_display.substring(0, 5) != "DATA-") daten_display = "";
else {
if (daten_display.substring((daten_display.length() - 1), daten_display.length()) == "?") {
String command = daten_display.substring(5, 9);
String value = daten_display.substring(9, daten_display.length() - 1);
Serial.println(command + " : " + value);
if (command == "SPED") {
vspeed = value.toInt();
Serial.println("SPEED: ");
Serial.println(vspeed);
}
if (command == "LEDD") {
ledDelay = value.toInt();
Serial.println("ledDelay: ");
Serial.println(ledDelay);
}
daten_display = "";
}
}
}
Mit daten_display += char(nextion.read()); wird der gelesene String in daten_display gepackt. Dann wird abgefragt ob der String daten_display größer 5 Zeichen und die Stellen 0-5 nicht DATA- enthalten. Wenn das so ist wir der String daten_display gelöscht.
daten_display += char(nextion.read());
if (daten_display.length() > 5 && daten_display.substring(0, 5) != "DATA-") daten_display = "";
Wenn der String daten_display größer 5 Zeichen groß ist und im Zeichensatz 0-5 DATA- steht. Wird dann alles ab Zeile 2 abgearbeitet. In Zeile 2 wird der String daten_display so zusagen abgefragt ob am Ende ein ? steht, Ihr könnt hier auch ein anderes Zeichen nehmen als Abschluss. Mit String command = daten_display.substring(5, 9); wird das Zeichen 6-9 in den String command geschrieben. Das Gleiche passiert mit String value = daten_display.substring(9, daten_display.length() – 1); hier wird alles ab Zeichen 9 und Zeichen Gesamtlänge -1 in den String value geschrieben.
Dann wird in Zeile 7-11 der command Sting auf SPED geprüft und der Wert ind vspeed geschrieben. In Zeile 12-15 passiert dasselbe nur mit dem ledDelay Wert.
else {
if (daten_display.substring((daten_display.length() - 1), daten_display.length()) == "?") {
String command = daten_display.substring(5, 9);
String value = daten_display.substring(9, daten_display.length() - 1);
Serial.println(command + " : " + value);
if (command == "SPED") {
vspeed = value.toInt();
Serial.println("SPEED: ");
Serial.println(vspeed);
}
if (command == "LEDD") {
ledDelay = value.toInt();
Serial.println("ledDelay: ");
Serial.println(ledDelay);
}
daten_display = "";
}
}
}
Ich hoffe ich könnte es einigermaßen erklären.
Hier könnt Ihr euch die Daten zum Beitrag runterladen.
Blende / Gehäuse für Nextion 3.5″ Display (Bezel)
Du sparst
UNO R3 SMD ATmega328P Board mit USB Kabel Arduino Uno R3 kompatibel
Du sparst