celleron:
Leider konnte ich den Code nicht kommentiert posten, da ich über die maximal erlaubte Zeichen hier im Forum kam.
Der Code aus den malerischen leerzeichen befreit:
#include <U8g2lib.h>
#include <Wire.h>
#define ENA 9 // Schritmotor Treiber Enable Pin
#define STP 3 // Schritmotor Treiber Step Pin
#define DIR 2 // Schritmotor Treiber Direction Pin
#define MS1 8 // Schritmotor Treiber MSI1 Pin
#define MS2 7 // Schritmotor Treiber MSI2 Pin
#define MS3 6 // Schritmotor Treiber MSI3 Pin
#define HOCH 10 // Taster/LED Pin für Taste "Hoch"
#define RUNTER 12 // Taster/LED Pin für Taste "Runter"
#define RESET 13 // Taster/LED Pin für Taste "Reset"
#define START 11 // Taster/LED Pin für Taste "Start"
#define ENDU 4 // Enschalter/LED Pin für Unten
#define ENDO 5 // Enschalter/LED Pin für Oben
bool bHOCH = LOW;
bool bRUNTER = LOW;
bool bPosHold = LOW;
int poscount = 0; // Zahl für Positions Angabe
int steps_1 = 200; // nötige Wiederholungen für 1mm bewegung des Tisches
int stepperspeed_l = 500; // Schrittmotor Geschwindigkeit bei langsame fahrt
int stepperspeed_h = 250; // Schrittmotor Geschwindigkeit bei Schnelle fahrt
int dec_continious = 1000; // Zeit welche eine Taste gedrückt gehalten werden muss, bis wechsel von langsamer Einzelfahrt, auf schnelle Dauerfahrt
int LaserPowerSetting = 0; // Zahl für Poti % Angabe
U8G2_SH1106_128X64_NONAME_F_HW_I2C OLED_1(U8G2_R0, U8X8_PIN_NONE); // U8G2 OLED_1
U8G2_SH1106_128X64_NONAME_F_HW_I2C OLED_2(U8G2_R0, U8X8_PIN_NONE); // U8G2 OLED_2
void setup() {
OLED_1.setI2CAddress(0x3C * 2); // OLED_1 mit I2C Adresse 0x3C
OLED_2.setI2CAddress(0x3D * 2); // OLED_1 mit I2C Adresse 0x3D
OLED_1.begin();
OLED_2.begin();
pinMode(ENA, OUTPUT); // Aus und Eingäge bestimmen
pinMode(STP, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(MS3, OUTPUT);
pinMode(HOCH, INPUT);
pinMode(RUNTER, INPUT);
pinMode(RESET, INPUT);
pinMode(START, INPUT);
pinMode(ENDO, INPUT);
pinMode(ENDU, INPUT);
digitalWrite(ENA, HIGH); // Einstellungen Schrittmotortreiber A4988
digitalWrite(MS1, HIGH);
digitalWrite(MS2, HIGH);
digitalWrite(MS3, LOW);
}
void loop() {
LaserPowerSetting = analogRead(A3); // Poti für % Angabe Angeschlossen an A3
LaserPowerSetting = map(LaserPowerSetting, 60, 1023, 0, 100); // Poti % Angabe
bHOCH = digitalRead(HOCH); // Var für Hoch Taster
bRUNTER = digitalRead(RUNTER); // Var für Runter Taster
drawOLED_1(); // Ausgabe Oled_1
drawOLED_2(); // Ausgabe Oled_2
if (bRUNTER == HIGH && !digitalRead(ENDU)) { // Runter Taster gedrückt und der Endschalter Unten nicht ausgelöst in mm runter fahren
Runter(); // Schrittmotor fährt den Tisch 1mm runter
poscount = poscount - 1; // Zahl für die Oled wird um 1 reduziert
drawOLED_2(); // OLED_2 anzeigen
while (digitalRead(RUNTER) && !digitalRead(ENDU)) { // Wenn immernoch Runter Taster gedrückt und der Endschalter Unten nicht ausgelöst
delay (dec_continious); // Zeit abwarten
do {
Runter_S(); // 1mm den Tisch schnell runterfahren
poscount = poscount - 1; // Zahl für die Oled wird um 1 reduziert
drawOLED_2(); // OLED_2 anzeigen
}
while (digitalRead(RUNTER) && !digitalRead(ENDU)); // Wenn immernoch Runter Taster gedrückt und der Endschalter Unten nicht ausgelöst schnelle Dauerfahrt
if (bPosHold == LOW) { // Soll Haltestrom den Schrittmotor an Position halten, wenn oben in Var eingestellt
digitalWrite(ENA, HIGH);
}
}
}
if (bHOCH == HIGH && !digitalRead(ENDO)) { // Hoch Taster gedrückt und der Endschalter Oben nicht ausgelöst in mm hoch fahren
Hoch(); // Schrittmotor fährt den Tisch 1mm hoch
poscount = poscount + 1; // Zahl für die Oled wird um 1 addiert
drawOLED_2(); // OLED_2 anzeigen
while (digitalRead(HOCH) && !digitalRead(ENDO)) { // Wenn immernoch Hoch Taster gedrückt und der Endschalter oben nicht ausgelöst
delay (dec_continious); // Zeit abwarten
do {
Hoch_S(); // 1mm den Tisch schnell hochfahren
poscount = poscount + 1; // Zahl für die Oled wird um 1 addiertt
drawOLED_2(); // OLED_2 anzeigen
}
while (digitalRead(HOCH) && !digitalRead(ENDO)); // Wenn immer noch Runter Taster gedrückt und der Endschalter Unten nicht ausgelöst schnelle Dauerfahrt
if (bPosHold == LOW) { // Soll Haltestrom den Schrittmotor an Position halten, wenn oben in Var eingestellt
digitalWrite(ENA, HIGH);
}
}
}
if (digitalRead(START) == HIGH) { // Wenn Start Taster gedrückt fahrt in mm Schritten auf 0
for (int index = 0; index < poscount; poscount = poscount - 1) // bei positiver Zahle solange runter fahren bis anzeige auf 0
{
Runter();
drawOLED_2();
}
for (int index = 0; index > poscount; poscount = poscount + 1) // bei negertiver Zahle solange hoch fahren bis anzeige auf 0
{
Hoch();
drawOLED_2();
}
if (bPosHold == LOW) { // Soll Haltestrom den Schrittmotor an Position halten, wenn oben in Var eingestellt
digitalWrite(ENA, HIGH);
}
}
if (digitalRead(RESET) == HIGH) { // setzt Anzeige einfahc auf 0 auf aktueller Position zurück
poscount = 0;
drawOLED_2();
}
}
void Hoch_S(void) { // 1 mm Hoch fahren in schnell
digitalWrite(ENA, LOW);
for (int index = 0; index <= steps_1; index = index + 1)
{
digitalWrite(DIR, LOW);
digitalWrite(STP, HIGH);
delayMicroseconds(stepperspeed_h);
digitalWrite(DIR, LOW);
digitalWrite(STP, LOW);
delayMicroseconds(stepperspeed_h);
}
}
void Hoch(void) { // 1 mm Hoch fahren in langsam
digitalWrite(ENA, LOW);
for (int index = 0; index <= steps_1; index = index + 1)
{
digitalWrite(DIR, LOW);
digitalWrite(STP, HIGH);
delayMicroseconds(stepperspeed_l);
digitalWrite(DIR, LOW);
digitalWrite(STP, LOW);
delayMicroseconds(stepperspeed_l);
}
}
void Runter_S(void) { // 1 mm Runter fahren in schnell
digitalWrite(ENA, LOW);
for (int index = 0; index <= steps_1; index = index + 1)
{
digitalWrite(DIR, HIGH);
digitalWrite(STP, HIGH);
delayMicroseconds(stepperspeed_h);
digitalWrite(DIR, HIGH);
digitalWrite(STP, LOW);
delayMicroseconds(stepperspeed_h);
}
}
void Runter(void) { // 1 mm Runter fahren in langsam
digitalWrite(ENA, LOW);
for (int index = 0; index <= steps_1; index = index + 1)
{
digitalWrite(DIR, HIGH);
digitalWrite(STP, HIGH);
delayMicroseconds(stepperspeed_l);
digitalWrite(DIR, HIGH);
digitalWrite(STP, LOW);
delayMicroseconds(stepperspeed_l);
}
}
void drawOLED_1(void) { // OLED Ausgabe
char buf[5];
sprintf (buf, "%d %%", LaserPowerSetting); // String % Angabe Poti
char buffer[10];
OLED_1.clearBuffer();
OLED_1.setFont(u8g_font_10x20); // Schriftart
OLED_1.drawStr(7, 15, "Laser Power"); // OLED Ausgabe oben
OLED_1.setFont(u8g_font_ncenR24); // Schriftart
OLED_1.drawStr(30, 55, buf); // Ausgabe String Poti % Angabe
OLED_1.sendBuffer();
}
void drawOLED_2(void) { // OLED Ausgabe
char buf2[6];
sprintf (buf2, "%d mm", poscount); // String mm Angabe Tisch Position
char buffer[10];
OLED_2.clearBuffer();
OLED_2.setFont(u8g_font_10x20); // Schriftart
OLED_2.drawStr(5, 15, "Laser Tisch"); // OLED Ausgabe oben
OLED_2.setFont(u8g_font_ncenR24); // Schriftart
OLED_2.drawStr(10, 55, buf2); // Ausgabe String mm Angabe Tisch Position
OLED_2.sendBuffer();
}