Schurwickelmaschine (Frage)

Hallo erstmal! :slight_smile:

Ich setze mich noch nicht so lange mit dem Arduino ausseinander und meine C++ Skills sind auch noch nicht so toll.

Ich wollte dem ganzen Projekt trotzdem eine Chance geben, da meine Mutter demn├Ąchst Geburtstag hat und ich genau wei├č, dass sie sich sowas w├╝nscht, da sie mit Wolle arbeitet und schon so eine ├Ąhnliche Maschine daheim hat.

Nun zum Projekt:

Ich will eine Wickelmaschine bauen, bei der man ein 2,8 Zoll gro├čes TFT Display an der Front hat zur Anzeige.
Daneben hat man (vorerst) ein 4x4 Matrix Keypad: 0-9 Zahlen, Start/Stop, Reset, Enter, Modus und zwei Tasten f├╝r die Auswahl nach links und rechts.

Man sollte die Meter angeben (Meterz├Ąhler muss ich noch besorgen) und daraufhin sollte der Motor z.B. 1000m Wolle auf Spule/Spindel aufwickeln. Hierbei dreht sich diese Spule, fixiert am Motor.

Nun zu meinem Problem:
Ich bekomme es per Touch hin das Keypad zu simulieren und die Buttons z├Ąhlen die Zahlen dann im Textfeld dazu, aber ich will kein Touch.
Wenn ich es ├╝bers Keypad versuche, dann bekomme ich es nur in den Seriellen Monitor, nicht aber zur Veranschaulichung auf das Display und dann muss ich auch noch daraufhin den Motor starten, der sich so lange dreht bis der magnetische Meterz├Ąhler oft genug seine Runde gedreht hat.
Auch sollte die Geschwindigkeit des Motors sich regeln lassen per Rotary Encoder.

Ich freu mich schonmal auf eure Antworten :smiley:
Z├Ąhlt mir bitte meine Fehler auf und ruhig raus mit euren Anregungen.

Danke ^^

Hier die Datei zu meinem Code: File-Upload.net - Wickler.ino

Solche Download-Links sind potentiell gef├Ąhrlich. Niemand will sich hier auf diese Art eine Schadsoftware einfangen.

Man kann den Code direkt in einen Posting einf├╝gen
das geht ganz fix

  1. Strg-T dr├╝cken um den code zu formatieren
  2. Mit der Maus in der Arduino-IDE einen Rechtsklick machen und "copy for forum" ausw├Ąhlen
  3. Mit Strg-V Inhalt der Zwischenablage in das Posting einf├╝gen fertig.
    vgs
// LIBRARIES //
#include <Elegoo_GFX.h>
#include <Elegoo_TFTLCD.h>
#include <TouchScreen.h>
#include <Keypad.h>

// LCD //
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

// TOUCHSCREEN //
#define YP A3
#define XM A2
#define YM 9
#define XP 8
#define TS_MINX 120
#define TS_MAXX 900
#define TS_MINY 70
#define TS_MAXY 920

// FARBEN //
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define ILI9341_BLACK       0x0000
#define ILI9341_NAVY        0x000F
#define ILI9341_DARKGREEN   0x03E0
#define ILI9341_DARKCYAN    0x03EF
#define ILI9341_MAROON      0x7800
#define ILI9341_PURPLE      0x780F
#define ILI9341_OLIVE       0x7BE0
#define ILI9341_LIGHTGREY   0xC618
#define ILI9341_DARKGREY    0x7BEF
#define ILI9341_BLUE        0x001F
#define ILI9341_GREEN       0x07E0
#define ILI9341_CYAN        0x07FF
#define ILI9341_RED         0xF800
#define ILI9341_MAGENTA     0xF81F
#define ILI9341_YELLOW      0xFFE0
#define ILI9341_WHITE       0xFFFF
#define ILI9341_ORANGE      0xFD20
#define ILI9341_GREENYELLOW 0xAFE5
#define ILI9341_PINK        0xF81F

