
Schönes Restwochenende, servus
Franz
Forum zur gegenseitigen Hilfe für Hobby´s, Spass und Technik, im Raum Penzberg, Garmisch, Bad Tölz, Seeshaupt
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;
}
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 "));
Code: Alles auswählen
oled.setCursor (50, 6); // 50er Einzug in Zeile 6
oled.print (F("-----"));
Code: Alles auswählen
//oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
Code: Alles auswählen
// Dateiname: Test_for_minimum_program_size_1_1.ino
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
//------------------------ setup -----
void setup() {
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(X11fixed7x14);
//oled.setFont(Arial14);
oled.setFont(Callibri11); // ok
//oled.setFont(Callibri11_bold);
//oled.setFont(Callibri11_italic);
//oled.setFont(Callibri15);
//oled.setFont(Corsiva_12);
//oled.setFont(fixed_bold10x15); // 12 Zeichen
//oled.setFont(font5x7);
//oled.setFont(font8x8);
//oled.setFont(Iain5x7);
//oled.setFont(lcd5x7);
//oled.setFont(Stang5x7); // ok
//oled.setFont(System5x7);
//oled.setFont(TimesNewRoman16);
//oled.setFont(TimesNewRoman16_bold);
//oled.setFont(TimesNewRoman16_italic);
//oled.setFont(utf8font10x16);
//oled.setFont(Verdana12); // ok
//oled.setFont(Verdana12_bold);
//oled.setFont(Verdana12_italic);
//oled.setFont(X11fixed7x14);
//oled.setFont(X11fixed7x14B);
//oled.setFont(ZevvPeep8x16); // 16 Zeichen
}
//------------------------ loop -----
void loop() {
oled.set1X();
/* Der Unterschied zwischen print() und println besteht darin,
dass println() zusätzlich einen Zeilenumbruch nach der Ausgabe einfügt.
*/
oled.setCursor [size=150](0, 0);[/size]
oled.print ("A---Zeile-1-------------E"); // 25 Zeichen
//oled.println("Zeile a");
oled.setCursor (0, 2);
oled.print ("A---Zeile-2------E");
//oled.println("Zeile b");
oled.setCursor (0, 4);
oled.print ("A---Zeile-3------E");
//oled.println("Zeile c");
oled.setCursor(0, 6);
//oled.print ("A----------------E");
oled.print ("A---Zeile-4------E");
//oled.println("Zeile d");
}
Müßte oled.setCursor (0,0) seinIch kanns mit dem Oled nicht testen. Aber sag mal, was ist beim Oled die Zeile 1?
"oled.setCursor (0, 1);" ?? oder "oled.setCursor (0, 0);" ??
Da muss ich dir nur mal die Zusammenhänge erklären. Wenn man in "fahrt" einfach mal was anderes übergibt, dann funktioniert die Tastenabfrage nicht mehr. Da gibt es ein Zusammenspiel mit dem Wert, der in "fahrt" steht. Wenn man die Zeile ändert, müßen ein paar Dinge angepasst werden.
Hast du das Programm schon auf das Oled Display geändert, so dass es grundsätzlich wieder funktioniert wie vorher mit dem 4x20 Display?
Dann kannst du mir das mal hier ins Forum reinhängen. Ich nehme das dann, und passe den Rest an, dass die Ausgabe mit Fahrt und Stopp auch wieder in den richtigen Zeilen klappt. Dann muss ich dir den Ablauf mal verklickern, dass du weißt was das Problem ist.
Das Problem ist oled.setCursor (0, (fahrt)); da ist nur eine Position 0 und (fahrt) schreibt doch nur den Wert "Fahrt" oder "STOPP" rein?
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;
}
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 = 8;
byte fahrt = 8;
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("MobaStepper_Oled_V1_"));
oled.setCursor (0, 2);
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 < 8)
{
//oled.setCursor (0, stopp); // Ausgabe Position für das Wort "Stopp" übergeben
//oled.print (F(" Stopp ")); // durch Leerzeichen mittig ausgerichtet
stopp = 8;
}
}
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 == 8)) { // Taster4 gedrückt:
tone(3, 440, 300);
oled.setCursor (0, 4);
oled.print (F("> Einfahrt Gleis 1A "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( 0 ); // dreht zur Einfahrt Gleis1A zurück
// zur Startposition
}
if ((button.pressed(Button5)) && (fahrt == 8)) { // Taster5 gedrückt
oled.setCursor (0, 4);
oled.print (F("> Ausfahrt Gleis 1B "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( 50 ); // dreht zur Ausfahrt Gleis1B - vorwärts
}
if ((button.pressed(Button6)) && (fahrt == 8)) { // Taster6 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< 180 Wendung "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -180 ); // wendet die Bühne um 180 Grad
}
if ((button.pressed(Button7)) && (fahrt == 8)) { // Taster7 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< Lokschuppen "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -250 ); // dreht zur Abfahrt: Lokschuppen
}
if ((button.pressed(Button8)) && (fahrt == 8)) { // Taster8 gedrückt:
oled.setCursor (0, 4);
oled.print (F("< Ausfahrt Gleis 1B "));
fahrt = 6;
disp();
stopp = 6;
myStepper.write( -100 ); // dreht zur Ausfahrt Gleis1B - rückwärts
}
}
void disp()
{
//oled.setCursor (0, (fahrt));
//oled.print (F(" "));
//oled.setCursor (0, (fahrt)); // Position (Zeile) für das Wort "Fahrt"
//oled.print (F(" Fahrt "));
//
fahrt = 8;
}
Code: Alles auswählen
// -----------Declarationen Blinklicht-----------------
int LED_PIN = 13; // Blink-LED auf 13
byte LED = LOW;
byte stopp = 8;
byte fahrt = 8;
unsigned long BLINKIO = 0;
const int delayTime = 300; // HIGH und LOW Zeit dess Blinksignales
unsigned long VorherMilles = 0;
unsigned long AktuellMilles;
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste