Hallo Franz,
ich habe mich mal mit einem 0,96" OLED-Display beschäftigt und den Sketch umgebaut:
Code: Alles auswählen
/* Dateiname: Drehscheibe_neu_1_6 by e69-fan
Beispiel: Stepper_03 von den MobaTools / MoToStepper - attaching a bipolar stepper with step/dir and enable
StepperMotor ACT 17HS4417L20P1X2
TB6600 Schrittmotor-Treiber-Modul
16 MicroStep - 3200 Pulse/Rev - S1 OFF / S2 OFF / S3 ON
Current Control Setting: 1,5 Ampere S4 ON / S5 ON / S6 OFF
max. Drehwinkel 370 Grad, dann zurück
Referenzpunkt bei Position "Einfahrt" in Einzelschritten links/rechts setzen, Bestätigung mit LED
Blinklicht AN während der Bühnendrehung
optionale Infoausgabe an LCD-Display 20x4 // A4 =SDA; A5 =SCL; 5V Plus; Masse
Danke an MicroBahner und Franz54 https://www.franzls-technik-forum.de
https://arduino-fan.de/
*/
#define MAX8BUTTONS
#include <MobaTools.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
// A4 = SDA, grün; A5 = SCL, blau; +5V, rot; Ground, schwarz;
//----- individuelle Definitionen -------------------------------------------------- //
// -----------Declarationen Blinklicht-----------------
int LED_PIN = 13; // Blink-LED auf 13
byte LED = LOW;
byte stopp = 4;
byte fahrt = 4;
unsigned long BLINKIO = 0;
const int delayTime = 300; // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;
// ----------------------------------------------------
//TMC2209 = 5,6,7 - TB6600 = 36,35,34 - DM556 = 32,31,30
const byte dirPin = 5; // orange
const byte stepPin = 6; // lila
const byte enaPin = 7; // grau
const byte LinksPin = A1; // rot / 4 steps nach links
const byte RechtsPin = A2; // grün / 4 steps nach rechts
const byte RefPin = A3; // grau / RefPunkt setzen - RefLED leuchtet
const byte RefLED = 13; // gelb / leuchtet wenn RefPunkt gesetzt
const byte piezo = 3; // / ?????????????????????????????????
const byte EinfahrtPin = 8 ; // grün / Einfahrt Gleis1A - Lok steht vorwärts
const byte V_Ausfahrt_1bPin = 9 ; // gelb / Ausfahrt Gleis1B - Lok steht vorwärts
const byte WendePin = 10; // blau / Wendung 180 Grad - Lok steht
const byte SchuppenPin = 11; // grau / Lokschuppen - Lok steht
const byte R_Ausfahrt_1bPin = 12; // orange / Ausfahrt Gleis1B - Lok steht rückwärts
const byte potPin = A0; // Analog Poti Eingang
int Umdrehungen = 0;
int Umdrehung_Schritte = 3200; // Referenz zur Treibereinstellung Schritte je Umdrehung
int Rampe = 200;
// ----- Stepper einrichten ( 3200 Schritte / Umdrehung - 1/8 Microstep )------------------------------------------- //
const int STEPS_REVOLUTION = 3200; // Schritte Auftrag für TCM2208 nur 1600
MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR ); // Steps bei xxx pro Umdrehung
// ----- Taster einrichten ----------------------------------------------------------------------------------------//
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 } ; // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { LinksPin, RechtsPin, RefPin, EinfahrtPin, V_Ausfahrt_1bPin, WendePin, SchuppenPin, R_Ausfahrt_1bPin } ; // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );
// ----- speedPoti einrichten --------------------------------------------------------------------------------------//
MoToTimebase speedIntervall; // Zeitinterval zum Auslesen des Speedpotentiometers
int vspeed = 0; // Steppergeschwindigkeit in U/min*10
// ----------------------------------------- S E T U P -----------------
void setup() {
// ------------------OLED Display --------------------------------------
Wire.begin();
Wire.setClock(400000L);
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
oled.setFont(Callibri11);
// ---------------------------------------------------------------------
pinMode(RefLED, OUTPUT);
digitalWrite(RefLED, LOW);
pinMode(LED_PIN, OUTPUT);
oled.setCursor (0, 0);
oled.print (F(""));
oled.setCursor (0, 0);
oled.print (F("Referenzpunkt ?? "));
oled.setCursor (0, 4);
oled.print (F("Gleis ? "));
oled.setCursor (50, 6); // 50er Einzug in Zeile 6
oled.print (F("-----"));
//----- Stepper -------------------------------------------------------------------- //
Umdrehungen = STEPS_REVOLUTION / Umdrehung_Schritte;
myStepper.attach( stepPin, dirPin );
myStepper.attachEnable( enaPin, 10, LOW ); // Enable Pin aktivieren ( LOW=aktiv )
myStepper.setSpeed( 200 ); // 20 Umdrehungen je Minute
myStepper.setRampLen( Rampe ); // Rampenlänge 300 Steps bei 20U/min
speedIntervall.setBasetime( 100 ); // 100ms Tickerzeit
}
void loop() {
BLINKIO = myStepper.stepsToDo();
AktuellMilles = millis();
if (AktuellMilles - VorherMilles >= delayTime) {
VorherMilles = AktuellMilles;
LED = !LED;
if (BLINKIO == 0) {
LED = 0;
if (stopp < 4)
{
//oled.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
//oled.print (F(" Stopp ")); // durch Leerzeichen mittig ausgerichtet
stopp = 4;
}
}
digitalWrite(LED_PIN, LED);
}
button.processButtons(); // Taster einlesen und bearbeiten
if ( speedIntervall.tick() ) { // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
// Speed alle 100ms neu einlesen und setzen
vspeed = map((analogRead(potPin)), 0, 1023, 20, 240); // Poti mappen auf 2 ... 240 Umdr/Min
myStepper.setSpeed( vspeed ); // min speed =2 and max speed =180 rpm
}
// --------------------------- Referenzpunkt setzen ------------------------------------------------ //
if (button.pressed(Button1) ) { // Taster Links gedrückt
digitalWrite(RefLED, LOW);
myStepper.doSteps( 4 ); // Stepper dreht 1x links
}
if ( button.released(Button1) ) { // Taster links losgelassen
myStepper.rotate(0); // Stepper stoppt
}
if (button.pressed(Button2) ) { // Taster Rechts gedrückt
digitalWrite(RefLED, LOW);
myStepper.doSteps( -4 ); // Stepper dreht 1x rechts
}
if ( button.released(Button2) ) { // Taster Rechts losgelassen
myStepper.rotate(0); // Stepper stoppt
}
if (button.pressed(Button3) ) { // Taster Ref gedrückt
myStepper.setZero(); // Referenzpunkt gesetzt
tone(3, 440, 300); // Bestätigungston piezo an PIN3, Tonhöhe, ? - Dauer
digitalWrite(RefLED, HIGH);
oled.setCursor (0, 0);
oled.print (F("Referenzpunkt OK "));
}
// --------------------------- Bühnendrehung ------------------------------------------------ //
if ((button.pressed(Button4)) && (fahrt == 4)) { // Taster4 gedrückt:
tone(3, 440, 300);
oled.setCursor (0, 4);
oled.print (F("> Einfahrt Gleis 1A "));
fahrt = 3;
disp();
stopp = 3;
myStepper.write( 0 ); // dreht zur Einfahrt Gleis1A zurück
// zur Startposition
}
if ((button.pressed(Button5)) && (fahrt == 4)) { // Taster5 gedrückt
oled.setCursor (0, 4);
oled.print (F("> Ausfahrt Gleis 1B "));
fahrt = 3;
disp();
stopp = 3;
myStepper.write( 50 ); // dreht zur Ausfahrt Gleis1B - vorwärts
}
if ((button.pressed(Button6)) && (fahrt == 4)) { // Taster6 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< 180 Wendung "));
fahrt = 3;
disp();
stopp = 3;
myStepper.write( -180 ); // wendet die Bühne um 180 Grad
}
if ((button.pressed(Button7)) && (fahrt == 4)) { // Taster7 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< Lokschuppen "));
fahrt = 3;
disp();
stopp = 3;
myStepper.write( -250 ); // dreht zur Abfahrt: Lokschuppen
}
if ((button.pressed(Button8)) && (fahrt == 4)) { // Taster8 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< Ausfahrt Gleis 1B "));
fahrt = 3;
disp();
stopp = 3;
myStepper.write( -100 ); // dreht zur Ausfahrt Gleis1B - rückwärts
}
}
void disp()
{
//oled.setCursor (0, 6);
//oled.print (F(" "));
//oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
//oled.print (F(" Fahrt "));
// 1-----------------20
fahrt = 4;
}
Jetzt stehe ich vor folgendem Problem:
Wie bekomme ich die Befehle in die letzte Zeile ----- :
Code: Alles auswählen
oled.setCursor (50, 6); // 50er Einzug in Zeile 6
oled.print (F("-----"));
Code: Alles auswählen
//oled.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
//oled.print (F(" Stopp ")); // durch Leerzeichen mittig ausgerichtet
Code: Alles auswählen
//oled.setCursor (0, 6);
//oled.print (F(" "));
//oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
//oled.print (F(" Fahrt "));
Wenn ich die Befehle aktiviere, rutscht die Schrift nach oben und beschneidet die anderen Zeilen in der Höhe.
Ich glaube beim OLED-Display braucht man eine exakte Positionsangabe wie z.B.
Code: Alles auswählen
oled.setCursor (50, 6); // 50er Einzug in Zeile 6
oled.print (F("-----"));
da jedoch der Befehl:
Code: Alles auswählen
//oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
lautet funktioniert das nicht.
Den "tone" habe drin gelassen - könnte ein Signal beim Drehbeginn werden.
Ich habe eine piezo-buzzer angeschlossen, möchte diesen aber durch einen 8 Ohm-Lautsprecher ersetzen. Da müsste man doch noch tiefere Töne erzeugen können.
Was brauch ich da für eine Schaltung? Vorwiderstand zur Strombegrenzung?
So jetzt wünsche ich Euch einen schönen Abend und tu mal Rasenmähen ( O-Ton Helga: "Robbi kommt mir nicht ins Haus