// TEXTBOX //
#define TEXT_X 16
#define TEXT_Y 114
#define TEXT_W 208
#define TEXT_H 40
#define TEXT_TSIZE 3
#define TEXT_TCOLOR ILI9341_MAGENTA
#define TEXT_LEN 6

// STATUS //
#define STATUS_X 15
#define STATUS_Y 95


// BUTTONS //
#define BUTTON_X 37
#define BUTTON_Y 185
#define BUTTON_W 45
#define BUTTON_H 40
#define BUTTON_SPACING_X 10
#define BUTTON_SPACING_Y 10
#define BUTTON_TEXTSIZE 2

char textfield[TEXT_LEN+1] = "";
uint8_t textfield_i=0;

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);


Elegoo_GFX_Button buttons[12];
char buttonlabels[12][4] = {"1", "2", "3", "!",
                            "4", "5", "6", "Go",
                            "7", "8", "9", "0"};
                            
uint16_t buttoncolors[12] = {ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE,ILI9341_RED,
                             ILI9341_BLUE,ILI9341_BLUE, ILI9341_BLUE, ILI9341_GREEN,
                             ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE, ILI9341_BLUE};

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {6, 47, 48, 49};
byte colPins[COLS] = {50, 51, 52, 53};


Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

   

 /////////////////
// GRUNDGER├ťST //
void setup(void) {
  
  Serial.begin(9600);
  Serial.println(F("TFT LCD test"));

#ifdef USE_Elegoo_SHIELD_PINOUT
  Serial.println(F("Using Elegoo 2.8\" TFT Arduino Shield Pinout"));
#else
  Serial.println(F("Using Elegoo 2.8\" TFT Breakout Board Pinout"));
#endif

  Serial.print("TFT size is "); Serial.print(tft.width()); Serial.print("x"); Serial.println(tft.height());

  tft.reset();

  uint16_t identifier = tft.readID();
  if(identifier == 0x9325) {
    Serial.println(F("Found ILI9325 LCD driver"));
  } else if(identifier == 0x9328) {
    Serial.println(F("Found ILI9328 LCD driver"));
  } else if(identifier == 0x4535) {
    Serial.println(F("Found LGDP4535 LCD driver"));
  }else if(identifier == 0x7575) {
    Serial.println(F("Found HX8347G LCD driver"));
  } else if(identifier == 0x9341) {
    Serial.println(F("Found ILI9341 LCD driver"));
  } else if(identifier == 0x8357) {
    Serial.println(F("Found HX8357D LCD driver"));
  } else if(identifier==0x0101)
  {     
      identifier=0x9341;
       Serial.println(F("Found 0x9341 LCD driver"));
  }
  
  else {
    Serial.print(F("Unknown LCD driver chip: "));
    Serial.println(identifier, HEX);
    Serial.println(F("If using the Elegoo 2.8\" TFT Arduino shield, the line:"));
    Serial.println(F("  #define USE_Elegoo_SHIELD_PINOUT"));
    Serial.println(F("should appear in the library header (Elegoo_TFT.h)."));
    Serial.println(F("If using the breakout board, it should NOT be #defined!"));
    Serial.println(F("Also if using the breakout, double-check that all wiring"));
    Serial.println(F("matches the tutorial."));
    identifier=0x9341;
  }

  
  tft.begin(identifier);
  tft.setRotation(2);
  tft.fillScreen(BLACK);
  tft.setCursor(31, 15);
  tft.setTextColor(YELLOW);
  tft.setTextSize(2);
  tft.print("Bobbelsymphonie");
  tft.setCursor(31, 35);
  tft.setTextSize(1);
  tft.print("Wickler v0.01");

  for (uint8_t row=0; row<3; row++) {
  for (uint8_t col=0; col<4; col++) {
      buttons[col + row*4].initButton(&tft, BUTTON_X+col*(BUTTON_W+BUTTON_SPACING_X), 
                                            BUTTON_Y+row*(BUTTON_H+BUTTON_SPACING_Y),
                                            BUTTON_W, BUTTON_H, ILI9341_WHITE,
      buttoncolors[col+row*4], ILI9341_WHITE,
      buttonlabels[col + row*4], BUTTON_TEXTSIZE); 
      buttons[col + row*4].drawButton();
  }
  }
 
  tft.drawRect(TEXT_X, TEXT_Y, TEXT_W, TEXT_H, ILI9341_WHITE);
}

