Hallo liebe Gemeinde,
ich bin neu hier und habe mich gleich mit meinem ersten großen Projekt so richtig übernommen und komme nicht mehr weiter. Vielleicht hat jemand von euch ja eine Idee wie ich weiter machen kann.
Ich fange mal von vorne an.
Ich habe einen Ballenwickler mit defekter Steuerung und da die vorher schon nicht das konnte was ich wollte habe ich mir gedacht das es ja eine super Idee wäre mir selber eine zu entwickeln und zu schreiben.
Der Ballenwickler hat 3 Drehzahlfühler die ich schon durch aktive ersetzt habe.
Ich muss mit meiner neuen Steuerung, über ein 16-fach Relais Board 7 Magnetventile und einen Elektromotor ansteuern.
Dazu habe ich 10 Taster verbaut.
Mit einem Rotary Encoder möchte ich das 2004 LCD Display steuern.
Das ganze sitzt auf einem Arduino Mega2560 mit einem Prototypen Board.
Verkabelt ist soweit alles und funktioniert auch soweit ich es bis jetzt prüfen kann.
Ich bin soweit das alle Taster schon mal die passenden Relais ansteuern.
Mein Problem besteht darin das alles auf das LCD zu bekommen, ein Menü zu erstellen was ich mit dem Rotary Decoder betätige kann und dann noch die ganzen zusätzlichen Funktionen zu schreiben die die Steuerung können soll.
Das wird jetzt leider viel Text, aber ich hoffe es hilft ein wenig.
Im Automatikmodus soll die Steuerung erstmal nur den Ballenheber heben und senken erlauben.
Wenn der Ballen dann auf dem Tisch liegt muss der Ballenheber abgesengt werden, da er sonst in den Tisch knallt. (Nicht das mir das schon mal passiert wäre hust).
Um das zu verhindern ist an dem Ballenheber ein Sensor verbaut der registrieren soll ob er im weg ist oder nicht.
Wenn er im weg ist soll es beim drücken der Start Taste eine Warnmeldung geben.
Wenn nicht dann soll er anfangen den Tisch schnell zu drehen (einstellbar) und die letzte Umdrehung soll er langsam drehen (das wird über einen der Drehzahlfühler abgefragt) und dabei das Messer spannen. Die Zeit für das Messer spannen muss leider auch einstellbar sein, da es dafür auch keine Sensoren gibt.
Wenn er mit dem drehen fertig ist soll der Tisch kippen (die Zeit dafür muss auch einstellbar sein das es dafür leider keinen Sensor gibt), bis das Messer die Folie greifen kann.
Dann soll das Messer entspannen. Wieder das leidige thema mit der verstellbaren Zeit.
Danach soll der tisch weiter kippen bis der letzte Sensor in der Familie anzeigt das der Ballen abgeworfen wurde.
Wenn der Ballen abgeworfen ist soll ein Zähler für die an diesem Tag gewickelten Ballen einen hochzählen und das ganze auch für einen gesamt Zähler dauerhaft abspeichern.
Als letztes muss der tisch noch runter gekippt werden.
Dann beginnt das ganze Spiel von vorne.
Ich habe um den Sketch übersichtlicher zu machen alle Taster in .h und .cpp ausgelagert.
Ich habe keine Ahnung ob ich nur Müll fabriziert habe oder ob man darauf aufbauen kann.
Und ich habe leider keine Ahnung wie ich weiter machen soll.
Ich bin für alle Ratschläge offen und bedanke mich im voraus das ihr euch dieses Monster von Text überhaupt durchgelesen habt.
#include <Wire.h>
#include <Bounce2.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>
#include <EEPROM.h>
#include "BHH.h"
#include "BHR.h"
#include "LWR.h"
#include "LWL.h"
#include "SWR.h"
#include "MS.h"
#include "ME.h"
#include "THK.h"
#include "TRK.h"
#include "START.h"
#include "KS.h"
#include "DF.h"
#include "BHS.h"
LiquidCrystal_I2C lcd(0x3F, 20, 4);
#define rotaryPin_A 2
#define rotaryPin_B 3
#define rotaryButtonPin 9
#define BHHR 25 // Relais Ballenheber hoch
#define BHRR 27 // Relais Ballenheber runter
#define LWRR 29 // Relais Langsam wickeln rechts rum
#define LWLR 31 // Relais Langsam wickeln links rum
#define MSR 39 // Relais Messer spannen
#define MER 37 // Relais Messer entspannen
#define THKR 33 // Relais Tisch hoch klappen
#define TRKR 35 // Relais Tisch runter klappen
#define HDER 23 // Relais fuer ERHÖHUNG des Hydraulikdrucks. Nur für LWR und LWL nicht bestromt
#define SBH A0 // Sensor Ballenheberarm
#define SDT A1 // Sensor Drehzahlerfassung Tisch
#define STK A2 // Sensor Tisch kippen
void setup() {
// Init aller Taster
bhh_init();
bhr_init();
lwr_init();
lwl_init();
swr_init();
ms_init();
me_init();
thk_init();
trk_init();
start_init();
// Init aller Relais ausgänge
pinMode(BHHR, OUTPUT); //Setzt "Ballenheber heben" Relais als Output
digitalWrite(BHHR, HIGH); //Setzt "Ballenheber heben" Relais auf High
pinMode(BHRR, OUTPUT); //Setzt "Ballenheber runter" Relais als Output
digitalWrite(BHRR, HIGH); //Setzt "Ballenheber runter" Relais auf High
pinMode(LWRR, OUTPUT); //Setzt "langsam wickeln rechts rum" Relais als Output
digitalWrite(LWRR, HIGH); //Setzt "langsam wickeln rechts rum" Relais auf High
pinMode(LWLR, OUTPUT); //Setzt "langsam wickeln links rum" Relais als Output
digitalWrite(LWLR, HIGH); //Setzt "langsam wickeln links rum" Relas auf High
pinMode(MSR, OUTPUT); //Setzt "Messer spannen" Relais als Output
digitalWrite(MSR, HIGH); //Setzt "Messer spannen" Relais auf High
pinMode(MER, OUTPUT); //Setzt "Messer entspannen" Relais als Output
digitalWrite(MER, HIGH); //Setzt "Messer entspannen" Relais auf High
pinMode(THKR, OUTPUT); //Setzt "Tisch hoch kippen" Relais als Output
digitalWrite(THKR, HIGH); //Setzt "Tisch hoch kippen" Relais auf High
pinMode(TRKR, OUTPUT); //Setzt "Tisch runter kippen" Relais als Output
digitalWrite(TRKR, HIGH); //Setzt "Tisch runter kippen" Relais auf High
pinMode(HDER, OUTPUT); //Setzt "Hydraulik druck erhöhen" Relais als Output
digitalWrite(HDER, HIGH); //Setzt "Hydraulik druck erhöhen" Relais auf High
//Init LCD
lcd.init(); //LCD initialisieren
lcd.backlight(); //LCD backlight anschalten
lcd.setCursor(4, 0); //Coursor setzen Zeile 1
lcd.print("BW Steuerung"); //Ausgegebener Text Zeile 1
lcd.setCursor(4, 1); //Coursor setzen Zeile 2
lcd.print("Version 1.00"); //Ausgegebener Text Zeile 2
lcd.setCursor(4, 2); //Coursor setzten Zeile 3
lcd.print(""); //Ausgegebener Text Zeile 3
lcd.setCursor(3, 3); //Coursor setzten Zeile 4
lcd.print(""); //Ausgegebener Text Zeile 4
delay(5000); //Anzeigedauer
lcd.clear(); //LCD leeren
Serial.begin(9600);
}
void Taster_Test() {
if (BHH_Taster()) {
Serial.println("BHH gedrueckt");
}
if (BHR_Taster()) {
Serial.println("BHR gedrueckt");
}
if (LWR_Taster()) {
Serial.println("LWR gedrueckt");
}
if (LWL_Taster()) {
Serial.println("LWL gedrueckt");
}
if (SWR_Taster()) {
Serial.println("SWR gedrueckt");
}
if (MS_Taster()) {
Serial.println("MS gedrueckt");
}
if (ME_Taster()) {
Serial.println("ME gedrueckt");
}
if (THK_Taster()) {
Serial.println("THK gedrueckt");
}
if (TRK_Taster()) {
Serial.println("TRK gedrueckt");
}
if (START_Taster()) {
Serial.println("START gedrueckt");
}
delay(500);
}
void Manuell() {
if (BHH_Taster()) { //Ballenheber hoch
digitalWrite(BHHR, LOW);
digitalWrite(HDER, LOW);
} else {
digitalWrite(BHHR, HIGH);
digitalWrite(HDER, HIGH);
}
if (BHR_Taster()) { //Ballenheber runter
digitalWrite(BHRR, LOW);
digitalWrite(HDER, LOW);
} else {
digitalWrite(BHRR, HIGH);
digitalWrite(HDER, HIGH);
}
if (LWR_Taster()) { //Langsam wickeln rechts
digitalWrite(LWRR, LOW);
} else if (SWR_Taster()) { //Schnell wickeln rechts
digitalWrite(LWRR, LOW);
digitalWrite(HDER, LOW);
} else {
digitalWrite(LWRR, HIGH);
digitalWrite(HDER, HIGH);
}
if (LWL_Taster()) { //Langsam wickeln links
digitalWrite(LWLR, LOW);
} else {
digitalWrite(LWLR, HIGH);
}
if (MS_Taster()) { //Messer spannen
digitalWrite(MSR, LOW);
} else {
digitalWrite(MSR, HIGH);
}
if (ME_Taster()) { //Messer entspannen
digitalWrite(MER, LOW);
} else {
digitalWrite(MER, HIGH);
}
if (THK_Taster()) { //Tisch hoch kippen
digitalWrite(THKR, LOW);
digitalWrite(HDER, LOW);
} else {
digitalWrite(THKR, HIGH);
digitalWrite(HDER, HIGH);
}
if (TRK_Taster()) { //Tisch runter kippen
digitalWrite(TRKR, LOW);
digitalWrite(HDER, LOW);
} else {
digitalWrite(TRKR, HIGH);
digitalWrite(HDER, HIGH);
}
}
void Automatik() {
if (BHH_Taster()) { //Wenn Ballenheber heben gedrückt wird, Ballenheber heben
digitalWrite(BHHR, LOW);
digitalWrite(HDER, LOW);
} else { //Wenn nicht dann Relais nicht ansteuern
digitalWrite(BHHR, HIGH);
digitalWrite(HDER, HIGH);
}
if (BHR_Taster()) { //Wenn Ballenheber runter gedückt wird, Ballenheber runter
digitalWrite(BHRR, LOW);
digitalWrite(HDER, LOW);
} else { //Wenn nicht dann Relais nicht ansteuern
digitalWrite(BHRR, HIGH);
digitalWrite(HDER, HIGH);
}
if (START_Taster()) { //Start löst das automatische wickeln aus
if (analogRead(SBH) < 250) { //Startet nur wenn der Ballenheber nicht im weg ist
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Ballenheber senken"); //Wenn der Ballenheber im weg ist, Warnung ausgeben und dabei blinken
delay(500);
lcd.clear();
delay(500);
} else { //Wenn der Ballenheber nicht im weg ist, Automatik weiter ausführen
int Wicklungen_ist = Wicklungen_ist;
int Wicklungen_soll = 20;
lcd.clear(); //Zeigt die Wicklungen an
lcd.backlight();
lcd.setCursor(5, 1);
lcd.print("Wicklungen");
lcd.setCursor(7, 2);
lcd.print(Wicklungen_ist); //Aktuelle Anzahl an Wicklungen
lcd.print(" / ");
lcd.print(Wicklungen_soll); //Zu wickelde Umdrehungen
for (Wicklungen_ist = 0; Wicklungen_ist <= Wicklungen_soll; Wicklungen_ist++) {
analogRead(SDT < 250);
digitalWrite(LWRR, LOW); //Ansteuerung Relais langsam wickel rechts
digitalWrite(HDER, LOW); //Ansteuerung Relais Hydraulikdruck erhöhen
}
}
}
}
void loop() {
Automatik();
// Taster_Test();
// Manuell();
}