// STATUS //
void status(const __FlashStringHelper *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}

void status(char *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000




void keypad(const __FlashStringHelper *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}

void keypad(char *msg) {
  tft.fillRect(STATUS_X, STATUS_Y, 240, 8, ILI9341_BLACK);
  tft.setCursor(STATUS_X, STATUS_Y);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(1);
  tft.print(msg);
}










 ///////////////////
// HAUPTPROGRAMM //
void loop(void) {



  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
  
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();
  digitalWrite(13, LOW);

  // if sharing pins, you'll need to fix the directions of the touchscreen pins
  // pinMode(XP, OUTPUT);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
      p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
      p.y = (tft.height()-map(p.y, TS_MINY, TS_MAXY, tft.height(), 0));
   }
   
  for (uint8_t b=0; b<12; b++) {
    
    if (buttons[b].contains(p.x, p.y)) {
      buttons[b].press(true);
    } 
    else {
      buttons[b].press(false);
    }
  }


  for (uint8_t b=0; b<12; b++) {
    
    if (buttons[b].justReleased()) {
      buttons[b].drawButton();
    }
    
    if (buttons[b].justPressed()) {
      buttons[b].drawButton(true);
        
    if (b >= 0) {
          if (textfield_i < TEXT_LEN) {
            textfield[textfield_i] = buttonlabels[b][0];
            textfield_i++;
            textfield[textfield_i] = 0 + 'm';  
           // fona.playDTMF(buttonlabels[b][0]);
          }
        }

        /*if (b == 1) {
          
          textfield[textfield_i] = 0;
          if (textfield > 0) {
            textfield_i--;
            textfield[textfield_i] = ' ';
          }
        }*/

        Serial.println(textfield);
        tft.setCursor(TEXT_X + 10, TEXT_Y+10);
        tft.setTextColor(TEXT_TCOLOR, ILI9341_BLACK);
        tft.setTextSize(TEXT_TSIZE);
        tft.print(textfield);

        if (b == 7) {
          status(F("Wickelvorgang wurde gestartet..."));
          Serial.print("Wickelvorgang wurde gestartet..."); Serial.print(textfield);
          //fona.callPhone(textfield);
        }
        
        if (b == 3) {
          status(F("Wickelvorgang wurde gestoppt!"));
          //fona.hangUp();
        }
        
      delay(100);
    }
  }
}

Ach dann lag ich doch erst richtig, kenne das aus anderen Foren wirklich halt mit Code und ned vorformatierter Text ^^

Mir ist jetzt nicht klar was f├╝r hardware du im Endzustand verwenden willst.
Wird es ein Display geben?
Wenn ja welches?
vgs

Wie gesagt ein 2,8 Zoll gro├čes TFT Touch von Elegoo ^^
Hab ein Bild hochgeladen, das einzige was sich ├Ąndern wird ist das Keypad.

Das bastel ich mit aus Edelstahltastern selber eines. :slight_smile:

Das ist irgendwas zusammenkopiertes...

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);

Das wird nicht gehen.
Hast Du versucht den Code zu kompilieren?

Willst Du wirklich den gezeigten Motor verwenden?
Der ist klein (ca 10 mm Durchmesser.
Gr├╝├če Uwe

Du hast noch mehr Probleme
1, Wolle darf nicht "gezogen" werden muss locker auf den Spind
2. je nach Wolle haste Klumpen so gro├č das er Dir nicht auf den Spind passt.
3. die meter zahl ist drauf hmm was jetzt abwickeln ?

Gr├╝├če

Kannst du ein Bild von der schon vorhandenen Maschine hier posten?
Je nachdem ob zum Beispiel die Wolle von Hand hin- und hergef├╝hrt wird
k├Ânnte das ja doch gehen mit einem einfachen Motor und Spindel.

Der Getriebemotor im Bild wird keine allzu hohe Drehzahl hinbekommen.
Auch da h├Ąngt es davon ab was denn f├╝r Drehzahlen notwendig sind.
Wenn man die Wolle noch von Hand verzwirbeln will dann braucht man eine niedrige Drehzahl.

Wenn du 1000 m auf eine Spindel die nur ca. 5 cm Durchmesser hat in 3 Minuten aufwickeln willst dann br├Ąuchte man da eine hohe Drehzahl.
vgs

Ich verstehe das so das Deine Mutter eine Strickmaschine hat oder?

@StefanL38
Mit Wolle ist es nicht einfach, als Kind durfte ich die Wickelmaschine sein.
und das ist nich einfach " Zieche das nicht so stramm wickel nicht nur in einer richtung "das ist nicht N├Ąhgarn" usW.
Mit Echter aber auch Kunstvolle arbeiten ist nicht so eifach

mit dreimal ist nicht so eifach ist wirklich so gemeint

So ich war heute bei meiner Mutter zu besuch und habs still und heimlich in ihr Wickelzimmer geschafft.

Aha. Hm aus dem Bild alleine werde ich noch nicht ganz schlau.
Welches runde Teil ist jetzt die Spindel auf die die Wolle aufgewickelt wird?
Macht das Maschinchen auch das hin- und herf├╝hren des Fadens automatisch?

Mit dem Drehknopf kann man wahrscheinlich die Drehzahl einstellen
Sch├Ątze mal grob die Drehzahlen. 0 bis 10 Umdrehungen pro Minute
oder 0 bis 600 Umdehungen pro Minute?

vgs

Ich sch├Ątze 3-4 Umdrehungen pro Minute in etwa.
Sorry dass ich mich erst jetzt melde, ich war arbeiten.

Jedes Mal wenn die zwei Magneten (ich hab damals verstanden, dass es rein magnetisch passiert) einer der fest verbaut ist und einer der im Rad ist, sich nahe kommen, gibts ein Signal.

Dieses wurde geeicht mit x-wie vielen cm auch immer.
Muss man halt nachmessen, anfangs w├╝rd ich es mit einem Taster versuchen der 5cm simulieren soll zum Testen.

Sollte ich 500cm wickeln wollen, dann muss ich also 100x den Taster dr├╝cken f├╝r den Prototypen.
der Motor l├Ąuft dann solange, bis genau so viele Signale kamen, dass er auf die 500cm hochgerechnet hat.

Dann stoppt der Motor bzw das Programm.
Die anderen Modi die es gibt m├╝sste ich erst nochmal heimlich erfragen wie diese denn funktionieren, aber das Hauptprogramm w├╝rds auch mal tun.

Zur besseren Veranschaulichung:

Der Bau selber stellt ja nicht das Problem dar, eher die Programmierung die in meinen H├Ąnden nat├╝rlich nicht perfekt wird :smiley:

So viel zum Problem.
Danke schonmal ^^

Wollte bevor mein Arduino Mega ankam es schonmal auf meinem Uno versuchen, hatte nat├╝rlich keine freien Pins, deshalb die Touch Version zuerst.

├ťber Touch funktioniertes es einwandfrei.
Aber ├╝bers Keypad bekomm ich die Werte nur in den seriellen Monitor und nicht auf das Display.

Fony, es sind eher zusammengekn├╝pfte F├Ąden/Garn und keine Wolle.
@Stefan Der Motor ist egal, ich brauch nur mal was f├╝r einen Prototypen das sich dreht. Wenns ned passt, dann waren es halt 4ÔéČ, nagut xD.
@my_xy_projekt das zusammenkopierte war in dem Beispielprogramm f├╝r das Touchdisplay von Elegoo geschrieben, hab darauf nur aufgebaut und dazugeschrieben daweil.

Dann befreie Deinen Code erstmal komplett vom Touch.
Und von allem, was Du sonst noch da drin hast, was nicht dazu geh├Ârt.

DANN! komme mit dem Code zur├╝ck.